Showing preview only (2,411K chars total). Download the full file or copy to clipboard to get everything.
Repository: waterholeforum/core
Branch: 0.6
Commit: d6563179e489
Files: 915
Total size: 2.1 MB
Directory structure:
gitextract_qddtl31l/
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ └── config.yml
│ ├── SECURITY.md
│ └── workflows/
│ ├── build-assets.yml
│ ├── phpstan.yml
│ ├── prettier.yml
│ ├── stale.yml
│ └── tests.yml
├── .gitignore
├── .prettierignore
├── .prettierrc
├── .release-it.yml
├── CHANGELOG.md
├── LICENSE.md
├── README.md
├── composer.json
├── config/
│ ├── api.php
│ ├── auth.php
│ ├── cp.php
│ ├── design.php
│ ├── forum.php
│ ├── seo.php
│ ├── system.php
│ ├── uploads.php
│ └── users.php
├── database/
│ ├── factories/
│ │ ├── ChannelFactory.php
│ │ ├── CommentFactory.php
│ │ ├── PageFactory.php
│ │ ├── PostFactory.php
│ │ ├── TagFactory.php
│ │ └── UserFactory.php
│ ├── migrations/
│ │ ├── 2021_06_21_021231_create_channels_table.php
│ │ ├── 2021_06_21_021344_create_users_table.php
│ │ ├── 2021_06_21_021345_create_notifications_table.php
│ │ ├── 2021_06_21_021348_create_posts_table.php
│ │ ├── 2021_06_21_021355_create_comments_table.php
│ │ ├── 2021_06_21_021413_create_groups_table.php
│ │ ├── 2021_06_21_021449_create_group_user_table.php
│ │ ├── 2021_06_21_021454_create_mentions_table.php
│ │ ├── 2021_06_21_021502_create_post_user_table.php
│ │ ├── 2021_06_21_111526_create_permissions_table.php
│ │ ├── 2021_10_18_130929_create_channel_user_table.php
│ │ ├── 2021_12_04_093522_create_pages_table.php
│ │ ├── 2021_12_04_095210_create_structure_table.php
│ │ ├── 2021_12_04_095221_create_structure_headings_table.php
│ │ ├── 2021_12_04_095226_create_structure_links_table.php
│ │ ├── 2023_01_06_083525_create_reaction_sets_table.php
│ │ ├── 2023_01_06_083700_create_reaction_types_table.php
│ │ ├── 2023_01_06_084208_create_reactions_table.php
│ │ ├── 2023_01_06_165934_add_reaction_set_columns_to_channels.php
│ │ ├── 2023_01_13_110454_create_taxonomies_table.php
│ │ ├── 2023_01_13_110537_create_tags_table.php
│ │ ├── 2023_01_13_110933_create_post_tag_table.php
│ │ ├── 2023_01_13_110952_create_channel_taxonomy_table.php
│ │ ├── 2023_01_19_113324_create_auth_providers_table.php
│ │ ├── 2023_01_26_145619_add_view_count_to_posts.php
│ │ ├── 2023_02_02_115230_create_uploads_table.php
│ │ ├── 2023_02_02_115236_create_attachments_table.php
│ │ ├── 2023_02_02_151121_add_hotness_to_posts.php
│ │ ├── 2023_02_02_153704_add_suspsended_until_to_users.php
│ │ ├── 2023_03_03_083340_add_is_required_to_taxonomies.php
│ │ ├── 2023_03_11_114659_add_answerable_to_channels.php
│ │ ├── 2023_03_11_114850_add_answer_id_to_posts.php
│ │ ├── 2023_03_16_095929_add_show_similar_posts_to_channels.php
│ │ ├── 2023_04_05_165546_add_post_id_created_at_index_to_comments.php
│ │ ├── 2023_04_05_165601_add_is_listed_position_index_to_structure.php
│ │ ├── 2023_04_13_163452_rename_channels_sandbox_to_ignore.php
│ │ ├── 2023_04_13_203750_rename_channels_default_layout_to_layout.php
│ │ ├── 2023_04_13_203835_add_layout_config_to_channels.php
│ │ ├── 2023_04_22_131025_add_translations_to_channels.php
│ │ ├── 2023_06_08_093656_add_is_pinned_to_posts.php
│ │ ├── 2023_06_08_113707_add_hiding_columns_to_comments.php
│ │ ├── 2023_06_10_151000_add_created_at_to_posts_is_pinned_index.php
│ │ ├── 2023_07_12_165151_add_deleted_at_to_posts.php
│ │ ├── 2026_01_22_000001_add_rules_and_auto_assign_to_groups.php
│ │ ├── 2026_01_22_000002_add_is_approved_to_posts.php
│ │ ├── 2026_01_22_000003_add_is_approved_to_comments.php
│ │ ├── 2026_01_22_000004_add_deleted_reason_to_posts.php
│ │ ├── 2026_01_22_000005_create_flags_table.php
│ │ ├── 2026_01_22_000006_migrate_comment_hidden_to_deleted.php
│ │ ├── 2026_01_22_000007_add_approval_requirements_to_channels.php
│ │ ├── 2026_01_22_000008_add_deleted_notes_to_posts_and_comments.php
│ │ ├── 2026_01_24_000009_add_note_to_flags_table.php
│ │ └── 2026_01_24_000010_add_reactions_enabled_to_channels.php
│ └── seeders/
│ ├── DefaultSeeder.php
│ └── GroupsSeeder.php
├── lang/
│ ├── en/
│ │ ├── auth.ftl
│ │ ├── cp.ftl
│ │ ├── forum.ftl
│ │ ├── install.ftl
│ │ ├── notifications.ftl
│ │ ├── passwords.php
│ │ ├── system.ftl
│ │ ├── user.ftl
│ │ └── validation.php
│ ├── fr/
│ │ ├── auth.ftl
│ │ ├── cp.ftl
│ │ ├── forum.ftl
│ │ ├── install.ftl
│ │ ├── notifications.ftl
│ │ ├── passwords.php
│ │ ├── system.ftl
│ │ ├── user.ftl
│ │ └── validation.php
│ ├── nl/
│ │ ├── auth.ftl
│ │ ├── cp.ftl
│ │ ├── forum.ftl
│ │ ├── install.ftl
│ │ ├── notifications.ftl
│ │ ├── passwords.php
│ │ ├── system.ftl
│ │ ├── user.ftl
│ │ └── validation.php
│ ├── ru/
│ │ ├── auth.ftl
│ │ ├── cp.ftl
│ │ ├── forum.ftl
│ │ ├── install.ftl
│ │ ├── notifications.ftl
│ │ ├── passwords.php
│ │ ├── system.ftl
│ │ ├── user.ftl
│ │ └── validation.php
│ └── zh-Hant/
│ ├── auth.ftl
│ ├── cp.ftl
│ ├── forum.ftl
│ ├── header.ftl
│ ├── install.ftl
│ ├── notifications.ftl
│ ├── passwords.php
│ ├── system.ftl
│ ├── user.ftl
│ └── validation.php
├── package.json
├── phpstan.dist.neon
├── phpunit.xml
├── postcss.config.cjs
├── resources/
│ ├── css/
│ │ ├── cp/
│ │ │ ├── _dashboard.css
│ │ │ ├── _permission-grid.css
│ │ │ ├── _structure.css
│ │ │ └── app.css
│ │ ├── global/
│ │ │ ├── _auth.css
│ │ │ ├── _channel-card.css
│ │ │ ├── _comment.css
│ │ │ ├── _composer.css
│ │ │ ├── _emoji.css
│ │ │ ├── _flags.css
│ │ │ ├── _header.css
│ │ │ ├── _index.css
│ │ │ ├── _notifications.css
│ │ │ ├── _post-feed.css
│ │ │ ├── _post-page.css
│ │ │ ├── _reactions.css
│ │ │ ├── _search.css
│ │ │ ├── _text-editor.css
│ │ │ ├── _user-profile.css
│ │ │ └── app.css
│ │ └── system/
│ │ ├── _alert.css
│ │ ├── _alerts.css
│ │ ├── _attribution.css
│ │ ├── _avatar.css
│ │ ├── _badge.css
│ │ ├── _base.css
│ │ ├── _block-link.css
│ │ ├── _breadcrumb.css
│ │ ├── _btn.css
│ │ ├── _card.css
│ │ ├── _channel-label.css
│ │ ├── _channel-picker.css
│ │ ├── _choice.css
│ │ ├── _color-picker.css
│ │ ├── _combobox.css
│ │ ├── _dialog.css
│ │ ├── _divider.css
│ │ ├── _emoji-picker.css
│ │ ├── _form.css
│ │ ├── _highlightjs.css
│ │ ├── _icon.css
│ │ ├── _input.css
│ │ ├── _mention.css
│ │ ├── _menu.css
│ │ ├── _modal.css
│ │ ├── _nav.css
│ │ ├── _placeholder.css
│ │ ├── _reset.css
│ │ ├── _sidebar.css
│ │ ├── _skip-link.css
│ │ ├── _spinner.css
│ │ ├── _table.css
│ │ ├── _tabs.css
│ │ ├── _tooltip.css
│ │ ├── _turbo.css
│ │ ├── _typography.css
│ │ ├── _user-label.css
│ │ ├── _utils.css
│ │ ├── _variables.css
│ │ ├── breakpoints.css
│ │ ├── mixins.css
│ │ └── system.css
│ ├── dist/
│ │ ├── cp.css
│ │ ├── cp.js
│ │ ├── emoji.js
│ │ ├── global.css
│ │ ├── global.js
│ │ └── highlight.js
│ ├── js/
│ │ ├── bootstrap/
│ │ │ ├── custom-elements.ts
│ │ │ ├── document-title.ts
│ │ │ ├── echo.ts
│ │ │ ├── hotkeys.ts
│ │ │ └── turbo.ts
│ │ ├── controllers/
│ │ │ ├── action-menu-controller.ts
│ │ │ ├── alert-controller.ts
│ │ │ ├── comment-controller.ts
│ │ │ ├── comment-replies-controller.ts
│ │ │ ├── composer-controller.ts
│ │ │ ├── copy-link-controller.ts
│ │ │ ├── details-focus-controller.ts
│ │ │ ├── load-backwards-controller.ts
│ │ │ ├── login-controller.ts
│ │ │ ├── mentions-controller.ts
│ │ │ ├── modal-controller.ts
│ │ │ ├── notifications-popup-controller.ts
│ │ │ ├── page-controller.ts
│ │ │ ├── post-controller.ts
│ │ │ ├── post-feed-controller.ts
│ │ │ ├── post-page-controller.ts
│ │ │ ├── quotable-controller.ts
│ │ │ ├── reveal-controller.ts
│ │ │ ├── scrollspy-controller.ts
│ │ │ ├── similar-posts-controller.ts
│ │ │ ├── suspend-duration-controller.ts
│ │ │ ├── text-editor-controller.ts
│ │ │ ├── theme-controller.ts
│ │ │ ├── truncated-controller.ts
│ │ │ ├── turbo-frame-controller.ts
│ │ │ ├── uploads-controller.ts
│ │ │ ├── watch-scroll-controller.ts
│ │ │ └── watch-sticky-controller.ts
│ │ ├── cp/
│ │ │ ├── controllers/
│ │ │ │ ├── color-picker-controller.ts
│ │ │ │ ├── filter-input-controller.ts
│ │ │ │ ├── form-controller.ts
│ │ │ │ ├── icon-picker-controller.ts
│ │ │ │ ├── incremental-search-controller.ts
│ │ │ │ ├── line-chart-controller.ts
│ │ │ │ ├── permission-grid-controller.ts
│ │ │ │ ├── slugger-controller.ts
│ │ │ │ └── sortable-controller.ts
│ │ │ └── index.ts
│ │ ├── elements/
│ │ │ └── turbo-echo-stream-tag.ts
│ │ ├── emoji.ts
│ │ ├── env.d.ts
│ │ ├── highlight.ts
│ │ ├── index.ts
│ │ └── utils.ts
│ └── views/
│ ├── actions/
│ │ ├── confirm.blade.php
│ │ └── menu.blade.php
│ ├── auth/
│ │ ├── confirm-password.blade.php
│ │ ├── forgot-password.blade.php
│ │ ├── login.blade.php
│ │ ├── register.blade.php
│ │ └── reset-password.blade.php
│ ├── comments/
│ │ ├── create.blade.php
│ │ ├── edit.blade.php
│ │ └── show.blade.php
│ ├── components/
│ │ ├── action-button.blade.php
│ │ ├── action-buttons.blade.php
│ │ ├── action-form.blade.php
│ │ ├── action-menu.blade.php
│ │ ├── alert.blade.php
│ │ ├── attribution.blade.php
│ │ ├── avatar.blade.php
│ │ ├── cancel.blade.php
│ │ ├── channel-label.blade.php
│ │ ├── channel-picker.blade.php
│ │ ├── collapsible-nav.blade.php
│ │ ├── comment-answer-badge.blade.php
│ │ ├── comment-frame.blade.php
│ │ ├── comment-full.blade.php
│ │ ├── comment-mark-as-answer.blade.php
│ │ ├── comment-reactions.blade.php
│ │ ├── comment-replies.blade.php
│ │ ├── comment-reply-button.blade.php
│ │ ├── comments-locked.blade.php
│ │ ├── composer.blade.php
│ │ ├── cp/
│ │ │ ├── color-picker.blade.php
│ │ │ ├── group-row.blade.php
│ │ │ ├── icon-picker.blade.php
│ │ │ ├── permission-grid.blade.php
│ │ │ ├── structure-node.blade.php
│ │ │ ├── title.blade.php
│ │ │ └── version.blade.php
│ │ ├── cp.blade.php
│ │ ├── dialog.blade.php
│ │ ├── email-verification.blade.php
│ │ ├── feed-filters.blade.php
│ │ ├── feed-top-period.blade.php
│ │ ├── field.blade.php
│ │ ├── flag-container.blade.php
│ │ ├── follow-button.blade.php
│ │ ├── group-badge.blade.php
│ │ ├── header-breadcrumb.blade.php
│ │ ├── header-guest.blade.php
│ │ ├── header-moderation.blade.php
│ │ ├── header-notifications.blade.php
│ │ ├── header-search.blade.php
│ │ ├── header-title.blade.php
│ │ ├── header-user.blade.php
│ │ ├── header.blade.php
│ │ ├── html.blade.php
│ │ ├── index-create-post.blade.php
│ │ ├── index-footer-language.blade.php
│ │ ├── index-footer.blade.php
│ │ ├── index-nav.blade.php
│ │ ├── index.blade.php
│ │ ├── infinite-scroll.blade.php
│ │ ├── layout.blade.php
│ │ ├── menu-item.blade.php
│ │ ├── nav-link.blade.php
│ │ ├── notification.blade.php
│ │ ├── pinned-post.blade.php
│ │ ├── post-activity.blade.php
│ │ ├── post-answer.blade.php
│ │ ├── post-answered.blade.php
│ │ ├── post-attribution.blade.php
│ │ ├── post-card.blade.php
│ │ ├── post-channel.blade.php
│ │ ├── post-feed-channel.blade.php
│ │ ├── post-feed-pinned.blade.php
│ │ ├── post-feed-toolbar.blade.php
│ │ ├── post-feed.blade.php
│ │ ├── post-full.blade.php
│ │ ├── post-list-item.blade.php
│ │ ├── post-locked.blade.php
│ │ ├── post-notifications.blade.php
│ │ ├── post-replies.blade.php
│ │ ├── post-sidebar.blade.php
│ │ ├── post-title.blade.php
│ │ ├── post-trash.blade.php
│ │ ├── post-unread.blade.php
│ │ ├── reaction-set-picker.blade.php
│ │ ├── reactions-condensed.blade.php
│ │ ├── reactions.blade.php
│ │ ├── relative-time.blade.php
│ │ ├── removed-banner.blade.php
│ │ ├── search-form.blade.php
│ │ ├── selector.blade.php
│ │ ├── spacer.blade.php
│ │ ├── text-editor-button.blade.php
│ │ ├── text-editor.blade.php
│ │ ├── theme-selector.blade.php
│ │ ├── user-label.blade.php
│ │ ├── user-link.blade.php
│ │ ├── user-profile.blade.php
│ │ └── validation-errors.blade.php
│ ├── cp/
│ │ ├── dashboard.blade.php
│ │ ├── groups/
│ │ │ ├── form.blade.php
│ │ │ └── index.blade.php
│ │ ├── reactions/
│ │ │ ├── index.blade.php
│ │ │ ├── reaction-set.blade.php
│ │ │ └── reaction-type.blade.php
│ │ ├── structure/
│ │ │ ├── channel.blade.php
│ │ │ ├── delete-channel.blade.php
│ │ │ ├── heading.blade.php
│ │ │ ├── index.blade.php
│ │ │ ├── link.blade.php
│ │ │ └── page.blade.php
│ │ ├── taxonomies/
│ │ │ ├── index.blade.php
│ │ │ ├── tag.blade.php
│ │ │ └── taxonomy.blade.php
│ │ ├── users/
│ │ │ ├── delete.blade.php
│ │ │ ├── form.blade.php
│ │ │ ├── index.blade.php
│ │ │ └── suspend.blade.php
│ │ └── widget.blade.php
│ ├── forum/
│ │ ├── channel.blade.php
│ │ ├── home.blade.php
│ │ ├── moderation.blade.php
│ │ ├── notifications.blade.php
│ │ ├── page.blade.php
│ │ └── search.blade.php
│ ├── mail/
│ │ ├── email.blade.php
│ │ ├── html/
│ │ │ ├── button.blade.php
│ │ │ ├── header.blade.php
│ │ │ ├── layout.blade.php
│ │ │ ├── link.blade.php
│ │ │ ├── message.blade.php
│ │ │ ├── subcopy.blade.php
│ │ │ └── themes/
│ │ │ └── default.css
│ │ ├── notification.blade.php
│ │ └── text/
│ │ ├── button.blade.php
│ │ ├── header.blade.php
│ │ ├── layout.blade.php
│ │ ├── link.blade.php
│ │ └── message.blade.php
│ ├── moderation/
│ │ ├── removal-reason.blade.php
│ │ └── report.blade.php
│ ├── pagination/
│ │ ├── default.blade.php
│ │ └── simple-default.blade.php
│ ├── posts/
│ │ ├── create.blade.php
│ │ ├── edit.blade.php
│ │ ├── move-to-channel.blade.php
│ │ └── show.blade.php
│ ├── preferences/
│ │ ├── account.blade.php
│ │ ├── notifications.blade.php
│ │ └── profile.blade.php
│ ├── reactions/
│ │ └── list.blade.php
│ ├── users/
│ │ ├── comments.blade.php
│ │ ├── mention-suggestion.blade.php
│ │ └── posts.blade.php
│ └── widgets/
│ ├── feed.blade.php
│ ├── getting-started.blade.php
│ └── line-chart.blade.php
├── routes/
│ ├── api.php
│ ├── channels.php
│ ├── cp.php
│ └── forum.php
├── src/
│ ├── Actions/
│ │ ├── Action.php
│ │ ├── Concerns/
│ │ │ ├── RemovesContent.php
│ │ │ └── ResolvesFlags.php
│ │ ├── CopyImpersonationUrl.php
│ │ ├── CopyLink.php
│ │ ├── DeleteChannel.php
│ │ ├── DeleteComment.php
│ │ ├── DeleteGroup.php
│ │ ├── DeletePost.php
│ │ ├── DeleteReactionSet.php
│ │ ├── DeleteReactionType.php
│ │ ├── DeleteSelf.php
│ │ ├── DeleteStructure.php
│ │ ├── DeleteTag.php
│ │ ├── DeleteTaxonomy.php
│ │ ├── DeleteUser.php
│ │ ├── DismissFlags.php
│ │ ├── EditChannel.php
│ │ ├── EditComment.php
│ │ ├── EditGroup.php
│ │ ├── EditPost.php
│ │ ├── EditReactionSet.php
│ │ ├── EditReactionType.php
│ │ ├── EditStructure.php
│ │ ├── EditTag.php
│ │ ├── EditTaxonomy.php
│ │ ├── EditUser.php
│ │ ├── Follow.php
│ │ ├── Ignore.php
│ │ ├── Link.php
│ │ ├── Lock.php
│ │ ├── MarkAsAnswer.php
│ │ ├── MarkAsRead.php
│ │ ├── MoveToChannel.php
│ │ ├── Pin.php
│ │ ├── React.php
│ │ ├── RemoveComment.php
│ │ ├── Report.php
│ │ ├── RestoreComment.php
│ │ ├── RestorePost.php
│ │ ├── SuspendUser.php
│ │ ├── TrashPost.php
│ │ ├── Unfollow.php
│ │ ├── Unignore.php
│ │ ├── Unlock.php
│ │ └── Unpin.php
│ ├── Api/
│ │ ├── Collections/
│ │ │ └── StructureContentCollection.php
│ │ └── Resources/
│ │ ├── ChannelUsersResource.php
│ │ ├── ChannelsResource.php
│ │ ├── CommentsResource.php
│ │ ├── ExtendableResource.php
│ │ ├── GroupsResource.php
│ │ ├── PagesResource.php
│ │ ├── PostUsersResource.php
│ │ ├── PostsResource.php
│ │ ├── ReactionCountsResource.php
│ │ ├── ReactionSetsResource.php
│ │ ├── ReactionTypesResource.php
│ │ ├── ReactionsResource.php
│ │ ├── StructureHeadingsResource.php
│ │ ├── StructureLinksResource.php
│ │ ├── StructureResource.php
│ │ ├── TagsResource.php
│ │ ├── TaxonomiesResource.php
│ │ └── UsersResource.php
│ ├── Auth/
│ │ ├── AuthenticatesWaterhole.php
│ │ ├── HasWaterholeUser.php
│ │ ├── Providers.php
│ │ ├── SsoPayload.php
│ │ ├── SsoProvider.php
│ │ └── SsoUser.php
│ ├── Console/
│ │ ├── CacheClearCommand.php
│ │ ├── Concerns/
│ │ │ └── ValidatesInput.php
│ │ ├── InstallCommand.php
│ │ ├── MakeExtensionCommand.php
│ │ ├── OpenApiCommand.php
│ │ ├── ReformatCommand.php
│ │ └── stubs/
│ │ └── extension/
│ │ ├── .editorconfig
│ │ ├── .gitattributes
│ │ ├── composer.json
│ │ └── src/
│ │ └── ServiceProvider.stub
│ ├── Database/
│ │ └── Migration.php
│ ├── Events/
│ │ ├── FlagReceived.php
│ │ ├── NewComment.php
│ │ ├── NewPost.php
│ │ └── NotificationReceived.php
│ ├── Extend/
│ │ ├── Api/
│ │ │ ├── ChannelUsersResource.php
│ │ │ ├── ChannelsResource.php
│ │ │ ├── CommentsResource.php
│ │ │ ├── GroupsResource.php
│ │ │ ├── JsonApi.php
│ │ │ ├── PagesResource.php
│ │ │ ├── PostUsersResource.php
│ │ │ ├── PostsResource.php
│ │ │ ├── ReactionSetsResource.php
│ │ │ ├── ReactionTypesResource.php
│ │ │ ├── ReactionsResource.php
│ │ │ ├── StructureHeadingsResource.php
│ │ │ ├── StructureLinksResource.php
│ │ │ ├── StructureResource.php
│ │ │ ├── TagsResource.php
│ │ │ ├── TaxonomiesResource.php
│ │ │ └── UsersResource.php
│ │ ├── Assets/
│ │ │ ├── Locales.php
│ │ │ ├── Script.php
│ │ │ └── Stylesheet.php
│ │ ├── Core/
│ │ │ ├── Actions.php
│ │ │ ├── Formatter.php
│ │ │ ├── NotificationTypes.php
│ │ │ ├── PostFilters.php
│ │ │ └── PostLayouts.php
│ │ ├── Forms/
│ │ │ ├── ChannelForm.php
│ │ │ ├── GroupForm.php
│ │ │ ├── PageForm.php
│ │ │ ├── PostForm.php
│ │ │ ├── ReactionSetForm.php
│ │ │ ├── ReactionTypeForm.php
│ │ │ ├── RegistrationForm.php
│ │ │ ├── StructureLinkForm.php
│ │ │ ├── TagForm.php
│ │ │ ├── TaxonomyForm.php
│ │ │ └── UserForm.php
│ │ ├── Query/
│ │ │ ├── CommentQuery.php
│ │ │ ├── PostFeedQuery.php
│ │ │ └── PostVisibilityScopes.php
│ │ ├── Routing/
│ │ │ ├── ApiRoutes.php
│ │ │ ├── CpRoutes.php
│ │ │ └── ForumRoutes.php
│ │ ├── ServiceProvider.php
│ │ ├── Support/
│ │ │ ├── Assets.php
│ │ │ ├── Attributes.php
│ │ │ ├── ComponentList.php
│ │ │ ├── OrderedList.php
│ │ │ ├── Resource.php
│ │ │ ├── Set.php
│ │ │ └── UnorderedList.php
│ │ └── Ui/
│ │ ├── CommentAttributes.php
│ │ ├── CommentComponent.php
│ │ ├── CpAlerts.php
│ │ ├── CpNav.php
│ │ ├── DocumentHead.php
│ │ ├── IndexPage.php
│ │ ├── Layout.php
│ │ ├── LoginPage.php
│ │ ├── PostAttributes.php
│ │ ├── PostFeed.php
│ │ ├── PostFooter.php
│ │ ├── PostListItem.php
│ │ ├── PostPage.php
│ │ ├── Preferences.php
│ │ ├── TextEditor.php
│ │ ├── UserInfo.php
│ │ ├── UserMenu.php
│ │ └── UserNav.php
│ ├── Feed/
│ │ ├── CommentFeed.php
│ │ ├── Feed.php
│ │ └── PostFeed.php
│ ├── Filters/
│ │ ├── Alphabetical.php
│ │ ├── Filter.php
│ │ ├── Following.php
│ │ ├── Ignoring.php
│ │ ├── Latest.php
│ │ ├── Newest.php
│ │ ├── Oldest.php
│ │ ├── Top.php
│ │ ├── Trash.php
│ │ └── Trending.php
│ ├── Formatter/
│ │ ├── Context.php
│ │ ├── FormatExternalLinks.php
│ │ ├── FormatMentions.php
│ │ ├── FormatUploads.php
│ │ └── Formatter.php
│ ├── Forms/
│ │ ├── ChannelForm.php
│ │ ├── Concerns/
│ │ │ └── ContainsFields.php
│ │ ├── Field.php
│ │ ├── Fields/
│ │ │ ├── ChannelAnswers.php
│ │ │ ├── ChannelApproval.php
│ │ │ ├── ChannelDescription.php
│ │ │ ├── ChannelFilters.php
│ │ │ ├── ChannelIgnore.php
│ │ │ ├── ChannelInstructions.php
│ │ │ ├── ChannelLayout.php
│ │ │ ├── ChannelLayoutCards.php
│ │ │ ├── ChannelLayoutList.php
│ │ │ ├── ChannelName.php
│ │ │ ├── ChannelReactions.php
│ │ │ ├── ChannelSimilarPosts.php
│ │ │ ├── ChannelSlug.php
│ │ │ ├── ChannelTaxonomies.php
│ │ │ ├── GroupAppearance.php
│ │ │ ├── GroupGlobalPermissions.php
│ │ │ ├── GroupName.php
│ │ │ ├── GroupRules.php
│ │ │ ├── GroupStructurePermissions.php
│ │ │ ├── Icon.php
│ │ │ ├── PageBody.php
│ │ │ ├── PageName.php
│ │ │ ├── PageSlug.php
│ │ │ ├── Permissions.php
│ │ │ ├── PostBody.php
│ │ │ ├── PostTags.php
│ │ │ ├── PostTitle.php
│ │ │ ├── ReactionSetDefaults.php
│ │ │ ├── ReactionSetName.php
│ │ │ ├── ReactionTypeName.php
│ │ │ ├── ReactionTypeScore.php
│ │ │ ├── StructureLinkName.php
│ │ │ ├── StructureLinkUrl.php
│ │ │ ├── TagName.php
│ │ │ ├── TaxonomyName.php
│ │ │ ├── TaxonomyOptions.php
│ │ │ ├── UserAvatar.php
│ │ │ ├── UserBio.php
│ │ │ ├── UserEmail.php
│ │ │ ├── UserGroups.php
│ │ │ ├── UserHeadline.php
│ │ │ ├── UserLocation.php
│ │ │ ├── UserName.php
│ │ │ ├── UserPassword.php
│ │ │ ├── UserShowOnline.php
│ │ │ └── UserWebsite.php
│ │ ├── Form.php
│ │ ├── FormSection.php
│ │ ├── GroupForm.php
│ │ ├── PageForm.php
│ │ ├── PostForm.php
│ │ ├── ReactionSetForm.php
│ │ ├── ReactionTypeForm.php
│ │ ├── RegistrationForm.php
│ │ ├── StructureLinkForm.php
│ │ ├── TagForm.php
│ │ ├── TaxonomyForm.php
│ │ ├── UserForm.php
│ │ └── UserProfileForm.php
│ ├── Http/
│ │ ├── Controllers/
│ │ │ ├── ActionsController.php
│ │ │ ├── Api/
│ │ │ │ └── ApiController.php
│ │ │ ├── Auth/
│ │ │ │ ├── ConfirmPasswordController.php
│ │ │ │ ├── ForgotPasswordController.php
│ │ │ │ ├── LoginController.php
│ │ │ │ ├── LogoutController.php
│ │ │ │ ├── RegisterController.php
│ │ │ │ ├── ResetPasswordController.php
│ │ │ │ ├── SsoController.php
│ │ │ │ └── VerifyEmailController.php
│ │ │ ├── Controller.php
│ │ │ ├── Cp/
│ │ │ │ ├── ChannelController.php
│ │ │ │ ├── DashboardController.php
│ │ │ │ ├── GroupController.php
│ │ │ │ ├── PageController.php
│ │ │ │ ├── ReactionSetController.php
│ │ │ │ ├── ReactionTypeController.php
│ │ │ │ ├── StructureController.php
│ │ │ │ ├── StructureHeadingController.php
│ │ │ │ ├── StructureLinkController.php
│ │ │ │ ├── TagController.php
│ │ │ │ ├── TaxonomyController.php
│ │ │ │ └── UserController.php
│ │ │ ├── FormatController.php
│ │ │ ├── Forum/
│ │ │ │ ├── CommentController.php
│ │ │ │ ├── IndexController.php
│ │ │ │ ├── ModerationController.php
│ │ │ │ ├── NotificationController.php
│ │ │ │ ├── PostController.php
│ │ │ │ ├── PreferencesController.php
│ │ │ │ ├── RssController.php
│ │ │ │ ├── SearchController.php
│ │ │ │ └── UserController.php
│ │ │ ├── ImpersonateController.php
│ │ │ ├── UploadController.php
│ │ │ └── UserLookupController.php
│ │ └── Middleware/
│ │ ├── ActorSeen.php
│ │ ├── AuthGuard.php
│ │ ├── Authenticate.php
│ │ ├── AuthenticateWaterhole.php
│ │ ├── ContactOutpost.php
│ │ ├── Localize.php
│ │ ├── MaybeRequireLogin.php
│ │ ├── MaybeRequirePassword.php
│ │ ├── PoweredByHeader.php
│ │ ├── RedirectIfAuthenticated.php
│ │ ├── StartSession.php
│ │ └── VerifyCsrfToken.php
│ ├── Layouts/
│ │ ├── CardsLayout.php
│ │ ├── Layout.php
│ │ └── ListLayout.php
│ ├── Licensing/
│ │ ├── LicenseManager.php
│ │ └── Outpost.php
│ ├── Listeners/
│ │ └── ReverifyInactiveUser.php
│ ├── Mail/
│ │ └── Markdown.php
│ ├── Models/
│ │ ├── Attributes/
│ │ │ └── FileAttribute.php
│ │ ├── AuthProvider.php
│ │ ├── Channel.php
│ │ ├── ChannelUser.php
│ │ ├── Comment.php
│ │ ├── Concerns/
│ │ │ ├── Approvable.php
│ │ │ ├── Deletable.php
│ │ │ ├── Flaggable.php
│ │ │ ├── Followable.php
│ │ │ ├── HasBody.php
│ │ │ ├── HasFileAttributes.php
│ │ │ ├── HasIcon.php
│ │ │ ├── HasPermissions.php
│ │ │ ├── HasUserState.php
│ │ │ ├── NotificationContent.php
│ │ │ ├── Reactable.php
│ │ │ ├── ReceivesPermissions.php
│ │ │ ├── Structurable.php
│ │ │ ├── UsesFormatter.php
│ │ │ └── ValidatesData.php
│ │ ├── Flag.php
│ │ ├── Group.php
│ │ ├── Model.php
│ │ ├── Notification.php
│ │ ├── Page.php
│ │ ├── Permission.php
│ │ ├── PermissionCollection.php
│ │ ├── Post.php
│ │ ├── PostUser.php
│ │ ├── Reaction.php
│ │ ├── ReactionSet.php
│ │ ├── ReactionType.php
│ │ ├── Structure.php
│ │ ├── StructureHeading.php
│ │ ├── StructureLink.php
│ │ ├── Support/
│ │ │ └── MorphTypeCache.php
│ │ ├── Tag.php
│ │ ├── Taxonomy.php
│ │ ├── Upload.php
│ │ └── User.php
│ ├── Notifications/
│ │ ├── ContentApproved.php
│ │ ├── ContentRemoved.php
│ │ ├── DatabaseChannel.php
│ │ ├── Mention.php
│ │ ├── NewComment.php
│ │ ├── NewFlag.php
│ │ ├── NewPost.php
│ │ ├── Notification.php
│ │ ├── ResetPassword.php
│ │ └── VerifyEmail.php
│ ├── Policies/
│ │ ├── CommentPolicy.php
│ │ ├── PostPolicy.php
│ │ └── UserPolicy.php
│ ├── Providers/
│ │ ├── ApiServiceProvider.php
│ │ ├── AppServiceProvider.php
│ │ ├── AuthServiceProvider.php
│ │ ├── BroadcastServiceProvider.php
│ │ ├── ConsoleServiceProvider.php
│ │ ├── EventServiceProvider.php
│ │ ├── FormatterServiceProvider.php
│ │ ├── MailServiceProvider.php
│ │ ├── RouteServiceProvider.php
│ │ ├── SearchServiceProvider.php
│ │ ├── TranslationServiceProvider.php
│ │ ├── ViewServiceProvider.php
│ │ └── WaterholeServiceProvider.php
│ ├── Scopes/
│ │ ├── CommentIndexScope.php
│ │ └── PermittedScope.php
│ ├── Search/
│ │ ├── EngineInterface.php
│ │ ├── FullTextSearchEngine.php
│ │ ├── Highlighter.php
│ │ ├── Hit.php
│ │ ├── Results.php
│ │ └── Searcher.php
│ ├── Translation/
│ │ ├── FluentTranslator.php
│ │ └── ValidationTranslator.php
│ ├── View/
│ │ ├── Components/
│ │ │ ├── ActionButton.php
│ │ │ ├── ActionButtons.php
│ │ │ ├── ActionForm.php
│ │ │ ├── ActionMenu.php
│ │ │ ├── Alert.php
│ │ │ ├── Attribution.php
│ │ │ ├── AuthButtons.php
│ │ │ ├── Avatar.php
│ │ │ ├── Cancel.php
│ │ │ ├── ChannelLabel.php
│ │ │ ├── ChannelPicker.php
│ │ │ ├── CollapsibleNav.php
│ │ │ ├── CommentAnswerBadge.php
│ │ │ ├── CommentFrame.php
│ │ │ ├── CommentFull.php
│ │ │ ├── CommentMarkAsAnswer.php
│ │ │ ├── CommentReactions.php
│ │ │ ├── CommentReplies.php
│ │ │ ├── CommentReplyButton.php
│ │ │ ├── CommentsLocked.php
│ │ │ ├── Composer.php
│ │ │ ├── Concerns/
│ │ │ │ └── Streamable.php
│ │ │ ├── Cp/
│ │ │ │ ├── ColorPicker.php
│ │ │ │ ├── IconPicker.php
│ │ │ │ ├── PermissionGrid.php
│ │ │ │ ├── StructureNode.php
│ │ │ │ ├── TagRow.php
│ │ │ │ └── Version.php
│ │ │ ├── Cp.php
│ │ │ ├── Dialog.php
│ │ │ ├── EmailVerification.php
│ │ │ ├── FeedFilters.php
│ │ │ ├── FeedTopPeriod.php
│ │ │ ├── Field.php
│ │ │ ├── FlagContainer.php
│ │ │ ├── FlagSummary.php
│ │ │ ├── FollowButton.php
│ │ │ ├── GroupBadge.php
│ │ │ ├── Header.php
│ │ │ ├── HeaderBreadcrumb.php
│ │ │ ├── HeaderGuest.php
│ │ │ ├── HeaderModeration.php
│ │ │ ├── HeaderNotifications.php
│ │ │ ├── HeaderSearch.php
│ │ │ ├── HeaderTitle.php
│ │ │ ├── HeaderUser.php
│ │ │ ├── Html.php
│ │ │ ├── Index.php
│ │ │ ├── IndexCreatePost.php
│ │ │ ├── IndexFooter.php
│ │ │ ├── IndexFooterLanguage.php
│ │ │ ├── IndexNav.php
│ │ │ ├── InfiniteScroll.php
│ │ │ ├── Layout.php
│ │ │ ├── MenuDivider.php
│ │ │ ├── MenuItem.php
│ │ │ ├── ModerationBadge.php
│ │ │ ├── NavHeading.php
│ │ │ ├── NavLink.php
│ │ │ ├── Notification.php
│ │ │ ├── NotificationAlert.php
│ │ │ ├── NotificationsBadge.php
│ │ │ ├── PinnedPost.php
│ │ │ ├── PostActivity.php
│ │ │ ├── PostAnswer.php
│ │ │ ├── PostAnswered.php
│ │ │ ├── PostAttribution.php
│ │ │ ├── PostCard.php
│ │ │ ├── PostChannel.php
│ │ │ ├── PostFeed.php
│ │ │ ├── PostFeedChannel.php
│ │ │ ├── PostFeedPinned.php
│ │ │ ├── PostFeedToolbar.php
│ │ │ ├── PostFull.php
│ │ │ ├── PostListItem.php
│ │ │ ├── PostLocked.php
│ │ │ ├── PostNotifications.php
│ │ │ ├── PostReactions.php
│ │ │ ├── PostReactionsCondensed.php
│ │ │ ├── PostReplies.php
│ │ │ ├── PostSidebar.php
│ │ │ ├── PostTagsSummary.php
│ │ │ ├── PostTitle.php
│ │ │ ├── PostTrash.php
│ │ │ ├── PostUnread.php
│ │ │ ├── ReactionSetPicker.php
│ │ │ ├── Reactions.php
│ │ │ ├── ReactionsCondensed.php
│ │ │ ├── RelativeTime.php
│ │ │ ├── RemovedBanner.php
│ │ │ ├── Selector.php
│ │ │ ├── Spacer.php
│ │ │ ├── Spinner.php
│ │ │ ├── TagsFilter.php
│ │ │ ├── TextEditor.php
│ │ │ ├── TextEditorButton.php
│ │ │ ├── TextEditorEmojiButton.php
│ │ │ ├── ThemeSelector.php
│ │ │ ├── UserGroups.php
│ │ │ ├── UserJoined.php
│ │ │ ├── UserLabel.php
│ │ │ ├── UserLastSeen.php
│ │ │ ├── UserLink.php
│ │ │ ├── UserLocation.php
│ │ │ ├── UserProfile.php
│ │ │ ├── UserWebsite.php
│ │ │ └── ValidationErrors.php
│ │ └── TurboStream.php
│ ├── Waterhole.php
│ ├── Widgets/
│ │ ├── Feed.php
│ │ ├── GettingStarted.php
│ │ └── LineChart.php
│ └── helpers.php
├── tests/
│ ├── Feature/
│ │ ├── ExtendActionsTest.php
│ │ ├── ExtendApiTest.php
│ │ ├── ExtendAssetsTest.php
│ │ ├── ExtendCoreTest.php
│ │ ├── ExtendFormsTest.php
│ │ ├── ExtendQueryTest.php
│ │ ├── ExtendRoutingTest.php
│ │ ├── ExtendUiTest.php
│ │ ├── JsonApiTest.php
│ │ ├── Permissions/
│ │ │ ├── CommentPermissionsTest.php
│ │ │ ├── GlobalPermissionsTest.php
│ │ │ ├── PostPermissionsTest.php
│ │ │ ├── StructurePermissionsTest.php
│ │ │ └── UserPermissionsTest.php
│ │ ├── SearchTest.php
│ │ └── SeoTest.php
│ ├── Pest.php
│ └── TestCase.php
├── tsconfig.json
└── tsdown.config.ts
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[*.yml]
indent_size = 2
[*.css]
indent_size = 2
================================================
FILE: .gitattributes
================================================
* text=auto
CHANGELOG.md export-ignore
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug Report
description: Fill out a bug report about something that's broken.
body:
- type: textarea
attributes:
label: Bug description
description: What happened? What did you expect to happen? Feel free to drop any screenshots in here.
placeholder: I did this, and then this happened...
validations:
required: true
- type: textarea
attributes:
label: Steps to reproduce
description: List the steps so we're able to recreate this bug. If possible, please provide a GitHub repository to demonstrate your issue.
placeholder: Go here, type this, click that, look over there.
validations:
required: true
- type: textarea
attributes:
label: Logs
description: You can paste any relevant logs here, they'll be automatically rendered in code blocks. You can find your logs in `storage/logs`.
render: shell
- type: textarea
attributes:
label: Environment
description: |
Details about your environment. Versions of Waterhole, PHP, Laravel, any extensions that are installed, etc.
Paste the output of the `php artisan about --only=environment` command.
render: yaml
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Feature Requests and Ideas
url: https://waterhole.dev/community/channels/ideas
about: 'Please submit feature requests to the Ideas channel in our community.'
- name: Support Questions & Other
url: https://waterhole.dev/support
about: 'This repository is only for reporting bugs. If you have a question or need help using Waterhole, see our support page.'
- name: Documentation Issue
url: https://github.com/waterholeforum/docs
about: For documentation issues, open a pull request at the waterholeforum/docs repository.
================================================
FILE: .github/SECURITY.md
================================================
# Security Policy
## Reporting a Vulnerability
If you discover a security vulnerability, please report the issue directly to us from [waterhole.dev/support](https://waterhole.dev/support). We will review and respond privately via email. All security vulnerabilities will be promptly addressed.
We are only interested in vulnerabilities that affect Waterhole itself, tested against your own local installation of the software, running the latest version. You can install a local copy of Waterhole by following these [installation instructions](https://waterhole.dev/docs/installation). Do not test against any Waterhole installation that you don't own, including waterhole.dev.
================================================
FILE: .github/workflows/build-assets.yml
================================================
name: Build Assets
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
cache: true
- name: Build
run: |
pnpm i
pnpm build
- name: Commit
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: 'Build assets'
file_pattern: resources/dist/*
================================================
FILE: .github/workflows/phpstan.yml
================================================
name: PHPStan
on: [push, pull_request]
jobs:
phpstan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
coverage: none
- name: Install dependencies
run: composer install --prefer-dist
- name: Run PHPStan
run: vendor/bin/phpstan analyze
================================================
FILE: .github/workflows/prettier.yml
================================================
name: Prettier
on: [push, pull_request]
jobs:
prettier:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v3
with:
# Make sure the actual branch is checked out when running on pull requests
ref: ${{ github.head_ref }}
fetch-depth: 0
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
cache: true
- name: Build
run: |
pnpm i
pnpm prettier
- name: Commit changes
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Run Prettier
branch: ${{ github.head_ref }}
================================================
FILE: .github/workflows/stale.yml
================================================
name: Close Stale Issues
on:
workflow_dispatch:
schedule:
- cron: '30 1 * * *'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v7
with:
only-labels: 'needs more info'
stale-issue-label: stale
stale-issue-message: >
This issue has not had recent activity and has been marked as stale.
Reply to keep it open – otherwise I will close it in a week.
================================================
FILE: .github/workflows/tests.yml
================================================
name: Tests
on: [push, pull_request]
jobs:
tests:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8.0
env:
MYSQL_ALLOW_EMPTY_PASSWORD: yes
MYSQL_DATABASE: waterhole_test
ports:
- 33306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
strategy:
fail-fast: true
matrix:
php: [8.2, 8.3, 8.4]
name: PHP ${{ matrix.php }}
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none
- name: Install dependencies
run: composer update --prefer-dist --no-interaction --no-progress
- name: Run tests
run: vendor/bin/pest
env:
DB_PORT: ${{ job.services.mysql.ports[3306] }}
DB_USERNAME: root
================================================
FILE: .gitignore
================================================
.phpunit.cache
node_modules
/vendor
composer.lock
.DS_Store
Thumbs.db
.idea
.fleet
.vscode
.phpunit.result.cache
================================================
FILE: .prettierignore
================================================
config
node_modules
resources/dist
resources/views/mail
vendor
================================================
FILE: .prettierrc
================================================
{
"singleQuote": true,
"phpVersion": "8.1",
"plugins": ["@prettier/plugin-php", "prettier-plugin-blade"],
"overrides": [
{
"files": ["*.blade.php"],
"options": {
"parser": "blade"
}
},
{
"files": ["*.php"],
"options": {
"printWidth": 100
}
},
{
"files": ["*.css"],
"options": {
"parser": "less"
}
}
]
}
================================================
FILE: .release-it.yml
================================================
npm: false
git:
commitMessage: 'Release v${version}'
tagName: v${version}
github:
release: true
releaseName: v${version}
plugins:
'@release-it/bumper':
out:
file: src/Waterhole.php
type: text/php
'@release-it/keep-a-changelog':
filename: CHANGELOG.md
addVersionUrl: true
addUnreleased: true
hooks:
after:bump: pnpm build
after:release:
'curl -f -X POST --location "https://api.waterhole.dev/releases"
-H "Content-Type: application/json"
-H "Accept: application/json"
-H "Authorization: Bearer $WATERHOLE_TOKEN"
-d "{\"version\": \"${version}\"}"'
================================================
FILE: CHANGELOG.md
================================================
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- Add support for Laravel 13
### Removed
- Remove unused Workbench setup from the package Testbench configuration
## [0.6.2] - 2026-02-15
### Fixed
- Fix dismiss flag action authorization check
- Bypass global visibility scope in CLI/queue workers
## [0.6.1] - 2026-02-09
### Changed
- Switch discussion structured data on post/comment pages from JSON-LD to Microdata
### Fixed
- Fix migration using wrong database connection ([#100](https://github.com/waterholeforum/core/pull/100))
- Fix discussion structured data to include required forum fields (`author`, `datePublished`, `text`)
- Fix channel page SEO description containing HTML
- Filter out empty search results for posts that are not visible to the current user
- Fix strict flag eager loading error for non-moderators
- Fall back to the app default database connection when a Waterhole connection is not configured
## [0.6.0] - 2026-01-31
### ⚠️ Breaking Changes
- Replace public comment hiding with moderator-only soft-deletion
- Rename `PostScopes` extender to `PostVisibilityScopes`
### Added
- Add basic SEO, including meta descriptions, Open Graph tags, Twitter card tags, JSON-LD structured data, and nofollow rules configurable in `waterhole.seo` config
- Add user reports and moderator flag queue
- Allow groups and channels to require moderator approval for new posts/comments
- Allow groups to be auto-assigned to new users
- Add comment soft-deletion with ability to select a reason and message
- Add "Suspend users" permission for groups
- Add configurable post/comment edit time limit (`waterhole.forum.edit_time_limit`)
- Allow configuring permissions for the built-in Public and Member groups
- Allow configuring the appearance of the built-in Admin group badge
- Add support for SVG icon file uploads
- Add MariaDB, PostgreSQL, and SQLite database support
- Add support for Reverb as the broadcasting driver
- Allow disabling reactions per-channel
- Allow configuring uploads (`waterhole.uploads.disk`) and assets (`waterhole.system.assets_disk`) disks
- Add support for SSO `PendingUser::forceName` option
- Add success message to copy link action
- Add confirmation for Composer repository addition in `waterhole:make:extension`
- Add `CommentQuery` extender for comment list queries
- Allow configuring search engine via `waterhole.system.search_engine`
- Improve version number display in CP
- Add a "last" pagination link in sidebar while reading post
### Changed
- Use `DateTimeInterface` to support `CarbonImmutable` dates ([#88](https://github.com/waterholeforum/core/pulls/88) by @BasilLangevin)
- Various styling tweaks
- Migrate asset pipeline to `tsdown`
- Upgrade to Turbo 8
- Replace `inclusive-sort` with `dnd-kit` for sortable UI
- Upgrade Intervention Image to 3.x
- Use cursor pagination for notifications list
- Move license alert to more prominent location on CP dashboard
- Rename `PostScopes` extender to `PostVisibilityScopes`
### Fixed
- Improve compatibility with Statamic ([#82](https://github.com/waterholeforum/core/issues/82))
- Fix actions dropdown for trashed posts ([#89](https://github.com/waterholeforum/core/issues/89))
- Fix MariaDB crash due to mixed types in notification queries ([#90](https://github.com/waterholeforum/core/pulls/90) by @iamdarkle)
- Fix crash when saving a new channel with taxonomies ([#91](https://github.com/waterholeforum/core/pulls/91) by @iamdarkle)
- Fix crash when using table prefix ([#94](https://github.com/waterholeforum/core/issues/94))
- Retain tags when switching filters on the post feed
- Fix flash alerts sometimes not displaying
- Sort trashed items by latest deleted date
- Fix crash when viewing content that mentions a deleted user
- Fix edit user submission returning to actions menu route
- Fix modal backdrop persisting when `prefers-reduced-motion` is enabled
### Security
- Fix an XSS vulnerability
- Fix JSON:API exposing sensitive user information
## [0.5.0] - 2026-01-02
### ⚠️ Breaking Changes
- Refresh the extension API with new namespaces and container-resolved extenders
- Replace `reactionsSummary()` with `reactionCounts()` for reaction totals and user-reacted state
### Added
- Add a read-only JSON:API for forum data with includes, sorting, filtering, and pagination
- Add API configuration for enabling, public/private access, and path in `config/waterhole/api.php`
- Add `waterhole:openapi` commmand to generate an OpenAPI schema for the API
### Changed
- Rely on Laravel core for the `Registered` event email verification listener
- Add `Waterhole::isApiRoute()` and route-name based checks for forum/CP detection
### Fixed
- Fix permission lookups when IDs are returned as strings in some databases
- Avoid loading `userState` relationship for guests
- Fix PHP 8.4 deprecation warning
## [0.4.12] - 2025-04-23
### Fixed
- Fix incorrect RSS feed `pubDate` for unedited posts
## [0.4.11] - 2025-04-21
### Added
- Add support for Laravel 12
- Add descriptive error message for CSRF token expiry ([#73](https://github.com/waterholeforum/core/issues/73))
### Fixed
- Fix taxonomies not being assignable by non-admins ([#75](https://github.com/waterholeforum/core/issues/75))
- Fix error when sending non-Waterhole notifications ([#79](https://github.com/waterholeforum/core/issues/79))
- Fix `FluentTranslator` not forwarding macros calls ([#81](https://github.com/waterholeforum/core/pull/81) by @jacksleight)
- Prevent post page sidebar width from changing
- Fix MariaDB `ONLY_FULL_GROUP_BY` error
- Fix HTML entities in notification email subjects
## [0.4.10] - 2024-10-03
### Fixed
- Fix some search queries causing a server error
- Fix formatter rendering cache error when Waterhole is run across multiple servers
## [0.4.9] - 2024-05-16
### Fixed
- Fix redirecting to incorrect URL when there is a sole auth provider
- Fix lazy loading error in some reaction configurations
- Fix broken Dutch localization ([#77](https://github.com/waterholeforum/core/pull/77) by @Emmanuel71git)
## [0.4.8] - 2024-04-16
### Added
- Add support for Laravel 11
### Fixed
- Fix "show more" rendering incorrectly on Firefox ([#64](https://github.com/waterholeforum/core/issues/64))
- Fix videos having no max width
- Fix emojis appearing full-width in notification emails ([#67](https://github.com/waterholeforum/core/issues/67))
- Fix PHP deprecation error ([#69](https://github.com/waterholeforum/core/issues/69))
## [0.4.7] - 2024-03-17
### Added
- Add PHP 8.3 compatibility ([#62](https://github.com/waterholeforum/core/pull/62) by @saturnphp)
- Add Dutch translation ([#60](https://github.com/waterholeforum/core/pull/60) by @Emmanuel71)
### Fixed
- Fix Chrome bug where textarea scrolls the viewport when selecting text
- Fix post slug mutation when title is highlighted in search results
- Fix icons displaying incorrectly with latest version of `blade-tabler-icons` ([#63](https://github.com/waterholeforum/core/issues/63))
## [0.4.6] - 2024-02-02
### Fixed
- Fix compatibility with `Model::shouldBeStrict()` ([#56](https://github.com/waterholeforum/core/issues/56))
- Fall back to base translator when using translation string keys ([#57](https://github.com/waterholeforum/core/pull/57) by @dsturm)
- Fall back to resource directory for missing translation bundle ([#58](https://github.com/waterholeforum/core/pull/58) by @dsturm)
## [0.4.5] - 2024-01-31
### Fixed
- Fix incorrect database connection being used in some cases
- Fix success message not appearing after change email/password
## [0.4.4] - 2024-01-30
### Fixed
- Fix an issue with Laravel auth integration causing user to be logged out after registration
## [0.4.3] - 2024-01-26
### Fixed
- Fix incorrect database connection being used in some cases ([#55](https://github.com/waterholeforum/core/issues/55))
## [0.4.2] - 2023-12-31
### Fixed
- Fix issues with Laravel integration ([#53](https://github.com/waterholeforum/core/issues/53))
- Add missing translations for CP reactions
## [0.4.1] - 2023-12-24
### Fixed
- Fix auth routes using incorrect path ([#51](https://github.com/waterholeforum/core/issues/51))
- Fix reactions not working due to incorrect permission check
- Fix error when sending notification to unverified email
## [0.4.0] - 2023-12-23
### ⚠️ Breaking Changes
- `waterhole.auth.oauth_providers` config key renamed to `waterhole.auth.providers`
- `.oauth-button` class renamed to `.auth-button`
- `<x-waterhole::oauth-buttons>` component renamed to `<x-waterhole::auth-buttons>`
- `Waterhole\OAuth\Payload` class renamed to `Waterhole\Auth\SsoPayload`
- Waterhole Gate abilities are now prefixed with `waterhole.`
- Waterhole routes no longer use the `web` route middleware group
### Added
- New `sso` auth provider to support custom single sign-on flows
- Auth guard used by Waterhole requests can be configured by setting `waterhole.auth.guard`
- Database connection can be configured by setting `waterhole.system.database`
- Route domain can be configured by settings `waterhole.system.domain`
- Support implicit authentication from existing user base by implementing `Waterhole\Auth\AuthenticatesWaterhole` interface
- Automatically create the formatter and translation cache directories if they don't exist
- Laravel Socialite is now included by default
- Update Traditional Chinese (zh-Hant) translation ([#48](https://github.com/waterholeforum/core/pull/48) by @efast1568)
### Changed
- If there is a single auth provider and passwords are disabled, the login and registration pages will now automatically redirect to the provider
- Add color to inline code spans
- Reduce size of the Create Post button
- Waterhole routes no longer rely on app-aliased middleware
### Fixed
- Fix the forum URL shown at the end of the installation command
- Fix emoji picker inserting emoji multiple times after navigations
- Fix "last reply" link to jump to the last comment instead of below it
- Fix CP users table pagination/sorting links
- Only send notifications to verified email addresses
## [0.3.2] - 2023-12-02
### Added
- Show comment button in post footer on mobile
### Fixed
- Fix comment composer being unreachable on mobile ([#44](https://github.com/waterholeforum/core/issues/44))
- Prevent composer re-appearing on page reload after it has been closed ([#46](https://github.com/waterholeforum/core/issues/46))
- Fix comment composer not clearing after submission
- Prevent unnecessary post page load when jumping to page 1
- Only configure Laravel Echo if Pusher is configured
- Fix entire page scrolling when navigating through @mention suggestions
## [0.3.1] - 2023-11-17
### Added
- Add Traditional Chinese (zh-Hant) translation ([#8](https://github.com/waterholeforum/core/pull/8) by @efast1568)
- Update French translation ([#14](https://github.com/waterholeforum/core/pull/14) by @qiaeru)
### Changed
- Load reaction counts as a relationship rather than via query scopes
### Fixed
- Fix reactions disappearing when following/unfollowing a post
- Opt out of smooth scrolling on Google Chrome
- Fix Copy Link action not working
- Disable login submit button to prevent double-submission
- Fix mobile page selector sometimes displaying incorrect page number
- Fix active nav items and buttons not highlighted in Firefox
- Remove `max-height` from images causing loss of aspect ratio
- Remove extra space from post title on comment page
- Fix post Delete Forever action not working
- Fix crawlers causing 500 error with invalid pagination cursor
- Don't scroll all the way to bottom of the page when opening composer
## [0.3.0] - 2023-07-31
### Added
- Show recent commenters and original poster in @mention suggestions
- Add ability to pin posts to top of feed
- Add ability to hide comments
- Show links in channel picker when creating post
- Get a "mention" notification when someone replies to your comment
- Add a comment button in the post sidebar
- Add ability to soft-delete posts
- Add `.btn--start` and `.btn--end` classes
- Add `--color-fill-soft` token and `.bg-fill-soft` utility
### Changed
- Use more compact layout for comments on small screens
- Use color to make search result keyword highlights more prominent
- Clamp `--space-gutter` between `lg` and `xl`
- Reduce default number of posts/comments per page to improve performance
- Optimize performance of avatar component
- Lazy-load the list of reaction users to improve performance
- Lazy-load action menus to improve performance
- Make "Automatically follow posts I comment on" preference also follow posts you create
- Limit one notification per user per new comment
- Change from idiomorph to nanomorph (due to buggy behavior with some attributes of old nodes remaining)
- Refactored the way Turbo Frames show loading spinners - using CSS instead of HTML
### Removed
- Remove unread badge from channel navigation items to improve performance
- Remove greeting and subcopy from verify email/reset password emails
- Remove unnecessary action button `title` attribute ([#21](https://github.com/waterholeforum/core/issues/21))
### Fixed
- Fix emoji alignment in reactions menu
- Highlight code blocks in streamed content
- Fix unread posts sometimes jumping to the incorrect page
- Don't globally override pagination views which is problematic on Octane
- Fix default layout for Announcements channel
- Fix avatar display for UTF-8 usernames
- Fix highlighting UTF-8 characters and phrases in search results ([#12](https://github.com/waterholeforum/core/issues/12), [#25](https://github.com/waterholeforum/core/issues/25))
- Fix color picker disappearing on Chrome ([#15](https://github.com/waterholeforum/core/issues/15))
- Fix fetch error alerts not showing in some cases, and allow them to disappear
- Fix email verification alert layout
- Fix comment index being incorrectly calculated in some cases
- Fix composer not disappearing after submitting comment
- Encode UTF-8 symbols in CSS files
- Fix other users' notifications getting marked as read
- Remove whitespace in user links
- Fix not being able to edit comments on lazy-loaded pages ([#24](https://github.com/waterholeforum/core/issues/24))
- Add missing translations ([#22](https://github.com/waterholeforum/core/issues/22))
- Fix copy link action being run multiple times ([#20](https://github.com/waterholeforum/core/issues/20))
- Fix composer overlapping header on small screens ([#19](https://github.com/waterholeforum/core/issues/19))
## [0.2.0] - 2023-05-30
### Added
- Add Russian translation ([#2](https://github.com/waterholeforum/core/pull/2) by @Awilum)
- Add French translation ([#5](https://github.com/waterholeforum/core/pull/5) by @qiaeru)
- Add support for looking up users by ID
- Make post last activity time link to the last comment
- Set the `color-scheme` CSS property according to the current theme
- Add `waterhole:reformat` command to reparse formatted content
- Add `body_text` getter to `Post` and `Comment` to get plain-text version of the body
- Add `waterhole.design.emoji_url` config option to configure TextFormatter emoji rendering
### Changed
- Use TextFormatter to render emoji instead of php-twemoji
- Don't open internal links in a new window
- Adjust container width and typographic measure
- Decrease padding on nested comments
- Change default sort for users table to last created
- Display more dates using relative time component
- Stop using deprecated `micro` format for relative times
- Rename `time-ago` component to `relative-time`
- Rename `.twemoji` class to `.emoji`
### Removed
- Remove `Waterhole\Extend\Emoji` class
- Remove `waterhole.design.twemoji_base` config option
- Remove Twemoji rendering in the emoji picker for now
- Remove unused HTML truncation utils
### Fixed
- Fix text editor emoji popup not displaying
- Fix a JavaScript error on posts with no comments
- Fix untranslated variable in resend confirmation email message ([#4](https://github.com/waterholeforum/core/pull/4) by @askerakbar)
- Fix error when running `waterhole:make:extension` command ([#6](https://github.com/waterholeforum/core/issues/6))
- Emojify the post title on the single comment page
- Allow code blocks to wrap in notification emails
- Fix bottom of composer textarea going off-screen
- Remove top border from first comment
- Remove height limit on comment preview tooltips
- Prevent crashing if database content contains invalid XML
- Fix localization of dates
### Security
- Fix an XSS vulnerability where HTML could be injected into emojified text
## [0.1.1] - 2023-05-23
### Fixed
- Fix license error alert incorrectly appearing in trial mode.
## [0.1.0] - 2023-05-23
Initial release.
[Unreleased]: https://github.com/waterholeforum/core/compare/v0.6.2...HEAD
[0.6.2]: https://github.com/waterholeforum/core/compare/v0.6.1...v0.6.2
[0.6.1]: https://github.com/waterholeforum/core/compare/v0.6.0...v0.6.1
[0.6.0]: https://github.com/waterholeforum/core/compare/v0.5.0...v0.6.0
[0.5.0]: https://github.com/waterholeforum/core/compare/v0.4.12...v0.5.0
[0.4.12]: https://github.com/waterholeforum/core/compare/v0.4.11...v0.4.12
[0.4.11]: https://github.com/waterholeforum/core/compare/v0.4.10...v0.4.11
[0.4.10]: https://github.com/waterholeforum/core/compare/v0.4.9...v0.4.10
[0.4.9]: https://github.com/waterholeforum/core/compare/v0.4.8...v0.4.9
[0.4.8]: https://github.com/waterholeforum/core/compare/v0.4.7...v0.4.8
[0.4.7]: https://github.com/waterholeforum/core/compare/v0.4.6...v0.4.7
[0.4.6]: https://github.com/waterholeforum/core/compare/v0.4.5...v0.4.6
[0.4.5]: https://github.com/waterholeforum/core/compare/v0.4.4...v0.4.5
[0.4.4]: https://github.com/waterholeforum/core/compare/v0.4.3...v0.4.4
[0.4.3]: https://github.com/waterholeforum/core/compare/v0.4.2...v0.4.3
[0.4.2]: https://github.com/waterholeforum/core/compare/v0.4.1...v0.4.2
[0.4.1]: https://github.com/waterholeforum/core/compare/v0.4.0...v0.4.1
[0.4.0]: https://github.com/waterholeforum/core/compare/v0.3.2...v0.4.0
[0.3.2]: https://github.com/waterholeforum/core/compare/v0.3.1...v0.3.2
[0.3.1]: https://github.com/waterholeforum/core/compare/v0.3.0...v0.3.1
[0.3.0]: https://github.com/waterholeforum/core/compare/v0.2.0...v0.3.0
[0.2.0]: https://github.com/waterholeforum/core/compare/v0.1.1...v0.2.0
[0.1.1]: https://github.com/waterholeforum/core/compare/v0.1.0...v0.1.1
[0.1.0]: https://github.com/waterholeforum/core/releases/tag/v0.1.0
================================================
FILE: LICENSE.md
================================================
# Waterhole Software Licence Agreement
1. **The Software:** This licence agreement relates to the software program known as 'Waterhole' including any updates that have been incorporated in the software program ("Software").
2. **Copyright and Licence:** The copyright in the Software is owned by Waterhole Pty Ltd (Australian Business Number 69 667 084 577) ("Waterhole"). Waterhole permits any person to use the Software, but only on the terms of this licence agreement.
3. **Free Trial:** Any person may use the Software in an environment that is purely for the purposes of development and client preview, and only accessible by a restricted number of users (like on a personal computer, on a server in a network with restricted access, or when protecting a staging website with a password that only a restricted number of users know).
4. **Production Licence:** Any person wishing to use the Software in a live, usable operation for the intended end users ("Production Environment") is required to either:
(a) have purchased a licence ("Licensee") to use the Software in a Production Environment from Waterhole ("Production Licence"); or
(b) be an officer, employee, agent, contractor, representative or affiliate of the Licensee who has been authorised to use the Software by the Licensee ("Authorised User").
Any use of the Software under a Production Licence is subject to any restrictions or additional terms advised to the Licensee at the time the Production Licence is purchased (“Scope of the Licence”). Where the Scope of the Licence is inconsistent with the terms of this licence agreement, the Scope of the Licence will prevail over the terms of this licence agreement to the extent of that inconsistency.
The Licensee must ensure that its Authorised Users are aware of the terms of this licence agreement and the Scope of the Licence.
5. **Single Project:** The Licensee and its Authorised Users may only use the Software for its intended purposes, for a single project at a time and in a single Production Environment at a time.
6. **Copying and Distribution:** Any person accessing or using the Software is not permitted to copy, reproduce, merge, publish and/or distribute the Software, unless that person is:
(a) a Licensee or an Authorised User deploying a website to a server under a Production Licence; or
(b) copying the Software when developing a website on a personal computer or server; or
(c) copying the Software when working on code contributions to be made available to Waterhole; or
(d) copying the Software as a backup; or
(e) a Licensee or Authorised User making the Software available to third parties via a Software-as-a-Service (SaaS) offering, provided that a separate Production Licence is purchased for each separate project or separate client.
All proprietary notices and this licence agreement shall be included in all copies or substantial portions of the Software.
7. **Alteration of Software:** Any person may alter, modify or extend the Software. However, they may not:
(a) alter or circumvent the licensing features, including (but not limited to) the licence validation and payment prompts; or
(b) resell, redistribute or transfer the modified or derivative version.
8. **Not For Reuse:** The Software and the proprietary code therein, including (but not limited to) designs, components, classes, and patterns, may not be reused in other software or projects.
9. **No Illegal or Immoral Use:** The Software may not be used for any illegal, immoral or objectionable purpose.
10. **Automatic Termination for Non-Compliance:** If any person using this Software does not comply with any requirements of this licence agreement, this licence agreement will automatically terminate and that person, and if that person is an Authorised User then also the Licensee, shall no longer have any right to use the Software.
11. **Separate Agreement for Updates:** This licence agreement does not of itself include any right to receive updates to the Software. Any such right must be purchased from Waterhole.
12. **Use Solely at Own Risk:** Each user of the Software must make their own assessment of the suitability and functionality of the Software and bears all risk related to the quality and performance of the Software, including the risk of actual and consequential harm, such as loss or corruption of data, and any necessary service, repair, or correction.
13. **Disclaimer:** 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, INCLUDING SPECIAL, INCIDENTAL AND CONSEQUENTIAL DAMAGES, 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.
14. **Governing Law:** The Scope of the Licence and this licence agreement are governed by the laws of South Australia. Any person using the Software submits to the jurisdiction of South Australian courts in respect of any dispute, action, proceeding or demand arising out of or in connection with the Scope of the Licence, this licence agreement or the use of the Software.
================================================
FILE: README.md
================================================
<p align="center">
<img src="https://waterhole.dev/images/waterhole-logo.svg" width="400" alt="Waterhole logo" />
</p>
## About Waterhole
Waterhole is the Laravel-powered community platform giving life to vibrant online communities.
> **Note:** This repository contains the code for the core Waterhole package. To start your own community project with Waterhole, visit the [Waterhole skeleton repository][skeleton].
## Learning Waterhole
Waterhole has extensive [documentation][docs] and a powerful extension API, making it easy to get started building a completely custom community. Feel free to open issues for anything you find confusing or incomplete.
## Support
We provide official developer support with [paid licenses](https://waterhole.dev/pricing). Community support is available in our [Community][community].
## Contributing
Thank you for considering contributing to Waterhole! Please review the [contribution guide](https://waterhole.dev/docs/contributing) before you open issues or send pull requests.
## Code of Conduct
In order to ensure that the Waterhole community is welcoming to all, please review and abide by the [Code of Conduct](https://waterhole.dev/docs/code-of-conduct).
## Important Links
- [Waterhole Website](https://waterhole.dev)
- [Waterhole Documentation][docs]
- [Waterhole Community][community]
- [Waterhole Skeleton Repo][skeleton]
[docs]: https://waterhole.dev/docs
[community]: https://waterhole.dev/community
[skeleton]: https://github.com/waterholeforum/waterhole
================================================
FILE: composer.json
================================================
{
"name": "waterhole/core",
"description": "Waterhole core",
"keywords": [
"forum"
],
"license": "proprietary",
"require": {
"ext-json": "*",
"composer/composer": "^2.4",
"guzzlehttp/guzzle": "^7.0.1",
"hotwired-laravel/turbo-laravel": "^2.0.0-beta5",
"intervention/image": "^3.0",
"intervention/image-laravel": "^1.0",
"jrmajor/fluent": "^1.0.1",
"kirschbaum-development/eloquent-power-joins": "^3.2|^4.2",
"laminas/laminas-feed": "^2.20",
"laravel/framework": "^10.0|^11.0|^12.0|^13.0",
"laravel/sanctum": "^4.0",
"laravel/socialite": "^v5.10.0",
"nyholm/psr7": "^1.8",
"s9e/text-formatter": "^2.13",
"secondnetwork/blade-tabler-icons": "^3.0",
"staudenmeir/laravel-adjacency-list": "^1.7",
"staudenmeir/laravel-cte": "^1.0",
"symfony/psr-http-message-bridge": "^2.0|^7.0",
"tobyz/json-api-server": "^1.0.0-rc.1",
"waterhole/sso": "^0.1"
},
"require-dev": {
"larastan/larastan": "^3.9.3",
"orchestra/testbench": "^10.2|^11.0",
"pestphp/pest": "^3.8"
},
"autoload": {
"psr-4": {
"Waterhole\\": "src/",
"Waterhole\\Database\\Factories\\": "database/factories/",
"Waterhole\\Database\\Seeders\\": "database/seeders/"
},
"files": [
"src/helpers.php"
]
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"config": {
"preferred-install": "dist",
"sort-packages": true,
"allow-plugins": {
"pestphp/pest-plugin": true
}
},
"extra": {
"branch-alias": {
"dev-main": "0.6.x-dev"
},
"laravel": {
"providers": [
"Waterhole\\Providers\\WaterholeServiceProvider"
],
"aliases": {
"Waterhole": "Waterhole\\Waterhole"
}
}
},
"scripts": {
"post-autoload-dump": [
"@clear",
"@prepare"
],
"clear": "@php vendor/bin/testbench package:purge-skeleton --ansi",
"prepare": "@php vendor/bin/testbench package:discover --ansi",
"serve": [
"Composer\\Config::disableProcessTimeout",
"@php vendor/bin/testbench serve --ansi"
],
"lint": [
"@php vendor/bin/phpstan analyse --verbose --ansi"
],
"test": [
"@clear",
"@php vendor/bin/pest"
]
}
}
================================================
FILE: config/api.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| JSON:API Enabled
|--------------------------------------------------------------------------
|
| The Waterhole JSON:API allows forum data to be accessed through an API
| that conforms to the JSON:API specification (https://jsonapi.org).
|
| Learn more: https://waterhole.dev/docs/api
|
*/
'enabled' => true,
/*
|--------------------------------------------------------------------------
| JSON:API Public
|--------------------------------------------------------------------------
|
| This option makes the Waterhole JSON:API public, so anyone will be able
| to access it, and users will be able to generate API tokens in their
| account preferences. If disabled, the API will require authentication
| using API tokens which only administrators will be able to create.
|
| Learn more: https://waterhole.dev/docs/api
|
*/
'public' => true,
/*
|--------------------------------------------------------------------------
| JSON:API Path
|--------------------------------------------------------------------------
|
| This is the URI path where the Waterhole JSON:API will be accessible
| from. Feel free to change this to anything you like.
|
*/
'path' => 'api',
];
================================================
FILE: config/auth.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Authentication Guard
|--------------------------------------------------------------------------
|
| By default, Waterhole will use the `web` authentication guard. However,
| if you want to run Waterhole alongside the default Laravel auth
| guard, you can configure that below.
|
*/
'guard' => 'web',
/*
|--------------------------------------------------------------------------
| Allow Registration
|--------------------------------------------------------------------------
|
| Whether to allow visitors to register new user accounts. If this
| is false, the registration page will become inaccessible and the
| "sign up" link will be hidden.
|
*/
'allow_registration' => true,
/*
|--------------------------------------------------------------------------
| Password Authentication Enabled
|--------------------------------------------------------------------------
|
| Whether to enable passwords for authentication. If this is false,
| visitors will only be able to log in and register via auth providers.
|
| Learn more: https://waterhole.dev/docs/authentication
|
*/
'password_enabled' => true,
/*
|--------------------------------------------------------------------------
| Auth Providers
|--------------------------------------------------------------------------
|
| Add the names of the auth providers you want to support. Waterhole will
| show buttons for these providers on the login and registration pages.
|
| Learn more: https://waterhole.dev/docs/authentication
|
*/
'providers' => [
// 'github',
],
/*
|--------------------------------------------------------------------------
| Single Sign-On
|--------------------------------------------------------------------------
|
| These settings are to configure the "sso" auth provider. The "url" is
| your website's URL where Waterhole will send users when they attempt to
| log in. "secret" is a secret string that will be used to sign payloads
| used in the process and ensure they are authentic.
|
| Learn more: https://waterhole.dev/docs/authentication
|
*/
'sso' => [
'url' => env('WATERHOLE_SSO_URL'),
'secret' => env('WATERHOLE_SSO_SECRET'),
],
];
================================================
FILE: config/cp.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Control Panel Path
|--------------------------------------------------------------------------
|
| This is the URI path where the Control Panel will be accessible from.
| Feel free to change this to anything you like.
|
*/
'path' => 'cp',
/*
|--------------------------------------------------------------------------
| Dashboard Widgets
|--------------------------------------------------------------------------
|
| Here you may the layout of your dashboard widgets. You're free to
| use the same widget multiple times in different configurations.
|
| Learn more: https://waterhole.dev/docs/dashboard
*/
'widgets' => [
[
'component' => Waterhole\Widgets\GettingStarted::class,
'width' => 1 / 2,
],
[
'component' => Waterhole\Widgets\Feed::class,
'width' => 1 / 2,
'title' => 'Waterhole Blog',
'url' => 'https://waterhole.dev/community/channels/blog/posts.rss',
],
[
'component' => Waterhole\Widgets\LineChart::class,
'width' => 1 / 3,
'title' => 'waterhole::cp.dashboard-users-title',
'model' => Waterhole\Models\User::class,
],
[
'component' => Waterhole\Widgets\LineChart::class,
'width' => 1 / 3,
'title' => 'waterhole::cp.dashboard-posts-title',
'model' => Waterhole\Models\Post::class,
],
[
'component' => Waterhole\Widgets\LineChart::class,
'width' => 1 / 3,
'title' => 'waterhole::cp.dashboard-comments-title',
'model' => Waterhole\Models\Comment::class,
],
],
];
================================================
FILE: config/design.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Theme
|--------------------------------------------------------------------------
|
| This option allows you to configure which theme Waterhole uses. A null
| value means that Waterhole will allow users to toggle between light
| and dark mode. You can disable this toggle by setting this to either
| "light" or "dark".
|
*/
'theme' => null,
/*
|--------------------------------------------------------------------------
| Emoji URL
|--------------------------------------------------------------------------
|
| This URL will be used to output emoji. You can set this to null to
| disable emoji parsing and fall back to system emoji.
|
| Learn more: https://s9etextformatter.readthedocs.io/Plugins/Emoji/Synopsis/
|
*/
'emoji_url' => 'https://cdn.jsdelivr.net/gh/twitter/twemoji@latest/assets/svg/{@tseq}.svg',
];
================================================
FILE: config/forum.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Forum Name
|--------------------------------------------------------------------------
|
| This value is the full name of your forum. This value is displayed in the
| <title> tag, your forum header, and in notification emails.
|
*/
'name' => env('APP_NAME', 'Waterhole'),
/*
|--------------------------------------------------------------------------
| Forum Path
|--------------------------------------------------------------------------
|
| This is the URI path where your Waterhole forum will be accessible
| from. Feel free to change this to anything you like.
|
*/
'path' => '',
/*
|--------------------------------------------------------------------------
| Post Filters
|--------------------------------------------------------------------------
|
| Here you can configure which filters are available on the forum index.
| The first one will be used as the default. This can be overridden for
| individual channels in the Structure section of the Control Panel.
|
*/
'post_filters' => [
\Waterhole\Filters\Latest::class,
\Waterhole\Filters\Newest::class,
\Waterhole\Filters\Trending::class,
\Waterhole\Filters\Top::class,
\Waterhole\Filters\Oldest::class,
],
/*
|--------------------------------------------------------------------------
| Post Layout
|--------------------------------------------------------------------------
|
| Here you can specify which post layout is used on the forum index. This
| can be overridden for individual channels in the Structure section of
| the Control Panel.
|
*/
'post_layout' => \Waterhole\Layouts\ListLayout::class,
/*
|--------------------------------------------------------------------------
| Posts & Comments Per Page
|--------------------------------------------------------------------------
|
| The numbers of items to show on each page of posts and comments.
|
*/
'posts_per_page' => 15,
'comments_per_page' => 15,
/*
|--------------------------------------------------------------------------
| Edit Time Limit
|--------------------------------------------------------------------------
|
| The number of minutes after creation that a post or comment can be edited
| by its author. Set to null for no limit, or 0 to never allow editing.
| Moderators are always allowed.
|
*/
'edit_time_limit' => null,
/*
|--------------------------------------------------------------------------
| Rate Limits
|--------------------------------------------------------------------------
|
| These limits will help to slow down malicious users and spammers.
| "Create" refers to the creation of new posts and comments.
|
*/
'create_per_minute' => 3,
'search_per_minute' => 10,
/*
|--------------------------------------------------------------------------
| Report Reasons
|--------------------------------------------------------------------------
|
| Keys are stored in the database. Labels come from Fluent translations
| like `waterhole::forum.report-reason-<key>-label`.
|
*/
'report_reasons' => ['off-topic', 'inappropriate', 'spam', 'other'],
];
================================================
FILE: config/seo.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Description
|--------------------------------------------------------------------------
|
| Used when a page-specific description is not available.
|
*/
'default_description' => null,
/*
|--------------------------------------------------------------------------
| Default OpenGraph Image
|--------------------------------------------------------------------------
|
| Absolute URL to a fallback image for social previews.
|
*/
'default_og_image' => null,
/*
|--------------------------------------------------------------------------
| Nofollow Allowlist
|--------------------------------------------------------------------------
|
| Comma-separated list of domains that should not receive "nofollow".
|
*/
'nofollow_allow' => [],
/*
|--------------------------------------------------------------------------
| Nofollow Rel Attribute
|--------------------------------------------------------------------------
|
| The rel attribute to apply to external links not on the allowlist.
|
*/
'nofollow_rel' => 'nofollow ugc',
];
================================================
FILE: config/system.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Site Key
|--------------------------------------------------------------------------
|
| The site key for the corresponding domain from your Waterhole account.
| Without a key entered, your forum is considered to be in Trial Mode and
| you cannot make it available on a public domain.
|
*/
'site_key' => env('WATERHOLE_SITE_KEY'),
/*
|--------------------------------------------------------------------------
| Database Connection
|--------------------------------------------------------------------------
|
| Here you may specify which database connection Waterhole should use
| for its data storage.
|
*/
'database' => env('DB_CONNECTION'),
/*
|--------------------------------------------------------------------------
| Search Engine
|--------------------------------------------------------------------------
|
| The search engine used for forum search. Set to null to disable search
| entirely (routes and UI will be hidden). The default is determined from
| the database driver.
|
*/
'search_engine' => env(
'WATERHOLE_SEARCH_ENGINE',
match (env('DB_CONNECTION')) {
'mysql', 'mariadb', 'pgsql' => 'full_text',
default => null,
},
),
/*
|--------------------------------------------------------------------------
| Route Domain
|--------------------------------------------------------------------------
|
| If you want Waterhole to register its routes under a sub-domain, you
| can specify that here.
|
*/
'domain' => null,
/*
|--------------------------------------------------------------------------
| Assets Storage Disk
|--------------------------------------------------------------------------
|
| The filesystem disk used for compiled Waterhole assets. This should be a
| publicly accessible disk.
|
*/
'assets_disk' => env('WATERHOLE_ASSETS_DISK', 'public'),
/*
|--------------------------------------------------------------------------
| Laravel Echo Configuration
|--------------------------------------------------------------------------
|
| This is the configuration that will be passed in when Waterhole's
| frontend JavaScript sets up the Laravel Echo client.
|
*/
'echo_config' => match (env('BROADCAST_DRIVER')) {
'pusher' => [
'broadcaster' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'cluster' => env('PUSHER_APP_CLUSTER', 'mt1'),
],
'reverb' => [
'broadcaster' => 'reverb',
'key' => env('REVERB_APP_KEY'),
'wsHost' => env('REVERB_HOST'),
'wsPort' => env('REVERB_PORT', 80),
'wssPort' => env('REVERB_PORT', 443),
'forceTLS' => env('REVERB_SCHEME', 'https') === 'https',
'enabledTransports' => ['ws', 'wss'],
],
default => [
'broadcaster' => null,
],
},
/*
|--------------------------------------------------------------------------
| Default Extensions Path
|--------------------------------------------------------------------------
|
| When generating addons via `php artisan make:waterhole-extension`, this
| path will be used by default. You can still specify custom repository
| paths in your composer.json, but this is the path used by the generator.
|
*/
'extensions_path' => base_path('extensions'),
/*
|--------------------------------------------------------------------------
| Send the Powered-By Header
|--------------------------------------------------------------------------
|
| Websites like builtwith.com use the X-Powered-By header to determine
| what technologies are used on a particular site. By default, we'll
| send this header, but feel free to disable it.
|
*/
'send_powered_by_header' => true,
/*
|--------------------------------------------------------------------------
| Intensive Operations
|--------------------------------------------------------------------------
|
| Sometimes Waterhole requires extra resources to complete intensive
| operations. Here you may configure these system resource limits.
|
*/
'php_memory_limit' => '-1',
'php_max_execution_time' => '-1',
];
================================================
FILE: config/uploads.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Storage Disk
|--------------------------------------------------------------------------
|
| The filesystem disk used for storing user uploads (attachments, avatars,
| icons). This should be a publicly accessible disk.
|
*/
'disk' => env('WATERHOLE_UPLOADS_DISK', 'public'),
/*
|--------------------------------------------------------------------------
| Allowed MIME Types
|--------------------------------------------------------------------------
|
| Uploaded files must match one of the MIME types listed here. Values can
| be either a MIME type (`text/plain`) or a file extension (`jpg`). If
| empty, no validation will take place and all MIME types will be allowed.
|
*/
'allowed_mimetypes' => [],
/*
|--------------------------------------------------------------------------
| Maximum Upload Size (Kilobytes)
|--------------------------------------------------------------------------
|
| Any uploads larger than this will be rejected. Make sure this value is
| below the size limit of POST requests enforced by your webserver, as
| well as PHP's `upload_max_filesize` and `post_max_size` settings.
|
*/
'max_upload_size' => 5120,
];
================================================
FILE: config/users.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Re-verify After Inactive Days
|--------------------------------------------------------------------------
|
| If set to a number of days, users who have been inactive longer than
| that will be required to re-verify their email address. Set to null
| to disable.
|
*/
'reverify_after_inactive_days' => 365,
/*
|--------------------------------------------------------------------------
| Post Filters
|--------------------------------------------------------------------------
|
| Here you can configure which filters are available when viewing a user's.
| posts on their profile page. The first one will be used as the default.
|
*/
'post_filters' => [
\Waterhole\Filters\Newest::class,
\Waterhole\Filters\Top::class,
],
/*
|--------------------------------------------------------------------------
| Comment Filters
|--------------------------------------------------------------------------
|
| Here you can configure which filters are available when viewing a user's.
| comments on their profile page. The first one will be used as the default.
|
*/
'comment_filters' => [
\Waterhole\Filters\Newest::class,
\Waterhole\Filters\Top::class,
],
];
================================================
FILE: database/factories/ChannelFactory.php
================================================
<?php
namespace Waterhole\Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Waterhole\Models\Channel;
class ChannelFactory extends Factory
{
protected $model = Channel::class;
public function definition(): array
{
return ['name' => fake()->name];
}
public function public(): static
{
return $this->afterCreating(function (Channel $channel) {
$channel->savePermissions(['group:1' => ['view' => true]]);
});
}
}
================================================
FILE: database/factories/CommentFactory.php
================================================
<?php
namespace Waterhole\Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Waterhole\Models\Comment;
class CommentFactory extends Factory
{
protected $model = Comment::class;
public function definition(): array
{
return ['body' => fake()->text];
}
}
================================================
FILE: database/factories/PageFactory.php
================================================
<?php
namespace Waterhole\Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Waterhole\Models\Page;
class PageFactory extends Factory
{
protected $model = Page::class;
public function definition(): array
{
return ['name' => fake()->name, 'body' => fake()->text];
}
public function public(): static
{
return $this->afterCreating(function (Page $page) {
$page->savePermissions(['group:1' => ['view' => true]]);
});
}
}
================================================
FILE: database/factories/PostFactory.php
================================================
<?php
namespace Waterhole\Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Waterhole\Models\Post;
class PostFactory extends Factory
{
protected $model = Post::class;
public function definition(): array
{
return ['body' => fake()->text];
}
}
================================================
FILE: database/factories/TagFactory.php
================================================
<?php
namespace Waterhole\Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Waterhole\Models\Tag;
class TagFactory extends Factory
{
protected $model = Tag::class;
public function definition(): array
{
return ['name' => fake()->name];
}
}
================================================
FILE: database/factories/UserFactory.php
================================================
<?php
namespace Waterhole\Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Waterhole\Models\Group;
use Waterhole\Models\User;
class UserFactory extends Factory
{
protected $model = User::class;
public function definition(): array
{
return [
'name' => fake()->userName,
'email' => fake()->email,
'email_verified_at' => now(),
];
}
public function admin(): UserFactory
{
return $this->afterCreating(function (User $user) {
$user->groups()->attach(Group::ADMIN_ID);
});
}
}
================================================
FILE: database/migrations/2021_06_21_021231_create_channels_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('channels', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug')->unique();
$table->string('icon')->nullable();
$table->text('description')->nullable();
$table->text('instructions')->nullable();
$table->json('filters')->nullable();
$table->string('default_layout')->nullable();
$table->boolean('sandbox')->default(0);
});
}
public function down()
{
Schema::dropIfExists('channels');
}
};
================================================
FILE: database/migrations/2021_06_21_021344_create_users_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name')->index();
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password')->nullable();
$table->rememberToken();
$table->string('locale')->nullable();
$table->string('headline')->nullable();
$table->text('bio')->nullable();
$table->string('location')->nullable();
$table->string('website')->nullable();
$table->string('avatar')->nullable();
$table->timestamp('created_at')->nullable()->index();
$table->timestamp('last_seen_at')->nullable()->index();
$table->boolean('show_online')->default(1);
$table->json('notification_channels')->nullable();
$table->timestamp('notifications_read_at')->nullable();
$table->boolean('follow_on_comment')->default(0);
});
}
public function down()
{
Schema::dropIfExists('users');
}
};
================================================
FILE: database/migrations/2021_06_21_021345_create_notifications_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('notifications', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->string('type');
$table->morphs('notifiable');
$table->text('data');
$table
->foreignId('sender_id')
->nullable()
->constrained('users')
->cascadeOnUpdate()
->nullOnDelete();
$table->nullableMorphs('group');
$table->nullableMorphs('content');
$table->timestamps();
$table->timestamp('read_at')->nullable();
});
}
public function down()
{
Schema::dropIfExists('notifications');
}
};
================================================
FILE: database/migrations/2021_06_21_021348_create_posts_table.php
================================================
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Waterhole\Database\Migration;
return new class extends Migration {
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->foreignId('channel_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
$table
->foreignId('user_id')
->nullable()
->constrained()
->cascadeOnUpdate()
->nullOnDelete();
$table->string('title')->nullable();
$table->string('slug')->nullable();
$table->mediumText('body');
$table->timestamp('created_at')->nullable()->index();
$table->timestamp('edited_at')->nullable()->index();
$table->timestamp('last_activity_at')->nullable()->index();
$table->unsignedInteger('comment_count')->default(0)->index();
$table->integer('score')->default(0)->index();
$table->boolean('is_locked')->default(0);
$table->index(['channel_id', 'created_at']); // used to get new post count within each channel
if (Schema::getConnection()->getDriverName() !== 'sqlite') {
$table->fullText(['title']);
$table->fullText(['body']);
}
});
}
public function down()
{
Schema::dropIfExists('posts');
}
};
================================================
FILE: database/migrations/2021_06_21_021355_create_comments_table.php
================================================
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Waterhole\Database\Migration;
return new class extends Migration {
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->foreignId('post_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
$table
->foreignId('parent_id')
->nullable()
->constrained('comments')
->cascadeOnUpdate()
->nullOnDelete();
$table
->foreignId('user_id')
->nullable()
->constrained()
->cascadeOnUpdate()
->nullOnDelete();
$table->mediumText('body');
$table->timestamp('created_at')->nullable()->index();
$table->timestamp('edited_at')->nullable()->index();
$table->unsignedInteger('reply_count')->default(0);
$table->integer('score')->default(0)->index();
if (Schema::getConnection()->getDriverName() !== 'sqlite') {
$table->fullText(['body']);
}
});
}
public function down()
{
Schema::dropIfExists('comments');
}
};
================================================
FILE: database/migrations/2021_06_21_021413_create_groups_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('groups', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->boolean('is_public')->default(0);
$table->string('icon')->nullable();
$table->string('color')->nullable();
});
}
public function down()
{
Schema::dropIfExists('groups');
}
};
================================================
FILE: database/migrations/2021_06_21_021449_create_group_user_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('group_user', function (Blueprint $table) {
$table->foreignId('group_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
$table->foreignId('user_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
$table->primary(['group_id', 'user_id']);
});
}
public function down()
{
Schema::dropIfExists('group_user');
}
};
================================================
FILE: database/migrations/2021_06_21_021454_create_mentions_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('mentions', function (Blueprint $table) {
$table->morphs('content');
$table->foreignId('user_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
$table->primary(['content_type', 'content_id', 'user_id']);
});
}
public function down()
{
Schema::dropIfExists('mentions');
}
};
================================================
FILE: database/migrations/2021_06_21_021502_create_post_user_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('post_user', function (Blueprint $table) {
$table->foreignId('post_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
$table->foreignId('user_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
$table->timestamp('last_read_at')->nullable();
$table->string('notifications')->nullable();
$table->timestamp('followed_at')->nullable();
$table->timestamp('mentioned_at')->nullable();
$table->primary(['post_id', 'user_id']);
});
}
public function down()
{
Schema::dropIfExists('post_user');
}
};
================================================
FILE: database/migrations/2021_06_21_111526_create_permissions_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('permissions', function (Blueprint $table) {
$table->id();
$table->nullableMorphs('scope');
$table->morphs('recipient');
$table->string('ability');
});
}
public function down()
{
Schema::dropIfExists('permissions');
}
};
================================================
FILE: database/migrations/2021_10_18_130929_create_channel_user_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('channel_user', function (Blueprint $table) {
$table->foreignId('channel_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
$table->foreignId('user_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
$table->string('notifications')->nullable();
$table->timestamp('followed_at')->nullable();
$table->primary(['channel_id', 'user_id']);
});
}
public function down()
{
Schema::dropIfExists('channel_user');
}
};
================================================
FILE: database/migrations/2021_12_04_093522_create_pages_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('pages', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug')->unique();
$table->string('icon')->nullable();
$table->mediumText('body');
});
}
public function down()
{
Schema::dropIfExists('pages');
}
};
================================================
FILE: database/migrations/2021_12_04_095210_create_structure_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('structure', function (Blueprint $table) {
$table->id();
$table->unsignedInteger('position')->default(0);
$table->morphs('content');
$table->boolean('is_listed')->default(0);
});
}
public function down()
{
Schema::dropIfExists('structure');
}
};
================================================
FILE: database/migrations/2021_12_04_095221_create_structure_headings_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('structure_headings', function (Blueprint $table) {
$table->id();
$table->string('name')->nullable();
});
}
public function down()
{
Schema::dropIfExists('structure_headings');
}
};
================================================
FILE: database/migrations/2021_12_04_095226_create_structure_links_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('structure_links', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('href');
$table->string('icon')->nullable();
});
}
public function down()
{
Schema::dropIfExists('structure_links');
}
};
================================================
FILE: database/migrations/2023_01_06_083525_create_reaction_sets_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('reaction_sets', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->boolean('is_default_posts')->default(0);
$table->boolean('is_default_comments')->default(0);
$table->boolean('allow_multiple')->default(0);
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('reaction_sets');
}
};
================================================
FILE: database/migrations/2023_01_06_083700_create_reaction_types_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('reaction_types', function (Blueprint $table) {
$table->id();
$table
->foreignId('reaction_set_id')
->constrained()
->cascadeOnUpdate()
->cascadeOnDelete();
$table->string('name');
$table->string('icon')->nullable();
$table->tinyInteger('score');
$table->unsignedSmallInteger('position');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('reaction_types');
}
};
================================================
FILE: database/migrations/2023_01_06_084208_create_reactions_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('reactions', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
$table
->foreignId('reaction_type_id')
->constrained()
->cascadeOnUpdate()
->cascadeOnDelete();
$table->morphs('content');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('reactions');
}
};
================================================
FILE: database/migrations/2023_01_06_165934_add_reaction_set_columns_to_channels.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::table('channels', function (Blueprint $table) {
$table
->foreignId('posts_reaction_set_id')
->nullable()
->constrained('reaction_sets')
->cascadeOnUpdate()
->nullOnDelete();
$table
->foreignId('comments_reaction_set_id')
->nullable()
->constrained('reaction_sets')
->cascadeOnUpdate()
->nullOnDelete();
});
}
public function down()
{
Schema::table('channels', function (Blueprint $table) {
$table->dropConstrainedForeignId('posts_reaction_set_id');
$table->dropConstrainedForeignId('comments_reaction_set_id');
});
}
};
================================================
FILE: database/migrations/2023_01_13_110454_create_taxonomies_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('taxonomies', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->boolean('allow_multiple')->default(0);
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('taxonomies');
}
};
================================================
FILE: database/migrations/2023_01_13_110537_create_tags_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('tags', function (Blueprint $table) {
$table->id();
$table->foreignId('taxonomy_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
$table->string('name');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('tags');
}
};
================================================
FILE: database/migrations/2023_01_13_110933_create_post_tag_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('post_tag', function (Blueprint $table) {
$table->foreignId('post_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
$table->foreignId('tag_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
});
}
public function down()
{
Schema::dropIfExists('post_tag');
}
};
================================================
FILE: database/migrations/2023_01_13_110952_create_channel_taxonomy_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('channel_taxonomy', function (Blueprint $table) {
$table->foreignId('channel_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
$table->foreignId('taxonomy_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
});
}
public function down()
{
Schema::dropIfExists('channel_taxonomy');
}
};
================================================
FILE: database/migrations/2023_01_19_113324_create_auth_providers_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('auth_providers', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
$table->string('provider');
$table->string('identifier');
$table->timestamp('created_at');
$table->timestamp('last_login_at')->nullable();
});
}
public function down()
{
Schema::dropIfExists('auth_providers');
}
};
================================================
FILE: database/migrations/2023_01_26_145619_add_view_count_to_posts.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::table('posts', function (Blueprint $table) {
$table->unsignedInteger('view_count')->default(0)->index();
});
}
public function down()
{
Schema::table('posts', function (Blueprint $table) {
$table->dropColumn('view_count');
});
}
};
================================================
FILE: database/migrations/2023_02_02_115230_create_uploads_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('uploads', function (Blueprint $table) {
$table->id();
$table
->foreignId('user_id')
->nullable()
->constrained()
->cascadeOnUpdate()
->nullOnDelete();
$table->string('filename')->unique();
$table->string('type')->nullable();
$table->unsignedSmallInteger('width')->nullable();
$table->unsignedSmallInteger('height')->nullable();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('uploads');
}
};
================================================
FILE: database/migrations/2023_02_02_115236_create_attachments_table.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('attachments', function (Blueprint $table) {
$table->morphs('content');
$table->foreignId('upload_id')->constrained()->cascadeOnUpdate()->cascadeOnDelete();
});
}
public function down()
{
Schema::dropIfExists('attachments');
}
};
================================================
FILE: database/migrations/2023_02_02_151121_add_hotness_to_posts.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::table('posts', function (Blueprint $table) {
$table->float('hotness', 10, 4)->nullable()->index();
});
}
public function down()
{
Schema::table('posts', function (Blueprint $table) {
$table->dropColumn('hotness');
});
}
};
================================================
FILE: database/migrations/2023_02_02_153704_add_suspsended_until_to_users.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->timestamp('suspended_until')->nullable();
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('suspended_until');
});
}
};
================================================
FILE: database/migrations/2023_03_03_083340_add_is_required_to_taxonomies.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::table('taxonomies', function (Blueprint $table) {
$table->boolean('is_required')->default(0);
});
}
public function down()
{
Schema::table('taxonomies', function (Blueprint $table) {
$table->dropColumn('is_required');
});
}
};
================================================
FILE: database/migrations/2023_03_11_114659_add_answerable_to_channels.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::table('channels', function (Blueprint $table) {
$table->boolean('answerable')->default(0);
});
}
public function down(): void
{
Schema::table('channels', function (Blueprint $table) {
$table->dropColumn('answerable');
});
}
};
================================================
FILE: database/migrations/2023_03_11_114850_add_answer_id_to_posts.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::table('posts', function (Blueprint $table) {
$table
->foreignId('answer_id')
->nullable()
->constrained('comments')
->cascadeOnUpdate()
->nullOnDelete();
});
}
public function down(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->dropConstrainedForeignId('answer_id');
});
}
};
================================================
FILE: database/migrations/2023_03_16_095929_add_show_similar_posts_to_channels.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::table('channels', function (Blueprint $table) {
$table->boolean('show_similar_posts')->default(0);
});
}
public function down(): void
{
Schema::table('channels', function (Blueprint $table) {
$table->dropColumn('show_similar_posts');
});
}
};
================================================
FILE: database/migrations/2023_04_05_165546_add_post_id_created_at_index_to_comments.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::table('comments', function (Blueprint $table) {
$table->index(['post_id', 'created_at']);
});
}
public function down(): void
{
Schema::table('comments', function (Blueprint $table) {
$table->dropIndex(['post_id', 'created_at']);
});
}
};
================================================
FILE: database/migrations/2023_04_05_165601_add_is_listed_position_index_to_structure.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::table('structure', function (Blueprint $table) {
$table->index(['is_listed', 'position']);
});
}
public function down(): void
{
Schema::table('structure', function (Blueprint $table) {
$table->dropIndex(['is_listed', 'position']);
});
}
};
================================================
FILE: database/migrations/2023_04_13_163452_rename_channels_sandbox_to_ignore.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::table('channels', function (Blueprint $table) {
$table->renameColumn('sandbox', 'ignore');
});
}
public function down(): void
{
Schema::table('channels', function (Blueprint $table) {
$table->renameColumn('ignore', 'sandbox');
});
}
};
================================================
FILE: database/migrations/2023_04_13_203750_rename_channels_default_layout_to_layout.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::table('channels', function (Blueprint $table) {
$table->renameColumn('default_layout', 'layout');
});
}
public function down(): void
{
Schema::table('channels', function (Blueprint $table) {
$table->renameColumn('layout', 'default_layout');
});
}
};
================================================
FILE: database/migrations/2023_04_13_203835_add_layout_config_to_channels.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::table('channels', function (Blueprint $table) {
$table->json('layout_config')->nullable()->after('layout');
});
}
public function down(): void
{
Schema::table('channels', function (Blueprint $table) {
$table->dropColumn('layout_config');
});
}
};
================================================
FILE: database/migrations/2023_04_22_131025_add_translations_to_channels.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::table('channels', function (Blueprint $table) {
$table->json('translations')->nullable();
});
}
public function down(): void
{
Schema::table('channels', function (Blueprint $table) {
$table->dropColumn('translations');
});
}
};
================================================
FILE: database/migrations/2023_06_08_093656_add_is_pinned_to_posts.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->boolean('is_pinned')->default(0)->index();
});
}
public function down(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->dropColumn('is_pinned');
});
}
};
================================================
FILE: database/migrations/2023_06_08_113707_add_hiding_columns_to_comments.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::table('comments', function (Blueprint $table) {
$table->timestamp('hidden_at')->nullable();
$table
->foreignId('hidden_by')
->nullable()
->constrained('users')
->cascadeOnUpdate()
->nullOnDelete();
$table->string('hidden_reason')->nullable();
});
}
public function down(): void
{
Schema::table('comments', function (Blueprint $table) {
$table->dropColumn('hidden_at');
$table->dropConstrainedForeignId('hidden_by');
$table->dropColumn('hidden_reason');
});
}
};
================================================
FILE: database/migrations/2023_06_10_151000_add_created_at_to_posts_is_pinned_index.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->dropIndex(['is_pinned']);
$table->index(['is_pinned', 'created_at']);
});
}
public function down(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->dropIndex(['is_pinned', 'created_at']);
$table->index(['is_pinned']);
});
}
};
================================================
FILE: database/migrations/2023_07_12_165151_add_deleted_at_to_posts.php
================================================
<?php
use Waterhole\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->timestamp('deleted_at')->nullable()->after('edited_at')->index();
});
}
public function down(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->dropColumn('deleted_at');
});
}
};
================================================
FILE: database/migrations/2026_01_22_000001_add_rules_and_auto_assign_to_groups.php
================================================
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Waterhole\Database\Migration;
return new class extends Migration {
public function up()
{
Schema::table('groups', function (Blueprint $table) {
$table->boolean('auto_assign')->default(0);
$table->json('rules')->nullable();
});
}
public function down()
{
Schema::table('groups', function (Blueprint $table) {
$table->dropColumn(['auto_assign', 'rules']);
});
}
};
================================================
FILE: database/migrations/2026_01_22_000002_add_is_approved_to_posts.php
================================================
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Waterhole\Database\Migration;
return new class extends Migration {
public function up()
{
Schema::table('posts', function (Blueprint $table) {
$table->boolean('is_approved')->default(1)->index()->after('is_locked');
});
}
public function down()
{
Schema::table('posts', function (Blueprint $table) {
$table->dropColumn('is_approved');
});
}
};
================================================
FILE: database/migrations/2026_01_22_000003_add_is_approved_to_comments.php
================================================
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Waterhole\Database\Migration;
return new class extends Migration {
public function up()
{
Schema::table('comments', function (Blueprint $table) {
$table->boolean('is_approved')->default(1)->index()->after('score');
});
}
public function down()
{
Schema::table('comments', function (Blueprint $table) {
$table->dropColumn('is_approved');
});
}
};
================================================
FILE: database/migrations/2026_01_22_000004_add_deleted_reason_to_posts.php
================================================
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Waterhole\Database\Migration;
return new class extends Migration {
public function up(): void
{
Schema::table('posts', function (Blueprint $table) {
$table
->foreignId('deleted_by')
->nullable()
->constrained('users')
->cascadeOnUpdate()
->nullOnDelete()
->after('deleted_at');
$table->string('deleted_reason')->nullable()->after('deleted_by');
});
}
public function down(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->dropColumn('deleted_reason');
$table->dropConstrainedForeignId('deleted_by');
});
}
};
================================================
FILE: database/migrations/2026_01_22_000005_create_flags_table.php
================================================
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Waterhole\Database\Migration;
return new class extends Migration {
public function up()
{
Schema::create('flags', function (Blueprint $table) {
$table->id();
$table->morphs('subject');
$table->string('reason');
$table
->foreignId('created_by')
->nullable()
->constrained('users')
->cascadeOnUpdate()
->nullOnDelete();
$table->timestamps();
$table->timestamp('resolved_at')->nullable();
$table
->foreignId('resolved_by')
->nullable()
->constrained('users')
->cascadeOnUpdate()
->nullOnDelete();
});
}
public function down()
{
Schema::dropIfExists('flags');
}
};
================================================
FILE: database/migrations/2026_01_22_000006_migrate_comment_hidden_to_deleted.php
================================================
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Waterhole\Database\Migration;
return new class extends Migration {
public function up(): void
{
Schema::table('comments', function (Blueprint $table) {
$table->timestamp('deleted_at')->nullable()->index();
$table
->foreignId('deleted_by')
->nullable()
->constrained('users')
->cascadeOnUpdate()
->nullOnDelete();
$table->string('deleted_reason')->nullable();
});
DB::table('comments')->update([
'deleted_at' => DB::raw('hidden_at'),
'deleted_by' => DB::raw('hidden_by'),
'deleted_reason' => DB::raw('hidden_reason'),
]);
Schema::table('comments', function (Blueprint $table) {
$table->dropColumn('hidden_at');
$table->dropConstrainedForeignId('hidden_by');
$table->dropColumn('hidden_reason');
});
}
public function down(): void
{
Schema::table('comments', function (Blueprint $table) {
$table->timestamp('hidden_at')->nullable();
$table
->foreignId('hidden_by')
->nullable()
->constrained('users')
->cascadeOnUpdate()
->nullOnDelete();
$table->string('hidden_reason')->nullable();
});
DB::table('comments')->update([
'hidden_at' => DB::raw('deleted_at'),
'hidden_by' => DB::raw('deleted_by'),
'hidden_reason' => DB::raw('deleted_reason'),
]);
Schema::table('comments', function (Blueprint $table) {
$table->dropColumn('deleted_at');
$table->dropConstrainedForeignId('deleted_by');
$table->dropColumn('deleted_reason');
});
}
};
================================================
FILE: database/migrations/2026_01_22_000007_add_approval_requirements_to_channels.php
================================================
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Waterhole\Database\Migration;
return new class extends Migration {
public function up(): void
{
Schema::table('channels', function (Blueprint $table) {
$table->boolean('require_approval_posts')->default(false);
$table->boolean('require_approval_comments')->default(false);
});
}
public function down(): void
{
Schema::table('channels', function (Blueprint $table) {
$table->dropColumn(['require_approval_posts', 'require_approval_comments']);
});
}
};
================================================
FILE: database/migrations/2026_01_22_000008_add_deleted_notes_to_posts_and_comments.php
================================================
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Waterhole\Database\Migration;
return new class extends Migration {
public function up()
{
Schema::table('posts', function (Blueprint $table) {
$table->text('deleted_message')->nullable()->after('deleted_reason');
});
Schema::table('comments', function (Blueprint $table) {
$table->text('deleted_message')->nullable()->after('deleted_reason');
});
}
public function down()
{
Schema::table('posts', function (Blueprint $table) {
$table->dropColumn('deleted_message');
});
Schema::table('comments', function (Blueprint $table) {
$table->dropColumn('deleted_message');
});
}
};
================================================
FILE: database/migrations/2026_01_24_000009_add_note_to_flags_table.php
================================================
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Waterhole\Database\Migration;
return new class extends Migration {
public function up()
{
Schema::table('flags', function (Blueprint $table) {
$table->text('note')->nullable()->after('reason');
});
}
public function down()
{
Schema::table('flags', function (Blueprint $table) {
$table->dropColumn('note');
});
}
};
================================================
FILE: database/migrations/2026_01_24_000010_add_reactions_enabled_to_channels.php
================================================
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Waterhole\Database\Migration;
return new class extends Migration {
public function up()
{
Schema::table('channels', function (Blueprint $table) {
$table->boolean('posts_reactions_enabled')->default(true)->after('ignore');
$table
->boolean('comments_reactions_enabled')
->default(true)
->after('posts_reaction_set_id');
});
}
public function down()
{
Schema::table('channels', function (Blueprint $table) {
$table->dropColumn('posts_reactions_enabled');
$table->dropColumn('comments_reactions_enabled');
});
}
};
================================================
FILE: database/seeders/DefaultSeeder.php
================================================
<?php
namespace Waterhole\Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Waterhole\Filters;
use Waterhole\Layouts;
use Waterhole\Models\Channel;
use Waterhole\Models\Group;
use Waterhole\Models\Page;
use Waterhole\Models\Permission;
use Waterhole\Models\ReactionSet;
/**
* A seeder that creates default groups, pages, channels, permissions, and
* reactions upon installation.
*/
class DefaultSeeder extends Seeder
{
public function run(): void
{
$this->callOnce(GroupsSeeder::class);
$guest = Group::guest();
$member = Group::member();
$mod = Group::custom()->firstOrFail();
// Community Guide
$guide = Page::firstOrCreate(
['slug' => Str::slug(__('waterhole::install.guide-title'))],
[
'icon' => 'emoji:📖',
'name' => __('waterhole::install.guide-title'),
'body' => __('waterhole::install.guide-body', [
'forumName' => config('waterhole.forum.name'),
]),
],
);
if ($guide->wasRecentlyCreated) {
$guide
->permissions()
->save((new Permission(['ability' => 'view']))->recipient()->associate($guest));
$guide->structure->update(['is_listed' => true]);
}
// Reactions
$emoji = ReactionSet::firstOrNew(
['name' => __('waterhole::install.reaction-set-emoji')],
['is_default_posts' => true, 'is_default_comments' => true],
);
if (!$emoji->exists) {
$emoji->save();
$emoji->reactionTypes()->createMany([
[
'name' => __('waterhole::install.reaction-type-like'),
'icon' => 'emoji:👍️',
'score' => 1,
],
[
'name' => __('waterhole::install.reaction-type-love'),
'icon' => 'emoji:❤️',
'score' => 2,
],
[
'name' => __('waterhole::install.reaction-type-laugh'),
'icon' => 'emoji:😆',
'score' => 1,
],
[
'name' => __('waterhole::install.reaction-type-wow'),
'icon' => 'emoji:😮',
'score' => 1,
],
[
'name' => __('waterhole::install.reaction-type-sad'),
'icon' => 'emoji:😢',
'score' => 1,
],
[
'name' => __('waterhole::install.reaction-type-angry'),
'icon' => 'emoji:😡',
'score' => -1,
],
]);
}
$votes = ReactionSet::firstOrNew(['name' => __('waterhole::install.reaction-set-votes')]);
if (!$votes->exists) {
$votes->save();
$votes->reactionTypes()->create([
'name' => __('waterhole::install.reaction-type-upvote'),
'icon' => 'emoji:🔺',
'score' => 1,
]);
}
// Channels
$channels = [
[
'name' => __('waterhole::install.announcements-name'),
'description' => __('waterhole::install.announcements-description'),
'icon' => 'emoji:📣',
'layout' => Layouts\CardsLayout::class,
'filters' => [
Filters\Newest::class,
Filters\Latest::class,
Filters\Top::class,
Filters\Oldest::class,
],
'group_post' => $mod,
],
[
'name' => __('waterhole::install.introductions-name'),
'description' => __('waterhole::install.introductions-description'),
'icon' => 'emoji:👋',
],
[
'name' => __('waterhole::install.support-name'),
'description' => __('waterhole::install.support-description'),
'icon' => 'emoji:❓',
'answerable' => true,
'show_similar_posts' => true,
],
[
'name' => __('waterhole::install.ideas-name'),
'description' => __('waterhole::install.ideas-description'),
'icon' => 'emoji:💡',
'posts_reaction_set_id' => $votes->id,
'show_similar_posts' => true,
],
[
'name' => __('waterhole::install.staff-name'),
'description' => __('waterhole::install.staff-description'),
'icon' => 'emoji:🔒',
'group' => $mod,
],
];
foreach ($channels as $data) {
$data['slug'] = Str::slug($data['name']);
$channel = Channel::firstOrCreate(
Arr::only($data, 'slug'),
Arr::except($data, ['slug', 'group', 'group_post']) + [
'layout' => Layouts\ListLayout::class,
],
);
if ($channel->wasRecentlyCreated) {
$channel
->permissions()
->saveMany([
(new Permission(['ability' => 'view']))
->recipient()
->associate($data['group'] ?? $guest),
(new Permission(['ability' => 'post']))
->recipient()
->associate($data['group_post'] ?? ($data['group'] ?? $member)),
(new Permission(['ability' => 'comment']))
->recipient()
->associate($data['group'] ?? $member),
(new Permission(['ability' => 'moderate']))->recipient()->associate($mod),
]);
$channel
->structure()
->withoutGlobalScope('hasVisibleContent')
->update(['is_listed' => true]);
}
}
}
}
================================================
FILE: database/seeders/GroupsSeeder.php
================================================
<?php
namespace Waterhole\Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Waterhole\Models\Group;
/**
* A seeder that creates default groups.
*/
class GroupsSeeder extends Seeder
{
public function run(): void
{
Group::updateOrCreate([
'id' => Group::GUEST_ID,
'name' => __('waterhole::install.group-guest'),
]);
Group::updateOrCreate([
'id' => Group::MEMBER_ID,
'name' => __('waterhole::install.group-member'),
]);
Group::updateOrCreate([
'id' => Group::ADMIN_ID,
'name' => __('waterhole::install.group-admin'),
]);
// In PostgreSQL, sequences don't advance on explicit ID inserts.
// Manually sync to current max ID.
if (DB::connection()->getDriverName() === 'pgsql') {
$model = new Group();
$table = $model->getConnection()->getTablePrefix() . $model->getTable();
DB::statement(
"SELECT setval(pg_get_serial_sequence('\"$table\"', 'id'), (SELECT MAX(id) FROM \"$table\"))",
);
}
Group::updateOrCreate([
'name' => __('waterhole::install.group-moderator'),
'is_public' => true,
]);
Group::updateOrCreate(
['name' => __('waterhole::install.group-quarantine')],
[
'is_public' => false,
'auto_assign' => true,
'rules' => [
'requires_approval' => true,
'remove_after_approval' => true,
],
],
);
}
}
================================================
FILE: lang/en/auth.ftl
================================================
### Auth
## Laravel strings
## https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/auth.php
failed = These credentials do not match our records.
password = The provided password is incorrect.
throttle = Too many login attempts. Please try again in { $seconds } seconds.
## Login
login-title = Log in to Your Account
login-submit = Log In
login-register-prompt = Don't have an account?
login-register-link = Sign Up
continue-with-provider = Continue with { $provider }
email-label = Email
password-label = Password
remember-me-label = Remember me
forgot-password-link = Forgot your password?
## Forgot Password
forgot-password-title = Forgot your password?
forgot-password-introduction = Request a password reset link by entering your email address below.
forgot-password-submit = Send Password Reset Link
reset-password-title = Reset Password
new-password-label = New Password
confirm-password-label = Confirm Password
reset-password-submit = Reset Password
reset-password-mail-subject = Reset Your Password
reset-password-mail-body = We received a password reset request for your account on { $forum }. If this was not you, no further action is required. This link will expire in { $minutes } minutes.
reset-password-mail-button = Reset Password
## Register
register-title = Create an Account
name-label = Username
register-submit = Create Account
register-login-prompt = Already have an account?
register-login-link = Log In
## Confirm Password
confirm-password-title = Confirm Your Password
confirm-password-introduction = Please confirm your password before continuing.
confirm-password-submit = Confirm
## Email Verification
email-verification-sent-message = We've sent a confirmation email to { $email }. If it doesn't arrive soon, check your spam folder.
email-verification-resend-button = Resend
email-verification-required-message = You must verify your email address.
email-verification-success-message = Thanks for verifying your email!
email-verification-mail-subject = Verify Email Address
email-verification-mail-body = Please click the button below to verify your email address. If you do not have an account on { $forum }, no further action is required.
email-verification-mail-button = Verify Email Address
================================================
FILE: lang/en/cp.ftl
================================================
### Localization for Waterhole Control Panel
title = Control Panel
## Dashboard
dashboard-title = Dashboard
configure-mail-message = You need to configure a mail driver in order for Waterhole to be able to send out verification emails and notifications.
debug-mode-on-message = Debug mode is ON. Sensitive configuration values may be exposed.
getting-started-title = Get Started With Waterhole
getting-started-strategy-title = Read the Docs
getting-started-strategy-description = Learn how to build a successful community with Waterhole.
getting-started-structure-title = Set Up Your Structure
getting-started-structure-description = Configure the channels and pages that make up the skeleton of your community.
getting-started-groups-title = Define User Groups
getting-started-groups-description = Set up groups for moderators, staff, and superusers.
getting-started-design-title = Join the Waterhole Community
getting-started-design-description = Ask questions, share tips, and learn how to get the most out of your community.
dashboard-users-title = Users
dashboard-posts-title = Posts
dashboard-comments-title = Comments
period-today = Today
period-last-7-days = Last 7 days
period-last-4-weeks = Last 4 weeks
period-last-3-months = Last 3 months
period-last-12-months = Last 12 months
period-this-month = This month
period-this-quarter = This quarter
period-this-year = This year
period-all-time = All time
period-current-heading = Current Period
preiod-previous-heading = Previous Period
## Structure
structure-title = Structure
structure-channel-label = Channel
structure-page-label = Page
structure-link-label = Link
structure-heading-label = Heading
structure-visibility-public-label = Public
structure-visibility-members-label = Members
structure-navigation-title = Navigation
structure-navigation-description = Move items here to show them in the navigation menu.
structure-unlisted-title = Unlisted
structure-unlisted-description = Move items here to hide them from the navigation menu.
delete-structure-confirm-message = Are you sure you want to delete this node?
## Structure - Heading
edit-heading-title = Edit Heading
create-heading-title = Create a Heading
heading-name-label = Name
## Structure - Link
edit-link-title = Edit Link
create-link-title = Create a Link
link-details-title = Details
link-name-label = Name
link-url-label = URL
link-permissions-title = Permissions
## Structure - Page
edit-page-title = Edit Page
create-page-title = Create a Page
page-details-title = Details
page-name-label = Name
page-slug-label = Slug
page-slug-url-label = This page will be accessible at:
page-body-label = Body
page-permissions-title = Permissions
## Structure - Channel
edit-channel-title = Edit Channel
create-channel-title = Create a Channel
channel-details-title = Details
channel-name-label = Name
channel-slug-label = Slug
channel-slug-url-label = This channel will be accessible at:
channel-description-label = Description
channel-description-description = A brief description of what this channel is for.
channel-options-title = Options
channel-visibility-label = Visibility
channel-ignore-label = Ignored by default
channel-ignore-description = Hide posts in this channel from the Feed for all users, unless they explicitly follow it.
channel-layout-title = Layout
channel-layout-label = Layout
channel-layout-show-author-label = Show post author
channel-layout-show-excerpt-label = Show post excerpt
channel-filters-label = Filters
channel-custom-filters-label = Use custom filters for this channel
channel-custom-filters-description = Override the global filters for this channel.
channel-permissions-title = Permissions
channel-approval-label = Approval
channel-approval-moderators-exempt = Moderators are exempt from approval.
channel-require-approval-posts-label = Require approval for posts
channel-require-approval-comments-label = Require approval for comments
channel-features-title = Features
channel-reactions-label = Reactions
channel-reactions-posts-label = Posts
channel-reactions-comments-label = Comments
reaction-set-picker-default = Default ({ $name })
reaction-set-picker-none = None
channel-taxonomies-label = Taxonomies
channel-answers-label = Answers
channel-enable-answers-label = Enable answers on this channel
channel-enable-answers-description = Allow post authors to mark a comment as the answer.
channel-posting-title = Posting
channel-instructions-label = Posting Instructions
channel-instructions-description = Give instructions to be shown to users as they create posts in this channel.
channel-similar-posts-title = Similar Posts
channel-show-similar-posts-label = Show similar posts from this channel based on the title
delete-channel-title = Delete Channel:
delete-channel-posts-label = Delete { $count } { $count ->
[one] post
*[other] posts
}
move-to-channel-posts-label = Move { $count } { $count ->
[one] post
*[other] posts
} to another channel
## Groups
groups-title = Groups
create-group-button = Create Group
group-user-count = { $count } { $count ->
[one] user
*[other] users
}
edit-group-title = Edit Group
create-group-title = Create a Group
group-details-title = Details
group-name-label = Name
group-appearance-label = Appearance
group-show-as-badge-label = Show this group as a user badge
group-color-label = Color
group-icon-label = Icon
group-rules-title = Participation
group-auto-assign-label = Auto-assign this group to new members
group-rules-requires-approval-label = Require approval for new members' content
group-rules-remove-after-approval-label = Remove from group after approval
group-permissions-title = Permissions
group-global-permissions-title = Global Permissions
group-structure-permissions-title = Structure Permissions
group-permission-suspend-users-label = Allow suspending users
delete-group-confirm-message = Are you sure you want to delete this group?
## Users
users-title = Users
users-filter-placeholder = Filter users
users-filter-group-description = Filter by group
create-user-button = Create User
users-name-column = Name
users-email-column = Email
users-groups-column = Groups
users-created-at-column = Created
users-last-seen-at-column = Last Seen
users-empty-message = No Results Found
edit-user-title = Edit User
create-user-title = Create a User
user-account-title = Account
user-name-label = Name
user-email-label = Email
user-password-label = Password
user-set-password-label = Set new password
user-groups-label = Groups
user-profile-title = Profile
user-created-message = User created.
user-saved-message = User saved.
delete-user-title = Delete { $count ->
[one] User:
*[other] { $count } Users
}
keep-user-content-label = Keep content and mark as anonymous
delete-user-content-label = Delete content permanently
delete-user-success-message = User deleted.
## Reactions
reactions-title = Reactions
reaction-sets-title = Reaction Sets
create-reaction-set-button = Create Reaction Set
edit-reaction-set-title = Edit Reaction Set
create-reaction-set-title = Create a Reaction Set
reaction-set-details-title = Details
reaction-set-name-label = Name
reaction-set-usage-label = Usage
reaction-set-default-posts = Use as default for posts
reaction-set-default-comments = Use as default for comments
delete-reaction-set-confirm-message = Are you sure you want to delete this reaction set?
reaction-set-saved-message = Reaction set saved.
reaction-types-title = Reaction Types
reaction-types-empty-message = No Reaction Types
reaction-types-add-button = Add
edit-reaction-type-title = Edit Reaction Type
create-reaction-type-title = Create a Reaction Type
reaction-type-name-label = Name
reaction-type-score-label = Score
reaction-type-score-description = The number of points that this reaction is worth.
delete-reaction-type-confirm-message = Are you sure you want to delete this reaction type?
reaction-type-saved-message = Reaction type saved.
## Taxonomies
taxonomies-title = Taxonomies
create-taxonomy-button = Create Taxonomy
create-taxonomy-title = Create a Taxonomy
edit-taxonomy-title = Edit Taxonomy
taxonomy-details-title = Details
taxonomy-permissions-title = Permissions
taxonomy-tags-title = Tags
taxonomy-name-label = Name
taxonomy-options-title = Options
taxonomy-required-label = Require a tag to be selected on post creation
taxonomy-allow-multiple-label = Allow selection of multiple tags
taxonomy-saved-message = Taxonomy saved.
delete-taxonomy-confirm-message = Are you sure you want to delete this taxonomy?
create-tag-title = Create a Tag
edit-tag-title = Edit Tag
tag-name-label = Name
tag-saved-message = Tag saved.
delete-tag-confirm-message = Are you sure you want to delete this tag?
## Licensing
license-error-message = Your license could not be validated, because there was an error communicating with the Waterhole API. ({ $status })
license-invalid-message = Please purchase or enter a valid license key for this site to comply with the License Agreement.
license-expired-message = You are not licensed to use this version of Waterhole. Please downgrade or renew your license.
license-suspended-message = Your Waterhole license has been suspended. Please contact us for more information.
trial-badge = Trial
licensed-badge = Licensed
unlicensed-badge = Unlicensed
================================================
FILE: lang/en/forum.ftl
================================================
### Forum
feed-link = Feed
## Header
log-in = Log In
register = Sign Up
## Search
search-placeholder = Search all discussions
search-results-title = Search Results for "{ $query }"
search-button = Search
search-filter-button = Filter
search-showing-results-title = Showing { $total } { $total ->
[one] result
*[other] results
}
search-showing-results-non-exhaustive-title = Showing { $total }+ { $total ->
[one] result
*[other] results
}
search-sort-relevance = Sort by Relevance
search-sort-latest = Sort by Latest
search-sort-top = Sort by Top
search-empty-message = No Results Found
search-keywords-too-short-message = Your keywords are too short – try something longer.
## Posts
post-activity-replied = replied
post-activity-posted = posted
post-new-badge = New
post-new-badge-tooltip = New post
post-locked-badge = Locked
post-answered-badge = Answered
post-trash-badge = Trash
post-removed-message = Post removed
post-answered-by = Answered by
post-view-answer-link = View Answer
post-unread-comments-badge-tooltip = { $count } { $count ->
[one] unread comment
*[other] unread comments
}
post-comments-heading = { $count } { $count ->
[one] Comment
*[other] Comments
}
mark-as-read-instruction = Click to mark as read
post-comments-link = { $count } { $count ->
[one] comment
*[other] comments
}
add-reaction-button = Add Reaction
move-post-title = Move { $count ->
[one] Post:
*[other] { $count } Posts
}
move-to-channel-button = Move to Channel
move-to-channel-confirm-button = Move
mark-as-read-button = Mark as Read
create-post-button = Create a Post
create-post-title = New Post
post-channel-label = Channel
post-submit-button = Post
edit-post-title = Edit Post
edit-post-link = Edit Post
post-title-label = Title
similar-posts-label = See these similar posts:
post-body-label = Body
channel-picker-placeholder = Select a Channel
delete-post-confirm-message = Are you sure you want to permanently delete this post?
delete-post-success-message = Post deleted.
original-post-link = Original Post
pin-to-top-button = Pin to Top
unpin-button = Unpin
post-comment-button = Comment
move-to-trash-button = Move to Trash
restore-button = Restore
delete-forever-button = Delete Forever
## Comments
comments-unread-heading = Unread
comments-unread-link = Unread
create-comment-title = Write a Comment
edit-comment-title = Edit Comment
comment-number-title = Comment #{ $number }
comment-in-reply-to-link = In reply to
comment-show-replies-button = Show { $count } { $count ->
[one] reply
*[other] replies
}
comment-reply-button = Reply
mark-as-answer-button = Mark as Answer
unmark-as-answer-button = Unmark as Answer
comment-answer-badge = Answer
comments-locked-message = Comments are locked.
lock-comments-button = Lock Comments
unlock-comments-button = Unlock Comments
composer-placeholder = Write a comment...
composer-reply-to-placeholder = Reply to { $userName }...
composer-replying-to-label = Replying to
composer-clear-reply-button = Clear
composer-submit = Post
delete-comment-confirm-message = Are you sure you want to permanently delete this comment?
comment-removed-message = Comment removed
comment-removed-tooltip = { $user } removed { $timestamp }
## Moderation
remove-button = Remove
removed-by-label = Removed by
removal-reason-label = Removal Reason
removal-reason-unspecified-label = Unspecified
removal-message-label = Message to Author
report-button = Report
report-confirm-button = Submit Report
report-note-placeholder = Add a note (optional)
report-system-user = System
user-actions-label = User Actions
user-actions-suspend-label = Suspend { $user }
user-actions-suspend-days = Days
user-actions-suspend-weeks = Weeks
user-actions-suspend-indefinitely = Indefinitely
approve-button = Approve
flag-dismiss-button = Dismiss
report-reason-off-topic-label = Off-topic
report-reason-off-topic-description = This content is not relevant to the current discussion.
report-reason-inappropriate-label = Inappropriate
report-reason-inappropriate-description = This content is offensive, abusive, or violates the community guidelines.
report-reason-spam-label = Spam
report-reason-spam-description = This content is an advertisement or vandalism.
report-reason-other-label = Other
report-reason-other-description = This content requires attention for some other reason.
report-reason-approval-label = Pending approval
moderation-title = Moderation
moderation-empty-message = No Pending Flags
moderation-finished-message = You're all caught up.
pending-approval-title = Pending approval
## Misc
quote-button = Quote
attribution-timestamp-created-label = Posted
attribution-timestamp-edited-label = Edited
## Filters
filter-alphabetical = Alphabetical
filter-following = Following
filter-ignoring = Ignoring
filter-newest = Newest
filter-latest = Latest
filter-oldest = Oldest
filter-top = Top
filter-top-all-time = All Time
filter-top-year = Year
filter-top-quarter = Quarter
filter-top-month = Month
filter-top-week = Week
filter-top-day = Day
filter-trending = Trending
filter-trash = Trash
## Followables
follow-button = Follow
follow-button-following = Following
follow-button-ignored = Ignored
ignore-button = Ignore
unfollow-button = Unfollow
unignore-button = Unignore
channel-follow-description = Get notified when there are new posts in this channel.
post-follow-description = Get notified when there are new comments on this post.
post-following-badge = Following
post-ignored-badge = Ignored
## Index
menu-button = Menu
navigation-title = Forum Navigation
post-feed-new-activity-button = New Activity
post-feed-new-activity-heading = New Activity
post-feed-empty-message = No Posts
post-feed-controls-layout-heading = Display as
================================================
FILE: lang/en/install.ftl
================================================
### Installation
## Groups
group-guest = Guest
group-member = Member
group-admin = Admin
group-moderator = Mod
group-quarantine = Quarantine
## Reactions
reaction-set-emoji = Emoji
reaction-type-like = Like
reaction-type-love = Love
reaction-type-laugh = Laugh
reaction-type-wow = Wow
reaction-type-sad = Sad
reaction-type-angry = Angry
reaction-set-votes = Votes
reaction-type-upvote = Upvote
## Structure
announcements-name = Announcements
announcements-description = News and other updates from the team.
introductions-name = Introductions
introductions-description = New to the community? Introduce yourself!
support-name = Support
support-description = Get help setting up, using, and customising our product.
ideas-name = Ideas
ideas-description = Have an idea? We want to hear it!
staff-name = Staff Only
staff-description = A private channel for staff discussion.
guide-title = Community Guide
guide-body =
Welcome to { $forumName }, and thanks for joining us! We want everyone to get the most out of of this community, so we ask that you please read and follow these guidelines.
- **Be civil.** This is a place to share knowledge and interests through conversation. Be kind, patient, and respectful towards everyone, including people outside of the Waterhole community.
- **No personal attacks.** Criticizing ideas, by means of reasoned arguments, is an important part of what we're doing here. But it's not okay for that to devolve into personal attacks. Harassment and other exclusionary behavior are never acceptable.
- **Assume good faith.** When there is disagreement, try to understand why, always assuming good intentions. Remember that different people have different perspectives on issues, and that's okay.
================================================
FILE: lang/en/notifications.ftl
================================================
### Notifications
title = Notifications
mark-all-as-read-button = Mark All as Read
preferences-button = Notification Preferences
empty-message = No Notifications
## Unsubscribe
unsubscribe-link = Unsubscribe from these notifications
unsubscribe-success-message = You've been unsubscribed from these notifications.
manage-notification-preferences-link = Manage notification preferences
## Mention
mention-description = Mentions and replies to my comments
mention-title = Mentioned in { $post }
mention-reason = You received this because you are subscribed to mention notifications.
mention-unsubscribe = Unsubscribe from mention notifications
## Content Approved
post-approved-title = Post approved: { $post }
comment-approved-title = Comment approved in { $post }
## New Comment
new-comment-description = New comments on followed posts
new-comment-title = New comment in { $post }
new-comment-reason = You received this because you are following this post.
new-comment-unsubscribe = Unfollow this post
## New Post
new-post-description = New posts in followed channels
new-post-title = New post in { $channel }: { $post }
new-post-reason = You received this because you are following this channel.
new-post-unsubscribe = Unfollow this channel
## New Flag
new-flag-description = Flags in channels I moderate
flagged-post-title = Post flagged: { $post }
flagged-comment-title = Comment flagged in { $post }
new-flag-reason = You received this because you moderate a channel.
new-flag-unsubscribe = Unsubscribe from flag notifications
## Content Removed
post-removed-title = Post removed: { $post }
comment-removed-title = Comment removed in { $post }
## Common
view-post-button = View Post
view-comment-button = View Comment
================================================
FILE: lang/en/passwords.php
================================================
<?php
// https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/passwords.php
return [
'reset' => 'Your password has been reset.',
'sent' => 'We have emailed your password reset link.',
'throttled' => 'Please wait before retrying.',
'token' => 'This password reset token is invalid.',
'user' => "We can't find a user with that email address.",
];
================================================
FILE: lang/en/system.ftl
================================================
## Accessibility
skip-to-main-content-link = Skip to main content
## Errors
fatal-error-heading = Something Went Wrong
try-again-button = Try Again
fatal-error-message = Something went wrong! Please reload the page and try again.
too-many-requests-message = You're going a bit too fast! Take a break and try again in a moment.
forbidden-message = You don't have permission to do this.
session-expired-message = Your session has expired. Please reload the page and try again.
validation-errors-message = The following errors were found:
## Generic Buttons & Links
save-changes-button = Save Changes
create-button = Create
cancel-button = Cancel
change-button = Change
continue-button = Continue
actions-button = Actions
learn-more-link = Learn More
delete-button = Delete
edit-link = Edit
copy-link-button = Copy Link
controls-button = Controls
more-button = More
loading = Loading
show-more-button = Show more
## Post Feed Layouts
layout-list = List
layout-cards = Cards
## Actions
confirm-action-title = Confirm Action
delete-confirm-button = Delete
link-copied-message = Link copied to clipboard.
## Users
deleted-user = Deleted User
user-list-overflow = { $count } others
## Pagination
pagination-first-link = First
pagination-previous-link = Previous
pagination-next-link = Next
pagination-last-link = Last
load-more-button = Load More
page-number-prefix = Page
page-number-heading = Page { $number }
## Theme Switcher
theme-button = Theme
theme-light = Light
theme-dark = Dark
theme-automatic = Automatic
## Text Editor
text-editor-heading = Heading
text-editor-bold = Bold
text-editor-italic = Italic
text-editor-quote = Quote
text-editor-code = Code
text-editor-link = Link
text-editor-bulleted-list = Bulleted List
text-editor-numbered-list = Numbered List
text-editor-mention = Mention a User
text-editor-emoji = Insert Emoji
text-editor-attachment = Attach Files
text-editor-preview = Preview
## Icon Picker
icon-field-label = Icon
icon-picker-change-button = Change
icon-picker-none-option = None
icon-picker-emoji-option = Emoji
icon-picker-emoji-description = Enter a single emoji character.
icon-picker-svg-option = SVG Icon
icon-picker-svg-description = Enter the name of an icon from one of the following installed sets: { $sets }.
icon-picker-svg-search-link = Search icons
icon-picker-image-option = Image
## Abilities
ability-view = View
ability-comment = Comment
ability-post = Post
ability-moderate = Moderate
ability-assign-tags = Assign Tags
## Used in the Waterhole\compact_number() function
compact-number-1000 = 0.0K
compact-number-10000 = 00K
compact-number-100000 = 000K
compact-number-1000000 = 0.0M
compact-number-10000000 = 00M
compact-number-100000000 = 000M
compact-number-1000000000 = 0.0B
================================================
FILE: lang/en/user.ftl
================================================
### User
## Account Settings
account-settings-title = Account Settings
delete-account-button = Delete Your Account
delete-account-confirmation-title = Are you sure you want to delete your account?
delete-account-confirmation-description = Your account data will be removed. Your contributions will be retained but marked as anonymous. This cannot be undone.
delete-account-success-message = Your account has been deleted.
## Notification Preferences
notification-preferences-title = Notification Preferences
notifications-label = Notifications
notification-channel-web = Web
notification-channel-email = Email
notifications-following-label = Following
follow-on-comment-label = Automatically follow posts I comment on
notification-preferences-saved-message = Notification preferences saved.
## Edit Profile
edit-profile-title = Edit Profile
profile-saved-message = Profile saved.
avatar-label = Avatar
remove-avatar-label = Remove avatar
headline-label = Headline
headline-description = Describe yourself in a few words. This will be displayed next to your name.
bio-label = Bio
bio-description = Write more about yourself. This will be displayed on your profile.
location-label = Location
website-label = Website
privacy-title = Privacy
show-online-label = Show when I was last online
## Comments
user-comments-title = { $userName }'s Comments
comments-empty-message = No Comments
## Posts
user-posts-title = { $userName }'s Posts
posts-empty-message = No Posts
## User Menu
profile-link = Profile
preferences-link = Preferences
administration-link = Administration
log-out-link = Log Out
## Profile
user-joined-text = Joined
user-last-seen-text = Last seen
online-label = Online
## Sidebar
posts-link = Posts
comments-link = Comments
preferences-heading = Preferences
account-settings-link = Account
edit-profile-link = Profile
notification-preferences-link = Notifications
## Admin
suspend-button = Suspend
edit-suspension-button = Edit Suspension
suspend-user-title = Suspend
not-suspended-label = Not suspended
suspended-indefinitely-label = Suspended indefinitely
suspended-until-label = Suspended until...
suspended-badge = Suspended
suspended-message = Your account has been suspended.
copy-impersonation-url-button = Copy Impersonation URL
impersonation-url-copied-message = Impersonation URL copied – open it in a new private window.
================================================
FILE: lang/en/validation.php
================================================
<?php
// https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/validation.php
return [
'accepted' => 'The :attribute field must be accepted.',
'accepted_if' => 'The :attribute field must be accepted when :other is :value.',
'active_url' => 'The :attribute field must be a valid URL.',
'after' => 'The :attribute field must be a date after :date.',
'after_or_equal' => 'The :attribute field must be a date after or equal to :date.',
'alpha' => 'The :attribute field must only contain letters.',
'alpha_dash' =>
'The :attribute field must only contain letters, numbers, dashes, and underscores.',
'alpha_num' => 'The :attribute field must only contain letters and numbers.',
'any_of' => 'The :attribute field is invalid.',
'array' => 'The :attribute field must be an array.',
'ascii' =>
'The :attribute field must only contain single-byte alphanumeric characters and symbols.',
'before' => 'The :attribute field must be a date before :date.',
'before_or_equal' => 'The :attribute field must be a date before or equal to :date.',
'between' => [
'array' => 'The :attribute field must have between :min and :max items.',
'file' => 'The :attribute field must be between :min and :max kilobytes.',
'numeric' => 'The :attribute field must be between :min and :max.',
'string' => 'The :attribute field must be between :min and :max characters.',
],
'boolean' => 'The :attribute field must be true or false.',
'can' => 'The :attribute field contains an unauthorized value.',
'confirmed' => 'The :attribute field confirmation does not match.',
'contains' => 'The :attribute field is missing a required value.',
'current_password' => 'The password is incorrect.',
'date' => 'The :attribute field must be a valid date.',
'date_equals' => 'The :attribute field must be a date equal to :date.',
'date_format' => 'The :attribute field must match the format :format.',
'decimal' => 'The :attribute field must have :decimal decimal places.',
'declined' => 'The :attribute field must be declined.',
'declined_if' => 'The :attribute field must be declined when :other is :value.',
'different' => 'The :attribute field and :other must be different.',
'digits' => 'The :attribute field must be :digits digits.',
'digits_between' => 'The :attribute field must be between :min and :max digits.',
'dimensions' => 'The :attribute field has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'doesnt_contain' => 'The :attribute field must not contain any of the following: :values.',
'doesnt_end_with' => 'The :attribute field must not end with one of the following: :values.',
'doesnt_start_with' =>
'The :attribute field must not start with one of the following: :values.',
'email' => 'The :attribute field must be a valid email address.',
'encoding' => 'The :attribute field must be encoded in :encoding.',
'ends_with' => 'The :attribute field must end with one of the following: :values.',
'enum' => 'The selected :attribute is invalid.',
'exists' => 'The selected :attribute is invalid.',
'extensions' => 'The :attribute field must have one of the following extensions: :values.',
'file' => 'The :attribute field must be a file.',
'filled' => 'The :attribute field must have a value.',
'gt' => [
'array' => 'The :attribute field must have more than :value items.',
'file' => 'The :attribute field must be greater than :value kilobytes.',
'numeric' => 'The :attribute field must be greater than :value.',
'string' => 'The :attribute field must be greater than :value characters.',
],
'gte' => [
'array' => 'The :attribute field must have :value items or more.',
'file' => 'The :attribute field must be greater than or equal to :value kilobytes.',
'numeric' => 'The :attribute field must be greater than or equal to :value.',
'string' => 'The :attribute field must be greater than or equal to :value characters.',
],
'hex_color' => 'The :attribute field must be a valid hexadecimal color.',
'image' => 'The :attribute field must be an image.',
'in' => 'The selected :attribute is invalid.',
'in_array' => 'The :attribute field must exist in :other.',
'in_array_keys' =>
'The :attribute field must contain at least one of the following keys: :values.',
'integer' => 'The :attribute field must be an integer.',
'ip' => 'The :attribute field must be a valid IP address.',
'ipv4' => 'The :attribute field must be a valid IPv4 address.',
'ipv6' => 'The :attribute field must be a valid IPv6 address.',
'json' => 'The :attribute field must be a valid JSON string.',
'list' => 'The :attribute field must be a list.',
'lowercase' => 'The :attribute field must be lowercase.',
'lt' => [
'array' => 'The :attribute field must have less than :value items.',
'file' => 'The :attribute field must be less than :value kilobytes.',
'numeric' => 'The :attribute field must be less than :value.',
'string' => 'The :attribute field must be less than :value characters.',
],
'lte' => [
'array' => 'The :attribute field must not have more than :value items.',
'file' => 'The :attribute field must be less than or equal to :value kilobytes.',
'numeric' => 'The :attribute field must be less than or equal to :value.',
'string' => 'The :attribute field must be less than or equal to :value characters.',
],
'mac_address' => 'The :attribute field must be a valid MAC address.',
'max' => [
'array' => 'The :attribute field must not have more than :max items.',
'file' => 'The :attribute field must not be greater than :max kilobytes.',
'numeric' => 'The :attribute field must not be greater than :max.',
'string' => 'The :attribute field must not be greater than :max characters.',
],
'max_digits' => 'The :attribute field must not have more than :max digits.',
'mimes' => 'The :attribute field must be a file of type: :values.',
'mimetypes' => 'The :attribute field must be a file of type: :values.',
'min' => [
'array' => 'The :attribute field must have at least :min items.',
'file' => 'The :attribute field must be at least :min kilobytes.',
'numeric' => 'The :attribute field must be at least :min.',
'string' => 'The :attribute field must be at least :min characters.',
],
'min_digits' => 'The :attribute field must have at least :min digits.',
'missing' => 'The :attribute field must be missing.',
'missing_if' => 'The :attribute field must be missing when :other is :value.',
'missing_unless' => 'The :attribute field must be missing unless :other is :value.',
'missing_with' => 'The :attribute field must be missing when :values is present.',
'missing_with_all' => 'The :attribute field must be missing when :values are present.',
'multiple_of' => 'The :attribute field must be a multiple of :value.',
'not_in' => 'The selected :attribute is invalid.',
'not_regex' => 'The :attribute field format is invalid.',
'numeric' => 'The :attribute field must be a number.',
'password' => [
'letters' => 'The :attribute field must contain at least one letter.',
'mixed' =>
'The :attribute field must contain at least one uppercase and one lowercase letter.',
'numbers' => 'The :attribute field must contain at least one number.',
'symbols' => 'The :attribute field must contain at least one symbol.',
'uncompromised' =>
'The given :attribute has appeared in a data leak. Please choose a different :attribute.',
],
'present' => 'The :attribute field must be present.',
'present_if' => 'The :attribute field must be present when :other is :value.',
'present_unless' => 'The :attribute field must be present unless :other is :value.',
'present_with' => 'The :attribute field must be present when :values is present.',
'present_with_all' => 'The :attribute field must be present when :values are present.',
'prohibited' => 'The :attribute field is prohibited.',
'prohibited_if' => 'The :attribute field is prohibited when :other is :value.',
'prohibited_if_accepted' => 'The :attribute field is prohibited when :other is accepted.',
'prohibited_if_declined' => 'The :attribute field is prohibited when :other is declined.',
'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.',
'prohibits' => 'The :attribute field prohibits :other from being present.',
'regex' => 'The :attribute field format is invalid.',
'required' => 'The :attribute field is required.',
'required_array_keys' => 'The :attribute field must contain entries for: :values.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_if_accepted' => 'The :attribute field is required when :other is accepted.',
'required_if_declined' => 'The :attribute field is required when :other is declined.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values are present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute field must match :other.',
'size' => [
'array' => 'The :attribute field must contain :size items.',
'file' => 'The :attribute field must be :size kilobytes.',
'numeric' => 'The :attribute field must be :size.',
'string' => 'The :attribute field must be :size characters.',
],
'starts_with' => 'The :attribute field must start with one of the following: :values.',
'string' => 'The :attribute field must be a string.',
'timezone' => 'The :attribute field must be a valid timezone.',
'unique' => 'The :attribute has already been taken.',
'uploaded' => 'The :attribute failed to upload.',
'uppercase' => 'The :attribute field must be uppercase.',
'url' => 'The :attribute field must be a valid URL.',
'ulid' => 'The :attribute field must be a valid ULID.',
'uuid' => 'The :attribute field must be a valid UUID.',
];
================================================
FILE: lang/fr/auth.ftl
================================================
### Auth
## Laravel strings
## https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/auth.php
failed = Ces identifiants ne correspondent pas à ceux de nos bases de données.
password = Le mot de passe saisi est incorrect.
throttle = Trop de tentatives de connexion. Veuillez réessayer dans { $seconds } secondes.
## Login
login-title = Se connecter à votre compte
login-submit = Se connecter
login-register-prompt = Vous n'avez pas de compte ?
login-register-link = S'inscrire
continue-with-provider = Continuer avec { $provider }
email-label = Adresse de courriel
password-label = Mot de passe
remember-me-label = Se souvenir de moi
forgot-password-link = Mot de passe oublié ?
## Forgot Password
forgot-password-title = Mot de passe oublié ?
forgot-password-introduction = Demandez un lien de réinitialisation du mot de passe en saisissant ci-dessous votre adresse de courriel.
forgot-password-submit = Envoyer le lien de réinitialisation du mot de passe
reset-password-title = Réinitialiser le mot de passe
new-password-label = Nouveau mot de passe
confirm-password-label = Confirmer le mot de passe
reset-password-submit = Réinitialiser le mot de passe
reset-password-mail-subject = Réinitialiser votre mot de passe
reset-password-mail-body = Nous avons reçu une demande de réinitialisation du mot de passe associé à votre compte sur { $forum }. Si vous n'êtes pas à l'origine de cette demande, aucune action n'est requise. Ce lien expirera dans { $minutes } minutes.
reset-password-mail-button = Réinitialiser le mot de passe
## Register
register-title = Créer un compte
name-label = Nom d'utilisateur
register-submit = Créer un compte
register-login-prompt = Vous avez déjà un compte ?
register-login-link = Se connecter
## Confirm Password
confirm-password-title = Confirmez votre mot de passe
confirm-password-introduction = Veuillez confirmer votre mot de passe avant de continuer.
confirm-password-submit = Confirmer
## Email Verification
email-verification-sent-message = Nous avons envoyé un courriel de confirmation à { $email }. S'il n'arrive pas dans les prochaines minutes, veuillez vérifier vos courriers indésirables.
email-verification-resend-button = Renvoyer
email-verification-required-message = Vous devez vérifier votre adresse de courriel.
email-verification-success-message = Merci d'avoir vérifié votre adresse de courriel !
email-verification-mail-subject = Vérifier l'adresse de courriel
email-verification-mail-body = Veuillez cliquer sur le bouton ci-dessous pour vérifier votre adresse de courriel. Si vous n'avez pas de compte sur { $forum }, aucune autre action n'est requise.
email-verification-mail-button = Vérifier l'adresse de courriel
================================================
FILE: lang/fr/cp.ftl
================================================
### Localization for Waterhole Control Panel
title = Panneau de contrôle
## Dashboard
dashboard-title = Tableau de bord
configure-mail-message = Vous devez configurer un pilote de messagerie pour que Waterhole puisse envoyer des courriels de vérification et des notifications.
debug-mode-on-message = Le mode débogage est activé. Des valeurs de configuration sensibles peuvent être exposées.
getting-started-title = Démarrer avec Waterhole
getting-started-strategy-title = Lire la documentation
getting-started-strategy-description = Apprendre à bâtir une communauté avec Waterhole.
getting-started-structure-title = Mettre en place votre structure
getting-started-structure-description = Configurer les canaux et les pages qui constituent le squelette de votre communauté.
getting-started-groups-title = Définir les groupes d'utilisateurs
getting-started-groups-description = Créer des groupes pour les modérateurs, les membres de l'équipe et les super utilisateurs.
getting-started-design-title = Rejoindre la communauté de Waterhole
getting-started-design-description = Poser des questions, partager des conseils et apprendre à exploiter au mieux votre communauté.
dashboard-users-title = Utilisateurs
dashboard-posts-title = Messages
dashboard-comments-title = Commentaires
period-today = Aujourd'hui
period-last-7-days = Ces 7 derniers jours
period-last-4-weeks = Ces 4 dernières semaines
period-last-3-months = Ces 3 derniers mois
period-last-12-months = Ces 12 derniers mois
period-this-month = Ce mois
period-this-quarter = Ce trimestre
period-this-year = Cette année
period-all-time = Depuis toujours
period-current-heading = Période actuelle
preiod-previous-heading = Période antérieure
## Structure
structure-title = Structure
structure-channel-label = Canal
structure-page-label = Page
structure-link-label = Lien
structure-heading-label = Rubrique
structure-visibility-public-label = Public
structure-visibility-members-label = Membres
structure-navigation-title = Navigation
structure-navigation-description = Déplacez les éléments ici pour les afficher dans le menu de navigation.
structure-unlisted-title = Non répertorié
structure-unlisted-description = Déplacez les éléments ici pour les masquer du menu de navigation.
delete-structure-confirm-message = Êtes-vous sûr de vouloir supprimer ce nœud ?
## Structure - Heading
edit-heading-title = Modifier la rubrique
create-heading-title = Créer une rubrique
heading-name-label = Nom
## Structure - Link
edit-link-title = Modifier le lien
create-link-title = Créer un lien
link-details-title = Informations
link-name-label = Nom
link-url-label = URL
link-permissions-title = Permissions
## Structure - Page
edit-page-title = Modifier la page
create-page-title = Créer une page
page-details-title = Informations
page-name-label = Nom
page-slug-label = Identifiant texte unique
page-slug-url-label = Cette page sera accessible sur :
page-body-label = Corps
page-permissions-title = Permissions
## Structure - Channel
edit-channel-title = Modifier le canal
create-channel-title = Créer un canal
channel-details-title = Informations
channel-name-label = Nom
channel-slug-label = Identifiant texte unique
channel-slug-url-label = Ce canal sera accessible sur :
channel-description-label = Description
channel-description-description = Une courte description de ce à quoi sert ce canal.
channel-options-title = Options
channel-visibility-label = Visibilité
channel-ignore-label = Ignoré par défaut
channel-ignore-description = Masque les messages de ce canal dans le fil d'actualité de tous les utilisateurs, à moins qu'ils ne le suivent explicitement.
channel-layout-title = Disposition
channel-layout-label = Disposition
channel-layout-show-author-label = Afficher l'auteur du message
channel-layout-show-excerpt-label = Afficher l'extrait du message
channel-filters-label = Filtres
channel-custom-filters-label = Utiliser des filtres personnalisés sur ce canal
channel-custom-filters-description = Remplace les filtres généraux de ce canal.
channel-permissions-title = Permissions
channel-approval-label = Approbation
channel-approval-moderators-exempt = Les modérateurs sont exemptés d'approbation.
channel-require-approval-posts-label = Exiger l'approbation des messages
channel-require-approval-comments-label = Exiger l'approbation des commentaires
channel-features-title = Fonctionnalités
channel-reactions-label = Réactions
channel-reactions-posts-label = Messages
channel-reactions-comments-label = Commentaires
reaction-set-picker-default = Par défaut ({ $name })
reaction-set-picker-none = Aucun
channel-taxonomies-label = Taxonomies
channel-answers-label = Réponses
channel-enable-answers-label = Activer les réponses sur ce canal
channel-enable-answers-description = Permet aux auteurs de messages de marquer un commentaire comme étant la réponse.
channel-posting-title = Publication
channel-instructions-label = Instructions de publication
channel-instructions-description = Affiche les instructions de publication aux utilisateurs lorsqu'ils rédigent des messages dans ce canal.
channel-similar-posts-title = Messages similaires
channel-show-similar-posts-label = Afficher les messages similaires de ce canal en fonction du titre
delete-channel-title = Supprimer le canal :
delete-channel-posts-label = Supprimer { $count } { $count ->
[one] message
*[other] messages
}
move-to-channel-posts-label = Déplacer { $count } { $count ->
[one] message
*[other] messages
} vers un autre canal
## Groups
groups-title = Groupes
create-group-button = Créer un groupe
group-user-count = { $count } { $count ->
[one] utilisateur
*[other] utilisateurs
}
edit-group-title = Modifier le groupe
create-group-title = Créer un groupe
group-details-title = Informations
group-name-label = Nom
group-appearance-label = Apparence
group-show-as-badge-label = Afficher ce groupe comme badge pour l'utilisateur
group-color-label = Couleur
group-icon-label = Icône
group-rules-title = Participation
group-auto-assign-label = Attribuer automatiquement ce groupe aux nouveaux membres
group-rules-requires-approval-label = Exiger l'approbation du contenu des nouveaux membres
group-rules-remove-after-approval-label = Retirer du groupe après approbation
group-permissions-title = Permissions
group-global-permissions-title = Autorisations globales
group-structure-permissions-title = Autorisations de structure
group-permission-suspend-users-label = Autoriser la suspension des utilisateurs
delete-group-confirm-message = Êtes-vous sûr de vouloir supprimer ce groupe ?
## Users
users-title = Utilisateurs
users-filter-placeholder = Filtrer les utilisateurs
users-filter-group-description = Filtrer par groupe
create-user-button = Créer un utilisateur
users-name-column = Nom
users-email-column = Adresse de courriel
users-groups-column = Groupes
users-created-at-column = Création
users-last-seen-at-column = Dernière visite
users-empty-message = Aucun résultat n'a été trouvé
edit-user-title = Modifier l'utilisateur
create-user-title = Créer un utilisateur
user-account-title = Compte
user-name-label = Nom
user-email-label = Adresse de courriel
user-password-label = Mot de passe
user-set-password-label = Définir un nouveau mot de passe
user-groups-label = Groupes
user-profile-title = Profil
user-created-message = L'utilisateur a été créé.
user-saved-message = L'utilisateur a été enregistré.
delete-user-title = Supprimer { $count ->
[one] l'utilisateur :
*[other] { $count } utilisateurs
}
keep-user-content-label = Conserver le contenu et le marquer comme anonyme
delete-user-content-label = Supprimer définitivement le contenu
delete-user-success-message = L'utilisateur a été supprimé.
## Reactions
reactions-title = Réactions
reaction-sets-title = Ensembles de réactions
create-reaction-set-button = Créer un ensemble de réactions
edit-reaction-set-title = Modifier l'ensemble de réactions
create-reaction-set-title = Créer un ensemble de réactions
reaction-set-details-title = Détails
reaction-set-name-label = Nom
reaction-set-usage-label = Utilisation
reaction-set-default-posts = Utiliser par défaut pour les messages
reaction-set-default-comments = Utiliser par défaut pour les commentaires
delete-reaction-set-confirm-message = Êtes-vous sûr de vouloir supprimer cet ensemble de réactions ?
reaction-set-saved-message = L'ensemble de réactions a été enregistré.
reaction-types-title = Types de réactions
reaction-types-empty-message = Aucun type de réaction
reaction-types-add-button = Ajouter
edit-reaction-type-title = Modifier le type de réaction
create-reaction-type-title = Créer un type de réaction
reaction-type-name-label = Nom
reaction-type-score-label = Score
reaction-type-score-description = Le nombre de points que vaut cette réaction.
delete-reaction-type-confirm-message = Êtes-vous sûr de vouloir supprimer ce type de réaction ?
reaction-type-saved-message = Le type de réaction a été enregistré.
## Taxonomies
taxonomies-title = Taxonomies
create-taxonomy-button = Créer une taxonomie
create-taxonomy-title = Créer une taxonomie
edit-taxonomy-title = Modifier la taxonomie
taxonomy-details-title = Informations
taxonomy-permissions-title = Permissions
taxonomy-tags-title = Étiquettes
taxonomy-name-label = Nom
taxonomy-options-title = Options
taxonomy-required-label = Exiger la sélection d'une étiquette lors de la création d'un message
taxonomy-allow-multiple-label = Permettre la sélection de plusieurs étiquettes
taxonomy-saved-message = La taxonomie a été enregistrée.
delete-taxonomy-confirm-message = Êtes-vous sûr de vouloir supprimer cette taxonomie ?
create-tag-title = Créer une étiquette
edit-tag-title = Modifier l'étiquette
tag-name-label = Nom
tag-saved-message = L'étiquette a été enregistrée.
delete-tag-confirm-message = Êtes-vous sûr de vouloir supprimer cette étiquette ?
## Licensing
license-error-message = Votre licence n'a pas pu être validée en raison d'une erreur de communication avec l'API de Waterhole. ({ $status })
license-invalid-message = Veuillez acheter ou saisir une clé de licence valide pour ce site afin de vous conformer à l'accord de licence.
license-expired-message = Vous n'êtes pas autorisé à utiliser cette version de Waterhole. Veuillez rétrograder votre version ou renouveler votre licence.
license-suspended-message = Votre licence Waterhole a été suspendue. Veuillez nous contacter pour plus d'informations.
trial-badge = Version d'essai
licensed-badge = Licence valide
unlicensed-badge = Sans licence
================================================
FILE: lang/fr/forum.ftl
================================================
### Forum
feed-link = Flux
## Header
log-in = Se connecter
register = S'inscrire
## Search
search-placeholder = Rechercher dans toutes les discussions
search-results-title = Résultats de la recherche pour "{ $query }"
search-button = Rechercher
search-filter-button = Filtre
search-showing-results-title = Affichage de { $total } { $total ->
[one] résultat
*[other] résultats
}
search-showing-results-non-exhaustive-title = Affichage de { $total }+ { $total ->
[one] résultat
*[other] résultats
}
search-sort-relevance = Trier par pertinence
search-sort-latest = Trier par ordre chronologique
search-sort-top = Trier par popularité
search-empty-message = Aucun résultat n'a été trouvé
search-keywords-too-short-message = Vos mots-clés sont trop courts, essayez une requête plus longue.
## Posts
post-activity-replied = a répondu
post-activity-posted = a publié
post-new-badge = Nouveau
post-new-badge-tooltip = Nouveau message
post-locked-badge = Verrouillé
post-answered-badge = Répondu
post-trash-badge = Corbeille
post-removed-message = Message supprimé
post-answered-by = Répondu par
post-view-answer-link = Voir la réponse
post-unread-comments-badge-tooltip = { $count } { $count ->
[one] commentaire non lu
*[other] commentaires non lus
}
post-comments-heading = { $count } { $count ->
[one] commentaire
*[other] commentaires
}
mark-as-read-instruction = Cliquer pour marquer comme lu
post-comments-link = { $count } { $count ->
[one] commentaire
*[other] commentaires
}
add-reaction-button = Ajouter une réaction
move-post-title = Déplacer { $count ->
[one] le message :
*[other] { $count } messages
}
move-to-channel-button = Déplacer vers le canal
move-to-channel-confirm-button = Déplacer
mark-as-read-button = Marquer comme lu
create-post-button = Créer un message
create-post-title = Nouveau message
post-channel-label = Canal
post-submit-button = Message
edit-post-title = Modifier le message
edit-post-link = Modifier le message
post-title-label = Titre
similar-posts-label = Voir ces messages similaires :
post-body-label = Corps
channel-picker-placeholder = Sélectionner un canal
delete-post-confirm-message = Êtes-vous sûr de vouloir supprimer ce message ?
delete-post-success-message = Le message a été supprimé.
original-post-link = Message original
pin-to-top-button = Épingler en haut
unpin-button = Ne plus épingler
post-comment-button = Commenter
move-to-trash-button = Déplacer vers la corbeille
restore-button = Restaurer
delete-forever-button = Supprimer définitivement
## Comments
comments-unread-heading = Non lu
comments-unread-link = Non lu
create-comment-title = Écrire un commentaire
edit-comment-title = Modifier le commentaire
comment-number-title = Commentaire #{ $number }
comment-in-reply-to-link = En réponse à
comment-show-replies-button = Afficher { $count } { $count ->
[one] la réponse
*[other] les réponses
}
comment-reply-button = Répondre
mark-as-answer-button = Marquer comme réponse
unmark-as-answer-button = Ne plus marquer comme réponse
comment-answer-badge = Réponse
comments-locked-message = Les commentaires sont verrouillés.
lock-comments-button = Verrouiller les commentaires
unlock-comments-button = Déverrouiller les commentaires
composer-placeholder = Écrire un commentaire…
composer-reply-to-placeholder = Répondre à { $userName }…
composer-replying-to-label = En réponse à
composer-clear-reply-button = Effacer
composer-submit = Publier
delete-comment-confirm-message = Êtes-vous sûr de vouloir supprimer ce commentaire ?
comment-removed-message = Commentaire supprimé
comment-removed-tooltip = { $user } a supprimé { $timestamp }
## Moderation
remove-button = Retirer
removed-by-label = Retiré par
removal-reason-label = Raison du retrait
removal-reason-unspecified-label = Non précisée
removal-message-label = Message à l'auteur
report-button = Signaler
report-confirm-button = Envoyer le signalement
report-note-placeholder = Ajouter une note (facultatif)
report-system-user = Système
user-actions-label = Actions utilisateur
user-actions-suspend-label = Suspendre { $user }
user-actions-suspend-days = Jours
user-actions-suspend-weeks = Semaines
user-actions-suspend-indefinitely = Indéfiniment
approve-button = Approuver
flag-dismiss-button = Ignorer
report-reason-off-topic-label = Hors sujet
report-reason-off-topic-description = Ce contenu n'est pas pertinent pour la discussion en cours.
report-reason-inappropriate-label = Inapproprié
report-reason-inappropriate-description = Ce contenu est offensant, abusif ou enfreint les règles de la communauté.
report-reason-spam-label = Spam
report-reason-spam-description = Ce contenu est une publicité ou du vandalisme.
report-reason-other-label = Autre
report-reason-other-description = Ce contenu nécessite une attention pour une autre raison.
report-reason-approval-label = En attente d'approbation
moderation-title = Modération
moderation-empty-message = Aucun signalement en attente
moderation-finished-message = Tout est à jour.
pending-approval-title = En attente d'approbation
## Misc
quote-button = Citer
attribution-timestamp-created-label = Publié
attribution-timestamp-edited-label = Modifié
## Filters
filter-alphabetical = Ordre alphabétique
filter-following = Plus suivis
filter-ignoring = Plus ignorés
filter-newest = Plus récents
filter-latest = Plus actifs
filter-oldest = Plus anciens
filter-top = Plus populaires
filter-top-all-time = Depuis toujours
filter-top-year = Année
filter-top-quarter = Trimestre
filter-top-month = Mois
filter-top-week = Semaine
filter-top-day = Jour
filter-trending = Plus tendances
filter-trash = Corbeille
## Followables
follow-button = Suivre
follow-button-following = Abonnés
follow-button-ignored = Ignorés
ignore-button = Ignorer
unfollow-button = Ne plus suivre
unignore-button = Ne plus ignorer
channel-follow-description = Recevez une notification lorsque de nouveaux messages sont publiés dans ce canal.
post-follow-description = Recevez une notification lorsque de nouveaux commentaires sont publiés dans ce message.
post-following-badge = Abonnés
post-ignored-badge = Ignorés
## Index
menu-button = Menu
navigation-title = Navigation du forum
post-feed-new-activity-button = Nouvelle activité
post-feed-new-activity-heading = Nouvelle activité
post-feed-empty-message = Il n'y a aucun message
post-feed-controls-layout-heading = Afficher comme
================================================
FILE: lang/fr/install.ftl
================================================
### Installation
## Groups
group-guest = Invité
group-member = Membre
group-admin = Administrateur
group-moderator = Modérateur
group-quarantine = Quarantaine
## Reactions
reaction-set-emoji = Émoji
reaction-type-like = J'aime
reaction-type-love = Cœur
reaction-type-laugh = Rire
reaction-type-wow = Waouh
reaction-type-sad = Triste
reaction-type-angry = En colère
reaction-set-votes = Votes
reaction-type-upvote = Voter pour
## Structure
announcements-name = Annonces
announcements-description = Actualités et autres annonces de l'équipe.
introductions-name = Présentations
introductions-description = Nouveau dans la communauté ? Présentez-vous !
support-name = Assistance
support-description = Obtenez de l'aide pour configurer, utiliser et personnaliser notre logiciel.
ideas-name = Idées
ideas-description = Vous avez une idée ? Nous voulons l'entendre !
staff-name = Réservé à l'équipe
staff-description = Un canal privé pour les discussions entre membres de l'équipe.
guide-title = Guide communautaire
guide-body =
Bienvenue sur { $forumName } et merci de nous rejoindre ! Nous souhaitons que chacun puisse profiter au maximum de cette communauté, et c'est pourquoi nous vous demandons de bien vouloir lire et respecter les lignes directrices suivantes.
- **Soyez courtois.** Il s'agit d'un lieu de partage de connaissances et d'intérêts par le biais de conversations. Soyez aimable, patient et respectueux envers tout le monde, y compris les personnes extérieures à la communauté de Waterhole.
- **Pas d'attaque personnelle.** La critique des idées, au moyen d'arguments raisonnés, est une partie importante de ce que nous faisons ici. Il n'est cependant pas acceptable que cela dégénère en attaques personnelles. Le harcèlement et les autres comportements discriminatoires ne sont pas tolérés.
- **Présumez de la bonne foi.** En cas de désaccord, essayez d'en comprendre les raisons tout en présumant que leurs intentions sont toujours bonnes. N'oubliez pas que les gens ont des points de vue différents sur de nombreux sujets, ce qui est parfaitement normal.
================================================
FILE: lang/fr/notifications.ftl
================================================
### Notifications
title = Notifications
mark-all-as-read-button = Marquer tout comme lu
preferences-button = Préférences de notification
empty-message = Aucune notification
## Unsubscribe
unsubscribe-link = Se désabonner de ces notifications
unsubscribe-success-message = Vous êtes à présent désabonné de ces notifications.
manage-notification-preferences-link = Gérer les préférences de notification
## Mention
mention-description = Mentions et réponses à mes commentaires
mention-title = Mentionné dans { $post }
mention-reason = Vous recevez cette notification parce que vous avez été mentionné.
mention-unsubscribe = Ne plus recevoir de notification lorsque je suis mentionné
## Content Approved
post-approved-title = Message approuvé : { $post }
comment-approved-title = Commentaire approuvé dans { $post }
## New Comment
new-comment-description = Nouveaux commentaires dans un message suivi
new-comment-title = Nouveau commentaire dans { $post }
new-comment-reason = Vous recevez cette notification parce que vous êtes abonné à ce message.
new-comment-unsubscribe = Se désabonner de ce message
## New Post
new-post-description = Nouveaux messages dans un canal suivi
new-post-title = Nouveau message dans { $channel } : { $post }
new-post-reason = Vous recevez cette notification parce que vous êtes abonné à ce canal.
new-post-unsubscribe = Se désabonner de ce canal
## New Flag
new-flag-description = Signalements dans les canaux que je modère
flagged-post-title = Message signalé : { $post }
flagged-comment-title = Commentaire signalé dans { $post }
new-flag-reason = Vous recevez ceci parce que vous modérez un canal.
new-flag-unsubscribe = Se désabonner des notifications de signalement
## Content Removed
post-removed-title = Message supprimé : { $post }
comment-removed-title = Commentaire supprimé dans { $post }
## Common
view-post-button = Voir le message
view-comment-button = Voir le commentaire
================================================
FILE: lang/fr/passwords.php
================================================
<?php
// https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/passwords.php
return [
'reset' => 'Votre mot de passe a été réinitialisé !',
'sent' =>
'Nous vous avons envoyé le lien de réinitialisation de votre mot de passe par courriel !',
'throttled' => 'Veuillez patienter avant de réessayer.',
'token' => "Ce jeton de réinitialisation du mot de passe n'est pas valide.",
'user' => "Nous ne trouvons pas d'utilisateur associé à cette adresse de courriel.",
];
================================================
FILE: lang/fr/system.ftl
================================================
## Accessibility
skip-to-main-content-link = Passer au contenu principal
## Errors
fatal-error-heading = Une erreur s'est produite
try-again-button = Réessayer
fatal-error-message = Une erreur s'est produite ! Veuillez recharger la page puis réessayer
too-many-requests-message = Vous allez un peu trop vite ! Faites une pause et réessayez dans un instant.
forbidden-message = Vous n'avez pas la permission de faire cela.
session-expired-message = Votre session a expiré. Veuillez recharger la page et réessayer.
validation-errors-message = Les erreurs suivantes ont été détectées :
## Generic Buttons & Links
save-changes-button = Enregistrer les modifications
create-button = Créer
cancel-button = Annuler
change-button = Modifier
continue-button = Continuer
actions-button = Actions
learn-more-link = En savoir plus
delete-button = Supprimer
edit-link = Modifier
copy-link-button = Copier le lien
controls-button = Contrôles
more-button = Plus
loading = Chargement
show-more-button = Afficher plus
## Post Feed Layouts
layout-list = Liste
layout-cards = Cartes
## Actions
confirm-action-title = Confirmer l'action
delete-confirm-button = Supprimer
link-copied-message = Lien copié dans le presse-papiers.
## Users
deleted-user = Utilisateur supprimé
user-list-overflow = { $count } autres
## Pagination
pagination-first-link = Premier
pagination-previous-link = Précédent
pagination-next-link = Suivant
pagination-last-link = Dernier
load-more-button = Charger plus
page-number-prefix = Page
page-number-heading = Page { $number }
## Theme Switcher
theme-button = Thème
theme-light = Clair
theme-dark = Sombre
theme-automatic = Automatique
## Text Editor
text-editor-heading = Titre
text-editor-bold = Gras
text-editor-italic = Italique
text-editor-quote = Citer
text-editor-code = Code
text-editor-link = Lien
text-editor-bulleted-list = Liste à puces
text-editor-numbered-list = Liste numérotée
text-editor-mention = Mentionner un utilisateur
text-editor-emoji = Insérer un émoji
text-editor-attachment = Joindre des fichiers
text-editor-preview = Prévisualiser
## Icon Picker
icon-field-label = Icône
icon-picker-change-button = Modifier
icon-picker-none-option = Aucun
icon-picker-emoji-option = Émoji
icon-picker-emoji-description = Saisissez un seul caractère émoji.
icon-picker-svg-option = Icône SVG
icon-picker-svg-description = Saisissez le nom d'une icône appartenant à l'un des ensembles installés suivants : { $sets }.
icon-picker-svg-search-link = Rechercher des icônes
icon-picker-image-option = Image
## Abilities
ability-view = Voir
ability-comment = Commenter
ability-post = Publier
ability-moderate = Modérer
ability-assign-tags = Étiqueter
## Used in the Waterhole\compact_number() function
compact-number-1000 = 0.0 k
compact-number-10000 = 00 k
compact-number-100000 = 000 k
compact-number-1000000 = 0.0 M
compact-number-10000000 = 00 M
compact-number-100000000 = 000 M
compact-number-1000000000 = 0.0 G
================================================
FILE: lang/fr/user.ftl
================================================
### User
## Account Settings
account-settings-title = Paramètres du compte
delete-account-button = Supprimer votre compte
delete-account-confirmation-title = Êtes-vous sûr de vouloir supprimer votre compte ?
delete-account-confirmation-description = Les données de votre compte seront supprimées. Vos contributions seront conservées mais marquées comme anonymes. Cette action est irréversible.
delete-account-success-message = Votre compte a été supprimé.
## Notification Preferences
notification-preferences-title = Préférences de notification
notifications-label = Notifications
notification-channel-web = Web
notification-channel-email = Courriel
notifications-following-label = Abonnements
follow-on-comment-label = Suivre automatiquement les messages que je commente
notification-preferences-saved-message = Les préférences de notification ont été enregistrées.
## Edit Profile
edit-profile-title = Modifier le profil
profile-saved-message = le profil a été enregistré.
avatar-label = Avatar
remove-avatar-label = Supprimer l'avatar
headline-label = Intitulé
headline-description = Décrivez-vous en quelques mots. Cette description sera affichée à côté de votre nom.
bio-label = Biographie
bio-description = Donnez plus d'informations sur vous. Ces informations seront affichées sur votre profil.
location-label = Localisation
website-label = Site internet
privacy-title = Confidentialité
show-online-label = Afficher la date de ma dernière connexion
## Comments
user-comments-title = Commentaires de { $userName }
comments-empty-message = Aucun commentaire
## Posts
user-posts-title = Messages de { $userName }
posts-empty-message = Aucun message
## User Menu
profile-link = Profil
preferences-link = Préférences
administration-link = Administration
log-out-link = Se déconnecter
## Profile
user-joined-text = Inscrit le
user-last-seen-text = Dernière visite le
online-label = En ligne
## Sidebar
posts-link = Messages
comments-link = Commentaires
preferences-heading = Préférences
account-settings-link = Compte
edit-profile-link = Profil
notification-preferences-link = Notifications
## Admin
suspend-button = Suspendre
edit-suspension-button = Modifier la suspension
suspend-user-title = Suspendre
not-suspended-label = Non suspendu
suspended-indefinitely-label = Suspendu indéfiniment
suspended-until-label = Suspendu jusqu'à…
suspended-badge = Suspendu
suspended-message = Votre compte a été suspendu.
copy-impersonation-url-button = Copier l'URL d'usurpation d'identité
impersonation-url-copied-message = L'URL d'usurpation d'identité a été copiée, vous pouvez l'ouvrir dans une nouvelle fenêtre privée.
================================================
FILE: lang/fr/validation.php
================================================
<?php
// https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/validation.php
return [
'accepted' => 'Le :attribute doit être accepté.',
'accepted_if' => 'Le :attribute doit être accepté lorsque :other est :value.',
'active_url' => "Le :attribute n'est pas une adresse URL valide.",
'after' => 'Le :attribute doit être une date postérieure au :date.',
'after_or_equal' => 'Le :attribute doit être une date postérieure ou égale au :date.',
'alpha' => 'Le :attribute ne doit contenir que des lettres.',
'alpha_dash' =>
'Le :attribute ne doit contenir que des lettres, des chiffres, des tirets et des tirets bas.',
'alpha_num' => 'Le :attribute ne doit contenir que des lettres et des chiffres.',
'array' => 'Le :attribute doit être un tableau.',
'ascii' =>
"Le :attribute ne doit contenir que des caractères alphanumériques et des symboles d'un seul octet.",
'before' => 'Le :attribute doit être une date antérieure au :date.',
'before_or_equal' => 'Le :attribute doit être une date antérieure ou égale au :date.',
'between' => [
'array' => 'Le tableau :attribute doit contenir entre :min et :max éléments.',
'file' =>
'La taille du fichier de :attribute doit être comprise entre :min et :max kilo-octets.',
'numeric' => 'La valeur de :attribute doit être comprise entre :min et :max.',
'string' => 'Le texte :attribute doit contenir entre :min et :max caractèress.',
],
'boolean' => 'Le :attribute doit être vrai ou faux.',
'confirmed' => 'Le champ de confirmation du :attribute ne correspond pas.',
'current_password' => 'Le mot de passe est incorrect.',
'date' => "Le :attribute n'est pas une date valide.",
'date_equals' => 'Le :attribute doit être une date égale à :date.',
'date_format' => 'Le :attribute ne correspond pas au format :format.',
'decimal' => 'Le :attribut doit avoir :decimal décimales.',
'declined' => 'Le :attribute doit être décliné.',
'declined_if' => 'Le :attribute doit être décliné lorsque :other est :value.',
'different' => 'Le :attribute et le :other doivent être différents.',
'digits' => 'Le :attribute doit contenir :digits chiffres.',
'digits_between' => 'Le :attribute doit contenir entre :min et :max chiffres.',
'dimensions' => "Les dimensions de l'image du :attribute ne sont pas valides.",
'distinct' => 'Le :attribute a une valeur dupliquée.',
'doesnt_end_with' =>
"Le :attribute ne doit pas se terminer par l'un des éléments suivants : :values.",
'doesnt_start_with' =>
"Le :attribute ne doit pas commencer par l'un des éléments suivants : :values.",
'email' => 'Le :attribute doit être une adresse de courriel valide.',
'ends_with' => 'Le :attribute doit terminer avec une des valeurs suivantes : :values.',
'enum' => "Le :attribute sélectionné n'est pas valide.",
'exists' => "Le :attribute sélectionné n'est pas valide.",
'file' => 'Le :attribute doit être un fichier.',
'filled' => 'Le :attribute doit contenir une valeur.',
'gt' => [
'array' => 'Le tableau :attribute doit contenir plus de :value éléments.',
'file' => 'La taille du fichier de :attribute doit être supérieure à :value kilo-octets.',
'numeric' => 'La valeur de :attribute doit être supérieure à :value.',
'string' => 'Le texte :attribute doit contenir plus de :value caractères.',
],
'gte' => [
'array' => 'Le tableau :attribute doit contenir au moins :value éléments.',
'file' =>
'La taille du fichier de :attribute doit être supérieure ou égale à :value kilo-octets.',
'numeric' => 'La valeur de :attribute doit être supérieure ou égale à :value.',
'string' => 'Le texte :attribute doit contenir au moins :value caractères.',
],
'image' => 'Le :attribute doit être une image.',
'in' => "Le :attribute sélectionné n'est pas invalide.",
'in_array' => "Le :attribute n'existe pas dans :other.",
'integer' => 'Le :attribute doit être un nombre entier.',
'ip' => 'Le :attribute doit être une adresse IP valide.',
'ipv4' => 'Le :attribute doit être une adresse IPv4 valide.',
'ipv6' => 'Le :attribute doit être une adresse IPv6 valide.',
'json' => 'Le :attribute doit être une chaîne JSON valide.',
'lowercase' => 'Le :attribute doit être en minuscules.',
'lt' => [
'array' => 'Le tableau :attribute doit contenir moins de :value éléments.',
'file' => 'La taille du fichier de :attribute doit être inférieure à :value kilo-octets.',
'numeric' => 'La valeur de :attribute doit être inférieure à :value.',
'string' => 'Le texte :attribute doit contenir moins de :value caractères.',
],
'lte' => [
'array' => 'Le tableau :attribute doit contenir au plus :value éléments.',
'file' =>
'La taille du fichier de :attribute doit être inférieure ou égale à :value kilo-octets.',
'numeric' => 'La valeur de :attribute doit être inférieure ou égale à :value.',
'string' => 'Le texte :attribute doit contenir au plus :value caractères.',
],
'mac_address' => 'Le :attribute doit être une adresse MAC valide.',
'max' => [
'array' => 'Le tableau :attribute ne doit pas contenir plus de :max éléments.',
'file' => 'La taille du fichier de :attribute ne doit pas dépasser :max kilo-octets.',
'numeric' => 'La valeur de :attribute ne doit pas dépasser :max.',
'string' => 'Le texte :attribute ne doit pas contenir plus de :max caractères.',
],
'max_digits' => 'Le :attribute ne doit pas comporter plus de chiffres que :max.',
'mimes' => 'Le :attribute doit être un fichier de type : :values.',
'mimetypes' => 'Le :attribute doit être un fichier de type : :values.',
'min' => [
'array' => 'Le tableau :attribute doit contenir au moins :min éléments.',
'file' => 'La taille du fichier de :attribute doit dépasser :min kilo-octets.',
'numeric' => 'La valeur de :attribute doit dépasser :min.',
'string' => 'Le texte :attribute doit contenir au moins :min caractères.',
],
'min_digits' => 'Le :attribute doit contenir au moins :min chiffres.',
'missing' => 'Le champ du :attribute doit être absent.',
'missing_if' => 'Le champ du :attribute doit être absent lorsque :other est :value.',
'missing_unless' => 'Le champ du :attribute doit être absent sauf si :other est :value.',
'missing_with' => 'Le champ du :attribute doit être absent lorsque :values est présent.',
'missing_with_all' => 'Le champ du :attribute doit être absent lorsque :values est présent.',
'multiple_of' => "L'attribut :attribute doit être un multiple de :value.",
'not_in' => "Le :attribute sélectionné n'est pas valide.",
'not_regex' => "Le format du :attribute n'est pas valide.",
'numeric' => 'Le :attribute doit être un nombre.',
'password' => [
'letters' => 'Le :attribute doit contenir au moins une lettre.',
'mixed' =>
'Le :attribute doit contenir au moins une lettre majuscule et une lettre minuscule.',
'numbers' => 'Le :attribute doit contenir au moins un chiffre.',
'symbols' => 'Le :attribute doit contenir au moins un symbole.',
'uncompromised' =>
"L'attribut :attribute spécifié est apparu dans une fuite de données. Veuillez saisir un autre :attribut.",
],
'present' => 'Le champ du :attribute doit être présent.',
'prohibited' => 'Le champ :attribute est prohibé.',
'prohibited_if' => 'Le champ :attribute est prohibé lorsque :other est :value.',
'prohibited_unless' => 'Le champ :attribute est prohibé sauf si :other figure dans :values.',
'prohibits' => 'Le champ :attribute interdit la présence de :other.',
'regex' => "Le format du :attribute n'est pas valide.",
'required' => 'Le champ du :attribute est obligatoire.',
'required_array_keys' => 'Le champ du :attribute doit contenir des entrées pour : :values.',
'required_if' =>
'Le champ du :attribute est obligatoire lorsque la valeur du :other est :value.',
'required_if_accepted' => 'Le champ du :attribute est obligatoire lorsque :other est accepté.',
'required_unless' => 'Le champ du :attribute est obligatoire sauf si :other est :values.',
'required_with' => 'Le champ du :attribute est obligatoire lorsque le :values est présent.',
'required_with_all' =>
'Le champ du :attribute est obligatoire lorsque le :values sont présents.',
'required_without' =>
"Le champ du :attribute est obligatoire lorsque le :values n'est pas présent.",
'required_without_all' =>
'Le champ du :attribute est obligatoire lorsque le :values ne sont pas présents.',
'same' => 'Le :attribute et le :other doivent être identiques.',
'size' => [
'array' => 'Le tableau :attribute doit contenir :size éléments.',
'file' => 'La taille du fichier de :attribute doit être de :size kilo-octets.',
'numeric' => 'La valeur de :attribute doit être de :size.',
'string' => 'Le texte :attribute doit contenir :size caractères.',
],
'starts_with' => 'Le :attribute doit commencer avec une des valeurs suivantes : :values.',
'string' => 'Le :attribute doit être une chaîne de caractères.',
'timezone' => 'Le :attribute doit être un fuseau horaire valide.',
'unique' => 'Le :attribute est déjà pris.',
'uploaded' => 'Le transfert de :attribute a échoué.',
'uppercase' => 'Le :attribute doit être en majuscules.',
'url' => "Le format du :attribute n'est pas valide.",
'ulid' => 'TLe :attribute doit être un ULID valide.',
'uuid' => 'Le :attribute doit être un UUID valide.',
];
================================================
FILE: lang/nl/auth.ftl
================================================
### Auth
## Laravel strings
## https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/auth.php
failed = Deze inloggegevens komen niet overeen met onze gegevens.
password = Het opgegeven wachtwoord is foutief.
throttle = Te veel inlogpogingen. Probeer het opnieuw over { $seconds } seconden.
## Login
login-title = Log in op uw account
login-submit = Inloggen
login-register-prompt = Nog geen account?
login-register-link = Aanmelden
continue-with-provider = Doorgaan met { $provider }
email-label = E-mail
password-label = Wachtwoord
remember-me-label = Onthoud mij
forgot-password-link = Wachtwoord vergeten?
## Forgot Password
forgot-password-title = Wachtwoord vergeten?
forgot-password-introduction = Vraag een wachtwoord reset link aan door hieronder je e-mailadres in te voeren.
forgot-password-submit = Wachtwoord reset link verzenden
reset-password-title = Wachtwoord resetten
new-password-label = Nieuw wachtwoord
confirm-password-label = Bevestig wachtwoord
reset-password-submit = Wachtwoord resetten
reset-password-mail-subject = Uw wachtwoord opnieuw instellen
reset-password-mail-body = We hebben een verzoek ontvangen om het wachtwoord voor uw account op { $forum } te resetten. Als u dit niet was, is er geen verdere actie nodig. Deze link verloopt over { $minutes } minuten.
reset-password-mail-button = Wachtwoord resetten
## Register
register-title = Maak een account aan
name-label = Gebruikersnaam
register-submit = Account aanmaken
register-login-prompt = U hebt reeds een account?
register-login-link = Inloggen
## Confirm Password
confirm-password-title = Bevestig uw wachtwoord
confirm-password-introduction = Bevestig uw wachtwoord voordat u doorgaat.
confirm-password-submit = Bevestigen
## Email Verification
email-verification-sent-message = We hebben een bevestigingsmail gestuurd naar { $email }. Als deze niet snel aankomt, controleer dan uw spam folder.
email-verification-resend-button = Opnieuw verzenden
email-verification-required-message = U moet uw e-mailadres verifiëren.
email-verification-success-message = Bedankt voor het verifiëren van uw e-mail!
email-verification-mail-subject = Verifieer e-mailadres
email-verification-mail-body = Klik op de onderstaande knop om uw e-mailadres te verifiëren. Als u geen account heeft op { $forum }, is er geen verdere actie nodig.
email-verification-mail-button = E-mailadres verifiëren
================================================
FILE: lang/nl/cp.ftl
================================================
### Localization for Waterhole Control Panel
title = Bedieningspaneel
## Dashboard
dashboard-title = Dashboard
configure-mail-message = U moet een mail driver configureren zodat Waterhole verificatie e-mails en meldingen kan versturen.
debug-mode-on-message = Debugmodus is AAN. Gevoelige instellingen kunnen worden blootgesteld.
getting-started-title = Aan de slag met Waterhole
getting-started-strategy-title = Lees de Documentatie
getting-started-strategy-description = Leer hoe je een succesvolle gemeenschap opbouwt met Waterhole.
getting-started-structure-title = Stel uw Structuur in
getting-started-structure-description = Configureer de kanalen en pagina's die het skelet van uw gemeenschap vormen.
getting-started-groups-title = Definieer Gebruikersgroepen
getting-started-groups-description = Stel groepen in voor moderators, personeel en supergebruikers.
getting-started-design-title = Sluit je aan bij de Waterhole Gemeenschap
getting-started-design-description = Stel vragen, deel tips en leer hoe je het meeste uit je gemeenschap haalt.
dashboard-users-title = Gebruikers
dashboard-posts-title = Berichten
dashboard-comments-title = Reacties
period-today = Vandaag
period-last-7-days = Voorbije 7 dagen
period-last-4-weeks = Voorbije 4 weken
period-last-3-months = Voorbije 3 maanden
period-last-12-months = Voorbije 12 maanden
period-this-month = Huidige maand
period-this-quarter = Huidig kwartaal
period-this-year = Huidig jaar
period-all-time = Altijd
period-current-heading = Huidige Periode
preiod-previous-heading = Vorige Periode
## Structure
structure-title = Structuur
structure-channel-label = Kanaal
structure-page-label = Pagina
structure-link-label = Link
structure-heading-label = Kop
structure-visibility-public-label = Openbaar
structure-visibility-members-label = Leden
structure-navigation-title = Navigatie
structure-navigation-description = Verplaats items hierheen om ze in het navigatiemenu te tonen.
structure-unlisted-title = Niet in lijst
structure-unlisted-description = Verplaats items hierheen om ze te verbergen in het navigatiemenu.
delete-structure-confirm-message = Weet u zeker dat u dit item wilt verwijderen?
## Structure - Heading
edit-heading-title = Bewerk Kop
create-heading-title = Maak een Kop
heading-name-label = Naam
## Structure - Link
edit-link-title = Bewerk Link
create-link-title = Maak een Link
link-details-title = Details
link-name-label = Naam
link-url-label = URL
link-permissions-title = Permissies
## Structure - Page
edit-page-title = Bewerk Pagina
create-page-title = Maak een Pagina
page-details-title = Details
page-name-label = Naam
page-slug-label = Slug
page-slug-url-label = Deze pagina is toegankelijk op:
page-body-label = Inhoud
page-permissions-title = Permissies
## Structure - Channel
edit-channel-title = Bewerk Kanaal
create-channel-title = Kanaal toevoegen
channel-details-title = Details
channel-name-label = Naam
channel-slug-label = Slug
channel-slug-url-label = Dit kanaal is toegankelijk op:
channel-description-label = Beschrijving
channel-description-description = Een korte beschrijving waar dit kanaal voor dient.
channel-options-title = Opties
channel-visibility-label = Zichtbaarheid
channel-ignore-label = Standaard genegeerd
channel-ignore-description = Verberg berichten in dit kanaal van de Feed voor alle gebruikers, tenzij ze het expliciet volgen.
channel-layout-title = Layout
channel-layout-label = Layout
channel-layout-show-author-label = Toon auteur bericht
channel-layout-show-excerpt-label = Toon berichtfragment
channel-filters-label = Filters
channel-custom-filters-label = Gebruik aangepaste filters voor dit kanaal
channel-custom-filters-description = Overschrijf d
gitextract_qddtl31l/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ └── config.yml │ ├── SECURITY.md │ └── workflows/ │ ├── build-assets.yml │ ├── phpstan.yml │ ├── prettier.yml │ ├── stale.yml │ └── tests.yml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .release-it.yml ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── composer.json ├── config/ │ ├── api.php │ ├── auth.php │ ├── cp.php │ ├── design.php │ ├── forum.php │ ├── seo.php │ ├── system.php │ ├── uploads.php │ └── users.php ├── database/ │ ├── factories/ │ │ ├── ChannelFactory.php │ │ ├── CommentFactory.php │ │ ├── PageFactory.php │ │ ├── PostFactory.php │ │ ├── TagFactory.php │ │ └── UserFactory.php │ ├── migrations/ │ │ ├── 2021_06_21_021231_create_channels_table.php │ │ ├── 2021_06_21_021344_create_users_table.php │ │ ├── 2021_06_21_021345_create_notifications_table.php │ │ ├── 2021_06_21_021348_create_posts_table.php │ │ ├── 2021_06_21_021355_create_comments_table.php │ │ ├── 2021_06_21_021413_create_groups_table.php │ │ ├── 2021_06_21_021449_create_group_user_table.php │ │ ├── 2021_06_21_021454_create_mentions_table.php │ │ ├── 2021_06_21_021502_create_post_user_table.php │ │ ├── 2021_06_21_111526_create_permissions_table.php │ │ ├── 2021_10_18_130929_create_channel_user_table.php │ │ ├── 2021_12_04_093522_create_pages_table.php │ │ ├── 2021_12_04_095210_create_structure_table.php │ │ ├── 2021_12_04_095221_create_structure_headings_table.php │ │ ├── 2021_12_04_095226_create_structure_links_table.php │ │ ├── 2023_01_06_083525_create_reaction_sets_table.php │ │ ├── 2023_01_06_083700_create_reaction_types_table.php │ │ ├── 2023_01_06_084208_create_reactions_table.php │ │ ├── 2023_01_06_165934_add_reaction_set_columns_to_channels.php │ │ ├── 2023_01_13_110454_create_taxonomies_table.php │ │ ├── 2023_01_13_110537_create_tags_table.php │ │ ├── 2023_01_13_110933_create_post_tag_table.php │ │ ├── 2023_01_13_110952_create_channel_taxonomy_table.php │ │ ├── 2023_01_19_113324_create_auth_providers_table.php │ │ ├── 2023_01_26_145619_add_view_count_to_posts.php │ │ ├── 2023_02_02_115230_create_uploads_table.php │ │ ├── 2023_02_02_115236_create_attachments_table.php │ │ ├── 2023_02_02_151121_add_hotness_to_posts.php │ │ ├── 2023_02_02_153704_add_suspsended_until_to_users.php │ │ ├── 2023_03_03_083340_add_is_required_to_taxonomies.php │ │ ├── 2023_03_11_114659_add_answerable_to_channels.php │ │ ├── 2023_03_11_114850_add_answer_id_to_posts.php │ │ ├── 2023_03_16_095929_add_show_similar_posts_to_channels.php │ │ ├── 2023_04_05_165546_add_post_id_created_at_index_to_comments.php │ │ ├── 2023_04_05_165601_add_is_listed_position_index_to_structure.php │ │ ├── 2023_04_13_163452_rename_channels_sandbox_to_ignore.php │ │ ├── 2023_04_13_203750_rename_channels_default_layout_to_layout.php │ │ ├── 2023_04_13_203835_add_layout_config_to_channels.php │ │ ├── 2023_04_22_131025_add_translations_to_channels.php │ │ ├── 2023_06_08_093656_add_is_pinned_to_posts.php │ │ ├── 2023_06_08_113707_add_hiding_columns_to_comments.php │ │ ├── 2023_06_10_151000_add_created_at_to_posts_is_pinned_index.php │ │ ├── 2023_07_12_165151_add_deleted_at_to_posts.php │ │ ├── 2026_01_22_000001_add_rules_and_auto_assign_to_groups.php │ │ ├── 2026_01_22_000002_add_is_approved_to_posts.php │ │ ├── 2026_01_22_000003_add_is_approved_to_comments.php │ │ ├── 2026_01_22_000004_add_deleted_reason_to_posts.php │ │ ├── 2026_01_22_000005_create_flags_table.php │ │ ├── 2026_01_22_000006_migrate_comment_hidden_to_deleted.php │ │ ├── 2026_01_22_000007_add_approval_requirements_to_channels.php │ │ ├── 2026_01_22_000008_add_deleted_notes_to_posts_and_comments.php │ │ ├── 2026_01_24_000009_add_note_to_flags_table.php │ │ └── 2026_01_24_000010_add_reactions_enabled_to_channels.php │ └── seeders/ │ ├── DefaultSeeder.php │ └── GroupsSeeder.php ├── lang/ │ ├── en/ │ │ ├── auth.ftl │ │ ├── cp.ftl │ │ ├── forum.ftl │ │ ├── install.ftl │ │ ├── notifications.ftl │ │ ├── passwords.php │ │ ├── system.ftl │ │ ├── user.ftl │ │ └── validation.php │ ├── fr/ │ │ ├── auth.ftl │ │ ├── cp.ftl │ │ ├── forum.ftl │ │ ├── install.ftl │ │ ├── notifications.ftl │ │ ├── passwords.php │ │ ├── system.ftl │ │ ├── user.ftl │ │ └── validation.php │ ├── nl/ │ │ ├── auth.ftl │ │ ├── cp.ftl │ │ ├── forum.ftl │ │ ├── install.ftl │ │ ├── notifications.ftl │ │ ├── passwords.php │ │ ├── system.ftl │ │ ├── user.ftl │ │ └── validation.php │ ├── ru/ │ │ ├── auth.ftl │ │ ├── cp.ftl │ │ ├── forum.ftl │ │ ├── install.ftl │ │ ├── notifications.ftl │ │ ├── passwords.php │ │ ├── system.ftl │ │ ├── user.ftl │ │ └── validation.php │ └── zh-Hant/ │ ├── auth.ftl │ ├── cp.ftl │ ├── forum.ftl │ ├── header.ftl │ ├── install.ftl │ ├── notifications.ftl │ ├── passwords.php │ ├── system.ftl │ ├── user.ftl │ └── validation.php ├── package.json ├── phpstan.dist.neon ├── phpunit.xml ├── postcss.config.cjs ├── resources/ │ ├── css/ │ │ ├── cp/ │ │ │ ├── _dashboard.css │ │ │ ├── _permission-grid.css │ │ │ ├── _structure.css │ │ │ └── app.css │ │ ├── global/ │ │ │ ├── _auth.css │ │ │ ├── _channel-card.css │ │ │ ├── _comment.css │ │ │ ├── _composer.css │ │ │ ├── _emoji.css │ │ │ ├── _flags.css │ │ │ ├── _header.css │ │ │ ├── _index.css │ │ │ ├── _notifications.css │ │ │ ├── _post-feed.css │ │ │ ├── _post-page.css │ │ │ ├── _reactions.css │ │ │ ├── _search.css │ │ │ ├── _text-editor.css │ │ │ ├── _user-profile.css │ │ │ └── app.css │ │ └── system/ │ │ ├── _alert.css │ │ ├── _alerts.css │ │ ├── _attribution.css │ │ ├── _avatar.css │ │ ├── _badge.css │ │ ├── _base.css │ │ ├── _block-link.css │ │ ├── _breadcrumb.css │ │ ├── _btn.css │ │ ├── _card.css │ │ ├── _channel-label.css │ │ ├── _channel-picker.css │ │ ├── _choice.css │ │ ├── _color-picker.css │ │ ├── _combobox.css │ │ ├── _dialog.css │ │ ├── _divider.css │ │ ├── _emoji-picker.css │ │ ├── _form.css │ │ ├── _highlightjs.css │ │ ├── _icon.css │ │ ├── _input.css │ │ ├── _mention.css │ │ ├── _menu.css │ │ ├── _modal.css │ │ ├── _nav.css │ │ ├── _placeholder.css │ │ ├── _reset.css │ │ ├── _sidebar.css │ │ ├── _skip-link.css │ │ ├── _spinner.css │ │ ├── _table.css │ │ ├── _tabs.css │ │ ├── _tooltip.css │ │ ├── _turbo.css │ │ ├── _typography.css │ │ ├── _user-label.css │ │ ├── _utils.css │ │ ├── _variables.css │ │ ├── breakpoints.css │ │ ├── mixins.css │ │ └── system.css │ ├── dist/ │ │ ├── cp.css │ │ ├── cp.js │ │ ├── emoji.js │ │ ├── global.css │ │ ├── global.js │ │ └── highlight.js │ ├── js/ │ │ ├── bootstrap/ │ │ │ ├── custom-elements.ts │ │ │ ├── document-title.ts │ │ │ ├── echo.ts │ │ │ ├── hotkeys.ts │ │ │ └── turbo.ts │ │ ├── controllers/ │ │ │ ├── action-menu-controller.ts │ │ │ ├── alert-controller.ts │ │ │ ├── comment-controller.ts │ │ │ ├── comment-replies-controller.ts │ │ │ ├── composer-controller.ts │ │ │ ├── copy-link-controller.ts │ │ │ ├── details-focus-controller.ts │ │ │ ├── load-backwards-controller.ts │ │ │ ├── login-controller.ts │ │ │ ├── mentions-controller.ts │ │ │ ├── modal-controller.ts │ │ │ ├── notifications-popup-controller.ts │ │ │ ├── page-controller.ts │ │ │ ├── post-controller.ts │ │ │ ├── post-feed-controller.ts │ │ │ ├── post-page-controller.ts │ │ │ ├── quotable-controller.ts │ │ │ ├── reveal-controller.ts │ │ │ ├── scrollspy-controller.ts │ │ │ ├── similar-posts-controller.ts │ │ │ ├── suspend-duration-controller.ts │ │ │ ├── text-editor-controller.ts │ │ │ ├── theme-controller.ts │ │ │ ├── truncated-controller.ts │ │ │ ├── turbo-frame-controller.ts │ │ │ ├── uploads-controller.ts │ │ │ ├── watch-scroll-controller.ts │ │ │ └── watch-sticky-controller.ts │ │ ├── cp/ │ │ │ ├── controllers/ │ │ │ │ ├── color-picker-controller.ts │ │ │ │ ├── filter-input-controller.ts │ │ │ │ ├── form-controller.ts │ │ │ │ ├── icon-picker-controller.ts │ │ │ │ ├── incremental-search-controller.ts │ │ │ │ ├── line-chart-controller.ts │ │ │ │ ├── permission-grid-controller.ts │ │ │ │ ├── slugger-controller.ts │ │ │ │ └── sortable-controller.ts │ │ │ └── index.ts │ │ ├── elements/ │ │ │ └── turbo-echo-stream-tag.ts │ │ ├── emoji.ts │ │ ├── env.d.ts │ │ ├── highlight.ts │ │ ├── index.ts │ │ └── utils.ts │ └── views/ │ ├── actions/ │ │ ├── confirm.blade.php │ │ └── menu.blade.php │ ├── auth/ │ │ ├── confirm-password.blade.php │ │ ├── forgot-password.blade.php │ │ ├── login.blade.php │ │ ├── register.blade.php │ │ └── reset-password.blade.php │ ├── comments/ │ │ ├── create.blade.php │ │ ├── edit.blade.php │ │ └── show.blade.php │ ├── components/ │ │ ├── action-button.blade.php │ │ ├── action-buttons.blade.php │ │ ├── action-form.blade.php │ │ ├── action-menu.blade.php │ │ ├── alert.blade.php │ │ ├── attribution.blade.php │ │ ├── avatar.blade.php │ │ ├── cancel.blade.php │ │ ├── channel-label.blade.php │ │ ├── channel-picker.blade.php │ │ ├── collapsible-nav.blade.php │ │ ├── comment-answer-badge.blade.php │ │ ├── comment-frame.blade.php │ │ ├── comment-full.blade.php │ │ ├── comment-mark-as-answer.blade.php │ │ ├── comment-reactions.blade.php │ │ ├── comment-replies.blade.php │ │ ├── comment-reply-button.blade.php │ │ ├── comments-locked.blade.php │ │ ├── composer.blade.php │ │ ├── cp/ │ │ │ ├── color-picker.blade.php │ │ │ ├── group-row.blade.php │ │ │ ├── icon-picker.blade.php │ │ │ ├── permission-grid.blade.php │ │ │ ├── structure-node.blade.php │ │ │ ├── title.blade.php │ │ │ └── version.blade.php │ │ ├── cp.blade.php │ │ ├── dialog.blade.php │ │ ├── email-verification.blade.php │ │ ├── feed-filters.blade.php │ │ ├── feed-top-period.blade.php │ │ ├── field.blade.php │ │ ├── flag-container.blade.php │ │ ├── follow-button.blade.php │ │ ├── group-badge.blade.php │ │ ├── header-breadcrumb.blade.php │ │ ├── header-guest.blade.php │ │ ├── header-moderation.blade.php │ │ ├── header-notifications.blade.php │ │ ├── header-search.blade.php │ │ ├── header-title.blade.php │ │ ├── header-user.blade.php │ │ ├── header.blade.php │ │ ├── html.blade.php │ │ ├── index-create-post.blade.php │ │ ├── index-footer-language.blade.php │ │ ├── index-footer.blade.php │ │ ├── index-nav.blade.php │ │ ├── index.blade.php │ │ ├── infinite-scroll.blade.php │ │ ├── layout.blade.php │ │ ├── menu-item.blade.php │ │ ├── nav-link.blade.php │ │ ├── notification.blade.php │ │ ├── pinned-post.blade.php │ │ ├── post-activity.blade.php │ │ ├── post-answer.blade.php │ │ ├── post-answered.blade.php │ │ ├── post-attribution.blade.php │ │ ├── post-card.blade.php │ │ ├── post-channel.blade.php │ │ ├── post-feed-channel.blade.php │ │ ├── post-feed-pinned.blade.php │ │ ├── post-feed-toolbar.blade.php │ │ ├── post-feed.blade.php │ │ ├── post-full.blade.php │ │ ├── post-list-item.blade.php │ │ ├── post-locked.blade.php │ │ ├── post-notifications.blade.php │ │ ├── post-replies.blade.php │ │ ├── post-sidebar.blade.php │ │ ├── post-title.blade.php │ │ ├── post-trash.blade.php │ │ ├── post-unread.blade.php │ │ ├── reaction-set-picker.blade.php │ │ ├── reactions-condensed.blade.php │ │ ├── reactions.blade.php │ │ ├── relative-time.blade.php │ │ ├── removed-banner.blade.php │ │ ├── search-form.blade.php │ │ ├── selector.blade.php │ │ ├── spacer.blade.php │ │ ├── text-editor-button.blade.php │ │ ├── text-editor.blade.php │ │ ├── theme-selector.blade.php │ │ ├── user-label.blade.php │ │ ├── user-link.blade.php │ │ ├── user-profile.blade.php │ │ └── validation-errors.blade.php │ ├── cp/ │ │ ├── dashboard.blade.php │ │ ├── groups/ │ │ │ ├── form.blade.php │ │ │ └── index.blade.php │ │ ├── reactions/ │ │ │ ├── index.blade.php │ │ │ ├── reaction-set.blade.php │ │ │ └── reaction-type.blade.php │ │ ├── structure/ │ │ │ ├── channel.blade.php │ │ │ ├── delete-channel.blade.php │ │ │ ├── heading.blade.php │ │ │ ├── index.blade.php │ │ │ ├── link.blade.php │ │ │ └── page.blade.php │ │ ├── taxonomies/ │ │ │ ├── index.blade.php │ │ │ ├── tag.blade.php │ │ │ └── taxonomy.blade.php │ │ ├── users/ │ │ │ ├── delete.blade.php │ │ │ ├── form.blade.php │ │ │ ├── index.blade.php │ │ │ └── suspend.blade.php │ │ └── widget.blade.php │ ├── forum/ │ │ ├── channel.blade.php │ │ ├── home.blade.php │ │ ├── moderation.blade.php │ │ ├── notifications.blade.php │ │ ├── page.blade.php │ │ └── search.blade.php │ ├── mail/ │ │ ├── email.blade.php │ │ ├── html/ │ │ │ ├── button.blade.php │ │ │ ├── header.blade.php │ │ │ ├── layout.blade.php │ │ │ ├── link.blade.php │ │ │ ├── message.blade.php │ │ │ ├── subcopy.blade.php │ │ │ └── themes/ │ │ │ └── default.css │ │ ├── notification.blade.php │ │ └── text/ │ │ ├── button.blade.php │ │ ├── header.blade.php │ │ ├── layout.blade.php │ │ ├── link.blade.php │ │ └── message.blade.php │ ├── moderation/ │ │ ├── removal-reason.blade.php │ │ └── report.blade.php │ ├── pagination/ │ │ ├── default.blade.php │ │ └── simple-default.blade.php │ ├── posts/ │ │ ├── create.blade.php │ │ ├── edit.blade.php │ │ ├── move-to-channel.blade.php │ │ └── show.blade.php │ ├── preferences/ │ │ ├── account.blade.php │ │ ├── notifications.blade.php │ │ └── profile.blade.php │ ├── reactions/ │ │ └── list.blade.php │ ├── users/ │ │ ├── comments.blade.php │ │ ├── mention-suggestion.blade.php │ │ └── posts.blade.php │ └── widgets/ │ ├── feed.blade.php │ ├── getting-started.blade.php │ └── line-chart.blade.php ├── routes/ │ ├── api.php │ ├── channels.php │ ├── cp.php │ └── forum.php ├── src/ │ ├── Actions/ │ │ ├── Action.php │ │ ├── Concerns/ │ │ │ ├── RemovesContent.php │ │ │ └── ResolvesFlags.php │ │ ├── CopyImpersonationUrl.php │ │ ├── CopyLink.php │ │ ├── DeleteChannel.php │ │ ├── DeleteComment.php │ │ ├── DeleteGroup.php │ │ ├── DeletePost.php │ │ ├── DeleteReactionSet.php │ │ ├── DeleteReactionType.php │ │ ├── DeleteSelf.php │ │ ├── DeleteStructure.php │ │ ├── DeleteTag.php │ │ ├── DeleteTaxonomy.php │ │ ├── DeleteUser.php │ │ ├── DismissFlags.php │ │ ├── EditChannel.php │ │ ├── EditComment.php │ │ ├── EditGroup.php │ │ ├── EditPost.php │ │ ├── EditReactionSet.php │ │ ├── EditReactionType.php │ │ ├── EditStructure.php │ │ ├── EditTag.php │ │ ├── EditTaxonomy.php │ │ ├── EditUser.php │ │ ├── Follow.php │ │ ├── Ignore.php │ │ ├── Link.php │ │ ├── Lock.php │ │ ├── MarkAsAnswer.php │ │ ├── MarkAsRead.php │ │ ├── MoveToChannel.php │ │ ├── Pin.php │ │ ├── React.php │ │ ├── RemoveComment.php │ │ ├── Report.php │ │ ├── RestoreComment.php │ │ ├── RestorePost.php │ │ ├── SuspendUser.php │ │ ├── TrashPost.php │ │ ├── Unfollow.php │ │ ├── Unignore.php │ │ ├── Unlock.php │ │ └── Unpin.php │ ├── Api/ │ │ ├── Collections/ │ │ │ └── StructureContentCollection.php │ │ └── Resources/ │ │ ├── ChannelUsersResource.php │ │ ├── ChannelsResource.php │ │ ├── CommentsResource.php │ │ ├── ExtendableResource.php │ │ ├── GroupsResource.php │ │ ├── PagesResource.php │ │ ├── PostUsersResource.php │ │ ├── PostsResource.php │ │ ├── ReactionCountsResource.php │ │ ├── ReactionSetsResource.php │ │ ├── ReactionTypesResource.php │ │ ├── ReactionsResource.php │ │ ├── StructureHeadingsResource.php │ │ ├── StructureLinksResource.php │ │ ├── StructureResource.php │ │ ├── TagsResource.php │ │ ├── TaxonomiesResource.php │ │ └── UsersResource.php │ ├── Auth/ │ │ ├── AuthenticatesWaterhole.php │ │ ├── HasWaterholeUser.php │ │ ├── Providers.php │ │ ├── SsoPayload.php │ │ ├── SsoProvider.php │ │ └── SsoUser.php │ ├── Console/ │ │ ├── CacheClearCommand.php │ │ ├── Concerns/ │ │ │ └── ValidatesInput.php │ │ ├── InstallCommand.php │ │ ├── MakeExtensionCommand.php │ │ ├── OpenApiCommand.php │ │ ├── ReformatCommand.php │ │ └── stubs/ │ │ └── extension/ │ │ ├── .editorconfig │ │ ├── .gitattributes │ │ ├── composer.json │ │ └── src/ │ │ └── ServiceProvider.stub │ ├── Database/ │ │ └── Migration.php │ ├── Events/ │ │ ├── FlagReceived.php │ │ ├── NewComment.php │ │ ├── NewPost.php │ │ └── NotificationReceived.php │ ├── Extend/ │ │ ├── Api/ │ │ │ ├── ChannelUsersResource.php │ │ │ ├── ChannelsResource.php │ │ │ ├── CommentsResource.php │ │ │ ├── GroupsResource.php │ │ │ ├── JsonApi.php │ │ │ ├── PagesResource.php │ │ │ ├── PostUsersResource.php │ │ │ ├── PostsResource.php │ │ │ ├── ReactionSetsResource.php │ │ │ ├── ReactionTypesResource.php │ │ │ ├── ReactionsResource.php │ │ │ ├── StructureHeadingsResource.php │ │ │ ├── StructureLinksResource.php │ │ │ ├── StructureResource.php │ │ │ ├── TagsResource.php │ │ │ ├── TaxonomiesResource.php │ │ │ └── UsersResource.php │ │ ├── Assets/ │ │ │ ├── Locales.php │ │ │ ├── Script.php │ │ │ └── Stylesheet.php │ │ ├── Core/ │ │ │ ├── Actions.php │ │ │ ├── Formatter.php │ │ │ ├── NotificationTypes.php │ │ │ ├── PostFilters.php │ │ │ └── PostLayouts.php │ │ ├── Forms/ │ │ │ ├── ChannelForm.php │ │ │ ├── GroupForm.php │ │ │ ├── PageForm.php │ │ │ ├── PostForm.php │ │ │ ├── ReactionSetForm.php │ │ │ ├── ReactionTypeForm.php │ │ │ ├── RegistrationForm.php │ │ │ ├── StructureLinkForm.php │ │ │ ├── TagForm.php │ │ │ ├── TaxonomyForm.php │ │ │ └── UserForm.php │ │ ├── Query/ │ │ │ ├── CommentQuery.php │ │ │ ├── PostFeedQuery.php │ │ │ └── PostVisibilityScopes.php │ │ ├── Routing/ │ │ │ ├── ApiRoutes.php │ │ │ ├── CpRoutes.php │ │ │ └── ForumRoutes.php │ │ ├── ServiceProvider.php │ │ ├── Support/ │ │ │ ├── Assets.php │ │ │ ├── Attributes.php │ │ │ ├── ComponentList.php │ │ │ ├── OrderedList.php │ │ │ ├── Resource.php │ │ │ ├── Set.php │ │ │ └── UnorderedList.php │ │ └── Ui/ │ │ ├── CommentAttributes.php │ │ ├── CommentComponent.php │ │ ├── CpAlerts.php │ │ ├── CpNav.php │ │ ├── DocumentHead.php │ │ ├── IndexPage.php │ │ ├── Layout.php │ │ ├── LoginPage.php │ │ ├── PostAttributes.php │ │ ├── PostFeed.php │ │ ├── PostFooter.php │ │ ├── PostListItem.php │ │ ├── PostPage.php │ │ ├── Preferences.php │ │ ├── TextEditor.php │ │ ├── UserInfo.php │ │ ├── UserMenu.php │ │ └── UserNav.php │ ├── Feed/ │ │ ├── CommentFeed.php │ │ ├── Feed.php │ │ └── PostFeed.php │ ├── Filters/ │ │ ├── Alphabetical.php │ │ ├── Filter.php │ │ ├── Following.php │ │ ├── Ignoring.php │ │ ├── Latest.php │ │ ├── Newest.php │ │ ├── Oldest.php │ │ ├── Top.php │ │ ├── Trash.php │ │ └── Trending.php │ ├── Formatter/ │ │ ├── Context.php │ │ ├── FormatExternalLinks.php │ │ ├── FormatMentions.php │ │ ├── FormatUploads.php │ │ └── Formatter.php │ ├── Forms/ │ │ ├── ChannelForm.php │ │ ├── Concerns/ │ │ │ └── ContainsFields.php │ │ ├── Field.php │ │ ├── Fields/ │ │ │ ├── ChannelAnswers.php │ │ │ ├── ChannelApproval.php │ │ │ ├── ChannelDescription.php │ │ │ ├── ChannelFilters.php │ │ │ ├── ChannelIgnore.php │ │ │ ├── ChannelInstructions.php │ │ │ ├── ChannelLayout.php │ │ │ ├── ChannelLayoutCards.php │ │ │ ├── ChannelLayoutList.php │ │ │ ├── ChannelName.php │ │ │ ├── ChannelReactions.php │ │ │ ├── ChannelSimilarPosts.php │ │ │ ├── ChannelSlug.php │ │ │ ├── ChannelTaxonomies.php │ │ │ ├── GroupAppearance.php │ │ │ ├── GroupGlobalPermissions.php │ │ │ ├── GroupName.php │ │ │ ├── GroupRules.php │ │ │ ├── GroupStructurePermissions.php │ │ │ ├── Icon.php │ │ │ ├── PageBody.php │ │ │ ├── PageName.php │ │ │ ├── PageSlug.php │ │ │ ├── Permissions.php │ │ │ ├── PostBody.php │ │ │ ├── PostTags.php │ │ │ ├── PostTitle.php │ │ │ ├── ReactionSetDefaults.php │ │ │ ├── ReactionSetName.php │ │ │ ├── ReactionTypeName.php │ │ │ ├── ReactionTypeScore.php │ │ │ ├── StructureLinkName.php │ │ │ ├── StructureLinkUrl.php │ │ │ ├── TagName.php │ │ │ ├── TaxonomyName.php │ │ │ ├── TaxonomyOptions.php │ │ │ ├── UserAvatar.php │ │ │ ├── UserBio.php │ │ │ ├── UserEmail.php │ │ │ ├── UserGroups.php │ │ │ ├── UserHeadline.php │ │ │ ├── UserLocation.php │ │ │ ├── UserName.php │ │ │ ├── UserPassword.php │ │ │ ├── UserShowOnline.php │ │ │ └── UserWebsite.php │ │ ├── Form.php │ │ ├── FormSection.php │ │ ├── GroupForm.php │ │ ├── PageForm.php │ │ ├── PostForm.php │ │ ├── ReactionSetForm.php │ │ ├── ReactionTypeForm.php │ │ ├── RegistrationForm.php │ │ ├── StructureLinkForm.php │ │ ├── TagForm.php │ │ ├── TaxonomyForm.php │ │ ├── UserForm.php │ │ └── UserProfileForm.php │ ├── Http/ │ │ ├── Controllers/ │ │ │ ├── ActionsController.php │ │ │ ├── Api/ │ │ │ │ └── ApiController.php │ │ │ ├── Auth/ │ │ │ │ ├── ConfirmPasswordController.php │ │ │ │ ├── ForgotPasswordController.php │ │ │ │ ├── LoginController.php │ │ │ │ ├── LogoutController.php │ │ │ │ ├── RegisterController.php │ │ │ │ ├── ResetPasswordController.php │ │ │ │ ├── SsoController.php │ │ │ │ └── VerifyEmailController.php │ │ │ ├── Controller.php │ │ │ ├── Cp/ │ │ │ │ ├── ChannelController.php │ │ │ │ ├── DashboardController.php │ │ │ │ ├── GroupController.php │ │ │ │ ├── PageController.php │ │ │ │ ├── ReactionSetController.php │ │ │ │ ├── ReactionTypeController.php │ │ │ │ ├── StructureController.php │ │ │ │ ├── StructureHeadingController.php │ │ │ │ ├── StructureLinkController.php │ │ │ │ ├── TagController.php │ │ │ │ ├── TaxonomyController.php │ │ │ │ └── UserController.php │ │ │ ├── FormatController.php │ │ │ ├── Forum/ │ │ │ │ ├── CommentController.php │ │ │ │ ├── IndexController.php │ │ │ │ ├── ModerationController.php │ │ │ │ ├── NotificationController.php │ │ │ │ ├── PostController.php │ │ │ │ ├── PreferencesController.php │ │ │ │ ├── RssController.php │ │ │ │ ├── SearchController.php │ │ │ │ └── UserController.php │ │ │ ├── ImpersonateController.php │ │ │ ├── UploadController.php │ │ │ └── UserLookupController.php │ │ └── Middleware/ │ │ ├── ActorSeen.php │ │ ├── AuthGuard.php │ │ ├── Authenticate.php │ │ ├── AuthenticateWaterhole.php │ │ ├── ContactOutpost.php │ │ ├── Localize.php │ │ ├── MaybeRequireLogin.php │ │ ├── MaybeRequirePassword.php │ │ ├── PoweredByHeader.php │ │ ├── RedirectIfAuthenticated.php │ │ ├── StartSession.php │ │ └── VerifyCsrfToken.php │ ├── Layouts/ │ │ ├── CardsLayout.php │ │ ├── Layout.php │ │ └── ListLayout.php │ ├── Licensing/ │ │ ├── LicenseManager.php │ │ └── Outpost.php │ ├── Listeners/ │ │ └── ReverifyInactiveUser.php │ ├── Mail/ │ │ └── Markdown.php │ ├── Models/ │ │ ├── Attributes/ │ │ │ └── FileAttribute.php │ │ ├── AuthProvider.php │ │ ├── Channel.php │ │ ├── ChannelUser.php │ │ ├── Comment.php │ │ ├── Concerns/ │ │ │ ├── Approvable.php │ │ │ ├── Deletable.php │ │ │ ├── Flaggable.php │ │ │ ├── Followable.php │ │ │ ├── HasBody.php │ │ │ ├── HasFileAttributes.php │ │ │ ├── HasIcon.php │ │ │ ├── HasPermissions.php │ │ │ ├── HasUserState.php │ │ │ ├── NotificationContent.php │ │ │ ├── Reactable.php │ │ │ ├── ReceivesPermissions.php │ │ │ ├── Structurable.php │ │ │ ├── UsesFormatter.php │ │ │ └── ValidatesData.php │ │ ├── Flag.php │ │ ├── Group.php │ │ ├── Model.php │ │ ├── Notification.php │ │ ├── Page.php │ │ ├── Permission.php │ │ ├── PermissionCollection.php │ │ ├── Post.php │ │ ├── PostUser.php │ │ ├── Reaction.php │ │ ├── ReactionSet.php │ │ ├── ReactionType.php │ │ ├── Structure.php │ │ ├── StructureHeading.php │ │ ├── StructureLink.php │ │ ├── Support/ │ │ │ └── MorphTypeCache.php │ │ ├── Tag.php │ │ ├── Taxonomy.php │ │ ├── Upload.php │ │ └── User.php │ ├── Notifications/ │ │ ├── ContentApproved.php │ │ ├── ContentRemoved.php │ │ ├── DatabaseChannel.php │ │ ├── Mention.php │ │ ├── NewComment.php │ │ ├── NewFlag.php │ │ ├── NewPost.php │ │ ├── Notification.php │ │ ├── ResetPassword.php │ │ └── VerifyEmail.php │ ├── Policies/ │ │ ├── CommentPolicy.php │ │ ├── PostPolicy.php │ │ └── UserPolicy.php │ ├── Providers/ │ │ ├── ApiServiceProvider.php │ │ ├── AppServiceProvider.php │ │ ├── AuthServiceProvider.php │ │ ├── BroadcastServiceProvider.php │ │ ├── ConsoleServiceProvider.php │ │ ├── EventServiceProvider.php │ │ ├── FormatterServiceProvider.php │ │ ├── MailServiceProvider.php │ │ ├── RouteServiceProvider.php │ │ ├── SearchServiceProvider.php │ │ ├── TranslationServiceProvider.php │ │ ├── ViewServiceProvider.php │ │ └── WaterholeServiceProvider.php │ ├── Scopes/ │ │ ├── CommentIndexScope.php │ │ └── PermittedScope.php │ ├── Search/ │ │ ├── EngineInterface.php │ │ ├── FullTextSearchEngine.php │ │ ├── Highlighter.php │ │ ├── Hit.php │ │ ├── Results.php │ │ └── Searcher.php │ ├── Translation/ │ │ ├── FluentTranslator.php │ │ └── ValidationTranslator.php │ ├── View/ │ │ ├── Components/ │ │ │ ├── ActionButton.php │ │ │ ├── ActionButtons.php │ │ │ ├── ActionForm.php │ │ │ ├── ActionMenu.php │ │ │ ├── Alert.php │ │ │ ├── Attribution.php │ │ │ ├── AuthButtons.php │ │ │ ├── Avatar.php │ │ │ ├── Cancel.php │ │ │ ├── ChannelLabel.php │ │ │ ├── ChannelPicker.php │ │ │ ├── CollapsibleNav.php │ │ │ ├── CommentAnswerBadge.php │ │ │ ├── CommentFrame.php │ │ │ ├── CommentFull.php │ │ │ ├── CommentMarkAsAnswer.php │ │ │ ├── CommentReactions.php │ │ │ ├── CommentReplies.php │ │ │ ├── CommentReplyButton.php │ │ │ ├── CommentsLocked.php │ │ │ ├── Composer.php │ │ │ ├── Concerns/ │ │ │ │ └── Streamable.php │ │ │ ├── Cp/ │ │ │ │ ├── ColorPicker.php │ │ │ │ ├── IconPicker.php │ │ │ │ ├── PermissionGrid.php │ │ │ │ ├── StructureNode.php │ │ │ │ ├── TagRow.php │ │ │ │ └── Version.php │ │ │ ├── Cp.php │ │ │ ├── Dialog.php │ │ │ ├── EmailVerification.php │ │ │ ├── FeedFilters.php │ │ │ ├── FeedTopPeriod.php │ │ │ ├── Field.php │ │ │ ├── FlagContainer.php │ │ │ ├── FlagSummary.php │ │ │ ├── FollowButton.php │ │ │ ├── GroupBadge.php │ │ │ ├── Header.php │ │ │ ├── HeaderBreadcrumb.php │ │ │ ├── HeaderGuest.php │ │ │ ├── HeaderModeration.php │ │ │ ├── HeaderNotifications.php │ │ │ ├── HeaderSearch.php │ │ │ ├── HeaderTitle.php │ │ │ ├── HeaderUser.php │ │ │ ├── Html.php │ │ │ ├── Index.php │ │ │ ├── IndexCreatePost.php │ │ │ ├── IndexFooter.php │ │ │ ├── IndexFooterLanguage.php │ │ │ ├── IndexNav.php │ │ │ ├── InfiniteScroll.php │ │ │ ├── Layout.php │ │ │ ├── MenuDivider.php │ │ │ ├── MenuItem.php │ │ │ ├── ModerationBadge.php │ │ │ ├── NavHeading.php │ │ │ ├── NavLink.php │ │ │ ├── Notification.php │ │ │ ├── NotificationAlert.php │ │ │ ├── NotificationsBadge.php │ │ │ ├── PinnedPost.php │ │ │ ├── PostActivity.php │ │ │ ├── PostAnswer.php │ │ │ ├── PostAnswered.php │ │ │ ├── PostAttribution.php │ │ │ ├── PostCard.php │ │ │ ├── PostChannel.php │ │ │ ├── PostFeed.php │ │ │ ├── PostFeedChannel.php │ │ │ ├── PostFeedPinned.php │ │ │ ├── PostFeedToolbar.php │ │ │ ├── PostFull.php │ │ │ ├── PostListItem.php │ │ │ ├── PostLocked.php │ │ │ ├── PostNotifications.php │ │ │ ├── PostReactions.php │ │ │ ├── PostReactionsCondensed.php │ │ │ ├── PostReplies.php │ │ │ ├── PostSidebar.php │ │ │ ├── PostTagsSummary.php │ │ │ ├── PostTitle.php │ │ │ ├── PostTrash.php │ │ │ ├── PostUnread.php │ │ │ ├── ReactionSetPicker.php │ │ │ ├── Reactions.php │ │ │ ├── ReactionsCondensed.php │ │ │ ├── RelativeTime.php │ │ │ ├── RemovedBanner.php │ │ │ ├── Selector.php │ │ │ ├── Spacer.php │ │ │ ├── Spinner.php │ │ │ ├── TagsFilter.php │ │ │ ├── TextEditor.php │ │ │ ├── TextEditorButton.php │ │ │ ├── TextEditorEmojiButton.php │ │ │ ├── ThemeSelector.php │ │ │ ├── UserGroups.php │ │ │ ├── UserJoined.php │ │ │ ├── UserLabel.php │ │ │ ├── UserLastSeen.php │ │ │ ├── UserLink.php │ │ │ ├── UserLocation.php │ │ │ ├── UserProfile.php │ │ │ ├── UserWebsite.php │ │ │ └── ValidationErrors.php │ │ └── TurboStream.php │ ├── Waterhole.php │ ├── Widgets/ │ │ ├── Feed.php │ │ ├── GettingStarted.php │ │ └── LineChart.php │ └── helpers.php ├── tests/ │ ├── Feature/ │ │ ├── ExtendActionsTest.php │ │ ├── ExtendApiTest.php │ │ ├── ExtendAssetsTest.php │ │ ├── ExtendCoreTest.php │ │ ├── ExtendFormsTest.php │ │ ├── ExtendQueryTest.php │ │ ├── ExtendRoutingTest.php │ │ ├── ExtendUiTest.php │ │ ├── JsonApiTest.php │ │ ├── Permissions/ │ │ │ ├── CommentPermissionsTest.php │ │ │ ├── GlobalPermissionsTest.php │ │ │ ├── PostPermissionsTest.php │ │ │ ├── StructurePermissionsTest.php │ │ │ └── UserPermissionsTest.php │ │ ├── SearchTest.php │ │ └── SeoTest.php │ ├── Pest.php │ └── TestCase.php ├── tsconfig.json └── tsdown.config.ts
Showing preview only (522K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5557 symbols across 592 files)
FILE: database/factories/ChannelFactory.php
class ChannelFactory (line 8) | class ChannelFactory extends Factory
method definition (line 12) | public function definition(): array
method public (line 17) | public function public(): static
FILE: database/factories/CommentFactory.php
class CommentFactory (line 8) | class CommentFactory extends Factory
method definition (line 12) | public function definition(): array
FILE: database/factories/PageFactory.php
class PageFactory (line 8) | class PageFactory extends Factory
method definition (line 12) | public function definition(): array
method public (line 17) | public function public(): static
FILE: database/factories/PostFactory.php
class PostFactory (line 8) | class PostFactory extends Factory
method definition (line 12) | public function definition(): array
FILE: database/factories/TagFactory.php
class TagFactory (line 8) | class TagFactory extends Factory
method definition (line 12) | public function definition(): array
FILE: database/factories/UserFactory.php
class UserFactory (line 9) | class UserFactory extends Factory
method definition (line 13) | public function definition(): array
method admin (line 22) | public function admin(): UserFactory
FILE: database/migrations/2021_06_21_021231_create_channels_table.php
method up (line 8) | public function up()
method down (line 23) | public function down()
FILE: database/migrations/2021_06_21_021344_create_users_table.php
method up (line 8) | public function up()
method down (line 32) | public function down()
FILE: database/migrations/2021_06_21_021345_create_notifications_table.php
method up (line 8) | public function up()
method down (line 28) | public function down()
FILE: database/migrations/2021_06_21_021348_create_posts_table.php
method up (line 8) | public function up()
method down (line 38) | public function down()
FILE: database/migrations/2021_06_21_021355_create_comments_table.php
method up (line 8) | public function up()
method down (line 37) | public function down()
FILE: database/migrations/2021_06_21_021413_create_groups_table.php
method up (line 8) | public function up()
method down (line 19) | public function down()
FILE: database/migrations/2021_06_21_021449_create_group_user_table.php
method up (line 8) | public function up()
method down (line 18) | public function down()
FILE: database/migrations/2021_06_21_021454_create_mentions_table.php
method up (line 8) | public function up()
method down (line 18) | public function down()
FILE: database/migrations/2021_06_21_021502_create_post_user_table.php
method up (line 8) | public function up()
method down (line 22) | public function down()
FILE: database/migrations/2021_06_21_111526_create_permissions_table.php
method up (line 8) | public function up()
method down (line 18) | public function down()
FILE: database/migrations/2021_10_18_130929_create_channel_user_table.php
method up (line 8) | public function up()
method down (line 20) | public function down()
FILE: database/migrations/2021_12_04_093522_create_pages_table.php
method up (line 8) | public function up()
method down (line 19) | public function down()
FILE: database/migrations/2021_12_04_095210_create_structure_table.php
method up (line 8) | public function up()
method down (line 18) | public function down()
FILE: database/migrations/2021_12_04_095221_create_structure_headings_table.php
method up (line 8) | public function up()
method down (line 16) | public function down()
FILE: database/migrations/2021_12_04_095226_create_structure_links_table.php
method up (line 8) | public function up()
method down (line 18) | public function down()
FILE: database/migrations/2023_01_06_083525_create_reaction_sets_table.php
method up (line 8) | public function up()
method down (line 20) | public function down()
FILE: database/migrations/2023_01_06_083700_create_reaction_types_table.php
method up (line 8) | public function up()
method down (line 25) | public function down()
FILE: database/migrations/2023_01_06_084208_create_reactions_table.php
method up (line 8) | public function up()
method down (line 23) | public function down()
FILE: database/migrations/2023_01_06_165934_add_reaction_set_columns_to_channels.php
method up (line 8) | public function up()
method down (line 26) | public function down()
FILE: database/migrations/2023_01_13_110454_create_taxonomies_table.php
method up (line 8) | public function up()
method down (line 18) | public function down()
FILE: database/migrations/2023_01_13_110537_create_tags_table.php
method up (line 8) | public function up()
method down (line 18) | public function down()
FILE: database/migrations/2023_01_13_110933_create_post_tag_table.php
method up (line 8) | public function up()
method down (line 16) | public function down()
FILE: database/migrations/2023_01_13_110952_create_channel_taxonomy_table.php
method up (line 8) | public function up()
method down (line 16) | public function down()
FILE: database/migrations/2023_01_19_113324_create_auth_providers_table.php
method up (line 8) | public function up()
method down (line 20) | public function down()
FILE: database/migrations/2023_01_26_145619_add_view_count_to_posts.php
method up (line 8) | public function up()
method down (line 15) | public function down()
FILE: database/migrations/2023_02_02_115230_create_uploads_table.php
method up (line 8) | public function up()
method down (line 26) | public function down()
FILE: database/migrations/2023_02_02_115236_create_attachments_table.php
method up (line 8) | public function up()
method down (line 16) | public function down()
FILE: database/migrations/2023_02_02_151121_add_hotness_to_posts.php
method up (line 8) | public function up()
method down (line 15) | public function down()
FILE: database/migrations/2023_02_02_153704_add_suspsended_until_to_users.php
method up (line 8) | public function up()
method down (line 15) | public function down()
FILE: database/migrations/2023_03_03_083340_add_is_required_to_taxonomies.php
method up (line 8) | public function up()
method down (line 15) | public function down()
FILE: database/migrations/2023_03_11_114659_add_answerable_to_channels.php
method up (line 8) | public function up(): void
method down (line 15) | public function down(): void
FILE: database/migrations/2023_03_11_114850_add_answer_id_to_posts.php
method up (line 8) | public function up(): void
method down (line 20) | public function down(): void
FILE: database/migrations/2023_03_16_095929_add_show_similar_posts_to_channels.php
method up (line 8) | public function up(): void
method down (line 15) | public function down(): void
FILE: database/migrations/2023_04_05_165546_add_post_id_created_at_index_to_comments.php
method up (line 8) | public function up(): void
method down (line 15) | public function down(): void
FILE: database/migrations/2023_04_05_165601_add_is_listed_position_index_to_structure.php
method up (line 8) | public function up(): void
method down (line 15) | public function down(): void
FILE: database/migrations/2023_04_13_163452_rename_channels_sandbox_to_ignore.php
method up (line 8) | public function up(): void
method down (line 15) | public function down(): void
FILE: database/migrations/2023_04_13_203750_rename_channels_default_layout_to_layout.php
method up (line 8) | public function up(): void
method down (line 15) | public function down(): void
FILE: database/migrations/2023_04_13_203835_add_layout_config_to_channels.php
method up (line 8) | public function up(): void
method down (line 15) | public function down(): void
FILE: database/migrations/2023_04_22_131025_add_translations_to_channels.php
method up (line 8) | public function up(): void
method down (line 15) | public function down(): void
FILE: database/migrations/2023_06_08_093656_add_is_pinned_to_posts.php
method up (line 8) | public function up(): void
method down (line 15) | public function down(): void
FILE: database/migrations/2023_06_08_113707_add_hiding_columns_to_comments.php
method up (line 8) | public function up(): void
method down (line 24) | public function down(): void
FILE: database/migrations/2023_06_10_151000_add_created_at_to_posts_is_pinned_index.php
method up (line 8) | public function up(): void
method down (line 16) | public function down(): void
FILE: database/migrations/2023_07_12_165151_add_deleted_at_to_posts.php
method up (line 8) | public function up(): void
method down (line 15) | public function down(): void
FILE: database/migrations/2026_01_22_000001_add_rules_and_auto_assign_to_groups.php
method up (line 8) | public function up()
method down (line 16) | public function down()
FILE: database/migrations/2026_01_22_000002_add_is_approved_to_posts.php
method up (line 8) | public function up()
method down (line 15) | public function down()
FILE: database/migrations/2026_01_22_000003_add_is_approved_to_comments.php
method up (line 8) | public function up()
method down (line 15) | public function down()
FILE: database/migrations/2026_01_22_000004_add_deleted_reason_to_posts.php
method up (line 8) | public function up(): void
method down (line 23) | public function down(): void
FILE: database/migrations/2026_01_22_000005_create_flags_table.php
method up (line 8) | public function up()
method down (line 31) | public function down()
FILE: database/migrations/2026_01_22_000006_migrate_comment_hidden_to_deleted.php
method up (line 9) | public function up(): void
method down (line 37) | public function down(): void
FILE: database/migrations/2026_01_22_000007_add_approval_requirements_to_channels.php
method up (line 8) | public function up(): void
method down (line 16) | public function down(): void
FILE: database/migrations/2026_01_22_000008_add_deleted_notes_to_posts_and_comments.php
method up (line 8) | public function up()
method down (line 19) | public function down()
FILE: database/migrations/2026_01_24_000009_add_note_to_flags_table.php
method up (line 8) | public function up()
method down (line 15) | public function down()
FILE: database/migrations/2026_01_24_000010_add_reactions_enabled_to_channels.php
method up (line 8) | public function up()
method down (line 19) | public function down()
FILE: database/seeders/DefaultSeeder.php
class DefaultSeeder (line 20) | class DefaultSeeder extends Seeder
method run (line 22) | public function run(): void
FILE: database/seeders/GroupsSeeder.php
class GroupsSeeder (line 12) | class GroupsSeeder extends Seeder
method run (line 14) | public function run(): void
FILE: resources/dist/cp.js
method constructor (line 1) | constructor(e,t,n,r){let i=_(`<div role="slider" tabindex="0" part="${t}...
method dragging (line 1) | set dragging(e){let t=e?document.addEventListener:document.removeEventLi...
method handleEvent (line 1) | handleEvent(e){switch(e.type){case`mousedown`:case`touchstart`:if(e.prev...
method style (line 1) | style(e){e.forEach((e,t)=>{for(let n in e)this.nodes[t].style.setPropert...
method constructor (line 1) | constructor(e){super(e,`hue`,`aria-label="Hue" aria-valuemin="0" aria-va...
method update (line 1) | update({h:e}){this.h=e,this.style([{left:`${e/360*100}%`,color:c({h:e,s:...
method getMove (line 1) | getMove(e,t){return{h:t?n(this.h+e.x*360,0,360):360*e.x}}
method constructor (line 1) | constructor(e){super(e,`saturation`,`aria-label="Color"`,!0)}
method update (line 1) | update(e){this.hsva=e,this.style([{top:`${100-e.v}%`,left:`${e.s}%`,colo...
method getMove (line 1) | getMove(e,t){return{s:t?n(this.hsva.s+e.x*100,0,100):e.x*100,v:t?n(this....
method observedAttributes (line 1) | static get observedAttributes(){return[`color`]}
method [ae] (line 1) | get[ae](){return[D,O,ee]}
method [oe] (line 1) | get[oe](){return[E,T]}
method color (line 1) | get color(){return this[k]}
method color (line 1) | set color(e){if(!this[te](e)){let t=this.colorModel.toHsva(e);this[re](t...
method constructor (line 1) | constructor(){super();let e=_(`<style>${this[ae].join(``)}</style>`),t=t...
method connectedCallback (line 1) | connectedCallback(){if(this.hasOwnProperty(`color`)){let e=this.color;de...
method attributeChangedCallback (line 1) | attributeChangedCallback(e,t,n){let r=this.colorModel.fromAttr(n);this[t...
method handleEvent (line 1) | handleEvent(e){let t=this[ne],n={...t,...e.detail};this[re](n);let r;!m(...
method [te] (line 1) | [te](e){return this.color&&this.colorModel.equal(e,this.color)}
method [re] (line 1) | [re](e){this[ne]=e,this[ie].forEach(t=>t.update(e))}
method constructor (line 1) | constructor(e){super(e,`alpha`,`aria-label="Alpha" aria-valuemin="0" ari...
method update (line 1) | update(e){this.hsva=e;let t=l({...e,a:0}),n=l({...e,a:1}),i=e.a*100;this...
method getMove (line 1) | getMove(e,t){return{a:t?n(this.hsva.a+e.x):e.x}}
method [ae] (line 1) | get[ae](){return[...super[ae],j]}
method [oe] (line 1) | get[oe](){return[...super[oe],A]}
method colorModel (line 1) | get colorModel(){return ce}
method observedAttributes (line 1) | static get observedAttributes(){return[`alpha`,`color`,`prefixed`]}
method color (line 1) | get color(){return this[me]}
method color (line 1) | set color(e){this[me]=e,this[ye](e)}
method alpha (line 1) | get alpha(){return this[pe]}
method alpha (line 1) | set alpha(e){this[pe]=e,this.toggleAttribute(`alpha`,e);let t=this.color...
method prefixed (line 1) | get prefixed(){return this[ve]}
method prefixed (line 1) | set prefixed(e){this[ve]=e,this.toggleAttribute(`prefixed`,e),this[ye](t...
method constructor (line 1) | constructor(){super();let e=this.attachShadow({mode:`open`});e.appendChi...
method connectedCallback (line 1) | connectedCallback(){if(this[_e](this.shadowRoot),this.hasOwnProperty(`al...
method handleEvent (line 1) | handleEvent(e){let{value:t}=e.target;switch(e.type){case`input`:let e=fe...
method attributeChangedCallback (line 1) | attributeChangedCallback(e,t,n){e===`color`&&this.color!==n&&(this.color...
method [_e] (line 1) | [_e](e){let t=this.querySelector(`input`);if(!t){let n;for(;n=this.first...
method [ye] (line 1) | [ye](e){this[ge]&&(this[ge].value=e==null||e==``?``:(this.prefixed?`#`:`...
function Se (line 1) | function Se(e){return e.toLowerCase().replace(/[^a-z0-9]/gi,`-`).replace...
function Ce (line 1) | function Ce(e){return Object.entries(e).map(([e,t])=>({identifier:e.matc...
function we (line 1) | function we(e){return e.replace(/(?:[_-])([a-z0-9])/g,(e,t)=>t.toUpperCa...
function F (line 1) | function F(e){return we(e.replace(/--/g,`-`).replace(/__/g,`_`))}
function I (line 1) | function I(e){return e.charAt(0).toUpperCase()+e.slice(1)}
function Te (line 1) | function Te(e){return e.replace(/([A-Z])/g,(e,t)=>`-${t.toLowerCase()}`)}
function Ee (line 1) | function Ee(e){return e!=null}
function De (line 1) | function De(e,t){return Object.prototype.hasOwnProperty.call(e,t)}
function Oe (line 1) | function Oe(e,t){let n=Ae(e);return Array.from(n.reduce((e,n)=>(je(n,t)....
function ke (line 1) | function ke(e,t){return Ae(e).reduce((e,n)=>(e.push(...Me(n,t)),e),[])}
function Ae (line 1) | function Ae(e){let t=[];for(;e;)t.push(e),e=Object.getPrototypeOf(e);ret...
function je (line 1) | function je(e,t){let n=e[t];return Array.isArray(n)?n:[]}
function Me (line 1) | function Me(e,t){let n=e[t];return n?Object.keys(n).map(e=>[e,n[e]]):[]}
function e (line 1) | function e(e){function t(){return Reflect.construct(e,arguments,new.targ...
function t (line 1) | function t(){let t=e(function(){this.a.call(this)});return t.prototype.a...
function Ne (line 1) | function Ne(e){return e.reduce((e,[t,n])=>Object.assign(Object.assign({}...
function Pe (line 1) | function Pe(e){return Oe(e,`classes`).reduce((e,t)=>Object.assign(e,Fe(t...
function Fe (line 1) | function Fe(e){return{[`${e}Class`]:{get(){let{classes:t}=this;if(t.has(...
function Ie (line 1) | function Ie(e){return Oe(e,`outlets`).reduce((e,t)=>Object.assign(e,ze(t...
function Le (line 1) | function Le(e,t,n){return e.application.getControllerForElementAndIdenti...
function Re (line 1) | function Re(e,t,n){let r=Le(e,t,n);if(r||(e.application.router.proposeTo...
function ze (line 1) | function ze(e){let t=F(e);return{[`${t}Outlet`]:{get(){let t=this.outlet...
function Be (line 1) | function Be(e){return Oe(e,`targets`).reduce((e,t)=>Object.assign(e,Ve(t...
function Ve (line 1) | function Ve(e){return{[`${e}Target`]:{get(){let t=this.targets.find(e);i...
function He (line 1) | function He(e){let t=ke(e,`values`);return t.reduce((e,t)=>Object.assign...
function Ue (line 1) | function Ue(e,t){let n=We(e,t),{key:r,name:i,reader:a,writer:o}=n;return...
function We (line 1) | function We([e,t],n){return Xe({controller:n,token:e,typeDefinition:t})}
function Ge (line 1) | function Ge(e){switch(e){case Array:return`array`;case Boolean:return`bo...
function Ke (line 1) | function Ke(e){switch(typeof e){case`boolean`:return`boolean`;case`numbe...
function qe (line 1) | function qe(e){let{controller:t,token:n,typeObject:r}=e,i=Ee(r.type),a=E...
function Je (line 1) | function Je(e){let{controller:t,token:n,typeDefinition:r}=e,i=qe({contro...
function Ye (line 1) | function Ye(e){let t=Ge(e);if(t)return Ze[t];let n=De(e,`default`),r=De(...
function Xe (line 1) | function Xe(e){let{token:t,typeDefinition:n}=e,r=`${Te(t)}-value`,i=Je(e...
method array (line 1) | get array(){return[]}
method object (line 1) | get object(){return{}}
method array (line 1) | array(e){let t=JSON.parse(e);if(!Array.isArray(t))throw TypeError(`expec...
method boolean (line 1) | boolean(e){return!(e==`0`||String(e).toLowerCase()==`false`)}
method number (line 1) | number(e){return Number(e.replace(/_/g,``))}
method object (line 1) | object(e){let t=JSON.parse(e);if(typeof t!=`object`||!t||Array.isArray(t...
method string (line 1) | string(e){return e}
function et (line 1) | function et(e){return JSON.stringify(e)}
function tt (line 1) | function tt(e){return`${e}`}
method constructor (line 1) | constructor(e){this.context=e}
method shouldLoad (line 1) | static get shouldLoad(){return!0}
method afterLoad (line 1) | static afterLoad(e,t){}
method application (line 1) | get application(){return this.context.application}
method scope (line 1) | get scope(){return this.context.scope}
method element (line 1) | get element(){return this.scope.element}
method identifier (line 1) | get identifier(){return this.scope.identifier}
method targets (line 1) | get targets(){return this.scope.targets}
method outlets (line 1) | get outlets(){return this.scope.outlets}
method classes (line 1) | get classes(){return this.scope.classes}
method data (line 1) | get data(){return this.scope.data}
method initialize (line 1) | initialize(){}
method connect (line 1) | connect(){}
method disconnect (line 1) | disconnect(){}
method dispatch (line 1) | dispatch(e,{target:t=this.element,detail:n={},prefix:r=this.identifier,b...
method show (line 1) | show(){clearTimeout(this.timeout),this.pickerTarget.hidden=!1}
method hide (line 1) | hide(){clearTimeout(this.timeout),this.timeout=window.setTimeout(()=>thi...
method colorChanged (line 1) | colorChanged(e){this.inputTarget.color=e.detail.value,this.pickerTarget....
method constructor (line 1) | constructor(e,t,{tabInsertsSuggestions:n,firstOptionSelectionMode:r,scro...
method destroy (line 1) | destroy(){this.clearSelection(),this.stop(),this.input.removeAttribute(`...
method start (line 1) | start(){this.input.setAttribute(`aria-expanded`,`true`),this.input.addEv...
method stop (line 1) | stop(){this.clearSelection(),this.input.setAttribute(`aria-expanded`,`fa...
method indicateDefaultOption (line 1) | indicateDefaultOption(){var e;this.firstOptionSelectionMode===`active`?(...
method navigate (line 1) | navigate(e=1){let t=Array.from(this.list.querySelectorAll(`[aria-selecte...
method clearSelection (line 1) | clearSelection(){this.input.removeAttribute(`aria-activedescendant`);for...
method resetSelection (line 1) | resetSelection(){this.clearSelection(),this.indicateDefaultOption()}
function ot (line 1) | function ot(e,t){if(!(e.shiftKey||e.metaKey||e.altKey)&&!(!t.ctrlBinding...
function st (line 1) | function st(e){if(!(e.target instanceof Element))return;let t=e.target.c...
function ct (line 1) | function ct(e,t){let n=t.querySelector(`[aria-selected="true"], [data-co...
function lt (line 1) | function lt(e,t){e.dispatchEvent(new CustomEvent(`combobox-commit`,{bubb...
function ut (line 1) | function ut(e){e.dispatchEvent(new Event(`combobox-select`,{bubbles:!0}))}
function dt (line 1) | function dt(e){return!e.hidden&&!(e instanceof HTMLInputElement&&e.type=...
function ft (line 1) | function ft(e,t){t.isComposing=e.type===`compositionstart`,document.getE...
function pt (line 1) | function pt(e){return e instanceof HTMLInputElement||e instanceof HTMLTe...
function mt (line 1) | function mt(e,t){let n=e.ownerDocument.activeElement;if(n===e)return t()...
function ht (line 1) | function ht(e,t){t===``?e.execCommand(`delete`):e.execCommand(`insertTex...
function gt (line 1) | function gt(e,t){mt(e,()=>{ht(e.ownerDocument,t)})}
function _t (line 1) | function _t(e,t){if(pt(e))e.select(),gt(e,t);else{let n=e.ownerDocument;...
method connect (line 1) | connect(){this.combobox=new at(this.inputTarget,this.listTarget)}
method focus (line 1) | focus(){this.combobox?.start(),this.update()}
method blur (line 1) | blur(){this.combobox?.stop(),this.listTarget.hidden=!0}
method tokens (line 1) | tokens(){let e=this.inputTarget.value.matchAll(bt);return Array.from(e)....
method currentToken (line 1) | currentToken(){let e=this.inputTarget.selectionStart||0;return this.toke...
method update (line 1) | update(){let e=this.tokens(),t=this.currentToken(),n=t&&t[0].toLowerCase...
method commit (line 1) | commit(e){let t=e.target,n=this.currentToken(),r=(t.dataset.value||t.tex...
method preventBlur (line 1) | preventBlur(e){e.preventDefault()}
method submit (line 1) | submit(){setTimeout(()=>{this.formTarget.requestSubmit()})}
method change (line 1) | change(){this.previewTarget.hidden=!0,this.formTarget.hidden=!1}
method emojiTargetConnected (line 1) | emojiTargetConnected(e){let t=e.querySelector(`input`),n=e.querySelector...
function Pt (line 1) | function Pt(e){var t=jt.call(e,Nt),n=e[Nt];try{e[Nt]=void 0;var r=!0}cat...
function Lt (line 1) | function Lt(e){return It.call(e)}
function Ht (line 1) | function Ht(e){return e==null?e===void 0?Bt:zt:Vt&&Vt in Object(e)?Ft(e)...
function Wt (line 1) | function Wt(e){return typeof e==`object`&&!!e}
function qt (line 1) | function qt(e){return typeof e==`symbol`||Gt(e)&&Ut(e)==Kt}
function Xt (line 1) | function Xt(e){for(var t=e.length;t--&&Yt.test(e.charAt(t)););return t}
function $t (line 1) | function $t(e){return e&&e.slice(0,Zt(e)+1).replace(Qt,``)}
function tn (line 1) | function tn(e){var t=typeof e;return e!=null&&(t==`object`||t==`function`)}
function ln (line 1) | function ln(e){if(typeof e==`number`)return e;if(Jt(e))return rn;if(nn(e...
function pn (line 1) | function pn(e,t,n){var r,i,a,o,s,c,l=0,u=!1,d=!1,f=!0;if(typeof e!=`func...
method constructor (line 1) | constructor(...e){super(...e),this.debouncedSubmit=mn(this.submit,250)}
method input (line 1) | input(e){e.target.value?this.debouncedSubmit():this.submit()}
method submit (line 1) | submit(){this.element.form?.requestSubmit()}
function Rn (line 1) | function Rn(){let e=devicePixelRatio;B!=e&&(B=e,Ln&&Qn(jn,Ln,Rn),Ln=matc...
function zn (line 1) | function zn(e,t){if(t!=null){let n=e.classList;!n.contains(t)&&n.add(t)}}
function Bn (line 1) | function Bn(e,t){let n=e.classList;n.contains(t)&&n.remove(t)}
function V (line 1) | function V(e,t,n){e.style[t]=n+`px`}
function Vn (line 1) | function Vn(e,t,n,r){let i=Pn.createElement(e);return t!=null&&zn(i,t),n...
function Hn (line 1) | function Hn(e,t){return Vn(`div`,e,t)}
function Wn (line 1) | function Wn(e,t,n,r,i){let a=`translate(`+t+`px,`+n+`px)`;a!=Un.get(e)&&...
function Kn (line 1) | function Kn(e,t,n){let r=t+n;r!=Gn.get(e)&&(Gn.set(e,r),e.style.backgrou...
function Jn (line 1) | function Jn(e,t,n,r){let i=t+``+n;i!=qn.get(e)&&(qn.set(e,i),e.style.hei...
function Zn (line 1) | function Zn(e,t,n,r){t.addEventListener(e,n,r?Xn:Yn)}
function Qn (line 1) | function Qn(e,t,n,r){t.removeEventListener(e,n,Yn)}
function $n (line 1) | function $n(e,t,n,r){let i;n||=0,r||=t.length-1;let a=r<=2147483647;for(...
function er (line 1) | function er(e){return(t,n,r)=>{let i=-1,a=-1;for(let a=n;a<=r;a++)if(e(t...
function ar (line 1) | function ar(e,t,n,r=0,i=!1){let a=i?ir:rr,o=i?nr:tr;[t,n]=a(e,t,n);let s...
function or (line 1) | function or(e,t,n,r){let i=Er(e),a=Er(t);e==t&&(i==-1?(e*=n,t/=n):(e/=n,...
function sr (line 1) | function sr(e,t,n,r){let i=or(e,t,n,r);return e==0&&(i[0]=0),t==0&&(i[1]...
function fr (line 1) | function fr(e,t,n,r){return ti(n)?mr(e,t,n):(ur.pad=n,ur.soft=r?0:null,u...
function H (line 1) | function H(e,t){return e??t}
function pr (line 1) | function pr(e,t,n){for(t=H(t,0),n=H(n,e.length-1);t<=n;){if(e[t]!=null)r...
function mr (line 1) | function mr(e,t,n){let r=n.min,i=n.max,a=H(r.pad,0),o=H(i.pad,0),s=H(r.h...
function jr (line 1) | function jr(e){return(Dr((e^e>>31)-(e>>31))|0)+1}
function Mr (line 1) | function Mr(e,t,n){return Cr(wr(e,t),n)}
function Nr (line 1) | function Nr(e){return typeof e==`function`}
function W (line 1) | function W(e){return Nr(e)?e:()=>e}
function Hr (line 1) | function Hr(e,t){return Vr(G(Vr(e/t))*t)}
function Ur (line 1) | function Ur(e,t){return Vr(Sr(Vr(e/t))*t)}
function Wr (line 1) | function Wr(e,t){return Vr(br(Vr(e/t))*t)}
function G (line 1) | function G(e,t=0){if(Qr(e))return e;let n=10**t;return xr(e*n*(1+2**-52)...
function Kr (line 1) | function Kr(e){return((``+e).split(`.`)[1]||``).length}
function qr (line 1) | function qr(e,t,n,r){let i=[],a=r.map(Kr);for(let o=t;o<n;o++){let t=yr(...
function ei (line 1) | function ei(e){return typeof e==`string`}
function ti (line 1) | function ti(e){let t=!1;if(e!=null){let n=e.constructor;t=n==null||n==Ob...
function ni (line 1) | function ni(e){return typeof e==`object`&&!!e}
function ai (line 1) | function ai(e,t=ti){let n;if(Zr(e)){let r=e.find(e=>e!=null);if(Zr(r)||t...
function oi (line 1) | function oi(e){let t=arguments;for(let n=1;n<t.length;n++){let r=t[n];fo...
function si (line 1) | function si(e,t,n){for(let r=0,i,a=-1;r<t.length;r++){let o=t[r];if(o>a)...
function ci (line 1) | function ci(e,t){if(di(e)){let t=e[0].slice();for(let n=1;n<e.length;n++...
function ui (line 1) | function ui(e){let t=e[0],n=t.length,r=Array(n);for(let e=0;e<r.length;e...
function di (line 1) | function di(e){let t=e[0][0],n=t.length;for(let r=1;r<e.length;r++){let ...
function fi (line 1) | function fi(e,t=100){let n=e.length;if(n<=1)return!0;let r=0,i=n-1;for(;...
function hi (line 1) | function hi(e){return e.slice(0,3)}
function vi (line 1) | function vi(e){return(e<10?`0`:``)+e}
function yi (line 1) | function yi(e){return(e<10?`00`:e<100?`0`:``)+e}
function xi (line 1) | function xi(e,t){t||=_i;let n=[],r=/\{([a-z]+)\}|[^{]+/gi,i;for(;i=r.exe...
function Ci (line 1) | function Ci(e,t){let n;return t==`UTC`||t==`Etc/UTC`?n=new Date(+e+e.get...
function zi (line 4) | function zi(e){let t=e*1e3,n=t*60,r=n*60,i=r*24,a=i*30,o=i*365,s=(e==1?q...
function Ki (line 4) | function Ki(e,t){return e.map(e=>e.map((n,r)=>r==0||r==8||n==null?n:t(r=...
function qi (line 4) | function qi(e,t){return(n,r,i,a,o)=>{let s=t.find(e=>o>=e[0])||t[t.lengt...
function Ji (line 4) | function Ji(e,t){let n=xi(t);return(t,r,i,a,o)=>r.map(t=>n(e(t)))}
function Yi (line 4) | function Yi(e,t,n){return new Date(e,t,n)}
function Xi (line 4) | function Xi(e,t){return t(e)}
function Zi (line 4) | function Zi(e,t){return(n,r,i,a)=>a==null?`--`:t(e(r))}
function Qi (line 4) | function Qi(e,t){let n=e.series[t];return n.width?n.stroke(e,t):n.points...
function $i (line 4) | function $i(e,t){return e.series[t].fill(e,t)}
function ta (line 4) | function ta(e,t){let n=e.cursor.points,r=Hn(),i=n.size(e,t);V(r,vn,i),V(...
function na (line 4) | function na(e,t){let n=e.series[t].points;return n._fill||n._stroke}
function ra (line 4) | function ra(e,t){let n=e.series[t].points;return n._stroke||n._fill}
function ia (line 4) | function ia(e,t){return e.series[t].points.size}
function oa (line 4) | function oa(e,t,n){return aa[0]=t,aa[1]=n,aa}
function sa (line 4) | function sa(e,t,n,r=!0){return e=>{e.button==0&&(!r||e.target==t)&&n(e)}}
function ca (line 4) | function ca(e,t,n,r=!0){return e=>{(!r||e.target==t)&&n(e)}}
function ya (line 4) | function ya(e,t,n,r,i){return t.map(e=>e==null?``:gr(e))}
function ba (line 4) | function ba(e,t,n,r,i,a,o){let s=[],c=Gr.get(i)||0;n=o?n:G(Ur(n,i),c);fo...
function xa (line 4) | function xa(e,t,n,r,i,a,o){let s=[],c=e.scales[e.axes[t].scale].log;i=Tr...
function Sa (line 4) | function Sa(e,t,n,r,i,a,o){let s=e.scales[e.axes[t].scale].asinh,c=r>s?x...
function Oa (line 4) | function Oa(e,t,n,r,i){let a=e.axes[n],o=a.scale,s=e.scales[o],c=e.valTo...
function ka (line 4) | function ka(e,t,n,r,i){let a=e.axes[n],o=a.scale,s=a._space,c=e.valToPos...
function Aa (line 4) | function Aa(e,t,n,r){return r==null?`--`:t==null?``:gr(t)}
function Ma (line 4) | function Ma(e,t){return G((3+(e||1)*2)*t,3)}
function Na (line 4) | function Na(e,t){let{scale:n,idxs:r}=e.series[0],i=e._data[0],a=e.valToP...
function Ra (line 4) | function Ra(e,t,n,r,i){return n/10}
function Ha (line 4) | function Ha(e,t){let n=Va[e];return n||(n={key:e,plots:[],sub(e){n.plots...
function Ua (line 4) | function Ua(e,t,n){let r=e.mode,i=e.series[t],a=r==2?e._data[t]:e._data,...
function Wa (line 4) | function Wa(e,t){let n=0,r=0,i=H(e.bands,Yr);for(let e=0;e<i.length;e++)...
function Ga (line 4) | function Ga(e,t,n,r,i){let a=e.mode,o=e.series[t],s=a==2?o.facets[1].sca...
function Ka (line 4) | function Ka(e,t,n,r,i,a){return Ua(e,t,(e,t,o,s,c,l,u,d,f,p,m)=>{let h=e...
function qa (line 4) | function qa(e,t,n,r,i,a){let o=null;if(e.length>0){o=new Path2D;let s=t=...
function Ja (line 4) | function Ja(e,t,n){let r=e[e.length-1];r&&r[0]==t?r[1]=n:e.push([t,n])}
function Ya (line 4) | function Ya(e,t,n,r,i,a,o){let s=[],c=e.length;for(let l=i==1?n:r;l>=n&&...
function Xa (line 4) | function Xa(e){return e==0?Fr:e==1?xr:t=>Hr(t,e)}
function Za (line 4) | function Za(e){let t=e==0?Qa:$a,n=e==0?(e,t,n,r,i,a)=>{e.arcTo(t,n,r,i,a...
function co (line 4) | function co(e){return(e,t,n,r,i)=>Ua(e,t,(t,a,o,s,c,l,u,d,f,p,m)=>{let{p...
function lo (line 4) | function lo(e){return(t,n,r,i,a,o)=>{r!=i&&(a!=r&&o!=r&&e(t,n,r),a!=i&&o...
function po (line 4) | function po(e){let t=H(e?.alignGaps,0);return(e,n,r,i)=>Ua(e,n,(a,o,s,c,...
function mo (line 4) | function mo(e){let t=H(e.align,1),n=H(e.ascDesc,!1),r=H(e.alignGaps,0),i...
function ho (line 4) | function ho(e,t,n,r,i,a,o=U){if(e.length>1){let s=null;for(let c=0,l=1/0...
function go (line 4) | function go(e){e||=Jr;let t=H(e.size,[.6,U,1]),n=e.align||0,r=e.gap||0,i...
function _o (line 4) | function _o(e,t){let n=H(t?.alignGaps,0);return(t,r,i,a)=>Ua(t,r,(o,s,c,...
function vo (line 4) | function vo(e){return _o(yo,e)}
function yo (line 4) | function yo(e,t,n,r,i,a){let o=e.length;if(o<2)return null;let s=new Pat...
function xo (line 4) | function xo(){for(let e of bo)e.syncRect(!0)}
function wo (line 4) | function wo(e,t,n,r){return(r?[e[0],e[1]].concat(e.slice(2)):[e[0]].conc...
function To (line 4) | function To(e,t){return e.map((e,n)=>n==0?{}:oi({},t,e))}
function Eo (line 4) | function Eo(e,t,n,r){return oi({},t==0?n:r,e)}
function Do (line 4) | function Do(e,t,n){return t==null?Xr:[t,n]}
function ko (line 4) | function ko(e,t,n){return t==null?Xr:fr(t,n,cr,!0)}
function Ao (line 4) | function Ao(e,t,n,r){return t==null?Xr:or(t,n,e.scales[r].log,!1)}
function Mo (line 4) | function Mo(e,t,n,r){return t==null?Xr:sr(t,n,e.scales[r].log,!1)}
function Po (line 4) | function Po(e,t,n,r,i){let a=wr(jr(e),jr(t)),o=t-e,s=$n(i/r*o,n);do{let ...
function Fo (line 4) | function Fo(e){let t,n;return e=e.replace(/(\d+)px/,(e,r)=>(t=xr((n=+r)*...
function Io (line 4) | function Io(e){e.show&&[e.font,e.labelFont].forEach(e=>{let t=G(e[2]*B,1...
function Lo (line 4) | function Lo(e,t,n){let r={mode:H(e.mode,1)},i=r.mode;function a(e,t,n,r)...
method getSize (line 5) | getSize(){return{width:this.chartTarget.offsetWidth,height:this.chartTar...
method connect (line 5) | connect(){this.tableTarget.hidden=!0,this.chartTarget.hidden=!1,this.axi...
method disconnect (line 5) | disconnect(){this.observer?.disconnect(),this.uplot?.destroy()}
method constructor (line 5) | constructor(...e){super(...e),this.mouseover=e=>{let t=e.target;if(t.clo...
method connect (line 5) | connect(){this.disabled=Array.from(this.element.querySelectorAll(`input:...
method disconnect (line 5) | disconnect(){this.element.removeEventListener(`click`,this.click),this.e...
method update (line 5) | update(){this.element.querySelectorAll(`tbody td input[type="checkbox"]`...
method constructor (line 5) | constructor(...e){super(...e),this.locked=!1}
method updateName (line 5) | updateName(e){let t=e.target;this.locked||(this.slugTarget.value=Se(t.va...
method updateSlug (line 5) | updateSlug(e){let t=e.target;this.mirror(),this.locked=!!t.value}
method mirror (line 5) | mirror(){this.mirrorTargets.forEach(e=>{e.textContent=this.slugTarget.va...
function Go (line 5) | function Go(){if(Jo>1)Jo--;else{for(var e,t=!1;qo!==void 0;){var n=qo;fo...
function Ko (line 5) | function Ko(e){if(Jo>0)return e();Jo++;try{return e()}finally{Go()}}
function q (line 5) | function q(e){var t=K;K=void 0;try{return e()}finally{K=t}}
function Zo (line 5) | function Zo(e){if(K!==void 0){var t=e.n;if(t===void 0||t.t!==K)return t=...
function Qo (line 5) | function Qo(e,t){this.v=e,this.i=0,this.n=void 0,this.t=void 0,this.W=t?...
function $o (line 5) | function $o(e,t){return new Qo(e,t)}
function es (line 5) | function es(e){for(var t=e.s;t!==void 0;t=t.n)if(t.S.i!==t.i||!t.S.h()||...
function ts (line 5) | function ts(e){for(var t=e.s;t!==void 0;t=t.n){var n=t.S.n;if(n!==void 0...
function ns (line 5) | function ns(e){for(var t=e.s,n=void 0;t!==void 0;){var r=t.p;t.i===-1?(t...
function rs (line 5) | function rs(e,t){Qo.call(this,void 0),this.x=e,this.s=void 0,this.g=Xo-1...
function is (line 5) | function is(e,t){return new rs(e,t)}
function as (line 5) | function as(e){var t=e.u;if(e.u=void 0,typeof t==`function`){Jo++;var n=...
function os (line 5) | function os(e){for(var t=e.s;t!==void 0;t=t.n)t.S.U(t);e.x=void 0,e.s=vo...
function ss (line 5) | function ss(e){if(K!==this)throw Error(`Out-of-order effect`);ns(this),K...
function cs (line 5) | function cs(e,t){this.x=e,this.u=void 0,this.s=void 0,this.o=void 0,this...
function ls (line 5) | function ls(e,t){var n=new cs(e,t);try{n.c()}catch(e){throw n.d(),e}var ...
method [n] (line 5) | get[n](){return Ns(this,a)}
method [n] (line 5) | set[n](e){return Fs(this,a,e)}
function Ls (line 5) | function Ls(e,t){if(t){let n;return is(()=>{let r=e();return r&&n&&t(n,r...
function Rs (line 5) | function Rs(e,t){if(Object.is(e,t))return!0;if(e===null||t===null)return...
function J (line 5) | function J({get:e},t){return{init(e){return $o(e)},get(){return e.call(t...
function zs (line 5) | function zs(e,t){let n=new WeakMap;return function(){let t=n.get(this);r...
function Bs (line 5) | function Bs(e=!0){return function(t,n){n.addInitializer(function(){let t...
function Vs (line 5) | function Vs(...e){let t=e.map(e=>ls(e));return()=>t.forEach(e=>e())}
method constructor (line 5) | constructor(e,t=Object.is){this.defaultValue=e,this.equals=t,ks(Js,5,thi...
method current (line 5) | get current(){return Ns(this,$s,oc)}
method initial (line 5) | get initial(){return Ns(this,$s,Zs)}
method previous (line 5) | get previous(){return Ns(this,$s,nc)}
method current (line 5) | set current(e){let t=q(()=>Ns(this,$s,oc));e&&t&&this.equals(t,e)||Ko(()...
method reset (line 5) | reset(e=this.defaultValue){Ko(()=>{Fs(this,$s,void 0,rc),Fs(this,$s,e,Qs...
function lc (line 5) | function lc(e){return q(()=>{let t={};for(let n in e)t[n]=e[n];return t})}
method constructor (line 5) | constructor(){Ps(this,uc,new WeakMap)}
method get (line 5) | get(e,t){return e?Ns(this,uc).get(e)?.get(t):void 0}
method set (line 5) | set(e,t,n){if(e)return Ns(this,uc).has(e)||Ns(this,uc).set(e,new Map),Ns...
method clear (line 5) | clear(e){return e?Ns(this,uc).get(e)?.clear():void 0}
method [n] (line 5) | get[n](){return Nc(this,a)}
method [n] (line 5) | set[n](e){return Fc(this,a,e)}
method constructor (line 5) | constructor(e,t){this.x=e,this.y=t}
method delta (line 5) | static delta(t,n){return new e(t.x-n.x,t.y-n.y)}
method distance (line 5) | static distance(e,t){return Math.hypot(e.x-t.x,e.y-t.y)}
method equals (line 5) | static equals(e,t){return e.x===t.x&&e.y===t.y}
method from (line 5) | static from({x:t,y:n}){return new e(t,n)}
method constructor (line 5) | constructor(e,t,n,r){this.left=e,this.top=t,this.width=n,this.height=r,t...
method inverseScale (line 5) | get inverseScale(){return{x:1/this.scale.x,y:1/this.scale.y}}
method translate (line 5) | translate(t,n){let{top:r,left:i,width:a,height:o,scale:s}=this,c=new e(i...
method boundingRectangle (line 5) | get boundingRectangle(){let{width:e,height:t,left:n,top:r,right:i,bottom...
method center (line 5) | get center(){let{left:e,top:t,right:n,bottom:r}=this;return new Lc((e+n)...
method area (line 5) | get area(){let{width:e,height:t}=this;return e*t}
method equals (line 5) | equals(t){if(!(t instanceof e))return!1;let{left:n,top:r,width:i,height:...
method containsPoint (line 5) | containsPoint(e){let{top:t,left:n,bottom:r,right:i}=this;return t<=e.y&&...
method intersectionArea (line 5) | intersectionArea(t){return t instanceof e?zc(this,t):0}
method intersectionRatio (line 5) | intersectionRatio(e){let{area:t}=this,n=this.intersectionArea(e);return ...
method bottom (line 5) | get bottom(){let{top:e,height:t}=this;return e+t}
method right (line 5) | get right(){let{left:e,width:t}=this;return e+t}
method aspectRatio (line 5) | get aspectRatio(){let{width:e,height:t}=this;return e/t}
method corners (line 5) | get corners(){return[{x:this.left,y:this.top},{x:this.right,y:this.top},...
method from (line 5) | static from({top:t,left:n,width:r,height:i}){return new e(n,t,r,i)}
method delta (line 5) | static delta(e,t,n={x:`center`,y:`center`}){let r=(e,t)=>{let r=n[t],i=t...
method intersectionRatio (line 5) | static intersectionRatio(t,n){return e.from(t).intersectionRatio(e.from(...
function zc (line 5) | function zc(e,t){let n=Math.max(t.top,e.top),r=Math.max(t.left,e.left),i...
method constructor (line 5) | constructor(e){let t=Lc.from(e);super(t,(e,t)=>Lc.equals(e,t)),kc(Wc,5,t...
method delta (line 5) | get delta(){return Lc.delta(this.current,this.initial)}
method direction (line 5) | get direction(){let{current:e,previous:t}=this;if(!t)return null;let n={...
method current (line 5) | get current(){return super.current}
method current (line 5) | set current(e){let{current:t}=this,n=Lc.from(e),r={x:n.x-t.x,y:n.y-t.y},...
method reset (line 5) | reset(e=this.defaultValue){super.reset(Lc.from(e)),this.velocity={x:0,y:0}}
function Kc (line 5) | function Kc({x:e,y:t},n){let r=Math.abs(e),i=Math.abs(t);return typeof n...
method [n] (line 5) | get[n](){return _l(this,a)}
method [n] (line 5) | set[n](e){return vl(this,a,e)}
function bl (line 5) | function bl(e,t){return{plugin:e,options:t}}
function xl (line 5) | function xl(e){return t=>bl(e,t)}
function Sl (line 5) | function Sl(e){return typeof e==`function`?{plugin:e,options:void 0}:e}
method constructor (line 5) | constructor(e,t){this.manager=e,this.options=t,Z(this,Tl,Y(wl,8,this,!1)...
method enable (line 5) | enable(){this.disabled=!1}
method disable (line 5) | disable(){this.disabled=!0}
method isDisabled (line 5) | isDisabled(){return q(()=>this.disabled)}
method configure (line 5) | configure(e){this.options=e}
method registerEffect (line 5) | registerEffect(e){let t=ls(e.bind(this));return _l(this,El).add(t),t}
method destroy (line 5) | destroy(){_l(this,El).forEach(e=>e())}
method configure (line 5) | static configure(e){return bl(this,e)}
method constructor (line 5) | constructor(e){this.manager=e,this.instances=new Map,Z(this,kl,[])}
method values (line 5) | get values(){return Array.from(this.instances.values())}
method values (line 5) | set values(e){let t=e.map(Sl).reduceRight((e,t)=>e.some(({plugin:e})=>e=...
method get (line 5) | get(e){return this.instances.get(e)}
method register (line 5) | register(e,t){let n=this.instances.get(e);if(n)return n.options!==t&&(n....
method unregister (line 5) | unregister(e){let t=this.instances.get(e);t&&(t.destroy(),this.instances...
method destroy (line 5) | destroy(){for(let e of this.instances.values())e.destroy();this.instance...
function jl (line 5) | function jl(e,t){return e.priority===t.priority?e.type===t.type?t.value-...
method constructor (line 5) | constructor(e){super(e),Z(this,Nl),Z(this,Pl),this.computeCollisions=thi...
method forceUpdate (line 5) | forceUpdate(e=!0){q(()=>{e?_l(this,Pl).value=this.computeCollisions():vl...
method computeCollisions (line 5) | computeCollisions(e,t){let{registry:n,dragOperation:r}=this.manager,{sou...
method collisions (line 5) | get collisions(){return _l(this,Pl).value}
method constructor (line 5) | constructor(){this.registry=new Map}
method addEventListener (line 5) | addEventListener(e,t){let{registry:n}=this,r=new Set(n.get(e));return r....
method removeEventListener (line 5) | removeEventListener(e,t){let{registry:n}=this,r=new Set(n.get(e));r.dele...
method dispatch (line 5) | dispatch(e,...t){let{registry:n}=this,r=n.get(e);if(r)for(let e of r)e(....
method constructor (line 5) | constructor(e){super(),this.manager=e}
method dispatch (line 5) | dispatch(e,t){let n=[t,this.manager];super.dispatch(e,...n)}
function Rl (line 5) | function Rl(e,t=!0){let n=!1;return sl(ol({},e),{cancelable:t,get defaul...
method constructor (line 5) | constructor(e){super(e);let t=(e,t)=>e.map(({id:e})=>e).join(``)===t.map...
method constructor (line 5) | constructor(){Y(Yl,5,this),Z(this,Xl,Y(Yl,8,this,`idle`)),Y(Yl,11,this)}
method current (line 5) | get current(){return this.value}
method idle (line 5) | get idle(){return this.value===`idle`}
method initializing (line 5) | get initializing(){return this.value===`initializing`}
method initialized (line 5) | get initialized(){let{value:e}=this;return e!==`idle`&&e!==`initializati...
method dragging (line 5) | get dragging(){return this.value===`dragging`}
method dropped (line 5) | get dropped(){return this.value===`dropped`}
method set (line 5) | set(e){this.value=e}
method constructor (line 5) | constructor(e){this.manager=e}
method setDragSource (line 5) | setDragSource(e){let{dragOperation:t}=this.manager;t.sourceIdentifier=ty...
method setDropTarget (line 5) | setDropTarget(e){return q(()=>{let{dragOperation:t}=this.manager,n=e??nu...
method start (line 5) | start(e){return q(()=>{let{dragOperation:t}=this.manager;if(e.source!=nu...
method move (line 5) | move(e){return q(()=>{let{dragOperation:t}=this.manager,{status:n,contro...
method stop (line 5) | stop(e={}){return q(()=>{let{dragOperation:t}=this.manager,{controller:n...
method constructor (line 5) | constructor(e,t){Z(this,iu,Y(ru,8,this)),Y(ru,11,this),Z(this,au,Y(ru,12...
method register (line 5) | register(){return this.manager?.registry.register(this)}
method unregister (line 5) | unregister(){var e;(e=this.manager)==null||e.registry.unregister(this)}
method destroy (line 5) | destroy(){var e;(e=this.manager)==null||e.registry.unregister(this)}
method constructor (line 5) | constructor(){this.map=$o(new Map),this.cleanupFunctions=new WeakMap,thi...
method [Symbol.iterator] (line 5) | [Symbol.iterator](){return this.map.peek().values()}
method value (line 5) | get value(){return this.map.value.values()}
method has (line 5) | has(e){return this.map.value.has(e)}
method get (line 5) | get(e){return this.map.value.get(e)}
method destroy (line 5) | destroy(){for(let e of this)this.cleanupFunctions.get(e)?.(),e.destroy()...
method constructor (line 5) | constructor(e,t){var n=e,{modifiers:r,type:i,sensors:a}=n,o=ll(n,[`modif...
method isDropping (line 5) | get isDropping(){return this.status===`dropping`&&this.isDragSource}
method isDragging (line 5) | get isDragging(){return this.status===`dragging`&&this.isDragSource}
method isDragSource (line 5) | get isDragSource(){return this.manager?.dragOperation.source?.id===this.id}
method constructor (line 5) | constructor(e,t){var n=e,{accept:r,collisionDetector:i,collisionPriority...
method accepts (line 5) | accepts(e){let{accept:t}=this;return t?typeof t==`function`?t(e):e.type?...
method isDropTarget (line 5) | get isDropTarget(){return this.manager?.dragOperation.target?.id===this.id}
method constructor (line 5) | constructor(e,t){super(e,t),this.manager=e,this.options=t}
method constructor (line 5) | constructor(e,t){super(),this.constraints=e,this.onActivate=t,this.activ...
method onEvent (line 5) | onEvent(e){if(!this.activated)if(this.constraints?.length)for(let t of t...
method activate (line 5) | activate(e){this.activated||(this.activated=!0,this.onActivate(e))}
method abort (line 5) | abort(e){this.activated=!1,super.abort(e)}
method constructor (line 5) | constructor(e){this.options=e,Z(this,Ru)}
method controller (line 5) | set controller(e){vl(this,Ru,e),e.signal.addEventListener(`abort`,()=>th...
method activate (line 5) | activate(e){var t;(t=_l(this,Ru))==null||t.activate(e)}
method constructor (line 5) | constructor(e,t){super(e,t),this.manager=e,this.options=t}
method apply (line 5) | apply(e){return e.transform}
method constructor (line 5) | constructor(e){this.draggables=new lu,this.droppables=new lu,this.plugin...
method register (line 5) | register(e,t){if(e instanceof xu)return this.draggables.register(e.id,e)...
method unregister (line 5) | unregister(e){if(e instanceof cu)return e instanceof xu?this.draggables....
method destroy (line 5) | destroy(){this.draggables.destroy(),this.droppables.destroy(),this.plugi...
method constructor (line 5) | constructor(e){Y(ed,5,this),Z(this,Zu),Z(this,Qu),Z(this,$u,new cc(void ...
method shape (line 5) | get shape(){let{current:e,initial:t,previous:n}=_l(this,$u);return!e||!t...
method shape (line 5) | set shape(e){e?_l(this,$u).current=e:_l(this,$u).reset()}
method source (line 5) | get source(){let e=this.sourceIdentifier;if(e==null)return null;let t=_l...
method target (line 5) | get target(){let e=this.targetIdentifier;return e==null?null:_l(this,Zu)...
method transform (line 5) | get transform(){let{x:e,y:t}=this.position.delta,n={x:e,y:t};for(let e o...
method snapshot (line 5) | snapshot(){return q(()=>({source:this.source,target:this.target,activato...
method reset (line 5) | reset(){Ko(()=>{this.status.set(`idle`),this.sourceIdentifier=null,this....
method rendering (line 5) | get rendering(){return Promise.resolve()}
method constructor (line 5) | constructor(e){this.destroy=()=>{this.dragOperation.status.idle||this.ac...
method plugins (line 5) | get plugins(){return this.registry.plugins.values}
method plugins (line 5) | set plugins(e){this.registry.plugins.values=e}
method modifiers (line 5) | get modifiers(){return this.registry.modifiers.values}
method modifiers (line 5) | set modifiers(e){this.registry.modifiers.values=e}
method sensors (line 5) | get sensors(){return this.registry.sensors.values}
method sensors (line 5) | set sensors(e){this.registry.sensors.values=e}
function hd (line 5) | function hd(e){return e?e instanceof KeyframeEffect?!0:`getKeyframes`in ...
function gd (line 5) | function gd(e,t){let n=e.getAnimations();if(n.length>0)for(let e of n){i...
function _d (line 5) | function _d(e){let{width:t,height:n,top:r,left:i,bottom:a,right:o}=e.get...
function vd (line 5) | function vd(e){let t=Object.prototype.toString.call(e);return t===`[obje...
function yd (line 5) | function yd(e){return`nodeType`in e}
function bd (line 5) | function bd(e){return e?vd(e)?e:yd(e)?`defaultView`in e?e.defaultView??w...
function xd (line 5) | function xd(e){let{Document:t}=bd(e);return e instanceof t||`nodeType`in...
function Sd (line 5) | function Sd(e){return!e||vd(e)?!1:e instanceof bd(e).HTMLElement||`names...
function Cd (line 5) | function Cd(e){return e instanceof bd(e).SVGElement||`namespaceURI`in e&...
function wd (line 5) | function wd(e){return e?vd(e)?e.document:yd(e)?xd(e)?e:Sd(e)||Cd(e)?e.ow...
function Td (line 5) | function Td(e){let{documentElement:t}=wd(e),n=t.clientWidth,r=t.clientHe...
function Ed (line 5) | function Ed(e,t){if(Dd(e)&&e.open===!1)return!1;let{overflow:n,overflowX...
function Dd (line 5) | function Dd(e){return e.tagName===`DETAILS`}
function Od (line 5) | function Od(e,t=e.getBoundingClientRect(),n=0){let r=t,{ownerDocument:i}...
function kd (line 5) | function kd(e){return{x:e.clientX,y:e.clientY}}
function jd (line 5) | function jd(e=document,t=new Set){if(t.has(e))return[];t.add(e);let n=[e...
function Md (line 5) | function Md(){return/^((?!chrome|android).)*safari/i.test(navigator.user...
function Nd (line 5) | function Nd(e){let t=`input, textarea, select, canvas, [contenteditable]...
function Pd (line 5) | function Pd(e){return`value`in e}
function Fd (line 5) | function Fd(e){return e.tagName===`CANVAS`}
function Id (line 5) | function Id(e,{x:t,y:n}){let r=e.elementFromPoint(t,n);if(Ld(r)){let{con...
function Ld (line 5) | function Ld(e){return e?.tagName===`IFRAME`}
function zd (line 5) | function zd(e){return!!e.closest(`
method constructor (line 12) | constructor(){this.entries=new Set,this.clear=()=>{for(let e of this.ent...
method bind (line 12) | bind(e,t){let n=Array.isArray(e)?e:[e],r=Array.isArray(t)?t:[t],i=[];for...
function Vd (line 12) | function Vd(e){let t=e?.ownerDocument.defaultView;if(t&&t.self!==t.paren...
function Hd (line 12) | function Hd(e){let t=new Set,n=Vd(e);for(;n;)t.add(n),n=Vd(n);return t}
function Ud (line 12) | function Ud(e,t){let n=setTimeout(e,t);return()=>clearTimeout(n)}
function Wd (line 12) | function Wd(e,t){let n=()=>performance.now(),r,i;return function(...a){l...
function Gd (line 12) | function Gd(e,t){return e===t?!0:!e||!t?!1:e.top==t.top&&e.left==t.left&...
function Kd (line 12) | function Kd(e,t=e.getBoundingClientRect()){let{width:n,height:r}=Od(e,t)...
method observe (line 12) | observe(){}
method unobserve (line 12) | unobserve(){}
method disconnect (line 12) | disconnect(){}
method constructor (line 12) | constructor(e){super(t=>{if(!Q(this,Jd)){pd(this,Jd,!0);return}e(t,this)...
method constructor (line 12) | constructor(e,t,n={debug:!1,skipInitial:!1}){this.element=e,this.callbac...
function pf (line 12) | function pf(e,t){let n=df.get(e);return n||={disconnect:new uf(e,t=>{let...
function mf (line 12) | function mf(e,t){let n=new Set;for(let r of e){let e=pf(r,t);n.add(e)}re...
function hf (line 12) | function hf(e,t){let n=e.ownerDocument;if(!ff.has(n)){let e=new AbortCon...
method constructor (line 12) | constructor(e,t,n){this.callback=t,fd(this,gf),fd(this,_f,!1),fd(this,vf...
function xf (line 12) | function xf(e){return`showPopover`in e&&`hidePopover`in e&&typeof e.show...
function Sf (line 12) | function Sf(e){try{xf(e)&&e.isConnected&&e.hasAttribute(`popover`)&&!e.m...
function Cf (line 12) | function Cf(e){return!Ad||!e?!1:e===wd(e).scrollingElement}
function wf (line 12) | function wf(e){let t=bd(e),n=Cf(e)?Td(e):_d(e),r=Cf(e)?{height:t.innerHe...
function Tf (line 12) | function Tf(e,t){let{isTop:n,isBottom:r,isLeft:i,isRight:a,position:o}=w...
method constructor (line 12) | constructor(e){this.scheduler=e,this.pending=!1,this.tasks=new Set,this....
method schedule (line 12) | schedule(e){return this.tasks.add(e),this.pending||(this.pending=!0,this...
function jf (line 12) | function jf(e,t=!1){if(!t)return Mf(e);let n=kf.get(e);return n||(n=Mf(e...
function Mf (line 12) | function Mf(e){return bd(e).getComputedStyle(e)}
function Nf (line 12) | function Nf(e,t=jf(e,!0)){return t.position===`fixed`||t.position===`sti...
function Pf (line 12) | function Pf(e,t=jf(e,!0)){let n=/(auto|scroll|overlay)/;return[`overflow...
function If (line 12) | function If(e,t=Ff){let{limit:n,excludeElement:r}=t,i=new Set;function a...
function Lf (line 12) | function Lf(e){let[t]=If(e,{limit:1});return t??null}
function Rf (line 12) | function Rf(e,t=window.frameElement){let n={x:0,y:0,scaleX:1,scaleY:1};i...
function zf (line 12) | function zf(e,t=_d(e)){let n=Math.round(t.width),r=Math.round(t.height);...
function Bf (line 12) | function Bf(e){if(e===`none`)return null;let t=e.split(` `),n=parseFloat...
function Vf (line 12) | function Vf(e){if(e===`none`)return null;let[t,n,r=`0`]=e.split(` `),i={...
function Hf (line 12) | function Hf(e){let{scale:t,transform:n,translate:r}=e,i=Bf(t),a=Vf(r),o=...
function Uf (line 12) | function Uf(e){if(e.startsWith(`matrix3d(`)){let t=e.slice(9,-1).split(/...
function qf (line 12) | function qf(e,t,n,r=25,i=Gf,a=Kf){let{x:o,y:s}=t,{rect:c,isTop:l,isBotto...
function Jf (line 12) | function Jf(e){return`scrollIntoViewIfNeeded`in e&&typeof e.scrollIntoVi...
function Yf (line 12) | function Yf(e,t=!1){if(Jf(e)){e.scrollIntoViewIfNeeded(t);return}if(!Sd(...
function Xf (line 12) | function Xf(e,t,n){let{scaleX:r,scaleY:i,x:a,y:o}=t,s=e.left+a+(1-r)*par...
function Zf (line 12) | function Zf(e,t,n){let{scaleX:r,scaleY:i,x:a,y:o}=t,s=e.left-a-(1-r)*par...
function Qf (line 12) | function Qf({element:e,keyframes:t,options:n}){return e.animate(t,n).fin...
function $f (line 12) | function $f(e,t=jf(e).translate,n=!0){if(n){let t=gd(e,e=>`translate`in ...
function rp (line 12) | function rp(e){let t=e.ownerDocument,n=tp.get(t);if(n)return n;n=t.getAn...
function ip (line 12) | function ip(e,t){let n=rp(e).filter(e=>{if(hd(e.effect)){let{target:n}=e...
method constructor (line 12) | constructor(e,t={}){let{frameTransform:n=Rf(e),ignoreTransforms:r,getBou...
function op (line 12) | function op(e,t){let n=e.getAnimations(),r=null;if(!n.length)return null...
function sp (line 12) | function sp(e){return`style`in e&&typeof e.style==`object`&&e.style!==nu...
method constructor (line 12) | constructor(e){this.element=e,this.initial=new Map}
method set (line 12) | set(e,t=``){let{element:n}=this;if(sp(n))for(let[r,i]of Object.entries(e...
method remove (line 12) | remove(e,t=``){let{element:n}=this;if(sp(n))for(let r of e){let e=`${t}$...
method reset (line 12) | reset(){let{element:e}=this;if(sp(e)){for(let[t,n]of this.initial)e.styl...
function lp (line 12) | function lp(e){return e?e instanceof bd(e).Element||yd(e)&&e.nodeType===...
function up (line 12) | function up(e){if(!e)return!1;let{KeyboardEvent:t}=bd(e.target);return e...
function dp (line 12) | function dp(e){if(!e)return!1;let{PointerEvent:t}=bd(e.target);return e ...
function fp (line 12) | function fp(e){if(!lp(e))return!1;let{tagName:t}=e;return t===`INPUT`||t...
function pp (line 12) | function pp(e){return e.hasAttribute(`contenteditable`)&&e.getAttribute(...
function hp (line 12) | function hp(e){let t=mp[e]==null?0:mp[e]+1;return mp[e]=t,`${e}-${t}`}
method [n] (line 12) | get[n](){return $(this,a)}
method [n] (line 12) | set[n](e){return Gp(this,a,e)}
method dragstart (line 12) | dragstart({operation:{source:e}}){if(e)return`Picked up draggable item $...
method dragover (line 12) | dragover({operation:{source:e,target:t}}){if(!(!e||e.id===t?.id))return ...
method dragend (line 12) | dragend({operation:{source:e,target:t},canceled:n}){if(e)return n?`Dragg...
function Qp (line 12) | function Qp(e){let t=e.tagName.toLowerCase();return[`input`,`select`,`te...
function $p (line 12) | function $p(e,t){let n=document.createElement(`div`);return n.id=e,n.sty...
function em (line 12) | function em(e){let t=document.createElement(`div`);return t.id=e,t.setAt...
method constructor (line 12) | constructor(e,t){super(e);let{id:n,idPrefix:{description:r=Jp,announceme...
function rm (line 12) | function rm(e,t){let n,r=()=>{clearTimeout(n),n=setTimeout(e,t)};return ...
method constructor (line 12) | constructor(e,t){super(e,t),this.manager=e;let n=Ls(()=>wd(this.manager....
function pm (line 70) | function pm(e,t=`hidden`){return q(()=>{let{element:n,manager:r}=e;if(!n...
function mm (line 70) | function mm(e,t){let n=new Map;for(let r of t)if(r.element&&(e===r.eleme...
function hm (line 70) | function hm(e,t,n){for(let[r,i]of e){if(!r.element)continue;let e=`[${i}...
function gm (line 70) | function gm(e,t=`hidden`){e.setAttribute(`inert`,`true`),e.setAttribute(...
function _m (line 70) | function _m(e,t){return e===t?!0:Vd(e)===Vd(t)}
function vm (line 70) | function vm(e){let{target:t}=e;`newState`in e&&e.newState===`closed`&&lp...
function ym (line 70) | function ym(e){return e.tagName===`TR`}
method constructor (line 70) | constructor(e,t){super(e,t),Wp(this,Tm),Wp(this,wm,Bp(Cm,8,this)),Bp(Cm,...
method destroy (line 70) | destroy(){super.destroy();for(let[e,t]of bm.entries())t.instances.has(th...
method constructor (line 70) | constructor(){Wp(this,Lm,Bp(Im,8,this,Am)),Bp(Im,11,this),Wp(this,Rm,Bp(...
method isLocked (line 70) | isLocked(e){return e===Wf.Idle?!1:e==null?this[Wf.Forward]===Am&&this[Wf...
method unlock (line 70) | unlock(e){e!==Wf.Idle&&(this[e]=jm)}
method constructor (line 70) | constructor(){this.x=new zm,this.y=new zm}
method isLocked (line 70) | isLocked(){return this.x.isLocked()&&this.y.isLocked()}
method constructor (line 70) | constructor(e){super(e);let t=$o(new Vm),n=null;this.signal=t,ls(()=>{le...
method current (line 70) | get current(){return this.signal.peek()}
function Um (line 70) | function Um(e,t){return Math.sign(e-t)}
method constructor (line 70) | constructor(e){super(e),Wp(this,qm,Bp(Km,8,this,!1)),Bp(Km,11,this),Wp(t...
function Zm (line 70) | function Zm(e){return e>0?Wf.Forward:e<0?Wf.Reverse:Wf.Idle}
method constructor (line 70) | constructor(e){this.scheduler=e,this.pending=!1,this.tasks=new Set,this....
method schedule (line 70) | schedule(e){return this.tasks.add(e),this.pending||(this.pending=!0,this...
method constructor (line 70) | constructor(e,t){super(e);let n=e.registry.plugins.get(Xm);if(!n)throw E...
method constructor (line 70) | constructor(e){super(e),Wp(this,nh),this.handleScroll=()=>{$(this,nh)??G...
method constructor (line 70) | constructor(e,t){super(e,t),this.manager=e,this.destroy=ls(()=>{let{drag...
function ah (line 70) | function ah(){var e;(e=document.getSelection())==null||e.removeAllRanges()}
method preventActivation (line 70) | preventActivation(e,t){let n=t.handle??t.element;return e.target!==n}
method constructor (line 70) | constructor(e,t){super(e),this.manager=e,this.options=t,Wp(this,sh,[]),t...
method bind (line 70) | bind(e,t=this.options){return ls(()=>{let n=e.handle??e.element,r=n=>{up...
method handleStart (line 70) | handleStart(e,t,n){let{element:r}=t;if(!r)throw Error(`Source draggable ...
method handleKeyDown (line 70) | handleKeyDown(e,t,n){let{keyboardCodes:r=oh.keyboardCodes}=n??{};if(uh(e...
method handleEnd (line 70) | handleEnd(e,t){this.manager.actions.stop({event:e,canceled:t}),this.clea...
method handleMove (line 70) | handleMove(e,t){let{shape:n}=this.manager.dragOperation,r=t.shiftKey?5:1...
method sideEffects (line 70) | sideEffects(){let e=this.manager.registry.plugins.get(eh);e?.disabled===...
method cleanup (line 70) | cleanup(){$(this,sh).forEach(e=>e()),Gp(this,sh,[])}
method destroy (line 70) | destroy(){this.cleanup(),this.listeners.clear()}
function uh (line 70) | function uh(e,t){return t.includes(e.code)}
method constructor (line 70) | constructor(){super(...arguments),Wp(this,dh)}
method onEvent (line 70) | onEvent(e){switch(e.type){case`pointerdown`:Gp(this,dh,kd(e));break;case...
method abort (line 70) | abort(){Gp(this,dh,void 0)}
method constructor (line 70) | constructor(){super(...arguments),Wp(this,ph),Wp(this,mh)}
method onEvent (line 70) | onEvent(e){switch(e.type){case`pointerdown`:Gp(this,mh,kd(e)),Gp(this,ph...
method abort (line 70) | abort(){$(this,ph)&&(clearTimeout($(this,ph)),Gp(this,mh,void 0),Gp(this...
method activationConstraints (line 70) | activationConstraints(e,t){let{pointerType:n,target:r}=e;if(!(n===`mouse...
method preventActivation (line 70) | preventActivation(e,t){let{target:n}=e;return n===t.element||n===t.handl...
method constructor (line 70) | constructor(e,t){super(e),this.manager=e,this.options=t,Wp(this,vh,new S...
method activationConstraints (line 70) | activationConstraints(e,t,n=this.options){let{activationConstraints:r=_h...
method bind (line 70) | bind(e,t=this.options){return ls(()=>{let n=new AbortController,{signal:...
method handlePointerDown (line 70) | handlePointerDown(e,t,n){if(this.disabled||!e.isPrimary||e.button!==0||!...
method handlePointerMove (line 70) | handlePointerMove(e,t){var n;if(this.controller?.activated===!1){(n=this...
method handlePointerUp (line 70) | handlePointerUp(e){let{status:t}=this.manager.dragOperation;if(!t.idle){...
method handleKeyDown (line 70) | handleKeyDown(e){e.key===`Escape`&&(e.preventDefault(),this.handleCancel...
method handleStart (line 70) | handleStart(e,t){let{manager:n,initialCoordinates:r}=this;if(!r||!n.drag...
method handleCancel (line 70) | handleCancel(e){let{dragOperation:t}=this.manager;t.status.initialized&&...
method cleanup (line 70) | cleanup(){this.latest={event:void 0,coordinates:void 0},$(this,vh).forEa...
method destroy (line 70) | destroy(){this.cleanup(),this.listeners.clear()}
function xh (line 70) | function xh(e){return`sensor`in e}
function Sh (line 70) | function Sh(e){e.preventDefault()}
function Ch (line 70) | function Ch(){}
function Th (line 70) | function Th(e){!e||wh.has(e)||(e.addEventListener(`touchmove`,Ch,{captur...
method constructor (line 70) | constructor(e={}){let{plugins:t=Eh.plugins,sensors:n=Eh.sensors,modifier...
method constructor (line 70) | constructor(e,t){var n=e,{element:r,effects:i=()=>[],handle:a,feedback:o...
method constructor (line 70) | constructor(e,t){var n=e,{element:r,effects:i=()=>[]}=n,a=Pp(n,[`element...
method element (line 70) | set element(e){Gp(this,Gh,e,Wh)}
method element (line 70) | get element(){return this.proxy??$(this,Gh,Uh)}
method [n] (line 70) | get[n](){return gg(this,a)}
method [n] (line 70) | set[n](e){return vg(this,a,e)}
function yg (line 70) | function yg(e){return e instanceof $g||e instanceof Qg}
method constructor (line 70) | constructor(e){super(e);let t=ls(()=>{let{dragOperation:t}=e;if(up(t.act...
function Sg (line 70) | function Sg(e){let{x:t,y:n}=e;if(t>0)return`right`;if(t<0)return`left`;i...
function Mg (line 70) | function Mg(e,t,n){if(t===n)return e;let r=e.slice();return r.splice(n,0...
function Ng (line 70) | function Ng(e,t,n){let{source:r,target:i,canceled:a}=t.operation;if(!r||...
function Pg (line 70) | function Pg(e,t){return Ng(e,t,Mg)}
method constructor (line 70) | constructor(e){super(e);let t=()=>{let t=new Map;for(let n of e.registry...
function Lg (line 70) | function Lg(e,t,n,r){let i=r<t?`afterend`:`beforebegin`;n.insertAdjacent...
function Rg (line 70) | function Rg(e,t){return e.index-t.index}
function zg (line 70) | function zg(e){return Array.from(e).sort(Rg)}
method constructor (line 70) | constructor(e,t){_g(this,Kg,pg(Gg,8,this)),pg(Gg,11,this),_g(this,qg),_g...
method initialIndex (line 70) | get initialIndex(){return Hg.get(this.manager,this.id)?.initialIndex??th...
method initialGroup (line 70) | get initialGroup(){return Hg.get(this.manager,this.id)?.initialGroup??th...
method animate (line 70) | animate(){q(()=>{let{manager:e,transition:t}=this,{shape:n}=this.droppab...
method manager (line 70) | get manager(){return this.draggable.manager}
method manager (line 70) | set manager(e){Ko(()=>{this.draggable.manager=e,this.droppable.manager=e})}
method element (line 70) | set element(e){Ko(()=>{let t=gg(this,Xg),n=this.droppable.element,r=this...
method element (line 70) | get element(){let e=gg(this,Xg);if(e)return Rd.get(e)??e??this.droppable...
method target (line 70) | set target(e){this.droppable.element=e}
method target (line 70) | get target(){return this.droppable.element}
method source (line 70) | set source(e){this.draggable.element=e}
method source (line 70) | get source(){return this.draggable.element}
method disabled (line 70) | get disabled(){return this.draggable.disabled&&this.droppable.disabled}
method feedback (line 70) | set feedback(e){this.draggable.feedback=e}
method disabled (line 70) | set disabled(e){Ko(()=>{this.droppable.disabled=e,this.draggable.disable...
method data (line 70) | set data(e){Ko(()=>{this.droppable.data=e,this.draggable.data=e})}
method handle (line 70) | set handle(e){this.draggable.handle=e}
method id (line 70) | set id(e){Ko(()=>{this.droppable.id=e,this.draggable.id=e})}
method id (line 70) | get id(){return this.droppable.id}
method sensors (line 70) | set sensors(e){this.draggable.sensors=e}
method modifiers (line 70) | set modifiers(e){this.draggable.modifiers=e}
method collisionPriority (line 70) | set collisionPriority(e){this.droppable.collisionPriority=e}
method collisionDetector (line 70) | set collisionDetector(e){this.droppable.collisionDetector=e??vp}
method alignment (line 70) | set alignment(e){this.draggable.alignment=e}
method alignment (line 70) | get alignment(){return this.draggable.alignment}
method type (line 70) | set type(e){Ko(()=>{this.droppable.type=e,this.draggable.type=e})}
method type (line 70) | get type(){return this.draggable.type}
method accept (line 70) | set accept(e){this.droppable.accept=e}
method accept (line 70) | get accept(){return this.droppable.accept}
method isDropTarget (line 70) | get isDropTarget(){return this.droppable.isDropTarget}
method isDragSource (line 70) | get isDragSource(){return this.draggable.isDragSource}
method isDragging (line 70) | get isDragging(){return this.draggable.isDragging}
method isDropping (line 70) | get isDropping(){return this.draggable.isDropping}
method status (line 70) | get status(){return this.draggable.status}
method refreshShape (line 70) | refreshShape(){return this.droppable.refreshShape()}
method accepts (line 70) | accepts(e){return this.droppable.accepts(e)}
method constructor (line 70) | constructor(e,t,n){super(e,t),this.sortable=n}
method index (line 70) | get index(){return this.sortable.index}
method constructor (line 70) | constructor(e,t,n){super(e,t),this.sortable=n}
method apply (line 70) | apply({transform:e}){if(!this.options)return e;let{axis:t,value:n}=this....
method apply (line 70) | apply({transform:e}){let{size:t=20}=this.options??{},n=typeof t==`number...
method constructor (line 70) | constructor(...e){super(...e),this.sortables=[],this.onDragEnd=()=>this....
method connect (line 70) | connect(){this.manager=new Dh({modifiers:[d_]}),this.manager.monitor.add...
method disconnect (line 70) | disconnect(){this.teardownSortables(),this.manager?.monitor.removeEventL...
method containerTargetConnected (line 70) | containerTargetConnected(){this.refreshSortables()}
method containerTargetDisconnected (line 70) | containerTargetDisconnected(){this.refreshSortables()}
method refreshSortables (line 70) | refreshSortables(){this.teardownSortables(),this.manager&&this.container...
method teardownSortables (line 70) | teardownSortables(){this.sortables.forEach(e=>e.destroy()),this.sortable...
method updateOrder (line 70) | updateOrder(){if(!this.hasOrderInputTarget){this.dispatch(`update`);retu...
FILE: resources/dist/emoji.js
function e (line 1) | function e(e){return e.replace(/(?:[_-])([a-z0-9])/g,(e,t)=>t.toUpperCas...
function t (line 1) | function t(t){return e(t.replace(/--/g,`-`).replace(/__/g,`_`))}
function n (line 1) | function n(e){return e.charAt(0).toUpperCase()+e.slice(1)}
function r (line 1) | function r(e){return e.replace(/([A-Z])/g,(e,t)=>`-${t.toLowerCase()}`)}
function i (line 1) | function i(e){return e!=null}
function a (line 1) | function a(e,t){return Object.prototype.hasOwnProperty.call(e,t)}
function o (line 1) | function o(e,t){let n=c(e);return Array.from(n.reduce((e,n)=>(l(n,t).for...
function s (line 1) | function s(e,t){return c(e).reduce((e,n)=>(e.push(...u(n,t)),e),[])}
function c (line 1) | function c(e){let t=[];for(;e;)t.push(e),e=Object.getPrototypeOf(e);retu...
function l (line 1) | function l(e,t){let n=e[t];return Array.isArray(n)?n:[]}
function u (line 1) | function u(e,t){let n=e[t];return n?Object.keys(n).map(e=>[e,n[e]]):[]}
function e (line 1) | function e(e){function t(){return Reflect.construct(e,arguments,new.targ...
function t (line 1) | function t(){let t=e(function(){this.a.call(this)});return t.prototype.a...
function d (line 1) | function d(e){return e.reduce((e,[t,n])=>Object.assign(Object.assign({},...
function f (line 1) | function f(e){return o(e,`classes`).reduce((e,t)=>Object.assign(e,p(t)),...
function p (line 1) | function p(e){return{[`${e}Class`]:{get(){let{classes:t}=this;if(t.has(e...
function m (line 1) | function m(e){return o(e,`outlets`).reduce((e,t)=>Object.assign(e,ee(t))...
function h (line 1) | function h(e,t,n){return e.application.getControllerForElementAndIdentif...
function g (line 1) | function g(e,t,n){let r=h(e,t,n);if(r||(e.application.router.proposeToCo...
function ee (line 1) | function ee(e){let r=t(e);return{[`${r}Outlet`]:{get(){let t=this.outlet...
function te (line 1) | function te(e){return o(e,`targets`).reduce((e,t)=>Object.assign(e,ne(t)...
function ne (line 1) | function ne(e){return{[`${e}Target`]:{get(){let t=this.targets.find(e);i...
function _ (line 1) | function _(e){let t=s(e,`values`);return t.reduce((e,t)=>Object.assign(e...
function re (line 1) | function re(e,t){let r=ie(e,t),{key:i,name:a,reader:o,writer:s}=r;return...
function ie (line 1) | function ie([e,t],n){return x({controller:n,token:e,typeDefinition:t})}
function v (line 1) | function v(e){switch(e){case Array:return`array`;case Boolean:return`boo...
function y (line 1) | function y(e){switch(typeof e){case`boolean`:return`boolean`;case`number...
function ae (line 1) | function ae(e){let{controller:t,token:n,typeObject:r}=e,a=i(r.type),o=i(...
function oe (line 1) | function oe(e){let{controller:t,token:n,typeDefinition:r}=e,i=ae({contro...
function b (line 1) | function b(e){let t=v(e);if(t)return S[t];let n=a(e,`default`),r=a(e,`ty...
function x (line 1) | function x(t){let{token:n,typeDefinition:i}=t,a=`${r(n)}-value`,o=oe(t);...
method array (line 1) | get array(){return[]}
method object (line 1) | get object(){return{}}
method array (line 1) | array(e){let t=JSON.parse(e);if(!Array.isArray(t))throw TypeError(`expec...
method boolean (line 1) | boolean(e){return!(e==`0`||String(e).toLowerCase()==`false`)}
method number (line 1) | number(e){return Number(e.replace(/_/g,``))}
method object (line 1) | object(e){let t=JSON.parse(e);if(typeof t!=`object`||!t||Array.isArray(t...
method string (line 1) | string(e){return e}
function w (line 1) | function w(e){return JSON.stringify(e)}
function ce (line 1) | function ce(e){return`${e}`}
method constructor (line 1) | constructor(e){this.context=e}
method shouldLoad (line 1) | static get shouldLoad(){return!0}
method afterLoad (line 1) | static afterLoad(e,t){}
method application (line 1) | get application(){return this.context.application}
method scope (line 1) | get scope(){return this.context.scope}
method element (line 1) | get element(){return this.scope.element}
method identifier (line 1) | get identifier(){return this.scope.identifier}
method targets (line 1) | get targets(){return this.scope.targets}
method outlets (line 1) | get outlets(){return this.scope.outlets}
method classes (line 1) | get classes(){return this.scope.classes}
method data (line 1) | get data(){return this.scope.data}
method initialize (line 1) | initialize(){}
method connect (line 1) | connect(){}
method disconnect (line 1) | disconnect(){}
method dispatch (line 1) | dispatch(e,{target:t=this.element,detail:n={},prefix:r=this.identifier,b...
function E (line 1) | function E(e){if(typeof e!=`string`||!e)throw Error(`expected a non-empt...
function D (line 1) | function D(e){if(typeof e!=`number`)throw Error(`expected a number, got:...
function de (line 1) | function de(e,t){let n=new Set,r=[];for(let i of e){let e=t(i);n.has(e)|...
function fe (line 1) | function fe(e){return de(e,e=>e.unicode)}
function pe (line 1) | function pe(e){function t(t,n,r){let i=n?e.createObjectStore(t,{keyPath:...
function me (line 1) | function me(e,t,n){n.onerror=()=>t(n.error),n.onblocked=()=>t(Error(`IDB...
function he (line 1) | async function he(e){let t=await new Promise((t,n)=>{let r=indexedDB.ope...
function ge (line 1) | function ge(e){return R[e]||(R[e]=he(e)),R[e]}
function B (line 1) | function B(e,t,n,r){return new Promise((i,a)=>{let o=e.transaction(t,n,{...
function V (line 1) | function V(e){let t=L[e],n=t&&t.result;if(n){n.close();let t=z[e];if(t)f...
function _e (line 1) | function _e(e){return new Promise((t,n)=>{V(e),me(t,n,indexedDB.deleteDa...
function ve (line 1) | function ve(e,t){let n=z[e];n||=z[e]=[],n.push(t)}
function H (line 1) | function H(e){return e.split(/[\s_]+/).map(e=>!e.match(/\w/)||ye.has(e)?...
function be (line 1) | function be(e){return e.filter(Boolean).map(e=>e.toLowerCase()).filter(e...
function xe (line 1) | function xe(e){return e.map(({annotation:e,emoticon:t,group:n,order:r,sh...
function Se (line 1) | function Se(e,t,n,r){e[t](n).onsuccess=e=>r&&r(e.target.result)}
function U (line 1) | function U(e,t,n){Se(e,`get`,t,n)}
function Ce (line 1) | function Ce(e,t,n){Se(e,`getAll`,t,n)}
function W (line 1) | function W(e){e.commit&&e.commit()}
function we (line 1) | function we(e,t){let n=e[0];for(let r=1;r<e.length;r++){let i=e[r];t(n)>...
function Te (line 1) | function Te(e,t){let n=we(e,e=>e.length),r=[];for(let i of n)e.some(e=>e...
function Ee (line 1) | async function Ee(e){return!await G(e,k,`url`)}
function De (line 1) | async function De(e,t,n){let[r,i]=await Promise.all([P,`url`].map(t=>G(e...
function Oe (line 1) | async function Oe(e,t){return B(e,O,F,(e,n,r)=>{let i,a=()=>{e.getAll(i&...
function ke (line 1) | async function ke(e,t,n,r){try{let i=xe(t);await B(e,[O,k],I,([e,t],a)=>...
function Ae (line 1) | async function Ae(e,t){return B(e,O,F,(e,n,r)=>{let i=IDBKeyRange.bound(...
function je (line 1) | async function je(e,t){let n=be(H(t));return n.length?B(e,O,F,(e,t,r)=>{...
function Me (line 1) | async function Me(e,t){let n=await je(e,t);return n.length?n.filter(e=>(...
function Ne (line 1) | async function Ne(e,t){return B(e,O,F,(e,n,r)=>U(e,t,n=>{if(n)return r(n...
function G (line 1) | function G(e,t,n){return B(e,t,F,(e,t,r)=>U(e,n,r))}
function Pe (line 1) | function Pe(e,t,n,r){return B(e,t,I,(e,t)=>{e.put(r,n),W(t)})}
function Fe (line 1) | function Fe(e,t){return B(e,A,I,(e,n)=>U(e,t,r=>{e.put((r||0)+1,t),W(n)}))}
function Ie (line 1) | function Ie(e,t,n){return n===0?[]:B(e,[A,O],F,([e,r],i,a)=>{let o=[];e....
function Le (line 1) | function Le(e,t){let n=new Map;for(let r of e){let e=t(r);for(let t of e...
function ze (line 1) | function ze(e){let t=e&&Array.isArray(e),n=t&&e.length&&(!e[0]||Re.some(...
function Be (line 1) | function Be(e){ze(e);let t=(e,t)=>e.name.toLowerCase()<t.name.toLowerCas...
function K (line 1) | function K(e){if(!e)return e;if(Ve&&(e=structuredClone(e)),delete e.toke...
function He (line 1) | function He(e){e||console.warn(`emoji-picker-element is more efficient i...
function We (line 1) | function We(e){if(!e||!Array.isArray(e)||!e[0]||typeof e[0]!=`object`||U...
function Ge (line 1) | function Ge(e,t){if(Math.floor(e.status/100)!==2)throw Error(`Failed to ...
function Ke (line 1) | async function Ke(e){let t=await fetch(e,{method:`HEAD`});Ge(t,e);let n=...
function q (line 1) | async function q(e){let t=await fetch(e);Ge(t,e);let n=t.headers.get(`et...
function qe (line 1) | function qe(e){for(var t=``,n=new Uint8Array(e),r=n.byteLength,i=-1;++i<...
function Je (line 1) | function Je(e){for(var t=e.length,n=new ArrayBuffer(t),r=new Uint8Array(...
function Ye (line 1) | async function Ye(e){let t=Je(JSON.stringify(e)),n=qe(await crypto.subtl...
function Xe (line 1) | async function Xe(e,t){let n,r=await Ke(t);if(!r){let e=await q(t);r=e[0...
function Ze (line 1) | async function Ze(e,t){let[n,r]=await q(t);n||=await Ye(r),await ke(e,r,...
function Qe (line 1) | async function Qe(e,t){try{await Xe(e,t)}catch(e){if(e.name!==`InvalidSt...
method constructor (line 1) | constructor({dataSource:e=`https://cdn.jsdelivr.net/npm/emoji-picker-ele...
method _init (line 1) | async _init(){let e=this._db=await ge(this._dbName);ve(this._dbName,this...
method ready (line 1) | async ready(){let e=async()=>(this._ready||=this._init(),this._ready);aw...
method getEmojiByGroup (line 1) | async getEmojiByGroup(e){return D(e),await this.ready(),fe(await Ae(this...
method getEmojiBySearchQuery (line 1) | async getEmojiBySearchQuery(e){E(e),await this.ready();let t=this._custo...
method getEmojiByShortcode (line 1) | async getEmojiByShortcode(e){return E(e),await this.ready(),this._custom...
method getEmojiByUnicodeOrName (line 1) | async getEmojiByUnicodeOrName(e){return E(e),await this.ready(),this._cu...
method getPreferredSkinTone (line 1) | async getPreferredSkinTone(){return await this.ready(),await G(this._db,...
method setPreferredSkinTone (line 1) | async setPreferredSkinTone(e){return D(e),await this.ready(),Pe(this._db...
method incrementFavoriteEmojiCount (line 1) | async incrementFavoriteEmojiCount(e){return E(e),await this.ready(),Fe(t...
method getTopFavoriteEmoji (line 1) | async getTopFavoriteEmoji(e){return D(e),await this.ready(),(await Ie(th...
method customEmoji (line 1) | set customEmoji(e){this._custom=Be(e)}
method customEmoji (line 1) | get customEmoji(){return this._custom.all}
method _shutdown (line 1) | async _shutdown(){await this.ready();try{await this._lazyUpdate}catch{}}
method _clear (line 1) | _clear(){this._db=this._ready=this._lazyUpdate=void 0}
method close (line 1) | async close(){await this._shutdown(),await V(this._dbName)}
method delete (line 1) | async delete(){await this._shutdown(),await _e(this._dbName)}
function nt (line 1) | function nt(e){return e.unicode.includes(``)}
function lt (line 1) | function lt(e){let t=st(e,`#000`),n=st(e,`#fff`);return t&&n&&ct(t,n)}
function ut (line 1) | function ut(){let e=Object.entries(rt);try{for(let[t,n]of e)if(lt(t))ret...
function mt (line 1) | function mt(e,t){if(t===0)return e;let n=e.indexOf(``);return n===-1?(e...
function Y (line 1) | function Y(e){e.preventDefault(),e.stopPropagation()}
function ht (line 1) | function ht(e,t,n){return t+=e?-1:1,t<0?t=n.length-1:t>=n.length&&(t=0),t}
function gt (line 1) | function gt(e,t){let n=new Set,r=[];for(let i of e){let e=t(i);n.has(e)|...
function _t (line 1) | function _t(e,t){let n=e=>{let n={};for(let r of e)typeof r.tone==`numbe...
function yt (line 1) | function yt(e,t,n){let r;vt?(r=new ResizeObserver(n),r.observe(e)):X(n),...
function bt (line 1) | function bt(e){{let t=document.createRange();return t.selectNode(e.first...
function St (line 1) | function St(e,t,n){let r=!0;for(let i of e){let e=n(i);if(!e)continue;le...
function Ct (line 1) | function Ct(e){return gt(e,e=>e)}
function wt (line 1) | function wt(e){e&&(e.scrollTop=0)}
function Z (line 1) | function Z(e,t,n){let r=e.get(t);return r||(r=n(),e.set(t,r)),r}
function Tt (line 1) | function Tt(e){return``+e}
function Et (line 1) | function Et(e){let t=document.createElement(`template`);return t.innerHT...
function jt (line 1) | function jt(e,t){At?e.replaceChildren(...t):(e.innerHTML=``,e.append(......
function Mt (line 1) | function Mt(e,t){let n=e.firstChild,r=0;for(;n;){if(t[r]!==n)return!0;n=...
function Nt (line 1) | function Nt(e,t){let{targetNode:n}=t,{targetParentNode:r}=t,i=!1;r?i=Mt(...
function Pt (line 1) | function Pt(e,t){for(let n of t){let{targetNode:t,currentExpression:r,bi...
function Ft (line 1) | function Ft(e){let t=``,n=!1,r=!1,i=-1,a=new Map,o=[],s=0;for(let c=0,l=...
function It (line 1) | function It(e,t,n){for(let r=0;r<e.length;r++){let i=e[r],a={binding:i,t...
function Lt (line 1) | function Lt(e,t){let n=[],r;if(t.size===1&&(r=t.get(0)))It(r,e,n);else{l...
function Rt (line 1) | function Rt(e){let{template:t,elementsToBindings:n}=Z(Dt,e,()=>Ft(e)),r=...
function zt (line 1) | function zt(e){let t=Z(Ot,e,()=>new Map),n=kt;function r(e,...r){return ...
function Bt (line 1) | function Bt(e,t,n,r,i,a,o,s,c){let{labelWithSkin:l,titleForEmoji:u,unico...
function Vt (line 1) | function Vt(e){let t=!1,n,r=new Map,i=new Set,a,o=()=>{if(t)return;let e...
function Ht (line 1) | function Ht(e,t,n){if(e.length!==t.length)return!1;for(let r=0;r<e.lengt...
function Wt (line 1) | function Wt(e,t,n){{let r=e.closest(`.tabpanel`),i=Ut.get(r);i||(i=new I...
function Kt (line 1) | function Kt(e,t){let n={},r=new AbortController,i=r.signal,{state:a,crea...
method constructor (line 4) | constructor(e){super(),this.attachShadow({mode:`open`});let t=document.c...
method connectedCallback (line 4) | connectedCallback(){$t(this),this._cmp||=Kt(this.shadowRoot,this._ctx)}
method disconnectedCallback (line 4) | disconnectedCallback(){$t(this),Q(()=>{if(!this.isConnected&&this._cmp){...
method observedAttributes (line 4) | static get observedAttributes(){return[`locale`,`data-source`,`skin-tone...
method attributeChangedCallback (line 4) | attributeChangedCallback(e,t,n){this._set(e.replace(/-([a-z])/g,(e,t)=>t...
method _set (line 4) | _set(e,t){this._ctx[e]=t,this._cmp&&this._cmp.$set({[e]:t}),[`locale`,`d...
method _dbCreate (line 4) | _dbCreate(){let{locale:e,dataSource:t,database:n}=this._ctx;(!n||n.local...
method _dbFlush (line 4) | _dbFlush(){Q(()=>this._dbCreate())}
method get (line 4) | get(){return e===`database`&&this._dbCreate(),this._ctx[e]}
method set (line 4) | set(t){if(e===`database`)throw Error(`database is read-only`);this._set(...
function $t (line 4) | function $t(e){e instanceof Zt||Object.setPrototypeOf(e,customElements.g...
method connect (line 4) | connect(){let e=this.element.querySelector(`emoji-picker`),t=e.shadowRoo...
FILE: resources/dist/global.js
method formatToParts (line 1) | formatToParts(e){let t=[];for(let n of e)t.push({type:`element`,value:n}...
method constructor (line 1) | constructor(e,t={}){f.set(this,void 0);let n=String(t.style||`short`);n!...
method resolvedOptions (line 1) | resolvedOptions(){return d(this,f,`f`)}
method formatToParts (line 1) | formatToParts(e){let t=[],n=d(this,f,`f`),r=n.style,i=n.locale;for(let[a...
method format (line 1) | format(e){return this.formatToParts(e).map(e=>e.value).join(``)}
method constructor (line 1) | constructor(e=0,t=0,n=0,r=0,i=0,a=0,o=0,s=0){this.years=e,this.months=t,...
method abs (line 1) | abs(){return new e(Math.abs(this.years),Math.abs(this.months),Math.abs(t...
method from (line 1) | static from(t){if(typeof t==`string`){let n=String(t).trim(),r=n.startsW...
method compare (line 1) | static compare(t,n){let r=Date.now(),i=Math.abs(ee(r,e.from(t)).getTime(...
method toLocaleString (line 1) | toLocaleString(e,t){return new _(e,t).format(this)}
function ee (line 1) | function ee(e,t){let n=new Date(e);return t.sign<0?(n.setUTCSeconds(n.ge...
function S (line 1) | function S(e,t=`second`,n=Date.now()){let r=e.getTime()-n;if(r===0)retur...
function C (line 1) | function C(e,{relativeTo:t=Date.now()}={}){if(t=new Date(t),e.blank)retu...
function w (line 1) | function w(e,t){let n=C(e,t);if(n.blank)return[0,`second`];for(let e of ...
method constructor (line 1) | constructor(e,t,n,r){super(`relative-time-updated`,{bubbles:!0,composed:...
function _e (line 1) | function _e(e){if(!e.date)return 1/0;if(e.format===`duration`||e.format=...
method constructor (line 1) | constructor(){this.elements=new Set,this.time=1/0,this.timer=-1}
method observe (line 1) | observe(e){if(this.elements.has(e))return;this.elements.add(e);let t=e.d...
method unobserve (line 1) | unobserve(e){this.elements.has(e)&&this.elements.delete(e)}
method update (line 1) | update(){if(clearTimeout(this.timer),!this.elements.size)return;let e=1/...
method constructor (line 1) | constructor(){super(...arguments),E.add(this),ne.set(this,!1),re.set(thi...
method define (line 1) | static define(e=`relative-time`,t=customElements){return t.define(e,this...
method timeZone (line 1) | get timeZone(){return this.closest(`[time-zone]`)?.getAttribute(`time-zo...
method observedAttributes (line 1) | static get observedAttributes(){return[`second`,`minute`,`hour`,`weekday...
method onRelativeTimeUpdated (line 1) | get onRelativeTimeUpdated(){return T(this,fe,`f`)}
method onRelativeTimeUpdated (line 1) | set onRelativeTimeUpdated(e){T(this,fe,`f`)&&this.removeEventListener(`r...
method second (line 1) | get second(){let e=this.getAttribute(`second`);if(e===`numeric`||e===`2-...
method second (line 1) | set second(e){this.setAttribute(`second`,e||``)}
method minute (line 1) | get minute(){let e=this.getAttribute(`minute`);if(e===`numeric`||e===`2-...
method minute (line 1) | set minute(e){this.setAttribute(`minute`,e||``)}
method hour (line 1) | get hour(){let e=this.getAttribute(`hour`);if(e===`numeric`||e===`2-digi...
method hour (line 1) | set hour(e){this.setAttribute(`hour`,e||``)}
method weekday (line 1) | get weekday(){let e=this.getAttribute(`weekday`);if(e===`long`||e===`sho...
method weekday (line 1) | set weekday(e){this.setAttribute(`weekday`,e||``)}
method day (line 1) | get day(){let e=this.getAttribute(`day`)??`numeric`;if(e===`numeric`||e=...
method day (line 1) | set day(e){this.setAttribute(`day`,e||``)}
method month (line 1) | get month(){let e=this.format,t=this.getAttribute(`month`);if(t!==``&&(t...
method month (line 1) | set month(e){this.setAttribute(`month`,e||``)}
method year (line 1) | get year(){let e=this.getAttribute(`year`);if(e===`numeric`||e===`2-digi...
method year (line 1) | set year(e){this.setAttribute(`year`,e||``)}
method timeZoneName (line 1) | get timeZoneName(){let e=this.getAttribute(`time-zone-name`);if(e===`lon...
method timeZoneName (line 1) | set timeZoneName(e){this.setAttribute(`time-zone-name`,e||``)}
method prefix (line 1) | get prefix(){return this.getAttribute(`prefix`)??(this.format===`datetim...
method prefix (line 1) | set prefix(e){this.setAttribute(`prefix`,e)}
method threshold (line 1) | get threshold(){let e=this.getAttribute(`threshold`);return e&&b(e)?e:`P...
method threshold (line 1) | set threshold(e){this.setAttribute(`threshold`,e)}
method tense (line 1) | get tense(){let e=this.getAttribute(`tense`);return e===`past`?`past`:e=...
method tense (line 1) | set tense(e){this.setAttribute(`tense`,e)}
method precision (line 1) | get precision(){let e=this.getAttribute(`precision`);return y.includes(e...
method precision (line 1) | set precision(e){this.setAttribute(`precision`,e)}
method format (line 1) | get format(){let e=this.getAttribute(`format`);return e===`datetime`?`da...
method format (line 1) | set format(e){this.setAttribute(`format`,e)}
method formatStyle (line 1) | get formatStyle(){let e=this.getAttribute(`format-style`);if(e===`long`)...
method formatStyle (line 1) | set formatStyle(e){this.setAttribute(`format-style`,e)}
method noTitle (line 1) | get noTitle(){return this.hasAttribute(`no-title`)}
method noTitle (line 1) | set noTitle(e){this.toggleAttribute(`no-title`,e)}
method datetime (line 1) | get datetime(){return this.getAttribute(`datetime`)||``}
method datetime (line 1) | set datetime(e){this.setAttribute(`datetime`,e)}
method date (line 1) | get date(){let e=Date.parse(this.datetime);return Number.isNaN(e)?null:n...
method date (line 1) | set date(e){this.datetime=e?.toISOString()||``}
method connectedCallback (line 1) | connectedCallback(){this.update()}
method disconnectedCallback (line 1) | disconnectedCallback(){ve.unobserve(this)}
method attributeChangedCallback (line 1) | attributeChangedCallback(e,t,n){t!==n&&(e===`title`&&te(this,ne,n!==null...
method update (line 1) | update(){let e=T(this,ie,`f`).textContent||this.textContent||``,t=this.g...
method constructor (line 1) | constructor(e,t,n){this.eventTarget=e,this.eventName=t,this.eventOptions...
method connect (line 1) | connect(){this.eventTarget.addEventListener(this.eventName,this,this.eve...
method disconnect (line 1) | disconnect(){this.eventTarget.removeEventListener(this.eventName,this,th...
method bindingConnected (line 1) | bindingConnected(e){this.unorderedBindings.add(e)}
method bindingDisconnected (line 1) | bindingDisconnected(e){this.unorderedBindings.delete(e)}
method handleEvent (line 1) | handleEvent(e){let t=Se(e);for(let e of this.bindings)if(t.immediateProp...
method hasBindings (line 1) | hasBindings(){return this.unorderedBindings.size>0}
method bindings (line 1) | get bindings(){return Array.from(this.unorderedBindings).sort((e,t)=>{le...
function Se (line 1) | function Se(e){if(`immediatePropagationStopped`in e)return e;{let{stopIm...
method constructor (line 1) | constructor(e){this.application=e,this.eventListenerMaps=new Map,this.st...
method start (line 1) | start(){this.started||(this.started=!0,this.eventListeners.forEach(e=>e....
method stop (line 1) | stop(){this.started&&(this.started=!1,this.eventListeners.forEach(e=>e.d...
method eventListeners (line 1) | get eventListeners(){return Array.from(this.eventListenerMaps.values())....
method bindingConnected (line 1) | bindingConnected(e){this.fetchEventListenerForBinding(e).bindingConnecte...
method bindingDisconnected (line 1) | bindingDisconnected(e,t=!1){this.fetchEventListenerForBinding(e).binding...
method handleError (line 1) | handleError(e,t,n={}){this.application.handleError(e,`Error ${t}`,n)}
method clearEventListenersForBinding (line 1) | clearEventListenersForBinding(e){let t=this.fetchEventListenerForBinding...
method removeMappedEventListenerFor (line 1) | removeMappedEventListenerFor(e){let{eventTarget:t,eventName:n,eventOptio...
method fetchEventListenerForBinding (line 1) | fetchEventListenerForBinding(e){let{eventTarget:t,eventName:n,eventOptio...
method fetchEventListener (line 1) | fetchEventListener(e,t,n){let r=this.fetchEventListenerMapForEventTarget...
method createEventListener (line 1) | createEventListener(e,t,n){let r=new xe(e,t,n);return this.started&&r.co...
method fetchEventListenerMapForEventTarget (line 1) | fetchEventListenerMapForEventTarget(e){let t=this.eventListenerMaps.get(...
method cacheKey (line 1) | cacheKey(e,t){let n=[e];return Object.keys(t).sort().forEach(e=>{n.push(...
method stop (line 1) | stop({event:e,value:t}){return t&&e.stopPropagation(),!0}
method prevent (line 1) | prevent({event:e,value:t}){return t&&e.preventDefault(),!0}
method self (line 1) | self({event:e,value:t,element:n}){return t?n===e.target:!0}
function Ee (line 1) | function Ee(e){let t=e.trim().match(Te)||[],n=t[2],r=t[3];return r&&![`k...
method constructor (line 29) | constructor(){this.globalLog=e=>{window.console&&window.console.log&&w...
method debug (line 29) | debug(...e){this.log(this.globalLog,e)}
method warn (line 29) | warn(...e){this.log(this.globalLogWarn,e)}
method error (line 29) | error(...e){this.log(this.globalLogError,e)}
method globalLogWarn (line 29) | globalLogWarn(e){window.console&&window.console.warn?window.console.wa...
method globalLogError (line 29) | globalLogError(e){window.console&&window.console.error?window.console....
method log (line 29) | log(e,...t){var n=ue.apply(this,arguments);xn.log?xn.log(n):xn.logToCo...
function j (line 1) | function j(e){if(e==`window`)return window;if(e==`document`)return docum...
function De (line 1) | function De(e){return e.split(`:`).reduce((e,t)=>Object.assign(e,{[t.rep...
function Oe (line 1) | function Oe(e){if(e==window)return`window`;if(e==document)return`document`}
method constructor (line 29) | constructor(e){this.src=e}
method send (line 29) | send(e){var t=this,n=`Error loading `+t.src;t.script=document.createEl...
method cleanup (line 29) | cleanup(){this.script&&(this.script.onload=this.script.onerror=null,th...
function ke (line 1) | function ke(e){return e.replace(/(?:[_-])([a-z0-9])/g,(e,t)=>t.toUpperCa...
method constructor (line 29) | constructor(e,t){this.url=e,this.data=t}
method send (line 29) | send(e){if(!this.request){var t=Ce(this.data),n=this.url+`/`+e.number+...
method cleanup (line 29) | cleanup(){this.request&&this.request.cleanup()}
function Ae (line 1) | function Ae(e){return ke(e.replace(/--/g,`-`).replace(/__/g,`_`))}
function je (line 1) | function je(e){return e.charAt(0).toUpperCase()+e.slice(1)}
function Me (line 1) | function Me(e){return e.replace(/([A-Z])/g,(e,t)=>`-${t.toLowerCase()}`)}
function Ne (line 1) | function Ne(e){return e.match(/[^\s]+/g)||[]}
function Pe (line 1) | function Pe(e){return e!=null}
function Fe (line 1) | function Fe(e,t){return Object.prototype.hasOwnProperty.call(e,t)}
method constructor (line 1) | constructor(e,t,n,r){this.element=e,this.index=t,this.eventTarget=n.even...
method forToken (line 1) | static forToken(e,t){return new this(e.element,e.index,Ee(e.content),t)}
method toString (line 1) | toString(){let e=this.keyFilter?`.${this.keyFilter}`:``,t=this.eventTarg...
method shouldIgnoreKeyboardEvent (line 1) | shouldIgnoreKeyboardEvent(e){if(!this.keyFilter)return!1;let t=this.keyF...
method shouldIgnoreMouseEvent (line 1) | shouldIgnoreMouseEvent(e){if(!this.keyFilter)return!1;let t=[this.keyFil...
method params (line 1) | get params(){let e={},t=RegExp(`^data-${this.identifier}-(.+)-param$`,`i...
method eventTargetName (line 1) | get eventTargetName(){return Oe(this.eventTarget)}
method keyMappings (line 1) | get keyMappings(){return this.schema.keyMappings}
method keyFilterDissatisfied (line 1) | keyFilterDissatisfied(e,t){let[n,r,i,a]=Ie.map(e=>t.includes(e));return ...
function Re (line 1) | function Re(e){let t=e.tagName.toLowerCase();if(t in M)return M[t](e)}
method constructor (line 29) | constructor(e,t,n,r,i){super(),this.initialize=I.transportConnectionIn...
method handlesActivityChecks (line 29) | handlesActivityChecks(){return!!this.hooks.handlesActivityChecks}
method supportsPing (line 29) | supportsPing(){return!!this.hooks.supportsPing}
method connect (line 29) | connect(){if(this.socket||this.state!==`initialized`)return!1;var e=th...
method close (line 29) | close(){return this.socket?(this.socket.close(),!0):!1}
method send (line 29) | send(e){return this.state===`open`?(O.defer(()=>{this.socket&&this.soc...
method ping (line 29) | ping(){this.state===`open`&&this.supportsPing()&&this.socket.ping()}
method onOpen (line 29) | onOpen(){this.hooks.beforeOpen&&this.hooks.beforeOpen(this.socket,this...
method onError (line 29) | onError(e){this.emit(`error`,{type:`WebSocketError`,error:e}),this.tim...
method onClose (line 29) | onClose(e){e?this.changeState(`closed`,{code:e.code,reason:e.reason,wa...
method onMessage (line 29) | onMessage(e){this.emit(`message`,e)}
method onActivity (line 29) | onActivity(){this.emit(`activity`)}
method bindListeners (line 29) | bindListeners(){this.socket.onopen=()=>{this.onOpen()},this.socket.one...
method unbindListeners (line 29) | unbindListeners(){this.socket&&(this.socket.onopen=void 0,this.socket....
method changeState (line 29) | changeState(e,t){this.state=e,this.timeline.info(this.buildTimelineMes...
method buildTimelineMessage (line 29) | buildTimelineMessage(e){return k({cid:this.id},e)}
function N (line 1) | function N(e){throw Error(e)}
method constructor (line 29) | constructor(e){this.hooks=e}
method isSupported (line 29) | isSupported(e){return this.hooks.isSupported(e)}
method createConnection (line 29) | createConnection(e,t,n,r){return new Re(this.hooks,e,t,n,r)}
function ze (line 1) | function ze(e){try{return JSON.parse(e)}catch{return e}}
method constructor (line 1) | constructor(e,t){this.context=e,this.action=t}
method index (line 1) | get index(){return this.action.index}
method eventTarget (line 1) | get eventTarget(){return this.action.eventTarget}
method eventOptions (line 1) | get eventOptions(){return this.action.eventOptions}
method identifier (line 1) | get identifier(){return this.context.identifier}
method handleEvent (line 1) | handleEvent(e){let t=this.prepareActionEvent(e);this.willBeInvokedByEven...
method eventName (line 1) | get eventName(){return this.action.eventName}
method method (line 1) | get method(){let e=this.controller[this.methodName];if(typeof e==`functi...
method applyEventModifiers (line 1) | applyEventModifiers(e){let{element:t}=this.action,{actionDescriptorFilte...
method prepareActionEvent (line 1) | prepareActionEvent(e){return Object.assign(e,{params:this.action.params})}
method invokeWithEvent (line 1) | invokeWithEvent(e){let{target:t,currentTarget:n}=e;try{this.method.call(...
method willBeInvokedByEvent (line 1) | willBeInvokedByEvent(e){let t=e.target;return e instanceof KeyboardEvent...
method controller (line 1) | get controller(){return this.context.controller}
method methodName (line 1) | get methodName(){return this.action.methodName}
method element (line 1) | get element(){return this.scope.element}
method scope (line 1) | get scope(){return this.context.scope}
method constructor (line 1) | constructor(e,t){this.mutationObserverInit={attributes:!0,childList:!0,s...
method start (line 1) | start(){this.started||(this.started=!0,this.mutationObserver.observe(thi...
method pause (line 1) | pause(e){this.started&&=(this.mutationObserver.disconnect(),!1),e(),this...
method stop (line 1) | stop(){this.started&&=(this.mutationObserver.takeRecords(),this.mutation...
method refresh (line 1) | refresh(){if(this.started){let e=new Set(this.matchElementsInTree());for...
method processMutations (line 1) | processMutations(e){if(this.started)for(let t of e)this.processMutation(t)}
method processMutation (line 1) | processMutation(e){e.type==`attributes`?this.processAttributeChange(e.ta...
method processAttributeChange (line 1) | processAttributeChange(e,t){this.elements.has(e)?this.delegate.elementAt...
method processRemovedNodes (line 1) | processRemovedNodes(e){for(let t of Array.from(e)){let e=this.elementFro...
method processAddedNodes (line 1) | processAddedNodes(e){for(let t of Array.from(e)){let e=this.elementFromN...
method matchElement (line 1) | matchElement(e){return this.delegate.matchElement(e)}
method matchElementsInTree (line 1) | matchElementsInTree(e=this.element){return this.delegate.matchElementsIn...
method processTree (line 1) | processTree(e,t){for(let n of this.matchElementsInTree(e))t.call(this,n)}
method elementFromNode (line 1) | elementFromNode(e){if(e.nodeType==Node.ELEMENT_NODE)return e}
method elementIsActive (line 1) | elementIsActive(e){return e.isConnected==this.element.isConnected?this.e...
method addElement (line 1) | addElement(e){this.elements.has(e)||this.elementIsActive(e)&&(this.eleme...
method removeElement (line 1) | removeElement(e){this.elements.has(e)&&(this.elements.delete(e),this.del...
method constructor (line 1) | constructor(e,t,n){this.attributeName=t,this.delegate=n,this.elementObse...
method element (line 1) | get element(){return this.elementObserver.element}
method selector (line 1) | get selector(){return`[${this.attributeName}]`}
method start (line 1) | start(){this.elementObserver.start()}
method pause (line 1) | pause(e){this.elementObserver.pause(e)}
method stop (line 1) | stop(){this.elementObserver.stop()}
method refresh (line 1) | refresh(){this.elementObserver.refresh()}
method started (line 1) | get started(){return this.elementObserver.started}
method matchElement (line 1) | matchElement(e){return e.hasAttribute(this.attributeName)}
method matchElementsInTree (line 1) | matchElementsInTree(e){let t=this.matchElement(e)?[e]:[],n=Array.from(e....
method elementMatched (line 1) | elementMatched(e){this.delegate.elementMatchedAttribute&&this.delegate.e...
method elementUnmatched (line 1) | elementUnmatched(e){this.delegate.elementUnmatchedAttribute&&this.delega...
method elementAttributeChanged (line 1) | elementAttributeChanged(e,t){this.delegate.elementAttributeValueChanged&...
function Ue (line 1) | function Ue(e,t,n){Ge(e,t).add(n)}
function We (line 1) | function We(e,t,n){Ge(e,t).delete(n),Ke(e,t)}
function Ge (line 1) | function Ge(e,t){let n=e.get(t);return n||(n=new Set,e.set(t,n)),n}
function Ke (line 1) | function Ke(e,t){let n=e.get(t);n!=null&&n.size==0&&e.delete(t)}
method constructor (line 1) | constructor(){this.valuesByKey=new Map}
method keys (line 1) | get keys(){return Array.from(this.valuesByKey.keys())}
method values (line 1) | get values(){return Array.from(this.valuesByKey.values()).reduce((e,t)=>...
method size (line 1) | get size(){return Array.from(this.valuesByKey.values()).reduce((e,t)=>e+...
method add (line 1) | add(e,t){Ue(this.valuesByKey,e,t)}
method delete (line 1) | delete(e,t){We(this.valuesByKey,e,t)}
method has (line 1) | has(e,t){let n=this.valuesByKey.get(e);return n!=null&&n.has(t)}
method hasKey (line 1) | hasKey(e){return this.valuesByKey.has(e)}
method hasValue (line 1) | hasValue(e){return Array.from(this.valuesByKey.values()).some(t=>t.has(e))}
method getValuesForKey (line 1) | getValuesForKey(e){let t=this.valuesByKey.get(e);return t?Array.from(t):[]}
method getKeysForValue (line 1) | getKeysForValue(e){return Array.from(this.valuesByKey).filter(([t,n])=>n...
method constructor (line 1) | constructor(e,t,n,r){this._selector=t,this.details=r,this.elementObserve...
method started (line 1) | get started(){return this.elementObserver.started}
method selector (line 1) | get selector(){return this._selector}
method selector (line 1) | set selector(e){this._selector=e,this.refresh()}
method start (line 1) | start(){this.elementObserver.start()}
method pause (line 1) | pause(e){this.elementObserver.pause(e)}
method stop (line 1) | stop(){this.elementObserver.stop()}
method refresh (line 1) | refresh(){this.elementObserver.refresh()}
method element (line 1) | get element(){return this.elementObserver.element}
method matchElement (line 1) | matchElement(e){let{selector:t}=this;if(t){let n=e.matches(t);return thi...
method matchElementsInTree (line 1) | matchElementsInTree(e){let{selector:t}=this;if(t){let n=this.matchElemen...
method elementMatched (line 1) | elementMatched(e){let{selector:t}=this;t&&this.selectorMatched(e,t)}
method elementUnmatched (line 1) | elementUnmatched(e){let t=this.matchesByElement.getKeysForValue(e);for(l...
method elementAttributeChanged (line 1) | elementAttributeChanged(e,t){let{selector:n}=this;if(n){let t=this.match...
method selectorMatched (line 1) | selectorMatched(e,t){this.delegate.selectorMatched(e,t,this.details),thi...
method selectorUnmatched (line 1) | selectorUnmatched(e,t){this.delegate.selectorUnmatched(e,t,this.details)...
method constructor (line 1) | constructor(e,t){this.element=e,this.delegate=t,this.started=!1,this.str...
method start (line 1) | start(){this.started||(this.started=!0,this.mutationObserver.observe(thi...
method stop (line 1) | stop(){this.started&&=(this.mutationObserver.takeRecords(),this.mutation...
method refresh (line 1) | refresh(){if(this.started)for(let e of this.knownAttributeNames)this.ref...
method processMutations (line 1) | processMutations(e){if(this.started)for(let t of e)this.processMutation(t)}
method processMutation (line 1) | processMutation(e){let t=e.attributeName;t&&this.refreshAttribute(t,e.ol...
method refreshAttribute (line 1) | refreshAttribute(e,t){let n=this.delegate.getStringMapKeyForAttribute(e)...
method stringMapKeyAdded (line 1) | stringMapKeyAdded(e,t){this.delegate.stringMapKeyAdded&&this.delegate.st...
method stringMapValueChanged (line 1) | stringMapValueChanged(e,t,n){this.delegate.stringMapValueChanged&&this.d...
method stringMapKeyRemoved (line 1) | stringMapKeyRemoved(e,t,n){this.delegate.stringMapKeyRemoved&&this.deleg...
method knownAttributeNames (line 1) | get knownAttributeNames(){return Array.from(new Set(this.currentAttribut...
method currentAttributeNames (line 1) | get currentAttributeNames(){return Array.from(this.element.attributes).m...
method recordedAttributeNames (line 1) | get recordedAttributeNames(){return Array.from(this.stringMap.keys())}
method constructor (line 1) | constructor(e,t,n){this.attributeObserver=new He(e,t,this),this.delegate...
method started (line 1) | get started(){return this.attributeObserver.started}
method start (line 1) | start(){this.attributeObserver.start()}
method pause (line 1) | pause(e){this.attributeObserver.pause(e)}
method stop (line 1) | stop(){this.attributeObserver.stop()}
method refresh (line 1) | refresh(){this.attributeObserver.refresh()}
method element (line 1) | get element(){return this.attributeObserver.element}
method attributeName (line 1) | get attributeName(){return this.attributeObserver.attributeName}
method elementMatchedAttribute (line 1) | elementMatchedAttribute(e){this.tokensMatched(this.readTokensForElement(...
method elementAttributeValueChanged (line 1) | elementAttributeValueChanged(e){let[t,n]=this.refreshTokensForElement(e)...
method elementUnmatchedAttribute (line 1) | elementUnmatchedAttribute(e){this.tokensUnmatched(this.tokensByElement.g...
method tokensMatched (line 1) | tokensMatched(e){e.forEach(e=>this.tokenMatched(e))}
method tokensUnmatched (line 1) | tokensUnmatched(e){e.forEach(e=>this.tokenUnmatched(e))}
method tokenMatched (line 1) | tokenMatched(e){this.delegate.tokenMatched(e),this.tokensByElement.add(e...
method tokenUnmatched (line 1) | tokenUnmatched(e){this.delegate.tokenUnmatched(e),this.tokensByElement.d...
method refreshTokensForElement (line 1) | refreshTokensForElement(e){let t=this.tokensByElement.getValuesForKey(e)...
method readTokensForElement (line 1) | readTokensForElement(e){let t=this.attributeName;return Ze(e.getAttribut...
function Ze (line 1) | function Ze(e,t,n){return e.trim().split(/\s+/).filter(e=>e.length).map(...
function Qe (line 1) | function Qe(e,t){let n=Math.max(e.length,t.length);return Array.from({le...
method constructor (line 29) | constructor(e,t,n){this.manager=e,this.transport=t,this.minPingDelay=n...
method createConnection (line 29) | createConnection(e,t,n,r){r=k({},r,{activityTimeout:this.pingDelay});v...
method isSupported (line 29) | isSupported(e){return this.manager.isAlive()&&this.transport.isSupport...
function $e (line 1) | function $e(e,t){return e&&t&&e.index==t.index&&e.content==t.content}
method constructor (line 1) | constructor(e,t,n){this.tokenListObserver=new Xe(e,t,this),this.delegate...
method started (line 1) | get started(){return this.tokenListObserver.started}
method start (line 1) | start(){this.tokenListObserver.start()}
method stop (line 1) | stop(){this.tokenListObserver.stop()}
method refresh (line 1) | refresh(){this.tokenListObserver.refresh()}
method element (line 1) | get element(){return this.tokenListObserver.element}
method attributeName (line 1) | get attributeName(){return this.tokenListObserver.attributeName}
method tokenMatched (line 1) | tokenMatched(e){let{element:t}=e,{value:n}=this.fetchParseResultForToken...
method tokenUnmatched (line 1) | tokenUnmatched(e){let{element:t}=e,{value:n}=this.fetchParseResultForTok...
method fetchParseResultForToken (line 1) | fetchParseResultForToken(e){let t=this.parseResultsByToken.get(e);return...
method fetchValuesByTokenForElement (line 1) | fetchValuesByTokenForElement(e){let t=this.valuesByTokenByElement.get(e)...
method parseToken (line 1) | parseToken(e){try{return{value:this.delegate.parseValueForToken(e)}}catc...
method constructor (line 1) | constructor(e,t){this.context=e,this.delegate=t,this.bindingsByAction=ne...
method start (line 1) | start(){this.valueListObserver||(this.valueListObserver=new et(this.elem...
method stop (line 1) | stop(){this.valueListObserver&&(this.valueListObserver.stop(),delete thi...
method element (line 1) | get element(){return this.context.element}
method identifier (line 1) | get identifier(){return this.context.identifier}
method actionAttribute (line 1) | get actionAttribute(){return this.schema.actionAttribute}
method schema (line 1) | get schema(){return this.context.schema}
method bindings (line 1) | get bindings(){return Array.from(this.bindingsByAction.values())}
method connectAction (line 1) | connectAction(e){let t=new Be(this.context,e);this.bindingsByAction.set(...
method disconnectAction (line 1) | disconnectAction(e){let t=this.bindingsByAction.get(e);t&&(this.bindings...
method disconnectAllActions (line 1) | disconnectAllActions(){this.bindings.forEach(e=>this.delegate.bindingDis...
method parseValueForToken (line 1) | parseValueForToken(e){let t=Le.forToken(e,this.schema);if(t.identifier==...
method elementMatchedValue (line 1) | elementMatchedValue(e,t){this.connectAction(t)}
method elementUnmatchedValue (line 1) | elementUnmatchedValue(e,t){this.disconnectAction(t)}
method constructor (line 1) | constructor(e,t){this.context=e,this.receiver=t,this.stringMapObserver=n...
method start (line 1) | start(){this.stringMapObserver.start(),this.invokeChangedCallbacksForDef...
method stop (line 1) | stop(){this.stringMapObserver.stop()}
method element (line 1) | get element(){return this.context.element}
method controller (line 1) | get controller(){return this.context.controller}
method getStringMapKeyForAttribute (line 1) | getStringMapKeyForAttribute(e){if(e in this.valueDescriptorMap)return th...
method stringMapKeyAdded (line 1) | stringMapKeyAdded(e,t){let n=this.valueDescriptorMap[t];this.hasValue(e)...
method stringMapValueChanged (line 1) | stringMapValueChanged(e,t,n){let r=this.valueDescriptorNameMap[t];e!==nu...
method stringMapKeyRemoved (line 1) | stringMapKeyRemoved(e,t,n){let r=this.valueDescriptorNameMap[e];this.has...
method invokeChangedCallbacksForDefaultValues (line 1) | invokeChangedCallbacksForDefaultValues(){for(let{key:e,name:t,defaultVal...
method invokeChangedCallback (line 1) | invokeChangedCallback(e,t,n){let r=`${e}Changed`,i=this.receiver[r];if(t...
method valueDescriptors (line 1) | get valueDescriptors(){let{valueDescriptorMap:e}=this;return Object.keys...
method valueDescriptorNameMap (line 1) | get valueDescriptorNameMap(){let e={};return Object.keys(this.valueDescr...
method hasValue (line 1) | hasValue(e){let t=this.valueDescriptorNameMap[e],n=`has${je(t.name)}`;re...
method constructor (line 1) | constructor(e,t){this.context=e,this.delegate=t,this.targetsByName=new qe}
method start (line 1) | start(){this.tokenListObserver||(this.tokenListObserver=new Xe(this.elem...
method stop (line 1) | stop(){this.tokenListObserver&&(this.disconnectAllTargets(),this.tokenLi...
method tokenMatched (line 1) | tokenMatched({element:e,content:t}){this.scope.containsElement(e)&&this....
method tokenUnmatched (line 1) | tokenUnmatched({element:e,content:t}){this.disconnectTarget(e,t)}
method connectTarget (line 1) | connectTarget(e,t){var n;this.targetsByName.has(t,e)||(this.targetsByNam...
method disconnectTarget (line 1) | disconnectTarget(e,t){var n;this.targetsByName.has(t,e)&&(this.targetsBy...
method disconnectAllTargets (line 1) | disconnectAllTargets(){for(let e of this.targetsByName.keys)for(let t of...
method attributeName (line 1) | get attributeName(){return`data-${this.context.identifier}-target`}
method element (line 1) | get element(){return this.context.element}
method scope (line 1) | get scope(){return this.context.scope}
function it (line 1) | function it(e,t){let n=ot(e);return Array.from(n.reduce((e,n)=>(st(n,t)....
method constructor (line 29) | constructor(e,t){super(function(t,n){j.debug(`No callbacks on `+e+` fo...
method authorize (line 29) | authorize(e,t){return t(null,{auth:``})}
method trigger (line 29) | trigger(e,t){if(e.indexOf(`client-`)!==0)throw new f(`Event '`+e+`' do...
method disconnect (line 29) | disconnect(){this.subscribed=!1,this.subscriptionPending=!1}
method handleEvent (line 29) | handleEvent(e){var t=e.event,n=e.data;t===`pusher_internal:subscriptio...
method handleSubscriptionSucceededEvent (line 29) | handleSubscriptionSucceededEvent(e){this.subscriptionPending=!1,this.s...
method handleSubscriptionCountEvent (line 29) | handleSubscriptionCountEvent(e){e.data.subscription_count&&(this.subsc...
method subscribe (line 29) | subscribe(){this.subscribed||(this.subscriptionPending=!0,this.subscri...
method unsubscribe (line 29) | unsubscribe(){this.subscribed=!1,this.pusher.send_event(`pusher:unsubs...
method cancelSubscription (line 29) | cancelSubscription(){this.subscriptionCancelled=!0}
method reinstateSubscription (line 29) | reinstateSubscription(){this.subscriptionCancelled=!1}
function at (line 1) | function at(e,t){return ot(e).reduce((e,n)=>(e.push(...ct(n,t)),e),[])}
method authorize (line 29) | authorize(e,t){return this.pusher.config.channelAuthorizer({channelNam...
function ot (line 1) | function ot(e){let t=[];for(;e;)t.push(e),e=Object.getPrototypeOf(e);ret...
method constructor (line 29) | constructor(){this.reset()}
method get (line 29) | get(e){return Object.prototype.hasOwnProperty.call(this.members,e)?{id...
method each (line 29) | each(e){A(this.members,(t,n)=>{e(this.get(n))})}
method setMyID (line 29) | setMyID(e){this.myID=e}
method onSubscription (line 29) | onSubscription(e){this.members=e.presence.hash,this.count=e.presence.c...
method addMember (line 29) | addMember(e){return this.get(e.user_id)===null&&this.count++,this.memb...
method removeMember (line 29) | removeMember(e){var t=this.get(e.user_id);return t&&(delete this.membe...
method reset (line 29) | reset(){this.members={},this.count=0,this.myID=null,this.me=null}
function st (line 1) | function st(e,t){let n=e[t];return Array.isArray(n)?n:[]}
function ct (line 1) | function ct(e,t){let n=e[t];return n?Object.keys(n).map(e=>[e,n[e]]):[]}
method constructor (line 29) | constructor(e,t){super(e,t),this.members=new ot}
method authorize (line 29) | authorize(e,t){super.authorize(e,(e,n)=>st(this,void 0,void 0,function...
method handleEvent (line 29) | handleEvent(e){var t=e.event;if(t.indexOf(`pusher_internal:`)===0)this...
method handleInternalEvent (line 29) | handleInternalEvent(e){var t=e.event,n=e.data;switch(t){case`pusher_in...
method handleSubscriptionSucceededEvent (line 29) | handleSubscriptionSucceededEvent(e){this.subscriptionPending=!1,this.s...
method disconnect (line 29) | disconnect(){this.members.reset(),super.disconnect()}
method constructor (line 1) | constructor(e,t){this.started=!1,this.context=e,this.delegate=t,this.out...
method start (line 1) | start(){this.started||(this.outletDefinitions.forEach(e=>{this.setupSele...
method refresh (line 1) | refresh(){this.selectorObserverMap.forEach(e=>e.refresh()),this.attribut...
method stop (line 1) | stop(){this.started&&(this.started=!1,this.disconnectAllOutlets(),this.s...
method stopSelectorObservers (line 1) | stopSelectorObservers(){this.selectorObserverMap.size>0&&(this.selectorO...
method stopAttributeObservers (line 1) | stopAttributeObservers(){this.attributeObserverMap.size>0&&(this.attribu...
method selectorMatched (line 1) | selectorMatched(e,t,{outletName:n}){let r=this.getOutlet(e,n);r&&this.co...
method selectorUnmatched (line 1) | selectorUnmatched(e,t,{outletName:n}){let r=this.getOutletFromMap(e,n);r...
method selectorMatchElement (line 1) | selectorMatchElement(e,{outletName:t}){let n=this.selector(t),r=this.has...
method elementMatchedAttribute (line 1) | elementMatchedAttribute(e,t){let n=this.getOutletNameFromOutletAttribute...
method elementAttributeValueChanged (line 1) | elementAttributeValueChanged(e,t){let n=this.getOutletNameFromOutletAttr...
method elementUnmatchedAttribute (line 1) | elementUnmatchedAttribute(e,t){let n=this.getOutletNameFromOutletAttribu...
method connectOutlet (line 1) | connectOutlet(e,t,n){var r;this.outletElementsByName.has(n,t)||(this.out...
method disconnectOutlet (line 1) | disconnectOutlet(e,t,n){var r;this.outletElementsByName.has(n,t)&&(this....
method disconnectAllOutlets (line 1) | disconnectAllOutlets(){for(let e of this.outletElementsByName.keys)for(l...
method updateSelectorObserverForOutlet (line 1) | updateSelectorObserverForOutlet(e){let t=this.selectorObserverMap.get(e)...
method setupSelectorObserverForOutlet (line 1) | setupSelectorObserverForOutlet(e){let t=this.selector(e),n=new Je(docume...
method setupAttributeObserverForOutlet (line 1) | setupAttributeObserverForOutlet(e){let t=this.attributeNameForOutletName...
method selector (line 1) | selector(e){return this.scope.outlets.getSelectorForOutletName(e)}
method attributeNameForOutletName (line 1) | attributeNameForOutletName(e){return this.scope.schema.outletAttributeFo...
method getOutletNameFromOutletAttributeName (line 1) | getOutletNameFromOutletAttributeName(e){return this.outletDefinitions.fi...
method outletDependencies (line 1) | get outletDependencies(){let e=new qe;return this.router.modules.forEach...
method outletDefinitions (line 1) | get outletDefinitions(){return this.outletDependencies.getKeysForValue(t...
method dependentControllerIdentifiers (line 1) | get dependentControllerIdentifiers(){return this.outletDependencies.getV...
method dependentContexts (line 1) | get dependentContexts(){let e=this.dependentControllerIdentifiers;return...
method hasOutlet (line 1) | hasOutlet(e,t){return!!this.getOutlet(e,t)||!!this.getOutletFromMap(e,t)}
method getOutlet (line 1) | getOutlet(e,t){return this.application.getControllerForElementAndIdentif...
method getOutletFromMap (line 1) | getOutletFromMap(e,t){return this.outletsByName.getValuesForKey(t).find(...
method scope (line 1) | get scope(){return this.context.scope}
method schema (line 1) | get schema(){return this.context.schema}
method identifier (line 1) | get identifier(){return this.context.identifier}
method application (line 1) | get application(){return this.context.application}
method router (line 1) | get router(){return this.application.router}
method constructor (line 1) | constructor(e,t){this.logDebugActivity=(e,t={})=>{let{identifier:n,contr...
method connect (line 1) | connect(){this.bindingObserver.start(),this.valueObserver.start(),this.t...
method refresh (line 1) | refresh(){this.outletObserver.refresh()}
method disconnect (line 1) | disconnect(){try{this.controller.disconnect(),this.logDebugActivity(`dis...
method application (line 1) | get application(){return this.module.application}
method identifier (line 1) | get identifier(){return this.module.identifier}
method schema (line 1) | get schema(){return this.application.schema}
method dispatcher (line 1) | get dispatcher(){return this.application.dispatcher}
method element (line 1) | get element(){return this.scope.element}
method parentElement (line 1) | get parentElement(){return this.element.parentElement}
method handleError (line 1) | handleError(e,t,n={}){let{identifier:r,controller:i,element:a}=this;n=Ob...
method targetConnected (line 1) | targetConnected(e,t){this.invokeControllerMethod(`${t}TargetConnected`,e)}
method targetDisconnected (line 1) | targetDisconnected(e,t){this.invokeControllerMethod(`${t}TargetDisconnec...
method outletConnected (line 1) | outletConnected(e,t,n){this.invokeControllerMethod(`${Ae(n)}OutletConnec...
method outletDisconnected (line 1) | outletDisconnected(e,t,n){this.invokeControllerMethod(`${Ae(n)}OutletDis...
method invokeControllerMethod (line 1) | invokeControllerMethod(e,...t){let n=this.controller;typeof n[e]==`funct...
function dt (line 1) | function dt(e){return ft(e,pt(e))}
method constructor (line 29) | constructor(e,t,n){super(e,t),this.key=null,this.nacl=n}
method authorize (line 29) | authorize(e,t){super.authorize(e,(e,n)=>{if(e){t(e,n);return}let r=n.s...
method trigger (line 29) | trigger(e,t){throw new _(`Client events are not currently supported fo...
method handleEvent (line 29) | handleEvent(e){var t=e.event,n=e.data;if(t.indexOf(`pusher_internal:`)...
method handleEncryptedEvent (line 29) | handleEncryptedEvent(e,t){if(!this.key){j.debug(`Received encrypted ev...
method getDataToEmit (line 29) | getDataToEmit(e){let t=(0,lt.decode)(e);try{return JSON.parse(t)}catch...
function ft (line 1) | function ft(e,t){let n=gt(e),r=mt(e.prototype,t);return Object.definePro...
method constructor (line 29) | constructor(e,t){super(),this.state=`initialized`,this.connection=null...
method connect (line 29) | connect(){if(!(this.connection||this.runner)){if(!this.strategy.isSupp...
method send (line 29) | send(e){return this.connection?this.connection.send(e):!1}
method send_event (line 29) | send_event(e,t,n){return this.connection?this.connection.send_event(e,...
method disconnect (line 29) | disconnect(){this.disconnectInternally(),this.updateState(`disconnecte...
method isUsingTLS (line 29) | isUsingTLS(){return this.usingTLS}
method startConnecting (line 29) | startConnecting(){var e=(t,n)=>{t?this.runner=this.strategy.connect(0,...
method abortConnecting (line 29) | abortConnecting(){this.runner&&=(this.runner.abort(),null)}
method disconnectInternally (line 29) | disconnectInternally(){this.abortConnecting(),this.clearRetryTimer(),t...
method updateStrategy (line 29) | updateStrategy(){this.strategy=this.options.getStrategy({key:this.key,...
method retryIn (line 29) | retryIn(e){this.timeline.info({action:`retry`,delay:e}),e>0&&this.emit...
method clearRetryTimer (line 29) | clearRetryTimer(){this.retryTimer&&=(this.retryTimer.ensureAborted(),n...
method setUnavailableTimer (line 29) | setUnavailableTimer(){this.unavailableTimer=new ce(this.options.unavai...
method clearUnavailableTimer (line 29) | clearUnavailableTimer(){this.unavailableTimer&&this.unavailableTimer.e...
method sendActivityCheck (line 29) | sendActivityCheck(){this.stopActivityCheck(),this.connection.ping(),th...
method resetActivityCheck (line 29) | resetActivityCheck(){this.stopActivityCheck(),this.connection&&!this.c...
method stopActivityCheck (line 29) | stopActivityCheck(){this.activityTimer&&this.activityTimer.ensureAbort...
method buildConnectionCallbacks (line 29) | buildConnectionCallbacks(e){return k({},e,{message:e=>{this.resetActiv...
method buildHandshakeCallbacks (line 29) | buildHandshakeCallbacks(e){return k({},e,{connected:e=>{this.activityT...
method buildErrorCallbacks (line 29) | buildErrorCallbacks(){let e=e=>t=>{t.error&&this.emit(`error`,{type:`W...
method setConnection (line 29) | setConnection(e){for(var t in this.connection=e,this.connectionCallbac...
method abandonConnection (line 29) | abandonConnection(){if(this.connection){for(var e in this.stopActivity...
method updateState (line 29) | updateState(e,t){var n=this.state;if(this.state=e,n!==e){var r=e;r===`...
method shouldRetry (line 29) | shouldRetry(){return this.state===`connecting`||this.state===`connected`}
function pt (line 1) | function pt(e){return it(e,`blessings`).reduce((t,n)=>{let r=n(e);for(le...
method constructor (line 29) | constructor(){this.channels={}}
method add (line 29) | add(e,t){return this.channels[e]||(this.channels[e]=mt(e,t)),this.chan...
method all (line 29) | all(){return pe(this.channels)}
method find (line 29) | find(e){return this.channels[e]}
method remove (line 29) | remove(e){var t=this.channels[e];return delete this.channels[e],t}
method disconnect (line 29) | disconnect(){A(this.channels,function(e){e.disconnect()})}
function mt (line 1) | function mt(e,t){return ht(t).reduce((n,r)=>{let i=P(e,t,r);return i&&Ob...
function P (line 1) | function P(e,t,n){let r=Object.getOwnPropertyDescriptor(e,n);if(!(r&&`va...
function e (line 1) | function e(e){function t(){return Reflect.construct(e,arguments,new.targ...
function t (line 1) | function t(){let t=e(function(){this.a.call(this)});return t.prototype.a...
function _t (line 1) | function _t(e){return{identifier:e.identifier,controllerConstructor:dt(e...
method constructor (line 29) | constructor(e){this.strategies=e}
method isSupported (line 29) | isSupported(){return be(this.strategies,O.method(`isSupported`))}
method connect (line 29) | connect(e,t){return vt(this.strategies,e,function(e,n){return function...
method constructor (line 1) | constructor(e,t){this.application=e,this.definition=_t(t),this.contextsB...
method identifier (line 1) | get identifier(){return this.definition.identifier}
method controllerConstructor (line 1) | get controllerConstructor(){return this.definition.controllerConstructor}
method contexts (line 1) | get contexts(){return Array.from(this.connectedContexts)}
method connectContextForScope (line 1) | connectContextForScope(e){let t=this.fetchContextForScope(e);this.connec...
method disconnectContextForScope (line 1) | disconnectContextForScope(e){let t=this.contextsByScope.get(e);t&&(this....
method fetchContextForScope (line 1) | fetchContextForScope(e){let t=this.contextsByScope.get(e);return t||(t=n...
method constructor (line 1) | constructor(e){this.scope=e}
method has (line 1) | has(e){return this.data.has(this.getDataKey(e))}
method get (line 1) | get(e){return this.getAll(e)[0]}
method getAll (line 1) | getAll(e){return Ne(this.data.get(this.getDataKey(e))||``)}
method getAttributeName (line 1) | getAttributeName(e){return this.data.getAttributeNameForKey(this.getData...
method getDataKey (line 1) | getDataKey(e){return`${e}-class`}
method data (line 1) | get data(){return this.scope.data}
method constructor (line 1) | constructor(e){this.scope=e}
method element (line 1) | get element(){return this.scope.element}
method identifier (line 1) | get identifier(){return this.scope.identifier}
method get (line 1) | get(e){let t=this.getAttributeNameForKey(e);return this.element.getAttri...
method set (line 1) | set(e,t){let n=this.getAttributeNameForKey(e);return this.element.setAtt...
method has (line 1) | has(e){let t=this.getAttributeNameForKey(e);return this.element.hasAttri...
method delete (line 1) | delete(e){if(this.has(e)){let t=this.getAttributeNameForKey(e);return th...
method getAttributeNameForKey (line 1) | getAttributeNameForKey(e){return`data-${this.identifier}-${Me(e)}`}
method constructor (line 1) | constructor(e){this.warnedKeysByObject=new WeakMap,this.logger=e}
method warn (line 1) | warn(e,t,n){let r=this.warnedKeysByObject.get(e);r||(r=new Set,this.warn...
function St (line 1) | function St(e,t){return`[${e}~="${t}"]`}
method constructor (line 1) | constructor(e){this.scope=e}
method element (line 1) | get element(){return this.scope.element}
method identifier (line 1) | get identifier(){return this.scope.identifier}
method schema (line 1) | get schema(){return this.scope.schema}
method has (line 1) | has(e){return this.find(e)!=null}
method find (line 1) | find(...e){return e.reduce((e,t)=>e||this.findTarget(t)||this.findLegacy...
method findAll (line 1) | findAll(...e){return e.reduce((e,t)=>[...e,...this.findAllTargets(t),......
method findTarget (line 1) | findTarget(e){let t=this.getSelectorForTargetName(e);return this.scope.f...
method findAllTargets (line 1) | findAllTargets(e){let t=this.getSelectorForTargetName(e);return this.sco...
method getSelectorForTargetName (line 1) | getSelectorForTargetName(e){return St(this.schema.targetAttributeForScop...
method findLegacyTarget (line 1) | findLegacyTarget(e){let t=this.getLegacySelectorForTargetName(e);return ...
method findAllLegacyTargets (line 1) | findAllLegacyTargets(e){let t=this.getLegacySelectorForTargetName(e);ret...
method getLegacySelectorForTargetName (line 1) | getLegacySelectorForTargetName(e){let t=`${this.identifier}.${e}`;return...
method deprecate (line 1) | deprecate(e,t){if(e){let{identifier:n}=this,r=this.schema.targetAttribut...
method guide (line 1) | get guide(){return this.scope.guide}
method constructor (line 1) | constructor(e,t){this.scope=e,this.controllerElement=t}
method element (line 1) | get element(){return this.scope.element}
method identifier (line 1) | get identifier(){return this.scope.identifier}
method schema (line 1) | get schema(){return this.scope.schema}
method has (line 1) | has(e){return this.find(e)!=null}
method find (line 1) | find(...e){return e.reduce((e,t)=>e||this.findOutlet(t),void 0)}
method findAll (line 1) | findAll(...e){return e.reduce((e,t)=>[...e,...this.findAllOutlets(t)],[])}
method getSelectorForOutletName (line 1) | getSelectorForOutletName(e){let t=this.schema.outletAttributeForScope(th...
method findOutlet (line 1) | findOutlet(e){let t=this.getSelectorForOutletName(e);if(t)return this.fi...
method findAllOutlets (line 1) | findAllOutlets(e){let t=this.getSelectorForOutletName(e);return t?this.f...
method findElement (line 1) | findElement(e,t){return this.scope.queryElements(e).filter(n=>this.match...
method findAllElements (line 1) | findAllElements(e,t){return this.scope.queryElements(e).filter(n=>this.m...
method matchesElement (line 1) | matchesElement(e,t,n){let r=e.getAttribute(this.scope.schema.controllerA...
method constructor (line 1) | constructor(e,t,n,r){this.targets=new Ct(this),this.classes=new yt(this)...
method findElement (line 1) | findElement(e){return this.element.matches(e)?this.element:this.queryEle...
method findAllElements (line 1) | findAllElements(e){return[...this.element.matches(e)?[this.element]:[],....
method queryElements (line 1) | queryElements(e){return Array.from(this.element.querySelectorAll(e))}
method controllerSelector (line 1) | get controllerSelector(){return St(this.schema.controllerAttribute,this....
method isDocumentScope (line 1) | get isDocumentScope(){return this.element===document.documentElement}
method documentScope (line 1) | get documentScope(){return this.isDocumentScope?this:new e(this.schema,d...
method constructor (line 1) | constructor(e,t,n){this.element=e,this.schema=t,this.delegate=n,this.val...
method start (line 1) | start(){this.valueListObserver.start()}
method stop (line 1) | stop(){this.valueListObserver.stop()}
method controllerAttribute (line 1) | get controllerAttribute(){return this.schema.controllerAttribute}
method parseValueForToken (line 1) | parseValueForToken(e){let{element:t,content:n}=e;return this.parseValueF...
method parseValueForElementAndIdentifier (line 1) | parseValueForElementAndIdentifier(e,t){let n=this.fetchScopesByIdentifie...
method elementMatchedValue (line 1) | elementMatchedValue(e,t){let n=(this.scopeReferenceCounts.get(t)||0)+1;t...
method elementUnmatchedValue (line 1) | elementUnmatchedValue(e,t){let n=this.scopeReferenceCounts.get(t);n&&(th...
method fetchScopesByIdentifierForElement (line 1) | fetchScopesByIdentifierForElement(e){let t=this.scopesByIdentifierByElem...
method constructor (line 1) | constructor(e){this.application=e,this.scopeObserver=new Et(this.element...
method element (line 1) | get element(){return this.application.element}
method schema (line 1) | get schema(){return this.application.schema}
method logger (line 1) | get logger(){return this.application.logger}
method controllerAttribute (line 1) | get controllerAttribute(){return this.schema.controllerAttribute}
method modules (line 1) | get modules(){return Array.from(this.modulesByIdentifier.values())}
method contexts (line 1) | get contexts(){return this.modules.reduce((e,t)=>e.concat(t.contexts),[])}
method start (line 1) | start(){this.scopeObserver.start()}
method stop (line 1) | stop(){this.scopeObserver.stop()}
method loadDefinition (line 1) | loadDefinition(e){this.unloadIdentifier(e.identifier);let t=new vt(this....
method unloadIdentifier (line 1) | unloadIdentifier(e){let t=this.modulesByIdentifier.get(e);t&&this.discon...
method getContextForElementAndIdentifier (line 1) | getContextForElementAndIdentifier(e,t){let n=this.modulesByIdentifier.ge...
method proposeToConnectScopeForElementAndIdentifier (line 1) | proposeToConnectScopeForElementAndIdentifier(e,t){let n=this.scopeObserv...
method handleError (line 1) | handleError(e,t,n){this.application.handleError(e,t,n)}
method createScopeForElementAndIdentifier (line 1) | createScopeForElementAndIdentifier(e,t){return new Tt(this.schema,e,t,th...
method scopeConnected (line 1) | scopeConnected(e){this.scopesByIdentifier.add(e.identifier,e);let t=this...
method scopeDisconnected (line 1) | scopeDisconnected(e){this.scopesByIdentifier.delete(e.identifier,e);let ...
method connectModule (line 1) | connectModule(e){this.modulesByIdentifier.set(e.identifier,e),this.scope...
method disconnectModule (line 1) | disconnectModule(e){this.modulesByIdentifier.delete(e.identifier),this.s...
function kt (line 1) | function kt(e){return e.reduce((e,[t,n])=>Object.assign(Object.assign({}...
method constructor (line 1) | constructor(e=document.documentElement,t=Ot){this.logger=console,this.de...
method start (line 1) | static start(e,t){let n=new this(e,t);return n.start(),n}
method start (line 1) | async start(){await jt(),this.logDebugActivity(`application`,`starting`)...
method stop (line 1) | stop(){this.logDebugActivity(`application`,`stopping`),this.dispatcher.s...
method register (line 1) | register(e,t){this.load({identifier:e,controllerConstructor:t})}
method registerActionOption (line 1) | registerActionOption(e,t){this.actionDescriptorFilters[e]=t}
method load (line 1) | load(e,...t){(Array.isArray(e)?e:[e,...t]).forEach(e=>{e.controllerConst...
method unload (line 1) | unload(e,...t){(Array.isArray(e)?e:[e,...t]).forEach(e=>this.router.unlo...
method controllers (line 1) | get controllers(){return this.router.contexts.map(e=>e.controller)}
method getControllerForElementAndIdentifier (line 1) | getControllerForElementAndIdentifier(e,t){let n=this.router.getContextFo...
method handleError (line 1) | handleError(e,t,n){var r;this.logger.error(`%s
method logFormattedMessage (line 5) | logFormattedMessage(e,t,n={}){n=Object.assign({application:this},n),this...
function jt (line 5) | function jt(){return new Promise(e=>{document.readyState==`loading`?docu...
function Mt (line 5) | function Mt(e){return it(e,`classes`).reduce((e,t)=>Object.assign(e,Nt(t...
function Nt (line 5) | function Nt(e){return{[`${e}Class`]:{get(){let{classes:t}=this;if(t.has(...
method constructor (line 29) | constructor(e,t,n){super(),this.hooks=e,this.method=t,this.url=n}
method start (line 29) | start(e){this.position=0,this.xhr=this.hooks.getRequest(this),this.unl...
method close (line 29) | close(){this.unloader&&=(I.removeUnloadListener(this.unloader),null),t...
method onChunk (line 29) | onChunk(e,t){for(;;){var n=this.advanceBuffer(t);if(n)this.emit(`chunk...
method advanceBuffer (line 29) | advanceBuffer(e){var t=e.slice(this.position),n=t.indexOf(`
method isBufferTooLong (line 30) | isBufferTooLong(e){return this.position===e.length&&e.length>262144}
function Pt (line 5) | function Pt(e){return it(e,`outlets`).reduce((e,t)=>Object.assign(e,It(t...
function F (line 5) | function F(e,t,n){return e.application.getControllerForElementAndIdentif...
function Ft (line 5) | function Ft(e,t,n){let r=F(e,t,n);if(r||(e.application.router.proposeToC...
function It (line 5) | function It(e){let t=Ae(e);return{[`${t}Outlet`]:{get(){let t=this.outle...
method constructor (line 30) | constructor(e,t){this.hooks=e,this.session=Vt(1e3)+`/`+Ht(8),this.loca...
method send (line 30) | send(e){return this.sendRaw(JSON.stringify([e]))}
method ping (line 30) | ping(){this.hooks.sendHeartbeat(this)}
method close (line 30) | close(e,t){this.onClose(e,t,!0)}
method sendRaw (line 30) | sendRaw(e){if(this.readyState===F.OPEN)try{return I.createSocketReques...
method reconnect (line 30) | reconnect(){this.closeStream(),this.openStream()}
method onClose (line 30) | onClose(e,t,n){this.closeStream(),this.readyState=F.CLOSED,this.onclos...
method onChunk (line 30) | onChunk(e){if(e.status===200){this.readyState===F.OPEN&&this.onActivit...
method onOpen (line 30) | onOpen(e){this.readyState===F.CONNECTING?(e&&e.hostname&&(this.locatio...
method onEvent (line 30) | onEvent(e){this.readyState===F.OPEN&&this.onmessage&&this.onmessage({d...
method onActivity (line 30) | onActivity(){this.onactivity&&this.onactivity()}
method onError (line 30) | onError(e){this.onerror&&this.onerror(e)}
method openStream (line 30) | openStream(){this.stream=I.createSocketRequest(`POST`,zt(this.hooks.ge...
method closeStream (line 30) | closeStream(){this.stream&&=(this.stream.unbind_all(),this.stream.clos...
function Lt (line 5) | function Lt(e){return it(e,`targets`).reduce((e,t)=>Object.assign(e,Rt(t...
function Rt (line 5) | function Rt(e){return{[`${e}Target`]:{get(){let t=this.targets.find(e);i...
function zt (line 5) | function zt(e){let t=at(e,`values`);return t.reduce((e,t)=>Object.assign...
function Bt (line 5) | function Bt(e,t){let n=Vt(e,t),{key:r,name:i,reader:a,writer:o}=n;return...
function Vt (line 5) | function Vt([e,t],n){return qt({controller:n,token:e,typeDefinition:t})}
function Ht (line 5) | function Ht(e){switch(e){case Array:return`array`;case Boolean:return`bo...
function Ut (line 5) | function Ut(e){switch(typeof e){case`boolean`:return`boolean`;case`numbe...
function Wt (line 5) | function Wt(e){let{controller:t,token:n,typeObject:r}=e,i=Pe(r.type),a=P...
function Gt (line 5) | function Gt(e){let{controller:t,token:n,typeDefinition:r}=e,i=Wt({contro...
function Kt (line 5) | function Kt(e){let t=Ht(e);if(t)return I[t];let n=Fe(e,`default`),r=Fe(e...
function qt (line 5) | function qt(e){let{token:t,typeDefinition:n}=e,r=`${Me(t)}-value`,i=Gt(e...
method array (line 5) | get array(){return[]}
method object (line 5) | get object(){return{}}
method array (line 5) | array(e){let t=JSON.parse(e);if(!Array.isArray(t))throw TypeError(`expec...
method boolean (line 5) | boolean(e){return!(e==`0`||String(e).toLowerCase()==`false`)}
method number (line 5) | number(e){return Number(e.replace(/_/g,``))}
method object (line 5) | object(e){let t=JSON.parse(e);if(typeof t!=`object`||!t||Array.isArray(t...
method string (line 5) | string(e){return e}
function Xt (line 5) | function Xt(e){return JSON.stringify(e)}
method constructor (line 30) | constructor(e,t,n){this.key=e,this.session=t,this.events=[],this.optio...
method log (line 30) | log(e,t){e<=this.options.level&&(this.events.push(k({},t,{timestamp:O....
method error (line 30) | error(e){this.log(Yt.ERROR,e)}
method info (line 30) | info(e){this.log(Yt.INFO,e)}
method debug (line 30) | debug(e){this.log(Yt.DEBUG,e)}
method isEmpty (line 30) | isEmpty(){return this.events.length===0}
method send (line 30) | send(e,t){var n=k({session:this.session,bundle:this.sent+1,key:this.ke...
method generateUniqueID (line 30) | generateUniqueID(){return this.uniqueID++,this.uniqueID}
function Zt (line 5) | function Zt(e){return`${e}`}
method constructor (line 30) | constructor(e,t,n,r){this.name=e,this.priority=t,this.transport=n,this...
method isSupported (line 30) | isSupported(){return this.transport.isSupported({useTLS:this.options.u...
method connect (line 30) | connect(e,t){if(!this.isSupported())return L(new y,t);if(this.priority...
method constructor (line 5) | constructor(e){this.context=e}
method shouldLoad (line 5) | static get shouldLoad(){return!0}
method afterLoad (line 5) | static afterLoad(e,t){}
method application (line 5) | get application(){return this.context.application}
method scope (line 5) | get scope(){return this.context.scope}
method element (line 5) | get element(){return this.scope.element}
method identifier (line 5) | get identifier(){return this.scope.identifier}
method targets (line 5) | get targets(){return this.scope.targets}
method outlets (line 5) | get outlets(){return this.scope.outlets}
method classes (line 5) | get classes(){return this.scope.classes}
method data (line 5) | get data(){return this.scope.data}
method initialize (line 5) | initialize(){}
method connect (line 5) | connect(){}
method disconnect (line 5) | disconnect(){}
method dispatch (line 5) | dispatch(e,{target:t=this.element,detail:n={},prefix:r=this.identifier,b...
method constructor (line 5) | constructor(e,t,n){let r=`${e.status||e.status===0?e.status:``} ${e.stat...
method constructor (line 5) | constructor(e){let t=`Non-error value was thrown`;try{typeof e==`string`...
method constructor (line 5) | constructor(e){let t=e?.cause?e.cause instanceof Error?e.cause:new $t(e....
method duplex (line 5) | get duplex(){return e=!0,`half`}
method constructor (line 5) | constructor(e){this.options=e}
method transform (line 5) | transform(e,a){if(a.enqueue(e),r){i+=r.byteLength;let e=t===0?0:i/t;e>=1...
method flush (line 5) | flush(){r&&(i+=r.byteLength,n?.({percent:1,totalBytes:Math.max(t,i),tran...
function Cn (line 5) | function Cn(e,t,n){return Object.hasOwn(t,n)&&t[n]===void 0?[]:En(e[n]??...
method constructor (line 5) | constructor(e){super(`Request timed out: ${e.method} ${e.url}`),this.nam...
function jn (line 5) | async function jn(e,t,n,r){return new Promise((i,a)=>{let o=setTimeout((...
function Mn (line 5) | async function Mn(e,{signal:t}){return new Promise((n,r)=>{t&&(t.throwIf...
function Fn (line 5) | function Fn(e){return e instanceof Qt||e?.name===Qt.name}
function In (line 5) | function In(e){return e instanceof An||e?.name===An.name}
method create (line 5) | static create(t,n){let r=new e(t,n),i=r.#p(async()=>{if(typeof r.#i.time...
method #e (line 5) | static#e(e){return e&&typeof e==`object`&&!Array.isArray(e)&&!(e instanc...
method constructor (line 5) | constructor(t,n={}){if(this.#r=t,this.#i={...n,headers:Sn(this.#r.header...
method #c (line 5) | #c(){let e=this.#i.retry.delay(this.#n),t=e;this.#i.retry.jitter===!0?t=...
method #l (line 5) | async#l(e){if(this.#n++,this.#n>this.#i.retry.limit)throw e;let t=e inst...
method #u (line 5) | #u(e){return this.#i.parseJson&&(e.json=async()=>this.#i.parseJson(await...
method #d (line 5) | #d(e){e&&e.cancel().catch(()=>void 0)}
method #f (line 5) | #f(e){this.#d(e.body??void 0)}
method #p (line 5) | async#p(e){try{return await e()}catch(t){let n=Math.min(await this.#l(t)...
method #m (line 5) | async#m(){this.#t?.signal.aborted&&(this.#t=new globalThis.AbortControll...
method #h (line 5) | #h(){if(!this.#s){let{hooks:e,...t}=this.#i;this.#s=Object.freeze(t)}ret...
method #g (line 5) | #g(e){this.#s=void 0,this.request=this.#_(e)}
method #_ (line 5) | #_(e,t){return!this.#i.onUploadProgress||!e.body?e:bn(e,this.#i.onUpload...
method constructor (line 7) | constructor(e,t,{tabInsertsSuggestions:n,defaultFirstOption:r,scrollInto...
method destroy (line 7) | destroy(){this.clearSelection(),this.stop(),this.input.removeAttribute(`...
method start (line 7) | start(){this.input.setAttribute(`aria-expanded`,`true`),this.input.addEv...
method stop (line 7) | stop(){this.clearSelection(),this.input.setAttribute(`aria-expanded`,`fa...
method indicateDefaultOption (line 7) | indicateDefaultOption(){var e;this.defaultFirstOption&&((e=Array.from(th...
method navigate (line 7) | navigate(e=1){let t=Array.from(this.list.querySelectorAll(`[aria-selecte...
method clearSelection (line 7) | clearSelection(){this.input.removeAttribute(`aria-activedescendant`);for...
function Vn (line 7) | function Vn(e,t){if(!(e.shiftKey||e.metaKey||e.altKey)&&!(!t.ctrlBinding...
function Hn (line 7) | function Hn(e){if(!(e.target instanceof Element))return;let t=e.target.c...
function Un (line 7) | function Un(e,t){let n=t.querySelector(`[aria-selected="true"], [data-co...
function Wn (line 7) | function Wn(e,t){e.dispatchEvent(new CustomEvent(`combobox-commit`,{bubb...
function Gn (line 7) | function Gn(e){e.dispatchEvent(new Event(`combobox-select`,{bubbles:!0}))}
function Kn (line 7) | function Kn(e){return!e.hidden&&!(e instanceof HTMLInputElement&&e.type=...
function qn (line 7) | function qn(e,t){t.isComposing=e.type===`compositionstart`,document.getE...
function Yn (line 7) | function Yn(e,t,n,{multiWord:r,lookBackIndex:i,lastMatchPosition:a}={mul...
method constructor (line 8) | constructor(){super(`update`)}
method for (line 8) | static for(t){let n=Zn.get(t);return n||(n=new e(t),Zn.set(t,n)),n}
method constructor (line 8) | constructor(e){super(),this.#n=new WeakRef(e),this.#r.style.position=`ab...
method element (line 8) | get element(){return this.#i}
method forceUpdate (line 8) | forceUpdate(){this.#f(),this.#p()}
method disconnect (line 8) | disconnect(){this.#r?.remove(),this.#e.disconnect(),this.#t.disconnect()...
method #a (line 8) | get#a(){return this.#n?.deref()}
method #o (line 8) | #o(e){let t=this.#a;return t?e(t):this.disconnect()}
method #l (line 8) | #l(){this.#o(e=>{let t=window.getComputedStyle(e);this.#i.style.height=t...
method #d (line 8) | #d(){this.#u||(this.#u=!0,requestAnimationFrame(()=>{this.#l(),this.#u=!...
method #f (line 8) | #f(){this.#o(e=>{let t=window.getComputedStyle(e);for(let e of $n)this.#...
method #p (line 8) | #p(){this.#o(e=>{this.#i.textContent=e.value,this.#l()})}
method constructor (line 8) | constructor(e,t=0,n=t){this.#e=e,this.#t=t,this.#n=n}
method fromSelection (line 8) | static fromSelection(t){let{selectionStart:n,selectionEnd:r}=t;return ne...
method collapsed (line 8) | get collapsed(){return this.startOffset===this.endOffset}
method commonAncestorContainer (line 8) | get commonAncestorContainer(){return this.#e}
method endContainer (line 8) | get endContainer(){return this.#e}
method startContainer (line 8) | get startContainer(){return this.#e}
method startOffset (line 8) | get startOffset(){return this.#t}
method endOffset (line 8) | get endOffset(){return this.#n}
method setStartOffset (line 8) | setStartOffset(e){this.#t=this.#a(e)}
method setEndOffset (line 8) | setEndOffset(e){this.#n=this.#a(e)}
method collapse (line 8) | collapse(e=!1){e?this.setEndOffset(this.startOffset):this.setStartOffset...
method cloneContents (line 8) | cloneContents(){return this.#o().cloneContents()}
method cloneRange (line 8) | cloneRange(){return new e(this.#e,this.startOffset,this.endOffset)}
method getBoundingClientRect (line 8) | getBoundingClientRect(){return this.#o().getBoundingClientRect()}
method getClientRects (line 8) | getClientRects(){return this.#o().getClientRects()}
method toString (line 8) | toString(){return this.#o().toString()}
method getStyleClone (line 8) | getStyleClone(){return this.#r}
method #r (line 8) | get#r(){return Qn.for(this.#e)}
method #i (line 8) | get#i(){return this.#r}
method #a (line 8) | #a(e){return Math.max(0,Math.min(e,this.#e.value.length))}
method #o (line 8) | #o(){let e=document.createRange(),t=this.#i.element.childNodes[0];return...
method constructor (line 8) | constructor(e,t){this.expander=e,this.input=t,this.combobox=null,this.me...
method destroy (line 8) | destroy(){this.input.removeEventListener(`paste`,this.onpaste),this.inpu...
method dismissMenu (line 8) | dismissMenu(){this.deactivate()&&(this.lookBackIndex=this.input.selectio...
method activate (line 8) | activate(e,t){this.input!==document.activeElement&&this.input!==document...
method positionMenu (line 8) | positionMenu(e,t){let n=Math.min(t,this.input.value.length),r=new er(thi...
method deactivate (line 8) | deactivate(){let e=this.menu;return!e||!this.combobox?!1:(this.expander....
method onCommit (line 8) | onCommit({target:e}){let t=e;if(!(t instanceof HTMLElement)||!this.combo...
method onBlur (line 8) | onBlur(){if(this.interactingWithList){this.interactingWithList=!1;return...
method onPaste (line 8) | onPaste(){this.justPasted=!0}
method isMatchStillValid (line 8) | isMatchStillValid(e){return e.position<=this.input.value.length}
method onInput (line 8) | async onInput(){if(this.justPasted){this.justPasted=!1;return}let e=this...
method findMatch (line 8) | findMatch(){let e=this.input.selectionEnd||0,t=this.input.value;e<=this....
method notifyProviders (line 8) | async notifyProviders(e){let t=[],n=new CustomEvent(`text-expander-chang...
method onMousedown (line 8) | onMousedown(){this.interactingWithList=!0}
method onKeydown (line 8) | onKeydown(e){e.key===`Escape`&&(this.match=null,this.deactivate()&&(this...
method keys (line 8) | get keys(){let e=this.getAttribute(`keys`),t=e?e.split(` `):[],n=this.ge...
method keys (line 8) | set keys(e){this.setAttribute(`keys`,e)}
method connectedCallback (line 8) | connectedCallback(){let e=this.querySelector(`input[type="text"], textar...
method disconnectedCallback (line 8) | disconnectedCallback(){let e=tr.get(this);e&&(e.destroy(),tr.delete(this))}
method dismiss (line 8) | dismiss(){let e=tr.get(this);e&&e.dismissMenu()}
method constructor (line 8) | constructor(){super(...arguments),or(this,`onToggle`,e=>{let t=e.target;...
method connectedCallback (line 8) | connectedCallback(){this.addEventListener(`toggle`,this.onToggle,{captur...
method disconnectedCallback (line 8) | disconnectedCallback(){this.removeEventListener(`toggle`,this.onToggle,{...
method required (line 8) | get required(){return this.hasAttribute(`required`)}
method constructor (line 8) | constructor(){super(...arguments),ur(this,`timeouts`,new Map),ur(this,`i...
method connectedCallback (line 8) | connectedCallback(){this.hasAttribute(`role`)||this.setAttribute(`role`,...
method show (line 8) | show(t,n={}){let r=n.key||t.dataset.key||String(this.index++);this.dismi...
method dismiss (line 8) | dismiss(e){if(typeof e==`string`){this.querySelectorAll(`[data-key="${e}...
method clear (line 8) | clear(){Array.from(this.children).forEach(e=>{this.dismiss(e)})}
method speak (line 8) | speak(e){let t=document.createElement(`div`);Object.assign(t.style,{clip...
method startTimeout (line 8) | startTimeout(e,t){this.clearTimeout(e),this.timeouts.set(e,window.setTim...
method clearTimeout (line 8) | clearTimeout(e){this.timeouts.has(e)&&clearTimeout(this.timeouts.get(e))}
function pr (line 8) | function pr(e){e._currentTransition&&=(e.classList.remove(...[`active`,`...
function mr (line 8) | async function mr(e,t,n={}){let r=yr(n)+t+`-`,i=e.classList;pr(e),e._cur...
function hr (line 8) | function hr(e,t={}){return mr(e,`enter`,t)}
function gr (line 8) | function gr(e,t={}){return mr(e,`leave`,t)}
function _r (line 8) | function _r(){return new Promise(e=>requestAnimationFrame(()=>requestAni...
function vr (line 8) | async function vr(e){if(getComputedStyle(e).transitionDuration.startsWit...
function yr (line 8) | function yr(e){return e!=null&&e.prefix?e.prefix+`-`:``}
function br (line 8) | function br(e){return e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||e.butt...
method constructor (line 8) | constructor(){super(...arguments),Cr(this,`onButtonClick`,e=>{!br(e)&&!t...
method observedAttributes (line 8) | static get observedAttributes(){return[`open`]}
method connectedCallback (line 8) | connectedCallback(){this.content.hidden=!this.open,this.button.setAttrib...
method disconnectedCallback (line 8) | disconnectedCallback(){pr(this.content),this.button.removeAttribute(`ari...
method open (line 8) | get open(){return this.hasAttribute(`open`)}
method open (line 8) | set open(e){e?this.setAttribute(`open`,``):this.removeAttribute(`open`)}
method disabled (line 8) | get disabled(){return this.hasAttribute(`disabled`)}
method attributeChangedCallback (line 8) | attributeChangedCallback(e,t,n){e===`open`&&(n===null?this.wasClosed():t...
method wasOpened (line 8) | wasOpened(){this.content.hidden&&(this.content.hidden=!1,hr(this.content...
method wasClosed (line 8) | wasClosed(){this.content.hidden||gr(this.content).then(()=>this.content....
method button (line 8) | get button(){return this.querySelector(`button, [role=button]`)}
method content (line 8) | get content(){return this.children[1]}
method constructor (line 8) | constructor(){super(...arguments),oi(this,`search`,``),oi(this,`searchTi...
method connectedCallback (line 8) | connectedCallback(){this.hasAttribute(`role`)||this.setAttribute(`role`,...
method disconnectedCallback (line 8) | disconnectedCallback(){this.removeEventListener(`keydown`,this.onKeyDown)}
method items (line 8) | get items(){return Array.from(this.querySelectorAll(`[role^=menuitem]`))...
method navigate (line 8) | navigate(e){var t;let n=this.items,r=(document.activeElement instanceof ...
function li (line 13) | function li(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array...
function ui (line 13) | function ui(e){if(Array.isArray(e))return li(e)}
function di (line 13) | function di(e,t){var n=typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@itera...
function fi (line 14) | function fi(e,t,n){return(t=yi(t))in e?Object.defineProperty(e,t,{value:...
function pi (line 14) | function pi(e){if(typeof Symbol<`u`&&e[Symbol.iterator]!=null||e[`@@iter...
function mi (line 14) | function mi(){throw TypeError(`Invalid attempt to spread non-iterable in...
function hi (line 15) | function hi(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function gi (line 15) | function gi(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==n...
function _i (line 15) | function _i(e){return ui(e)||pi(e)||bi(e)||mi()}
function vi (line 15) | function vi(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPri...
function yi (line 15) | function yi(e){var t=vi(e,`string`);return typeof t==`symbol`?t:t+``}
function bi (line 15) | function bi(e,t){if(e){if(typeof e==`string`)return li(e,t);var n={}.toS...
method active (line 15) | get active(){return a.active}
method paused (line 15) | get paused(){return a.paused}
method constructor (line 15) | constructor(){super(),Pi(this,`focusTrap`),Pi(this,`connected`,!1);let t...
method observedAttributes (line 18) | static get observedAttributes(){return[`open`]}
method connectedCallback (line 18) | connectedCallback(){var e,t,n,r,i,a;this.connected=!0,(e=this.content)!=...
method disconnectedCallback (line 18) | disconnectedCallback(){this.connected=!1}
method open (line 18) | get open(){return this.hasAttribute(`open`)}
method open (line 18) | set open(e){e?this.setAttribute(`open`,``):this.removeAttribute(`open`)}
method close (line 18) | close(){if(!this.open)return;let e=new Event(`beforeclose`,{cancelable:!...
method attributeChangedCallback (line 18) | attributeChangedCallback(e,t,n){e!==`open`||!this.connected||(n===null?t...
method wasOpened (line 18) | async wasOpened(){document.documentElement.style.overflow=`hidden`,this....
method wasClosed (line 18) | wasClosed(){var e;document.documentElement.style.overflow=``,(e=this.foc...
method backdrop (line 18) | get backdrop(){return this.shadowRoot?.firstElementChild}
method content (line 18) | get content(){return this.firstElementChild}
function Hi (line 18) | function Hi(e,t,n){return z(e,Li(t,n))}
function Ui (line 18) | function Ui(e,t){return typeof e==`function`?e(t):e}
function Wi (line 18) | function Wi(e){return e.split(`-`)[0]}
function Gi (line 18) | function Gi(e){return e.split(`-`)[1]}
function Ki (line 18) | function Ki(e){return e===`x`?`y`:`x`}
function qi (line 18) | function qi(e){return e===`y`?`height`:`width`}
function Yi (line 18) | function Yi(e){return Ji.has(Wi(e))?`y`:`x`}
function Xi (line 18) | function Xi(e){return Ki(Yi(e))}
function Zi (line 18) | function Zi(e,t,n){n===void 0&&(n=!1);let r=Gi(e),i=Xi(e),a=qi(i),o=i===...
function Qi (line 18) | function Qi(e){let t=oa(e);return[$i(e),t,$i(t)]}
function $i (line 18) | function $i(e){return e.replace(/start|end/g,e=>Vi[e])}
function ia (line 18) | function ia(e,t,n){switch(e){case`top`:case`bottom`:return n?t?ta:ea:t?e...
function aa (line 18) | function aa(e,t,n,r){let i=Gi(e),a=ia(Wi(e),n===`start`,r);return i&&(a=...
function oa (line 18) | function oa(e){return e.replace(/left|right|bottom|top/g,e=>Bi[e])}
function sa (line 18) | function sa(e){return{top:0,right:0,bottom:0,left:0,...e}}
function ca (line 18) | function ca(e){return typeof e==`number`?{top:e,right:e,bottom:e,left:e}...
function la (line 18) | function la(e){let{x:t,y:n,width:r,height:i}=e;return{width:r,height:i,t...
function ua (line 18) | function ua(e,t,n){let{reference:r,floating:i}=e,a=Yi(t),o=Xi(t),s=qi(o)...
function fa (line 18) | async function fa(e,t){t===void 0&&(t={});let{x:n,y:r,platform:i,rects:a...
method fn (line 18) | async fn(t){var n;let{placement:r,middlewareData:i,rects:a,initialPlacem...
function ha (line 18) | async function ha(e,t){let{placement:n,platform:r,elements:i}=e,a=await(...
method fn (line 18) | async fn(t){var n;let{x:r,y:i,placement:a,middlewareData:o}=t,s=await ha...
method fn (line 18) | async fn(t){let{x:n,y:r,placement:i}=t,{mainAxis:a=!0,crossAxis:o=!1,lim...
method fn (line 18) | async fn(t){var n,r;let{placement:i,rects:a,platform:o,elements:s}=t,{ap...
function ya (line 18) | function ya(){return typeof window<`u`}
function ba (line 18) | function ba(e){return xa(e)?(e.nodeName||``).toLowerCase():`#document`}
function V (line 18) | function V(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.d...
function H (line 18) | function H(e){return((xa(e)?e.ownerDocument:e.document)||window.document...
function xa (line 18) | function xa(e){return ya()?e instanceof Node||e instanceof V(e).Node:!1}
function U (line 18) | function U(e){return ya()?e instanceof Element||e instanceof V(e).Elemen...
function W (line 18) | function W(e){return ya()?e instanceof HTMLElement||e instanceof V(e).HT...
function Sa (line 18) | function Sa(e){return!ya()||typeof ShadowRoot>`u`?!1:e instanceof Shadow...
function wa (line 18) | function wa(e){let{overflow:t,overflowX:n,overflowY:r,display:i}=G(e);re...
function Ea (line 18) | function Ea(e){return Ta.has(ba(e))}
function Oa (line 18) | function Oa(e){return Da.some(t=>{try{return e.matches(t)}catch{return!1...
function Ma (line 18) | function Ma(e){let t=Pa(),n=U(e)?G(e):e;return ka.some(e=>n[e]?n[e]!==`n...
function Na (line 18) | function Na(e){let t=Ra(e);for(;W(t)&&!Ia(t);){if(Ma(t))return t;if(Oa(t...
function Pa (line 18) | function Pa(){return typeof CSS>`u`||!CSS.supports?!1:CSS.supports(`-web...
function Ia (line 18) | function Ia(e){return Fa.has(ba(e))}
function G (line 18) | function G(e){return V(e).getComputedStyle(e)}
function La (line 18) | function La(e){return U(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTo...
function Ra (line 18) | function Ra(e){if(ba(e)===`html`)return e;let t=e.assignedSlot||e.parent...
function za (line 18) | function za(e){let t=Ra(e);return Ia(t)?e.ownerDocument?e.ownerDocument....
function Ba (line 18) | function Ba(e,t,n){t===void 0&&(t=[]),n===void 0&&(n=!0);let r=za(e),i=r...
function Va (line 18) | function Va(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameE...
function Ha (line 18) | function Ha(e){let t=G(e),n=parseFloat(t.width)||0,r=parseFloat(t.height...
function Ua (line 18) | function Ua(e){return U(e)?e:e.contextElement}
function Wa (line 18) | function Wa(e){let t=Ua(e);if(!W(t))return B(1);let n=t.getBoundingClien...
function Ka (line 18) | function Ka(e){let t=V(e);return!Pa()||!t.visualViewport?Ga:{x:t.visualV...
function qa (line 18) | function qa(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==V(e)?!1:t}
function Ja (line 18) | function Ja(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);let i=e.getBo...
function Ya (line 18) | function Ya(e,t){let n=La(e).scrollLeft;return t?t.left+n:Ja(H(e)).left+n}
function Xa (line 18) | function Xa(e,t){let n=e.getBoundingClientRect();return{x:n.left+t.scrol...
function Za (line 18) | function Za(e){let{elements:t,rect:n,offsetParent:r,strategy:i}=e,a=i===...
function Qa (line 18) | function Qa(e){return Array.from(e.getClientRects())}
function $a (line 18) | function $a(e){let t=H(e),n=La(e),r=e.ownerDocument.body,i=z(t.scrollWid...
function eo (line 18) | function eo(e,t){let n=V(e),r=H(e),i=n.visualViewport,a=r.clientWidth,o=...
function no (line 18) | function no(e,t){let n=Ja(e,!0,t===`fixed`),r=n.top+e.clientTop,i=n.left...
function ro (line 18) | function ro(e,t,n){let r;if(t===`viewport`)r=eo(e,n);else if(t===`docume...
function io (line 18) | function io(e,t){let n=Ra(e);return n===t||!U(n)||Ia(n)?!1:G(n).position...
function ao (line 18) | function ao(e,t){let n=t.get(e);if(n)return n;let r=Ba(e,[],!1).filter(e...
function oo (line 18) | function oo(e){let{element:t,boundary:n,rootBoundary:r,strategy:i}=e,a=[...
function so (line 18) | function so(e){let{width:t,height:n}=Ha(e);return{width:t,height:n}}
function co (line 18) | function co(e,t,n){let r=W(t),i=H(t),a=n===`fixed`,o=Ja(e,!0,a,t),s={scr...
function lo (line 18) | function lo(e){return G(e).position===`static`}
function uo (line 18) | function uo(e,t){if(!W(e)||G(e).position===`fixed`)return null;if(t)retu...
function fo (line 18) | function fo(e,t){let n=V(e);if(Oa(e))return n;if(!W(e)){let t=Ra(e);for(...
function mo (line 18) | function mo(e){return G(e).direction===`rtl`}
function go (line 18) | function go(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.heigh...
function _o (line 18) | function _o(e,t){let n=null,r,i=H(e);function a(){var e;clearTimeout(r),...
function vo (line 18) | function vo(e,t,n,r){r===void 0&&(r={});let{ancestorScroll:i=!0,ancestor...
method constructor (line 18) | constructor(){super(),Eo(this,`cleanup`),Eo(this,`onButtonClick`,e=>{!br...
method observedAttributes (line 21) | static get observedAttributes(){return[`open`]}
method connectedCallback (line 21) | connectedCallback(){var e,t,n,r;this.backdrop.hidden=!this.open,this.con...
method disconnectedCallback (line 21) | disconnectedCallback(){var e,t,n,r,i;pr(this.backdrop),this.content&&pr(...
method open (line 21) | get open(){return this.hasAttribute(`open`)}
method open (line 21) | set open(e){e?this.setAttribute(`open`,``):this.removeAttribute(`open`)}
method disabled (line 21) | get disabled(){return this.hasAttribute(`disabled`)}
method attributeChangedCallback (line 21) | attributeChangedCallback(e,t,n){e===`open`&&(n===null?this.wasClosed():t...
method wasOpened (line 21) | wasOpened(){var e,t;if(!((e=this.content)!=null&&e.hidden))return;this.c...
method wasClosed (line 21) | wasClosed(){var e,t,n;(e=this.content)!=null&&e.hidden||((t=this.button)...
method backdrop (line 21) | get backdrop(){return this.shadowRoot?.firstElementChild}
method button (line 21) | get button(){return this.querySelector(`button, [role=button]`)}
method content (line 21) | get content(){return this.children[1]}
method constructor (line 21) | constructor(){super(...arguments),Ao(this,`onInitialFocus`,()=>{this.rem...
method connectedCallback (line 21) | connectedCallback(){this.hasAttribute(`role`)||this.setAttribute(`role`,...
method disconnectedCallback (line 21) | disconnectedCallback(){this.removeEventListener(`keydown`,this.onKeyDown)}
method focusControlAtIndex (line 21) | focusControlAtIndex(e){this.controls.forEach((t,n)=>{n===e?(t.setAttribu...
method controls (line 21) | get controls(){return ei(this)}
method constructor (line 21) | constructor(){super(...arguments),K(this,`parent`),K(this,`tooltip`),K(t...
method connectedCallback (line 21) | connectedCallback(){this.parent=this.parentNode,this.parent&&(this.paren...
method disconnectedCallback (line 21) | disconnectedCallback(){var e,t;(e=this.cleanup)==null||e.call(this),this...
method disabled (line 21) | get disabled(){return this.hasAttribute(`disabled`)}
method disabled (line 21) | set disabled(e){e?this.setAttribute(`disabled`,``):this.removeAttribute(...
method show (line 21) | show(){var t;if(this.disabled)return;let n=this.createTooltip();clearTim...
method hide (line 21) | hide(){var e;clearTimeout(this.timeout),(e=this.cleanup)==null||e.call(t...
method afterDelay (line 21) | afterDelay(t){clearTimeout(this.timeout);let n=parseInt(this.getAttribut...
method createTooltip (line 21) | createTooltip(){return this.tooltip||(this.tooltip=document.createElemen...
method constructor (line 21) | constructor(){this.title=``,this.count=0}
method initialize (line 21) | initialize(){this.title=document.title,this.count=0}
method increment (line 21) | increment(){this.count++,this.update()}
method reset (line 21) | reset(){this.count=0,this.update()}
method update (line 21) | update(){document.title=(this.count?`(${this.count}) `:``)+this.title}
method constructor (line 21) | constructor(){this.notificationCreatedEvent=`.Illuminate\\Notifications\...
method listenForWhisper (line 21) | listenForWhisper(e,t){return this.listen(`.client-`+e,t)}
method notification (line 21) | notification(e){return this.listen(this.notificationCreatedEvent,e)}
method stopListeningForNotification (line 21) | stopListeningForNotification(e){return this.stopListening(this.notificat...
method stopListeningForWhisper (line 21) | stopListeningForWhisper(e,t){return this.stopListening(`.client-`+e,t)}
method constructor (line 21) | constructor(e){this.namespace=e}
method format (line 21) | format(e){return[`.`,`\\`].includes(e.charAt(0))?e.substring(1):(this.na...
method setNamespace (line 21) | setNamespace(e){this.namespace=e}
function zo (line 21) | function zo(e){try{new e}catch(e){if(e instanceof Error&&e.message.inclu...
method constructor (line 21) | constructor(e,t,n){super(),this.name=t,this.pusher=e,this.options=n,this...
method subscribe (line 21) | subscribe(){this.subscription=this.pusher.subscribe(this.name)}
method unsubscribe (line 21) | unsubscribe(){this.pusher.unsubscribe(this.name)}
method listen (line 21) | listen(e,t){return this.on(this.eventFormatter.format(e),t),this}
method listenToAll (line 21) | listenToAll(e){return this.subscription.bind_global((t,n)=>{if(t.startsW...
method stopListening (line 21) | stopListening(e,t){return t?this.subscription.unbind(this.eventFormatter...
method stopListeningToAll (line 21) | stopListeningToAll(e){return e?this.subscription.unbind_global(e):this.s...
method subscribed (line 21) | subscribed(e){return this.on(`pusher:subscription_succeeded`,()=>{e()}),...
method error (line 21) | error(e){return this.on(`pusher:subscription_error`,t=>{e(t)}),this}
method on (line 21) | on(e,t){return this.subscription.bind(e,t),this}
method whisper (line 21) | whisper(e,t){return this.pusher.channels.channels[this.name].trigger(`cl...
method whisper (line 21) | whisper(e,t){return this.pusher.channels.channels[this.name].trigger(`cl...
method here (line 21) | here(e){return this.on(`pusher:subscription_succeeded`,t=>{e(Object.keys...
method joining (line 21) | joining(e){return this.on(`pusher:member_added`,t=>{e(t.info)}),this}
method whisper (line 21) | whisper(e,t){return this.pusher.channels.channels[this.name].trigger(`cl...
method leaving (line 21) | leaving(e){return this.on(`pusher:member_removed`,t=>{e(t.info)}),this}
method constructor (line 21) | constructor(e,t,n){super(),this.events={},this.listeners={},this.name=t,...
method subscribe (line 21) | subscribe(){this.socket.emit(`subscribe`,{channel:this.name,auth:this.op...
method unsubscribe (line 21) | unsubscribe(){this.unbind(),this.socket.emit(`unsubscribe`,{channel:this...
method listen (line 21) | listen(e,t){return this.on(this.eventFormatter.format(e),t),this}
method stopListening (line 21) | stopListening(e,t){return this.unbindEvent(this.eventFormatter.format(e)...
method subscribed (line 21) | subscribed(e){return this.on(`connect`,t=>{e(t)}),this}
method error (line 21) | error(e){return this}
method on (line 21) | on(e,t){return this.listeners[e]=this.listeners[e]||[],this.events[e]||(...
method unbind (line 21) | unbind(){Object.keys(this.events).forEach(e=>{this.unbindEvent(e)})}
method unbindEvent (line 21) | unbindEvent(e,t){this.listeners[e]=this.listeners[e]||[],t&&(this.listen...
method whisper (line 21) | whisper(e,t){return this.socket.emit(`client event`,{channel:this.name,e...
method here (line 21) | here(e){return this.on(`presence:subscribed`,t=>{e(t.map(e=>e.user_info)...
method joining (line 21) | joining(e){return this.on(`presence:joining`,t=>e(t.user_info)),this}
method whisper (line 21) | whisper(e,t){return this.socket.emit(`client event`,{channel:this.name,e...
method leaving (line 21) | leaving(e){return this.on(`presence:leaving`,t=>e(t.user_info)),this}
method subscribe (line 21) | subscribe(){}
method unsubscribe (line 21) | unsubscribe(){}
method listen (line 21) | listen(e,t){return this}
method listenToAll (line 21) | listenToAll(e){return this}
method stopListening (line 21) | stopListening(e,t){return this}
method subscribed (line 21) | subscribed(e){return this}
method error (line 21) | error(e){return this}
method on (line 21) | on(e,t){return this}
method whisper (line 21) | whisper(e,t){return this}
method whisper (line 21) | whisper(e,t){return this}
method here (line 21) | here(e){return this}
method joining (line 21) | joining(e){return this}
method whisper (line 21) | whisper(e,t){return this}
method leaving (line 21) | leaving(e){return this}
method constructor (line 21) | constructor(e){this.setOptions(e),this.connect()}
method setOptions (line 21) | setOptions(t){this.options={...e._defaultOptions,...t,broadcaster:t.broa...
method csrfToken (line 21) | csrfToken(){var e;return typeof window<`u`&&(e=window.Laravel)!=null&&e....
method constructor (line 21) | constructor(){super(...arguments),this.channels={}}
method connect (line 21) | connect(){if(typeof this.options.client<`u`)this.pusher=this.options.cli...
method signin (line 21) | signin(){this.pusher.signin()}
method listen (line 21) | listen(e,t,n){return this.channel(e).listen(t,n)}
method channel (line 21) | channel(e){return this.channels[e]||(this.channels[e]=new Bo(this.pusher...
method privateChannel (line 21) | privateChannel(e){return this.channels[`private-`+e]||(this.channels[`pr...
method encryptedPrivateChannel (line 21) | encryptedPrivateChannel(e){return this.channels[`private-encrypted-`+e]|...
method presenceChannel (line 21) | presenceChannel(e){return this.channels[`presence-`+e]||(this.channels[`...
method leave (line 21) | leave(e){[e,`private-`+e,`private-encrypted-`+e,`presence-`+e].forEach(e...
method leaveChannel (line 21) | leaveChannel(e){this.channels[e]&&(this.channels[e].unsubscribe(),delete...
method socketId (line 21) | socketId(){return this.pusher.connection.socket_id}
method connectionStatus (line 21) | connectionStatus(){let e=this.pusher.connection.state;switch(e){case`con...
method onConnectionChange (line 21) | onConnectionChange(e){let t=()=>{e(this.connectionStatus())},n=[`state_c...
method disconnect (line 21) | disconnect(){this.pusher.disconnect()}
method constructor (line 21) | constructor(){super(...arguments),this.channels={}}
method connect (line 21) | connect(){this.socket=this.getSocketIO()(this.options.host??void 0,this....
method getSocketIO (line 21) | getSocketIO(){if(typeof this.options.client<`u`)return this.options.clie...
method listen (line 21) | listen(e,t,n){return this.channel(e).listen(t,n)}
method channel (line 21) | channel(e){return this.channels[e]||(this.channels[e]=new Wo(this.socket...
method privateChannel (line 21) | privateChannel(e){return this.channels[`private-`+e]||(this.channels[`pr...
method presenceChannel (line 21) | presenceChannel(e){return this.channels[`presence-`+e]||(this.channels[`...
method leave (line 21) | leave(e){[e,`private-`+e,`presence-`+e].forEach(e=>{this.leaveChannel(e)})}
method leaveChannel (line 21) | leaveChannel(e){this.channels[e]&&(this.channels[e].unsubscribe(),delete...
method socketId (line 21) | socketId(){return this.socket.id}
method connectionStatus (line 21) | connectionStatus(){return this.socket.connected?`connected`:this.socket....
method onConnectionChange (line 21) | onConnectionChange(e){let t=()=>{e(this.connectionStatus())},n=[`connect...
method disconnect (line 21) | disconnect(){this.socket.disconnect()}
method constructor (line 21) | constructor(){super(...arguments),this.channels={}}
method connect (line 21) | connect(){}
method listen (line 21) | listen(e,t,n){return new qo}
method channel (line 21) | channel(e){return new qo}
method privateChannel (line 21) | privateChannel(e){return new Jo}
method encryptedPrivateChannel (line 21) | encryptedPrivateChannel(e){return new Yo}
method presenceChannel (line 21) | presenceChannel(e){return new Xo}
method leave (line 21) | leave(e){}
method leaveChannel (line 21) | leaveChannel(e){}
method socketId (line 21) | socketId(){return`fake-socket-id`}
method connectionStatus (line 21) | connectionStatus(){return`connected`}
method onConnectionChange (line 21) | onConnectionChange(e){return()=>{}}
method disconnect (line 21) | disconnect(){}
method constructor (line 21) | constructor(e){this.options=e,this.connect(),this.options.withoutInterce...
method channel (line 21) | channel(e){return this.connector.channel(e)}
method connect (line 21) | connect(){if(this.options.broadcaster===`reverb`)this.connector=new $o({...
method disconnect (line 21) | disconnect(){this.connector.disconnect()}
method join (line 21) | join(e){return this.connector.presenceChannel(e)}
method leave (line 21) | leave(e){this.connector.leave(e)}
method leaveChannel (line 21) | leaveChannel(e){this.connector.leaveChannel(e)}
method leaveAllChannels (line 21) | leaveAllChannels(){for(let e in this.connector.channels)this.leaveChanne...
method listen (line 21) | listen(e,t,n){return this.connector.listen(e,t,n)}
method private (line 21) | private(e){return this.connector.privateChannel(e)}
method encryptedPrivate (line 21) | encryptedPrivate(e){if(this.connectorSupportsEncryptedPrivateChannels(th...
method connectorSupportsEncryptedPrivateChannels (line 21) | connectorSupportsEncryptedPrivateChannels(e){return e instanceof $o||e i...
method socketId (line 21) | socketId(){return this.connector.socketId()}
method connectionStatus (line 21) | connectionStatus(){return this.connector.connectionStatus()}
method registerInterceptors (line 21) | registerInterceptors(){typeof Vue<`u`&&Vue!=null&&Vue.http&&this.registe...
method registerVueRequestInterceptor (line 21) | registerVueRequestInterceptor(){Vue.http.interceptors.push((e,t)=>{this....
method registerAxiosRequestInterceptor (line 21) | registerAxiosRequestInterceptor(){axios.interceptors.request.use(e=>(thi...
method registerjQueryAjaxSetup (line 21) | registerjQueryAjaxSetup(){typeof jQuery.ajax<`u`&&jQuery.ajaxPrefilter((...
method registerTurboRequestInterceptor (line 21) | registerTurboRequestInterceptor(){document.addEventListener(`turbo:befor...
function n (line 29) | function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{...
function r (line 29) | function r(){this.constructor=t}
method constructor (line 29) | constructor(e,t){this.lastId=0,this.prefix=e,this.name=t}
method create (line 29) | create(e){this.lastId++;var t=this.lastId,n=this.prefix+t,r=this.name+...
method remove (line 29) | remove(e){delete this[e.number]}
method constructor (line 37) | constructor(e){this.originalNode=e,this.realParentNode=e.parentNode,th...
method childNodes (line 37) | get childNodes(){let e=[],t=this.previousSibling?this.previousSibling....
method querySelectorAll (line 37) | querySelectorAll(e){return this.childNodes.reduce((t,n)=>{if(n instanc...
method insertBefore (line 37) | insertBefore(e,t){return this.realParentNode.insertBefore(e,t)}
method moveBefore (line 37) | moveBefore(e,t){return this.realParentNode.moveBefore(e,t)}
method __idiomorphRoot (line 37) | get __idiomorphRoot(){return this.originalNode}
function e (line 29) | function e(e){e===void 0&&(e=`=`),this._paddingCharacter=e}
function s (line 29) | function s(e){return o.encode(e)}
function c (line 29) | function c(e){return o.decode(e)}
function t (line 29) | function t(){return e!==null&&e.apply(this,arguments)||this}
function d (line 29) | function d(e){return u.encode(e)}
function f (line 29) | function f(e){return u.decode(e)}
method constructor (line 29) | constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}
function a (line 29) | function a(e){for(var t=new Uint8Array(o(e)),n=0,r=0;r<e.length;r++){var...
function o (line 29) | function o(e){for(var t=0,n=0;n<e.length;n++){var i=e.charCodeAt(n);if(i...
method constructor (line 29) | constructor(e){this.options=e,this.receivers=e.receivers||i,this.loadi...
method load (line 29) | load(e,t,n){var r=this;if(r.loading[e]&&r.loading[e].length>0)r.loadin...
method getRoot (line 29) | getRoot(e){var t,n=I.getDocument().location.protocol;return t=e&&e.use...
method getPath (line 29) | getPath(e,t){return this.getRoot(t)+`/`+e+this.options.suffix+`.js`}
function s (line 29) | function s(e){for(var t=[],n=0;n<e.length;n++){var r=e[n];if(r&128){var ...
class r (line 29) | class r{constructor(e,t){this.lastId=0,this.prefix=e,this.name=t}create(...
method constructor (line 29) | constructor(e,t){this.lastId=0,this.prefix=e,this.name=t}
method create (line 29) | create(e){this.lastId++;var t=this.lastId,n=this.prefix+t,r=this.name+...
method remove (line 29) | remove(e){delete this[e.number]}
method constructor (line 37) | constructor(e){this.originalNode=e,this.realParentNode=e.parentNode,th...
method childNodes (line 37) | get childNodes(){let e=[],t=this.previousSibling?this.previousSibling....
method querySelectorAll (line 37) | querySelectorAll(e){return this.childNodes.reduce((t,n)=>{if(n instanc...
method insertBefore (line 37) | insertBefore(e,t){return this.realParentNode.insertBefore(e,t)}
method moveBefore (line 37) | moveBefore(e,t){return this.realParentNode.moveBefore(e,t)}
method __idiomorphRoot (line 37) | get __idiomorphRoot(){return this.originalNode}
class o (line 29) | class o{constructor(e){this.options=e,this.receivers=e.receivers||i,this...
method constructor (line 29) | constructor(e){this.options=e,this.receivers=e.receivers||i,this.loadi...
method load (line 29) | load(e,t,n){var r=this;if(r.loading[e]&&r.loading[e].length>0)r.loadin...
method getRoot (line 29) | getRoot(e){var t,n=I.getDocument().location.protocol;return t=e&&e.use...
method getPath (line 29) | getPath(e,t){return this.getRoot(t)+`/`+e+this.options.suffix+`.js`}
class f (line 29) | class f extends Error{constructor(e){super(e),Object.setPrototypeOf(this...
method constructor (line 29) | constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}
class p (line 29) | class p extends Error{constructor(e){super(e),Object.setPrototypeOf(this...
method constructor (line 29) | constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}
class m (line 29) | class m extends Error{constructor(e){super(e),Object.setPrototypeOf(this...
method constructor (line 29) | constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}
class h (line 29) | class h extends Error{constructor(e){super(e),Object.setPrototypeOf(this...
method constructor (line 29) | constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}
class g (line 29) | class g extends Error{constructor(e){super(e),Object.setPrototypeOf(this...
method constructor (line 29) | constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}
class _ (line 29) | class _ extends Error{constructor(e){super(e),Object.setPrototypeOf(this...
method constructor (line 29) | constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}
class v (line 29) | class v extends Error{constructor(e){super(e),Object.setPrototypeOf(this...
method constructor (line 29) | constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}
class y (line 29) | class y extends Error{constructor(e){super(e),Object.setPrototypeOf(this...
method constructor (line 29) | constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}
class b (line 29) | class b extends Error{constructor(e,t){super(t),this.status=e,Object.set...
method constructor (line 29) | constructor(e,t){super(t),this.status=e,Object.setPrototypeOf(this,new...
function ee (line 29) | function ee(e){return D(ne(e))}
class ie (line 29) | class ie{constructor(e,t,n,r){this.clear=t,this.timer=e(()=>{this.timer&...
method constructor (line 29) | constructor(e,t,n,r){this.clear=t,this.timer=e(()=>{this.timer&&=r(thi...
method isRunning (line 29) | isRunning(){return this.timer!==null}
method ensureAborted (line 29) | ensureAborted(){this.timer&&=(this.clear(this.timer),null)}
function oe (line 29) | function oe(e){window.clearTimeout(e)}
function se (line 29) | function se(e){window.clearInterval(e)}
class ce (line 29) | class ce extends ae{constructor(e,t){super(setTimeout,oe,e,function(e){r...
method constructor (line 29) | constructor(e,t){super(setTimeout,oe,e,function(e){return t(),null})}
class le (line 29) | class le extends ae{constructor(e,t){super(setInterval,se,e,function(e){...
method constructor (line 29) | constructor(e,t){super(setInterval,se,e,function(e){return t(),e})}
method now (line 29) | now(){return Date.now?Date.now():new Date().valueOf()}
method defer (line 29) | defer(e){return new ce(0,e)}
method method (line 29) | method(e,...t){var n=Array.prototype.slice.call(arguments,1);return func...
function k (line 29) | function k(e,...t){for(var n=0;n<t.length;n++){var r=t[n];for(var i in r...
function ue (line 29) | function ue(){for(var e=[`Pusher`],t=0;t<arguments.length;t++)typeof arg...
function de (line 29) | function de(e,t){var n=Array.prototype.indexOf;if(e===null)return-1;if(n...
function A (line 29) | function A(e,t){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)...
function fe (line 29) | function fe(e){var t=[];return A(e,function(e,n){t.push(n)}),t}
function pe (line 29) | function pe(e){var t=[];return A(e,function(e){t.push(e)}),t}
function me (line 29) | function me(e,t,n){for(var r=0;r<e.length;r++)t.call(n||window,e[r],r,e)}
function he (line 29) | function he(e,t){for(var n=[],r=0;r<e.length;r++)n.push(t(e[r],r,e,n));r...
function ge (line 29) | function ge(e,t){var n={};return A(e,function(e,r){n[r]=t(e)}),n}
function _e (line 29) | function _e(e,t){t||=function(e){return!!e};for(var n=[],r=0;r<e.length;...
function ve (line 29) | function ve(e,t){var n={};return A(e,function(r,i){(t&&t(r,i,e,n)||r)&&(...
function ye (line 29) | function ye(e){var t=[];return A(e,function(e,n){t.push([n,e])}),t}
function be (line 29) | function be(e,t){for(var n=0;n<e.length;n++)if(t(e[n],n,e))return!0;retu...
function xe (line 29) | function xe(e,t){for(var n=0;n<e.length;n++)if(!t(e[n],n,e))return!1;ret...
function Se (line 29) | function Se(e){return ge(e,function(e){return typeof e==`object`&&(e=Te(...
function Ce (line 29) | function Ce(e){return he(ye(Se(ve(e,function(e){return e!==void 0}))),O....
function we (line 29) | function we(e){var t=[],n=[];return(function e(r,i){var a,o,s;switch(typ...
function Te (line 29) | function Te(e){try{return JSON.stringify(e)}catch{return JSON.stringify(...
class Ee (line 29) | class Ee{constructor(){this.globalLog=e=>{window.console&&window.console...
method constructor (line 29) | constructor(){this.globalLog=e=>{window.console&&window.console.log&&w...
method debug (line 29) | debug(...e){this.log(this.globalLog,e)}
method warn (line 29) | warn(...e){this.log(this.globalLogWarn,e)}
method error (line 29) | error(...e){this.log(this.globalLogError,e)}
method globalLogWarn (line 29) | globalLogWarn(e){window.console&&window.console.warn?window.console.wa...
method globalLogError (line 29) | globalLogError(e){window.console&&window.console.error?window.console....
method log (line 29) | log(e,...t){var n=ue.apply(this,arguments);xn.log?xn.log(n):xn.logToCo...
class Oe (line 29) | class Oe{constructor(e){this.src=e}send(e){var t=this,n=`Error loading `...
method constructor (line 29) | constructor(e){this.src=e}
method send (line 29) | send(e){var t=this,n=`Error loading `+t.src;t.script=document.createEl...
method cleanup (line 29) | cleanup(){this.script&&(this.script.onload=this.script.onerror=null,th...
class ke (line 29) | class ke{constructor(e,t){this.url=e,this.data=t}send(e){if(!this.reques...
method constructor (line 29) | constructor(e,t){this.url=e,this.data=t}
method send (line 29) | send(e){if(!this.request){var t=Ce(this.data),n=this.url+`/`+e.number+...
method cleanup (line 29) | cleanup(){this.request&&this.request.cleanup()}
function je (line 29) | function je(e,t,n){var r=e+(t.useTLS?`s`:``),i=t.useTLS?t.hostTLS:t.host...
function Me (line 29) | function Me(e,t){return`/app/`+e+(`?protocol=`+a.PROTOCOL+`&client=js&ve...
class Ie (line 29) | class Ie{constructor(){this._callbacks={}}get(e){return this._callbacks[...
method constructor (line 29) | constructor(){this._callbacks={}}
method get (line 29) | get(e){return this._callbacks[Le(e)]}
method add (line 29) | add(e,t,n){var r=Le(e);this._callbacks[r]=this._callbacks[r]||[],this....
method remove (line 29) | remove(e,t,n){if(!e&&!t&&!n){this._callbacks={};return}var r=e?[Le(e)]...
method removeCallback (line 29) | removeCallback(e,t,n){me(e,function(e){this._callbacks[e]=_e(this._cal...
method removeAllCallbacks (line 29) | removeAllCallbacks(e){me(e,function(e){delete this._callbacks[e]},this)}
function Le (line 29) | function Le(e){return`_`+e}
class M (line 29) | class M{constructor(e){this.callbacks=new Ie,this.global_callbacks=[],th...
method constructor (line 29) | constructor(e){this.callbacks=new Ie,this.global_callbacks=[],this.fai...
method bind (line 29) | bind(e,t,n){return this.callbacks.add(e,t,n),this}
method bind_global (line 29) | bind_global(e){return this.global_callbacks.push(e),this}
method unbind (line 29) | unbind(e,t,n){return this.callbacks.remove(e,t,n),this}
method unbind_global (line 29) | unbind_global(e){return e?(this.global_callbacks=_e(this.global_callba...
method unbind_all (line 29) | unbind_all(){return this.unbind(),this.unbind_global(),this}
method emit (line 29) | emit(e,t,n){for(var r=0;r<this.global_callbacks.length;r++)this.global...
class Re (line 29) | class Re extends M{constructor(e,t,n,r,i){super(),this.initialize=I.tran...
method constructor (line 29) | constructor(e,t,n,r,i){super(),this.initialize=I.transportConnectionIn...
method handlesActivityChecks (line 29) | handlesActivityChecks(){return!!this.hooks.handlesActivityChecks}
method supportsPing (line 29) | supportsPing(){return!!this.hooks.supportsPing}
method connect (line 29) | connect(){if(this.socket||this.state!==`initialized`)return!1;var e=th...
method close (line 29) | close(){return this.socket?(this.socket.close(),!0):!1}
method send (line 29) | send(e){return this.state===`open`?(O.defer(()=>{this.socket&&this.soc...
method ping (line 29) | ping(){this.state===`open`&&this.supportsPing()&&this.socket.ping()}
method onOpen (line 29) | onOpen(){this.hooks.beforeOpen&&this.hooks.beforeOpen(this.socket,this...
method onError (line 29) | onError(e){this.emit(`error`,{type:`WebSocketError`,error:e}),this.tim...
method onClose (line 29) | onClose(e){e?this.changeState(`closed`,{code:e.code,reason:e.reason,wa...
method onMessage (line 29) | onMessage(e){this.emit(`message`,e)}
method onActivity (line 29) | onActivity(){this.emit(`activity`)}
method bindListeners (line 29) | bindListeners(){this.socket.onopen=()=>{this.onOpen()},this.socket.one...
method unbindListeners (line 29) | unbindListeners(){this.socket&&(this.socket.onopen=void 0,this.socket....
method changeState (line 29) | changeState(e,t){this.state=e,this.timeline.info(this.buildTimelineMes...
method buildTimelineMessage (line 29) | buildTimelineMessage(e){return k({cid:this.id},e)}
class N (line 29) | class N{constructor(e){this.hooks=e}isSupported(e){return this.hooks.isS...
method constructor (line 29) | constructor(e){this.hooks=e}
method isSupported (line 29) | isSupported(e){return this.hooks.isSupported(e)}
method createConnection (line 29) | createConnection(e,t,n,r){return new Re(this.hooks,e,t,n,r)}
class Xe (line 29) | class Xe extends M{constructor(){super();var e=this;window.addEventListe...
method constructor (line 29) | constructor(){super();var e=this;window.addEventListener!==void 0&&(wi...
method isOnline (line 29) | isOnline(){return window.navigator.onLine===void 0?!0:window.navigator...
class Qe (line 29) | class Qe{constructor(e,t,n){this.manager=e,this.transport=t,this.minPing...
method constructor (line 29) | constructor(e,t,n){this.manager=e,this.transport=t,this.minPingDelay=n...
method createConnection (line 29) | createConnection(e,t,n,r){r=k({},r,{activityTimeout:this.pingDelay});v...
method isSupported (line 29) | isSupported(e){return this.manager.isAlive()&&this.transport.isSupport...
class tt (line 29) | class tt extends M{constructor(e,t){super(),this.id=e,this.transport=t,t...
method constructor (line 29) | constructor(e,t){super(),this.id=e,this.transport=t,this.activityTimeo...
method handlesActivityChecks (line 29) | handlesActivityChecks(){return this.transport.handlesActivityChecks()}
method send (line 29) | send(e){return this.transport.send(e)}
method send_event (line 29) | send_event(e,t,n){var r={event:e,data:t};return n&&(r.channel=n),j.deb...
method ping (line 29) | ping(){this.transport.supportsPing()?this.transport.ping():this.send_e...
method close (line 29) | close(){this.transport.close()}
method bindListeners (line 29) | bindListeners(){var e={message:e=>{var t;try{t=et.decodeMessage(e)}cat...
method handleCloseEvent (line 29) | handleCloseEvent(e){var t=et.getCloseAction(e),n=et.getCloseError(e);n...
class nt (line 29) | class nt{constructor(e,t){this.transport=e,this.callback=t,this.bindList...
method constructor (line 29) | constructor(e,t){this.transport=e,this.callback=t,this.bindListeners()}
method close (line 29) | close(){this.unbindListeners(),this.transport.close()}
method bindListeners (line 29) | bindListeners(){this.onMessage=e=>{this.unbindListeners();var t;try{t=...
method unbindListeners (line 29) | unbindListeners(){this.transport.unbind(`message`,this.onMessage),this...
method finish (line 29) | finish(e,t){this.callback(k({transport:this.transport,action:e},t))}
class rt (line 29) | class rt{constructor(e,t){this.timeline=e,this.options=t||{}}send(e,t){t...
method constructor (line 29) | constructor(e,t){this.timeline=e,this.options=t||{}}
method send (line 29) | send(e,t){this.timeline.isEmpty()||this.timeline.send(I.TimelineTransp...
class it (line 29) | class it extends M{constructor(e,t){super(function(t,n){j.debug(`No call...
method constructor (line 29) | constructor(e,t){super(function(t,n){j.debug(`No callbacks on `+e+` fo...
method authorize (line 29) | authorize(e,t){return t(null,{auth:``})}
method trigger (line 29) | trigger(e,t){if(e.indexOf(`client-`)!==0)throw new f(`Event '`+e+`' do...
method disconnect (line 29) | disconnect(){this.subscribed=!1,this.subscriptionPending=!1}
method handleEvent (line 29) | handleEvent(e){var t=e.event,n=e.data;t===`pusher_internal:subscriptio...
method handleSubscriptionSucceededEvent (line 29) | handleSubscriptionSucceededEvent(e){this.subscriptionPending=!1,this.s...
method handleSubscriptionCountEvent (line 29) | handleSubscriptionCountEvent(e){e.data.subscription_count&&(this.subsc...
method subscribe (line 29) | subscribe(){this.subscribed||(this.subscriptionPending=!0,this.subscri...
method unsubscribe (line 29) | unsubscribe(){this.subscribed=!1,this.pusher.send_event(`pusher:unsubs...
method cancelSubscription (line 29) | cancelSubscription(){this.subscriptionCancelled=!0}
method reinstateSubscription (line 29) | reinstateSubscription(){this.subscriptionCancelled=!1}
class at (line 29) | class at extends it{authorize(e,t){return this.pusher.config.channelAuth...
method authorize (line 29) | authorize(e,t){return this.pusher.config.channelAuthorizer({channelNam...
class ot (line 29) | class ot{constructor(){this.reset()}get(e){return Object.prototype.hasOw...
method constructor (line 29) | constructor(){this.reset()}
method get (line 29) | get(e){return Object.prototype.hasOwnProperty.call(this.members,e)?{id...
method each (line 29) | each(e){A(this.members,(t,n)=>{e(this.get(n))})}
method setMyID (line 29) | setMyID(e){this.myID=e}
method onSubscription (line 29) | onSubscription(e){this.members=e.presence.hash,this.count=e.presence.c...
method addMember (line 29) | addMember(e){return this.get(e.user_id)===null&&this.count++,this.memb...
method removeMember (line 29) | removeMember(e){var t=this.get(e.user_id);return t&&(delete this.membe...
method reset (line 29) | reset(){this.members={},this.count=0,this.myID=null,this.me=null}
function i (line 29) | function i(e){return e instanceof n?e:new n(function(t){t(e)})}
function o (line 29) | function o(e){try{c(r.next(e))}catch(e){a(e)}}
method constructor (line 29) | constructor(e){this.options=e,this.receivers=e.receivers||i,this.loadi...
method load (line 29) | load(e,t,n){var r=this;if(r.loading[e]&&r.loading[e].length>0)r.loadin...
method getRoot (line 29) | getRoot(e){var t,n=I.getDocument().location.protocol;return t=e&&e.use...
method getPath (line 29) | getPath(e,t){return this.getRoot(t)+`/`+e+this.options.suffix+`.js`}
function s (line 29) | function s(e){try{c(r.throw(e))}catch(e){a(e)}}
function c (line 29) | function c(e){e.done?n(e.value):i(e.value).then(o,s)}
class ct (line 29) | class ct extends at{constructor(e,t){super(e,t),this.members=new ot}auth...
method constructor (line 29) | constructor(e,t){super(e,t),this.members=new ot}
method authorize (line 29) | authorize(e,t){super.authorize(e,(e,n)=>st(this,void 0,void 0,function...
method handleEvent (line 29) | handleEvent(e){var t=e.event;if(t.indexOf(`pusher_internal:`)===0)this...
method handleInternalEvent (line 29) | handleInternalEvent(e){var t=e.event,n=e.data;switch(t){case`pusher_in...
method handleSubscriptionSucceededEvent (line 29) | handleSubscriptionSucceededEvent(e){this.subscriptionPending=!1,this.s...
method disconnect (line 29) | disconnect(){this.members.reset(),super.disconnect()}
class dt (line 29) | class dt extends at{constructor(e,t,n){super(e,t),this.key=null,this.nac...
method constructor (line 29) | constructor(e,t,n){super(e,t),this.key=null,this.nacl=n}
method authorize (line 29) | authorize(e,t){super.authorize(e,(e,n)=>{if(e){t(e,n);return}let r=n.s...
method trigger (line 29) | trigger(e,t){throw new _(`Client events are not currently supported fo...
method handleEvent (line 29) | handleEvent(e){var t=e.event,n=e.data;if(t.indexOf(`pusher_internal:`)...
method handleEncryptedEvent (line 29) | handleEncryptedEvent(e,t){if(!this.key){j.debug(`Received encrypted ev...
method getDataToEmit (line 29) | getDataToEmit(e){let t=(0,lt.decode)(e);try{return JSON.parse(t)}catch...
class ft (line 29) | class ft extends M{constructor(e,t){super(),this.state=`initialized`,thi...
method constructor (line 29) | constructor(e,t){super(),this.state=`initialized`,this.connection=null...
method connect (line 29) | connect(){if(!(this.connection||this.runner)){if(!this.strategy.isSupp...
method send (line 29) | send(e){return this.connection?this.connection.send(e):!1}
method send_event (line 29) | send_event(e,t,n){return this.connection?this.connection.send_event(e,...
method disconnect (line 29) | disconnect(){this.disconnectInternally(),this.updateState(`disconnecte...
method isUsingTLS (line 29) | isUsingTLS(){return this.usingTLS}
method startConnecting (line 29) | startConnecting(){var e=(t,n)=>{t?this.runner=this.strategy.connect(0,...
method abortConnecting (line 29) | abortConnecting(){this.runner&&=(this.runner.abort(),null)}
method disconnectInternally (line 29) | disconnectInternally(){this.abortConnecting(),this.clearRetryTimer(),t...
method updateStra
Condensed preview — 915 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,361K chars).
[
{
"path": ".editorconfig",
"chars": 238,
"preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\nindent_size = 4\ntrim_"
},
{
"path": ".gitattributes",
"chars": 39,
"preview": "* text=auto\nCHANGELOG.md export-ignore\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 1231,
"preview": "name: Bug Report\ndescription: Fill out a bug report about something that's broken.\nbody:\n - type: textarea\n attribut"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 601,
"preview": "blank_issues_enabled: false\n\ncontact_links:\n - name: Feature Requests and Ideas\n url: https://waterhole.dev/communit"
},
{
"path": ".github/SECURITY.md",
"chars": 680,
"preview": "# Security Policy\n\n## Reporting a Vulnerability\n\nIf you discover a security vulnerability, please report the issue direc"
},
{
"path": ".github/workflows/build-assets.yml",
"chars": 542,
"preview": "name: Build Assets\n\non: [push, pull_request]\n\njobs:\n build:\n runs-on: ubuntu-latest\n\n permissions:\n contents"
},
{
"path": ".github/workflows/phpstan.yml",
"chars": 411,
"preview": "name: PHPStan\n\non: [push, pull_request]\n\njobs:\n phpstan:\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/c"
},
{
"path": ".github/workflows/prettier.yml",
"chars": 689,
"preview": "name: Prettier\n\non: [push, pull_request]\n\njobs:\n prettier:\n runs-on: ubuntu-latest\n\n permissions:\n contents:"
},
{
"path": ".github/workflows/stale.yml",
"chars": 450,
"preview": "name: Close Stale Issues\n\non:\n workflow_dispatch:\n schedule:\n - cron: '30 1 * * *'\n\njobs:\n stale:\n runs-on: ubu"
},
{
"path": ".github/workflows/tests.yml",
"chars": 943,
"preview": "name: Tests\n\non: [push, pull_request]\n\njobs:\n tests:\n runs-on: ubuntu-latest\n\n services:\n mysql:\n ima"
},
{
"path": ".gitignore",
"chars": 113,
"preview": ".phpunit.cache\nnode_modules\n/vendor\ncomposer.lock\n.DS_Store\nThumbs.db\n.idea\n.fleet\n.vscode\n.phpunit.result.cache\n"
},
{
"path": ".prettierignore",
"chars": 63,
"preview": "config\nnode_modules\nresources/dist\nresources/views/mail\nvendor\n"
},
{
"path": ".prettierrc",
"chars": 527,
"preview": "{\n \"singleQuote\": true,\n \"phpVersion\": \"8.1\",\n \"plugins\": [\"@prettier/plugin-php\", \"prettier-plugin-blade\"],\n "
},
{
"path": ".release-it.yml",
"chars": 615,
"preview": "npm: false\n\ngit:\n commitMessage: 'Release v${version}'\n tagName: v${version}\n\ngithub:\n release: true\n releaseName: v"
},
{
"path": "CHANGELOG.md",
"chars": 18661,
"preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
},
{
"path": "LICENSE.md",
"chars": 5384,
"preview": "# Waterhole Software Licence Agreement\n\n1. **The Software:** This licence agreement relates to the software program know"
},
{
"path": "README.md",
"chars": 1522,
"preview": "<p align=\"center\">\n <img src=\"https://waterhole.dev/images/waterhole-logo.svg\" width=\"400\" alt=\"Waterhole logo\" />\n</"
},
{
"path": "composer.json",
"chars": 2627,
"preview": "{\n \"name\": \"waterhole/core\",\n \"description\": \"Waterhole core\",\n \"keywords\": [\n \"forum\"\n ],\n \"licen"
},
{
"path": "config/api.php",
"chars": 1411,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | JSON:API E"
},
{
"path": "config/auth.php",
"chars": 2501,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Authentica"
},
{
"path": "config/cp.php",
"chars": 1857,
"preview": "<?php\n\nreturn [\n /*\n |--------------------------------------------------------------------------\n | Control Pan"
},
{
"path": "config/design.php",
"chars": 1010,
"preview": "<?php\n\nreturn [\n /*\n |--------------------------------------------------------------------------\n | Theme\n |"
},
{
"path": "config/forum.php",
"chars": 3488,
"preview": "<?php\n\nreturn [\n /*\n |--------------------------------------------------------------------------\n | Forum Name\n"
},
{
"path": "config/seo.php",
"chars": 1278,
"preview": "<?php\n\nreturn [\n /*\n |--------------------------------------------------------------------------\n | Default Des"
},
{
"path": "config/system.php",
"chars": 4569,
"preview": "<?php\n\nreturn [\n /*\n |--------------------------------------------------------------------------\n | Site Key\n "
},
{
"path": "config/uploads.php",
"chars": 1373,
"preview": "<?php\n\nreturn [\n /*\n |--------------------------------------------------------------------------\n | Storage Dis"
},
{
"path": "config/users.php",
"chars": 1415,
"preview": "<?php\n\nreturn [\n /*\n |--------------------------------------------------------------------------\n | Re-verify A"
},
{
"path": "database/factories/ChannelFactory.php",
"chars": 505,
"preview": "<?php\n\nnamespace Waterhole\\Database\\Factories;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\nuse Waterhole\\Models"
},
{
"path": "database/factories/CommentFactory.php",
"chars": 305,
"preview": "<?php\n\nnamespace Waterhole\\Database\\Factories;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\nuse Waterhole\\Models"
},
{
"path": "database/factories/PageFactory.php",
"chars": 511,
"preview": "<?php\n\nnamespace Waterhole\\Database\\Factories;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\nuse Waterhole\\Models"
},
{
"path": "database/factories/PostFactory.php",
"chars": 296,
"preview": "<?php\n\nnamespace Waterhole\\Database\\Factories;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\nuse Waterhole\\Models"
},
{
"path": "database/factories/TagFactory.php",
"chars": 293,
"preview": "<?php\n\nnamespace Waterhole\\Database\\Factories;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\nuse Waterhole\\Models"
},
{
"path": "database/factories/UserFactory.php",
"chars": 611,
"preview": "<?php\n\nnamespace Waterhole\\Database\\Factories;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\nuse Waterhole\\Models"
},
{
"path": "database/migrations/2021_06_21_021231_create_channels_table.php",
"chars": 781,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2021_06_21_021344_create_users_table.php",
"chars": 1307,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2021_06_21_021345_create_notifications_table.php",
"chars": 902,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2021_06_21_021348_create_posts_table.php",
"chars": 1479,
"preview": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\nuse Waterhole\\Database\\Migration"
},
{
"path": "database/migrations/2021_06_21_021355_create_comments_table.php",
"chars": 1296,
"preview": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\nuse Waterhole\\Database\\Migration"
},
{
"path": "database/migrations/2021_06_21_021413_create_groups_table.php",
"chars": 568,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2021_06_21_021449_create_group_user_table.php",
"chars": 609,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2021_06_21_021454_create_mentions_table.php",
"chars": 566,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2021_06_21_021502_create_post_user_table.php",
"chars": 838,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2021_06_21_111526_create_permissions_table.php",
"chars": 516,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2021_10_18_130929_create_channel_user_table.php",
"chars": 732,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2021_12_04_093522_create_pages_table.php",
"chars": 549,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2021_12_04_095210_create_structure_table.php",
"chars": 541,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2021_12_04_095221_create_structure_headings_table.php",
"chars": 453,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2021_12_04_095226_create_structure_links_table.php",
"chars": 519,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_01_06_083525_create_reaction_sets_table.php",
"chars": 649,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_01_06_083700_create_reaction_types_table.php",
"chars": 782,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_01_06_084208_create_reactions_table.php",
"chars": 727,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_01_06_165934_add_reaction_set_columns_to_channels.php",
"chars": 976,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_01_13_110454_create_taxonomies_table.php",
"chars": 518,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_01_13_110537_create_tags_table.php",
"chars": 546,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_01_13_110933_create_post_tag_table.php",
"chars": 548,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_01_13_110952_create_channel_taxonomy_table.php",
"chars": 572,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_01_19_113324_create_auth_providers_table.php",
"chars": 679,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_01_26_145619_add_view_count_to_posts.php",
"chars": 504,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_02_02_115230_create_uploads_table.php",
"chars": 831,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_02_02_115236_create_attachments_table.php",
"chars": 501,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_02_02_151121_add_hotness_to_posts.php",
"chars": 495,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_02_02_153704_add_suspsended_until_to_users.php",
"chars": 499,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_03_03_083340_add_is_required_to_taxonomies.php",
"chars": 499,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_03_11_114659_add_answerable_to_channels.php",
"chars": 505,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_03_11_114850_add_answer_id_to_posts.php",
"chars": 658,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_03_16_095929_add_show_similar_posts_to_channels.php",
"chars": 521,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_04_05_165546_add_post_id_created_at_index_to_comments.php",
"chars": 516,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_04_05_165601_add_is_listed_position_index_to_structure.php",
"chars": 518,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_04_13_163452_rename_channels_sandbox_to_ignore.php",
"chars": 514,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_04_13_203750_rename_channels_default_layout_to_layout.php",
"chars": 528,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_04_13_203835_add_layout_config_to_channels.php",
"chars": 525,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_04_22_131025_add_translations_to_channels.php",
"chars": 506,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_06_08_093656_add_is_pinned_to_posts.php",
"chars": 506,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_06_08_113707_add_hiding_columns_to_comments.php",
"chars": 870,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_06_10_151000_add_created_at_to_posts_is_pinned_index.php",
"chars": 602,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2023_07_12_165151_add_deleted_at_to_posts.php",
"chars": 530,
"preview": "<?php\n\nuse Waterhole\\Database\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema"
},
{
"path": "database/migrations/2026_01_22_000001_add_rules_and_auto_assign_to_groups.php",
"chars": 549,
"preview": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\nuse Waterhole\\Database\\Migration"
},
{
"path": "database/migrations/2026_01_22_000002_add_is_approved_to_posts.php",
"chars": 518,
"preview": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\nuse Waterhole\\Database\\Migration"
},
{
"path": "database/migrations/2026_01_22_000003_add_is_approved_to_comments.php",
"chars": 520,
"preview": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\nuse Waterhole\\Database\\Migration"
},
{
"path": "database/migrations/2026_01_22_000004_add_deleted_reason_to_posts.php",
"chars": 825,
"preview": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\nuse Waterhole\\Database\\Migration"
},
{
"path": "database/migrations/2026_01_22_000005_create_flags_table.php",
"chars": 947,
"preview": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\nuse Waterhole\\Database\\Migration"
},
{
"path": "database/migrations/2026_01_22_000006_migrate_comment_hidden_to_deleted.php",
"chars": 1962,
"preview": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Schem"
},
{
"path": "database/migrations/2026_01_22_000007_add_approval_requirements_to_channels.php",
"chars": 638,
"preview": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\nuse Waterhole\\Database\\Migration"
},
{
"path": "database/migrations/2026_01_22_000008_add_deleted_notes_to_posts_and_comments.php",
"chars": 806,
"preview": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\nuse Waterhole\\Database\\Migration"
},
{
"path": "database/migrations/2026_01_24_000009_add_note_to_flags_table.php",
"chars": 489,
"preview": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\nuse Waterhole\\Database\\Migration"
},
{
"path": "database/migrations/2026_01_24_000010_add_reactions_enabled_to_channels.php",
"chars": 758,
"preview": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\nuse Waterhole\\Database\\Migration"
},
{
"path": "database/seeders/DefaultSeeder.php",
"chars": 6252,
"preview": "<?php\n\nnamespace Waterhole\\Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Arr;\nuse Illuminate"
},
{
"path": "database/seeders/GroupsSeeder.php",
"chars": 1671,
"preview": "<?php\n\nnamespace Waterhole\\Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Wat"
},
{
"path": "lang/en/auth.ftl",
"chars": 2271,
"preview": "### Auth\n\n## Laravel strings\n## https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/auth"
},
{
"path": "lang/en/cp.ftl",
"chars": 9274,
"preview": "### Localization for Waterhole Control Panel\n\ntitle = Control Panel\n\n## Dashboard\n\ndashboard-title = Dashboard\n\nconfigur"
},
{
"path": "lang/en/forum.ftl",
"chars": 5774,
"preview": "### Forum\n\nfeed-link = Feed\n\n## Header\n\nlog-in = Log In\nregister = Sign Up\n\n## Search\n\nsearch-placeholder = Search all d"
},
{
"path": "lang/en/install.ftl",
"chars": 1749,
"preview": "### Installation\n\n## Groups\n\ngroup-guest = Guest\ngroup-member = Member\ngroup-admin = Admin\ngroup-moderator = Mod\ngroup-q"
},
{
"path": "lang/en/notifications.ftl",
"chars": 1739,
"preview": "### Notifications\n\ntitle = Notifications\nmark-all-as-read-button = Mark All as Read\npreferences-button = Notification Pr"
},
{
"path": "lang/en/passwords.php",
"chars": 398,
"preview": "<?php\n\n// https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/passwords.php\n\nreturn [\n "
},
{
"path": "lang/en/system.ftl",
"chars": 2748,
"preview": "## Accessibility\n\nskip-to-main-content-link = Skip to main content\n\n## Errors\n\nfatal-error-heading = Something Went Wron"
},
{
"path": "lang/en/user.ftl",
"chars": 2365,
"preview": "### User\n\n## Account Settings\n\naccount-settings-title = Account Settings\n\ndelete-account-button = Delete Your Account\nde"
},
{
"path": "lang/en/validation.php",
"chars": 10636,
"preview": "<?php\n\n// https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/validation.php\n\nreturn [\n "
},
{
"path": "lang/fr/auth.ftl",
"chars": 2719,
"preview": "### Auth\n\n## Laravel strings\n## https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/auth"
},
{
"path": "lang/fr/cp.ftl",
"chars": 10506,
"preview": "### Localization for Waterhole Control Panel\n\ntitle = Panneau de contrôle\n\n## Dashboard\n\ndashboard-title = Tableau de bo"
},
{
"path": "lang/fr/forum.ftl",
"chars": 6434,
"preview": "### Forum\n\nfeed-link = Flux\n\n## Header\n\nlog-in = Se connecter\nregister = S'inscrire\n\n## Search\n\nsearch-placeholder = Rec"
},
{
"path": "lang/fr/install.ftl",
"chars": 2092,
"preview": "### Installation\n\n## Groups\n\ngroup-guest = Invité\ngroup-member = Membre\ngroup-admin = Administrateur\ngroup-moderator = M"
},
{
"path": "lang/fr/notifications.ftl",
"chars": 1932,
"preview": "### Notifications\n\ntitle = Notifications\nmark-all-as-read-button = Marquer tout comme lu\npreferences-button = Préférence"
},
{
"path": "lang/fr/passwords.php",
"chars": 523,
"preview": "<?php\n\n// https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/passwords.php\n\nreturn [\n "
},
{
"path": "lang/fr/system.ftl",
"chars": 2953,
"preview": "## Accessibility\n\nskip-to-main-content-link = Passer au contenu principal\n\n## Errors\n\nfatal-error-heading = Une erreur s"
},
{
"path": "lang/fr/user.ftl",
"chars": 2637,
"preview": "### User\n\n## Account Settings\n\naccount-settings-title = Paramètres du compte\n\ndelete-account-button = Supprimer votre co"
},
{
"path": "lang/fr/validation.php",
"chars": 9826,
"preview": "<?php\n\n// https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/validation.php\n\nreturn [\n "
},
{
"path": "lang/nl/auth.ftl",
"chars": 2413,
"preview": "### Auth\n\n## Laravel strings\n## https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/auth"
},
{
"path": "lang/nl/cp.ftl",
"chars": 9785,
"preview": "### Localization for Waterhole Control Panel\n\ntitle = Bedieningspaneel\n\n## Dashboard\n\ndashboard-title = Dashboard\n\nconfi"
},
{
"path": "lang/nl/forum.ftl",
"chars": 6197,
"preview": "### Forum\n\nfeed-link = Nieuwsfeed\n\n## Header\n\nlog-in = Inloggen\nregister = Registreren\n\n## Search\n\nsearch-placeholder = "
},
{
"path": "lang/nl/install.ftl",
"chars": 1915,
"preview": "### Installation\n\n## Groups\n\ngroup-guest = Gast\ngroup-member = Lid\ngroup-admin = Beheerder\ngroup-moderator = Moderator\ng"
},
{
"path": "lang/nl/notifications.ftl",
"chars": 1785,
"preview": "### Notifications\n\ntitle = Notificaties\nmark-all-as-read-button = Alles als gelezen markeren\npreferences-button = Notifi"
},
{
"path": "lang/nl/passwords.php",
"chars": 339,
"preview": "<?php\n\nreturn [\n 'reset' => 'Je wachtwoord is gereset!',\n 'sent' => 'We hebben je een link gestuurd om je wachtwoo"
},
{
"path": "lang/nl/system.ftl",
"chars": 2900,
"preview": "## Accessibility\n\nskip-to-main-content-link = Ga naar de hoofdinhoud\n\n## Errors\n\nfatal-error-heading = Er is iets fout g"
},
{
"path": "lang/nl/user.ftl",
"chars": 2450,
"preview": "### User\n\n## Account Settings\n\naccount-settings-title = Accountinstellingen\n\ndelete-account-button = Verwijder je accoun"
},
{
"path": "lang/nl/validation.php",
"chars": 9561,
"preview": "<?php\n\nreturn [\n 'accepted' => 'Het :attribute veld moet geaccepteerd worden.',\n 'accepted_if' =>\n 'Het :at"
},
{
"path": "lang/ru/auth.ftl",
"chars": 2478,
"preview": "### Auth\n\n## Laravel strings\n## https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/auth"
},
{
"path": "lang/ru/cp.ftl",
"chars": 10128,
"preview": "### Localization for Waterhole Control Panel\n\ntitle = Панель управления\n\n## Dashboard\n\ndashboard-title = Панель управлен"
},
{
"path": "lang/ru/forum.ftl",
"chars": 6333,
"preview": "### Forum\n\nfeed-link = Лента\n\n## Header\n\nlog-in = Вход\nregister = Регистрация\n\n## Search\n\nsearch-placeholder = Поиск по "
},
{
"path": "lang/ru/install.ftl",
"chars": 1859,
"preview": "### Installation\n\n## Groups\n\ngroup-guest = Гость\ngroup-member = Участник\ngroup-admin = Администратор\ngroup-moderator = М"
},
{
"path": "lang/ru/notifications.ftl",
"chars": 1833,
"preview": "### Notifications\n\ntitle = Уведомления\nmark-all-as-read-button = Отметить все как прочитанное\npreferences-button = Настр"
},
{
"path": "lang/ru/passwords.php",
"chars": 464,
"preview": "<?php\n\n// https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/passwords.php\n\nreturn [\n "
},
{
"path": "lang/ru/system.ftl",
"chars": 2936,
"preview": "## Accessibility\n\nskip-to-main-content-link = Перейти к основному содержанию\n\n## Errors\n\nfatal-error-heading = Что-то по"
},
{
"path": "lang/ru/user.ftl",
"chars": 2524,
"preview": "### User\n\n## Account Settings\n\naccount-settings-title = Настройки аккаунта\n\ndelete-account-button = Удалить аккаунт\ndele"
},
{
"path": "lang/ru/validation.php",
"chars": 9258,
"preview": "<?php\n\n// https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/validation.php\n\nreturn [\n "
},
{
"path": "lang/zh-Hant/auth.ftl",
"chars": 1556,
"preview": "### Auth\n\n## Laravel strings\n## https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/auth"
},
{
"path": "lang/zh-Hant/cp.ftl",
"chars": 6749,
"preview": "### Localization for Waterhole Control Panel\n\ntitle = 控制台\n\n## Dashboard\n\ndashboard-title = 儀表板\n\nconfigure-mail-message ="
},
{
"path": "lang/zh-Hant/forum.ftl",
"chars": 4574,
"preview": "### Forum\n\nfeed-link = 動態消息\n\n## Header\n\nlog-in = 登入\nregister = 註冊\n\n## Search\n\nsearch-placeholder = 站內文章搜尋\nsearch-results"
},
{
"path": "lang/zh-Hant/header.ftl",
"chars": 0,
"preview": ""
},
{
"path": "lang/zh-Hant/install.ftl",
"chars": 970,
"preview": "### Installation\n\n## Groups\n\ngroup-guest = 訪客\ngroup-member = 會員\ngroup-admin = 管理員\ngroup-moderator = 版主\ngroup-quarantine "
},
{
"path": "lang/zh-Hant/notifications.ftl",
"chars": 1188,
"preview": "### Notifications\n\ntitle = 通知\nmark-all-as-read-button = 全部標記為已讀\npreferences-button = 通知偏好設定\nempty-message = 沒有通知\n\n## Uns"
},
{
"path": "lang/zh-Hant/passwords.php",
"chars": 283,
"preview": "<?php\n\n// https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/passwords.php\n\nreturn [\n "
},
{
"path": "lang/zh-Hant/system.ftl",
"chars": 2215,
"preview": "## Accessibility\n\nskip-to-main-content-link = 跳至主要內容\n\n## Errors\n\nfatal-error-heading = 發生錯誤\ntry-again-button = 重試\n\nfatal"
},
{
"path": "lang/zh-Hant/user.ftl",
"chars": 1719,
"preview": "### User\n\n## Account Settings\n\naccount-settings-title = 帳戶設定\n\ndelete-account-button = 刪除帳戶\ndelete-account-confirmation-t"
},
{
"path": "lang/zh-Hant/validation.php",
"chars": 7254,
"preview": "<?php\n\n// https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/validation.php\n\nreturn [\n "
},
{
"path": "package.json",
"chars": 1870,
"preview": "{\n \"type\": \"module\",\n \"packageManager\": \"pnpm@10.28.1\",\n \"scripts\": {\n \"dev\": \"DEV=1 tsdown\",\n \"b"
},
{
"path": "phpstan.dist.neon",
"chars": 144,
"preview": "includes:\n - ./vendor/larastan/larastan/extension.neon\nparameters:\n paths:\n - src/\n level: 1\n checkOc"
},
{
"path": "phpunit.xml",
"chars": 1197,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:noNam"
},
{
"path": "postcss.config.cjs",
"chars": 576,
"preview": "module.exports = {\n parser: 'postcss-scss', // for single-line comment support\n plugins: [\n require('postcs"
},
{
"path": "resources/css/cp/_dashboard.css",
"chars": 467,
"preview": ".cp-dashboard__widgets {\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n margin: calc(-1 * var(--space-lg)"
},
{
"path": "resources/css/cp/_permission-grid.css",
"chars": 143,
"preview": ".permission-grid {\n & thead th {\n width: 9ch;\n padding-inline: var(--space-xxs);\n text-align: center;\n vert"
},
{
"path": "resources/css/cp/_structure.css",
"chars": 621,
"preview": ".cp-structure {\n padding: 0;\n overflow: hidden;\n\n & li {\n border-top: 1px solid var(--color-stroke);\n }\n\n > :fir"
},
{
"path": "resources/css/cp/app.css",
"chars": 374,
"preview": "@import '_dashboard.css';\n@import '_permission-grid.css';\n@import '_structure.css';\n\n.container {\n max-width: none;\n}\n\n"
},
{
"path": "resources/css/global/_auth.css",
"chars": 645,
"preview": ".auth-button[data-provider='facebook'] {\n background-color: #4267b2;\n color: #fff;\n}\n\n.auth-button[data-provider^='twi"
},
{
"path": "resources/css/global/_channel-card.css",
"chars": 90,
"preview": ".channel-card__inner {\n flex-basis: 30ch;\n}\n\n.channel-card__info {\n flex-basis: 30ch;\n}\n"
},
{
"path": "resources/css/global/_comment.css",
"chars": 2138,
"preview": ".comment {\n --comment-padding: var(--space-lg);\n --comment-padding-left: var(--comment-padding);\n\n padding: var(--com"
},
{
"path": "resources/css/global/_composer.css",
"chars": 2406,
"preview": ".composer {\n --height-transition-duration: 0s;\n\n border-radius: var(--radius);\n background: var(--color-bg);\n transi"
},
{
"path": "resources/css/global/_emoji.css",
"chars": 221,
"preview": ".emoji {\n display: inline-block;\n}\n\nspan.emoji {\n transform: scale(1.2);\n}\n\nimg.emoji {\n height: 1.2em;\n width: 1.2e"
},
{
"path": "resources/css/global/_flags.css",
"chars": 261,
"preview": ".flag-container {\n border: 2px solid var(--color-activity);\n box-shadow: inset 0 0 10px 2px var(--color-activity-soft)"
},
{
"path": "resources/css/global/_header.css",
"chars": 966,
"preview": ".header {\n --color-bg: var(--palette-surface);\n\n position: sticky;\n top: -1px; // ensures that .is-stuck only applies"
},
{
"path": "resources/css/global/_index.css",
"chars": 225,
"preview": "// When the sidebar becomes horizontal, move the create post button to the right side.\n@media (--md-down) {\n .index-sid"
},
{
"path": "resources/css/global/_notifications.css",
"chars": 882,
"preview": ".notifications-menu,\n.moderation-menu {\n width: 55ch;\n max-width: 100%;\n max-height: 40em;\n\n .menu-item {\n margin"
},
{
"path": "resources/css/global/_post-feed.css",
"chars": 1362,
"preview": ".post-feed__pinned {\n --grid-min: 31ch;\n}\n\n.post-feed__refresh {\n position: sticky;\n top: calc(var(--header-height) +"
},
{
"path": "resources/css/global/_post-page.css",
"chars": 339,
"preview": ".post-header {\n .post-tags-summary {\n .tag {\n font-size: var(--text-sm);\n }\n }\n\n .attribution,\n .post-tit"
},
{
"path": "resources/css/global/_reactions.css",
"chars": 550,
"preview": ".reactions-menu {\n border-radius: 999px;\n overflow: visible;\n min-width: 0;\n max-width: none;\n display: flex;\n fle"
},
{
"path": "resources/css/global/_search.css",
"chars": 82,
"preview": ".search-results .post-list-item__title a:visited {\n color: var(--color-muted);\n}\n"
},
{
"path": "resources/css/global/_text-editor.css",
"chars": 774,
"preview": ".text-editor {\n padding: 0;\n height: auto;\n min-height: 15em;\n}\n\n.text-editor__toolbar {\n margin: var(--space-xxs);\n"
},
{
"path": "resources/css/global/_user-profile.css",
"chars": 194,
"preview": ".user-profile__card {\n .avatar {\n width: 12ch;\n }\n}\n\n.user-profile__content {\n flex-basis: 60ch;\n}\n\n.user-profile_"
},
{
"path": "resources/css/global/app.css",
"chars": 409,
"preview": "@import '../system/system.css';\n\n@import '_auth.css';\n@import '_channel-card.css';\n@import '_comment.css';\n@import '_com"
},
{
"path": "resources/css/system/_alert.css",
"chars": 615,
"preview": ".alert {\n border-radius: var(--radius);\n padding: var(--space-sm) var(--space-md);\n background: var(--color-fill);\n "
},
{
"path": "resources/css/system/_alerts.css",
"chars": 457,
"preview": ".alerts {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--space-sm);\n padding: var(--spa"
},
{
"path": "resources/css/system/_attribution.css",
"chars": 742,
"preview": ":root {\n --attribution-avatar-size: 2.5em;\n}\n\n.attribution {\n padding-left: calc(var(--attribution-avatar-size) + var("
},
{
"path": "resources/css/system/_avatar.css",
"chars": 184,
"preview": ".avatar {\n border-radius: 100%;\n background: var(--color-stroke);\n width: 100%;\n height: 100%;\n aspect-ratio: 1;\n\n "
},
{
"path": "resources/css/system/_badge.css",
"chars": 1019,
"preview": ".badge,\n.tag {\n border-radius: 999px;\n background: var(--color-fill);\n color: var(--color-muted);\n border: 0;\n marg"
},
{
"path": "resources/css/system/_base.css",
"chars": 2784,
"preview": ":root {\n scroll-behavior: auto;\n}\n\nhtml {\n background: var(--color-bg);\n color: var(--color-text);\n font-family: var"
},
{
"path": "resources/css/system/_block-link.css",
"chars": 252,
"preview": ".block-link {\n display: block;\n color: inherit;\n text-decoration: none !important;\n border-radius: var(--radius);\n "
},
{
"path": "resources/css/system/_breadcrumb.css",
"chars": 283,
"preview": ".breadcrumb {\n list-style: none;\n padding: 0;\n color: var(--color-muted);\n\n > * {\n display: inline;\n }\n\n > * + "
},
{
"path": "resources/css/system/_btn.css",
"chars": 2587,
"preview": ".btn {\n --btn-height: var(--control-height);\n --btn-padding: calc(0.4 * var(--btn-height));\n\n height: var(--btn-heigh"
},
{
"path": "resources/css/system/_card.css",
"chars": 1302,
"preview": ".card {\n --color-bg: var(--palette-surface);\n\n border-radius: var(--radius);\n background: var(--color-bg);\n box-shad"
},
{
"path": "resources/css/system/_channel-label.css",
"chars": 224,
"preview": ".channel-label {\n display: inline-flex;\n align-items: center;\n gap: var(--space-xxs);\n vertical-align: bottom;\n col"
},
{
"path": "resources/css/system/_channel-picker.css",
"chars": 306,
"preview": ".channel-picker {\n .menu-item {\n padding: var(--space-sm) var(--space-md);\n gap: var(--space-md);\n\n > .icon:fi"
},
{
"path": "resources/css/system/_choice.css",
"chars": 1441,
"preview": ".choice {\n cursor: pointer;\n display: flex;\n align-items: flex-start;\n gap: var(--space-sm);\n\n > :disabled + * {\n "
},
{
"path": "resources/css/system/_color-picker.css",
"chars": 364,
"preview": ".color-picker__picker {\n position: absolute;\n z-index: var(--z-index-overlay);\n box-shadow: var(--shadow-md);\n margi"
},
{
"path": "resources/css/system/_combobox.css",
"chars": 159,
"preview": ".combobox {\n position: relative;\n}\n\n.combobox__list {\n position: absolute;\n top: 100%;\n left: 0;\n max-width: none !"
},
{
"path": "resources/css/system/_dialog.css",
"chars": 773,
"preview": ".dialog {\n --color-bg: var(--palette-surface);\n\n margin-left: auto;\n margin-right: auto;\n max-width: 100%;\n border-"
},
{
"path": "resources/css/system/_divider.css",
"chars": 418,
"preview": ".divider {\n display: flex;\n align-items: center;\n color: var(--color-muted);\n text-transform: uppercase;\n font-size"
},
{
"path": "resources/css/system/_emoji-picker.css",
"chars": 624,
"preview": ".emoji-picker {\n padding: 0;\n max-width: none;\n\n & emoji-picker {\n --border-color: var(--color-stroke);\n --bord"
},
{
"path": "resources/css/system/_form.css",
"chars": 792,
"preview": ".field {\n display: flex;\n flex-wrap: wrap;\n column-gap: var(--space-md);\n row-gap: var(--space-xs);\n align-items: f"
},
{
"path": "resources/css/system/_highlightjs.css",
"chars": 4638,
"preview": ":root,\n[data-theme='light'] {\n /*!\n Theme: GitHub\n Description: Light theme as seen on github.com\n Author: git"
},
{
"path": "resources/css/system/_icon.css",
"chars": 724,
"preview": ".icon {\n display: inline-block;\n height: 1.2em;\n width: 1.2em;\n vertical-align: -0.2em;\n flex-shrink: 0;\n object-f"
},
{
"path": "resources/css/system/_input.css",
"chars": 2791,
"preview": "input:where(\n [type='date'],\n [type='datetime-local'],\n [type='email'],\n [type='file'],\n [type='month'],\n [type='n"
},
{
"path": "resources/css/system/_mention.css",
"chars": 249,
"preview": ".mention {\n color: inherit;\n border-radius: var(--radius);\n font-weight: var(--weight-bold);\n}\n\n.mention--self {\n ba"
},
{
"path": "resources/css/system/_menu.css",
"chars": 2809,
"preview": ".menu {\n --color-bg: var(--palette-surface);\n --color-text: var(--palette-text);\n\n display: block;\n background: var("
},
{
"path": "resources/css/system/_modal.css",
"chars": 1061,
"preview": "/* Style the modal container */\nui-modal {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n align-item"
},
{
"path": "resources/css/system/_nav.css",
"chars": 1558,
"preview": ".nav {\n list-style: none;\n margin-inline: 0;\n padding-inline: 0;\n}\n\n.nav-heading {\n margin-bottom: var(--space-xs);\n"
},
{
"path": "resources/css/system/_placeholder.css",
"chars": 298,
"preview": ".placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--space-sm);\n text-align: c"
},
{
"path": "resources/css/system/_reset.css",
"chars": 669,
"preview": "// Inspired by https://github.com/andy-piccalilli/modern-css-reset\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n "
},
{
"path": "resources/css/system/_sidebar.css",
"chars": 1478,
"preview": ":root {\n --sidebar-width: 25ch;\n}\n\n.with-sidebar {\n display: flex;\n align-items: flex-start;\n justify-content: cente"
},
{
"path": "resources/css/system/_skip-link.css",
"chars": 291,
"preview": ".skip-link {\n color: var(--color-accent-contrast);\n background-color: var(--color-accent);\n padding: var(--space-xs);"
},
{
"path": "resources/css/system/_spinner.css",
"chars": 550,
"preview": ".spinner {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: var(--space-sm);\n color: var"
},
{
"path": "resources/css/system/_table.css",
"chars": 1135,
"preview": ".table-container {\n overflow: auto;\n max-width: 100%;\n width: fit-content;\n\n * {\n overflow-wrap: normal;\n }\n\n &"
},
{
"path": "resources/css/system/_tabs.css",
"chars": 1604,
"preview": ".tabs {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-inline: calc(-1 * var(--space-sm));\n}\n\n.tab "
},
{
"path": "resources/css/system/_tooltip.css",
"chars": 1042,
"preview": "ui-tooltip {\n // .visually-hidden\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n "
},
{
"path": "resources/css/system/_turbo.css",
"chars": 509,
"preview": "turbo-frame {\n display: block;\n}\n\n.busy-spinner[aria-busy='true'] {\n position: relative;\n min-height: 4em;\n visibili"
},
{
"path": "resources/css/system/_typography.css",
"chars": 2398,
"preview": ".h1,\n.h2,\n.h3,\nh1,\nh2,\nh3 {\n font-family: var(--font-display);\n}\n\n.h4,\n.h5,\n.h6,\nh4,\nh5,\nh6 {\n font-family: var(--font"
},
{
"path": "resources/css/system/_user-label.css",
"chars": 237,
"preview": ".user-label {\n display: inline-flex;\n align-items: baseline;\n gap: var(--space-xxs);\n vertical-align: baseline;\n co"
},
{
"path": "resources/css/system/_utils.css",
"chars": 10096,
"preview": "// Accessibility\n\n.visually-hidden {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n"
},
{
"path": "resources/css/system/_variables.css",
"chars": 7544,
"preview": ":root,\n[data-theme='light'] {\n color-scheme: light;\n\n // Background color\n --palette-bg-hsl: 250 38% 98%;\n --palette"
},
{
"path": "resources/css/system/breakpoints.css",
"chars": 330,
"preview": "@custom-media --sm (width <= 40rem);\n@custom-media --md-up (width > 40rem);\n@custom-media --md-down (width <= 52rem);\n@c"
},
{
"path": "resources/css/system/mixins.css",
"chars": 656,
"preview": "@define-mixin clickable {\n &:is(:disabled, .is-disabled) {\n opacity: 0.5;\n cursor: default;\n }\n\n &.is-inert {\n "
},
{
"path": "resources/css/system/system.css",
"chars": 1009,
"preview": "@import '_variables.css';\n\n// Base styles\n@import '_reset.css';\n@import '_base.css';\n@import '_typography.css';\n\n// Base"
}
]
// ... and 715 more files (download for full content)
About this extraction
This page contains the full source code of the waterholeforum/core GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 915 files (2.1 MB), approximately 598.2k tokens, and a symbol index with 5557 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.