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` - `` component renamed to `` - `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 ================================================

Waterhole logo

## 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 ================================================ 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 ================================================ '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 ================================================ '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 ================================================ 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 ================================================ 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--label`. | */ 'report_reasons' => ['off-topic', 'inappropriate', 'spam', 'other'], ]; ================================================ FILE: config/seo.php ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ fake()->name]; } public function public(): static { return $this->afterCreating(function (Channel $channel) { $channel->savePermissions(['group:1' => ['view' => true]]); }); } } ================================================ FILE: database/factories/CommentFactory.php ================================================ fake()->text]; } } ================================================ FILE: database/factories/PageFactory.php ================================================ 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 ================================================ fake()->text]; } } ================================================ FILE: database/factories/TagFactory.php ================================================ fake()->name]; } } ================================================ FILE: database/factories/UserFactory.php ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ id(); $table->string('name')->nullable(); }); } public function down() { Schema::dropIfExists('structure_headings'); } }; ================================================ FILE: database/migrations/2021_12_04_095226_create_structure_links_table.php ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ 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 ================================================ '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 ================================================ '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 ================================================ '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 ================================================ '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 de globale filters voor dit kanaal. channel-permissions-title = Permissies channel-approval-label = Goedkeuring channel-approval-moderators-exempt = Moderators zijn vrijgesteld van goedkeuring. channel-require-approval-posts-label = Goedkeuring vereisen voor berichten channel-require-approval-comments-label = Goedkeuring vereisen voor reacties channel-features-title = Functies channel-reactions-label = Reacties channel-reactions-posts-label = Berichten channel-reactions-comments-label = Reacties reaction-set-picker-default = Standaard ({ $name }) reaction-set-picker-none = Geen channel-taxonomies-label = Taxonomieën channel-answers-label = Antwoorden channel-enable-answers-label = Sta antwoorden toe op dit kanaal channel-enable-answers-description = Sta auteurs van berichten toe een reactie als antwoord te markeren. channel-posting-title = Berichten toevoegen channel-instructions-label = Instructies voor het toevoegen van berichten channel-instructions-description = Geef instructies die aan gebruikers worden getoond terwijl ze berichten in dit kanaal maken. channel-similar-posts-title = Vergelijkbare Berichten channel-show-similar-posts-label = Toon vergelijkbare berichten uit dit kanaal op basis van de titel delete-channel-title = Verwijder Kanaal: delete-channel-posts-label = Verwijder { $count } { $count -> [one] bericht *[other] berichten } move-to-channel-posts-label = Verplaats { $count } { $count -> [one] bericht *[other] berichten } naar een ander kanaal ## Groups groups-title = Groepen create-group-button = Groep toevoegen group-user-count = { $count } { $count -> [one] gebruiker *[other] gebruikers } edit-group-title = Bewerk Groep create-group-title = Groep Toevoegen group-details-title = Details group-name-label = Naam group-appearance-label = Uiterlijk group-show-as-badge-label = Toon deze groep als een gebruikersbadge group-color-label = Kleur group-icon-label = Icoon group-rules-title = Deelname group-auto-assign-label = Deze groep automatisch toewijzen aan nieuwe leden group-rules-requires-approval-label = Goedkeuring vereisen voor inhoud van nieuwe leden group-rules-remove-after-approval-label = Na goedkeuring uit de groep verwijderen group-permissions-title = Permissies group-global-permissions-title = Globale permissies group-structure-permissions-title = Structuurpermissies group-permission-suspend-users-label = Toestaan om gebruikers te schorsen delete-group-confirm-message = Weet u zeker dat u deze groep wilt verwijderen? ## Users users-title = Gebruikers users-filter-placeholder = Filter gebruikers users-filter-group-description = Filter op groep create-user-button = Gebruiker Toevoegen users-name-column = Naam users-email-column = E-mail users-groups-column = Groepen users-created-at-column = Aangemaakt users-last-seen-at-column = Laatst gezien users-empty-message = Geen resultaten gevonden edit-user-title = Bewerk Gebruiker create-user-title = Maak een Gebruiker user-account-title = Account user-name-label = Naam user-email-label = E-mail user-password-label = Wachtwoord user-set-password-label = Stel nieuw wachtwoord in user-groups-label = Groepen user-profile-title = Profiel user-created-message = Gebruiker aangemaakt. user-saved-message = Gebruiker opgeslagen. delete-user-title = Verwijder { $count -> [one] Gebruiker: *[other] { $count } Gebruikers } keep-user-content-label = Inhoud behouden en als anoniem markeren delete-user-content-label = Verwijder inhoud permanent delete-user-success-message = Gebruiker verwijderd. ## Reactions reactions-title = Reacties reaction-sets-title = Reactiesets create-reaction-set-button = Maak Reactieset edit-reaction-set-title = Bewerk Reactieset create-reaction-set-title = Reactieset Toevoegen reaction-set-details-title = Details reaction-set-name-label = Naam reaction-set-usage-label = Gebruik reaction-set-default-posts = Gebruik als standaard voor berichten reaction-set-default-comments = Gebruik als standaard voor reacties delete-reaction-set-confirm-message = Weet u zeker dat u deze reactieset wilt verwijderen? reaction-set-saved-message = Reactieset opgeslagen. reaction-types-title = Reactietypes reaction-types-empty-message = Geen Reactietypes reaction-types-add-button = Toevoegen edit-reaction-type-title = Bewerk Reactietype create-reaction-type-title = Reactietype Toevoegen reaction-type-name-label = Naam reaction-type-score-label = Score reaction-type-score-description = Het aantal punten dat deze reactie waard is. delete-reaction-type-confirm-message = Weet u zeker dat u dit reactietype wilt verwijderen? reaction-type-saved-message = Reactietype opgeslagen. ## Taxonomies taxonomies-title = Taxonomieën create-taxonomy-button = Taxonomie Toevoegen create-taxonomy-title = Taxonomie Toevoegen edit-taxonomy-title = Bewerk Taxonomie taxonomy-details-title = Details taxonomy-permissions-title = Permissies taxonomy-tags-title = Tags taxonomy-name-label = Naam taxonomy-options-title = Opties taxonomy-required-label = Vereis een tag bij het aanmaken van een bericht taxonomy-allow-multiple-label = Sta selectie van meerdere tags toe taxonomy-saved-message = Taxonomie opgeslagen. delete-taxonomy-confirm-message = Weet u zeker dat u deze taxonomie wilt verwijderen? create-tag-title = Maak een Tag edit-tag-title = Bewerk Tag tag-name-label = Naam tag-saved-message = Tag opgeslagen. delete-tag-confirm-message = Weet u zeker dat u deze tag wilt verwijderen? ## Licensing license-error-message = Uw licentie kon niet worden gevalideerd, omdat er een fout optrad bij de communicatie met de Waterhole API. ({ $status }) license-invalid-message = Koop of voer een geldige licentiesleutel in voor deze site om te voldoen aan de licentie overeenkomst. license-expired-message = U bent niet gelicentieerd om deze versie van Waterhole te gebruiken. Downgrade of vernieuw uw licentie. license-suspended-message = Uw Waterhole licentie is geschorst. Neem contact met ons op voor meer informatie. trial-badge = Proefversie licensed-badge = Gelicenseerd unlicensed-badge = Ongelicenseerd ================================================ FILE: lang/nl/forum.ftl ================================================ ### Forum feed-link = Nieuwsfeed ## Header log-in = Inloggen register = Registreren ## Search search-placeholder = Zoek in alle discussies search-results-title = Zoekresultaten voor "{ $query }" search-button = Zoeken search-filter-button = Filteren search-showing-results-title = Toont { $total } { $total -> [one] resultaat *[other] resultaten } search-showing-results-non-exhaustive-title = Toont { $total }+ { $total -> [one] resultaat *[other] resultaten } search-sort-relevance = Sorteer op Relevantie search-sort-latest = Sorteer op Nieuwste search-sort-top = Sorteer op Top search-empty-message = Geen Resultaten Gevonden search-keywords-too-short-message = Uw zoekwoorden zijn te kort - probeer iets langer. ## Posts post-activity-replied = gereageerd post-activity-posted = geplaatst post-new-badge = Nieuw post-new-badge-tooltip = Nieuw bericht post-locked-badge = Vergrendeld post-answered-badge = Beantwoord post-trash-badge = Prullenbak post-removed-message = Bericht verwijderd post-answered-by = Beantwoord door post-view-answer-link = Bekijk Antwoord post-unread-comments-badge-tooltip = { $count } { $count -> [one] ongelezen reactie *[other] ongelezen reacties } post-comments-heading = { $count } { $count -> [one] Reactie *[other] Reacties } mark-as-read-instruction = Klik om als gelezen te markeren post-comments-link = { $count } { $count -> [one] reactie *[other] reacties } add-reaction-button = Reactie Toevoegen move-post-title = Verplaats { $count -> [one] Bericht: *[other] { $count } Berichten } move-to-channel-button = Verplaats naar Kanaal move-to-channel-confirm-button = Verplaatsen mark-as-read-button = Markeer als Gelezen create-post-button = Maak een Bericht create-post-title = Nieuw Bericht post-channel-label = Kanaal post-submit-button = Plaatsen edit-post-title = Bewerk Bericht edit-post-link = Bewerk Bericht post-title-label = Titel similar-posts-label = Bekijk deze vergelijkbare berichten: post-body-label = Inhoud channel-picker-placeholder = Selecteer een Kanaal delete-post-confirm-message = Weet u zeker dat u dit bericht wilt verwijderen? delete-post-success-message = Bericht verwijderd. original-post-link = Origineel Bericht pin-to-top-button = Bovenaan Vastpinnen unpin-button = Losmaken post-comment-button = Reageer move-to-trash-button = Verplaats naar Prullenbak restore-button = Herstellen delete-forever-button = Voorgoed Verwijderen ## Comments comments-unread-heading = Ongelezen comments-unread-link = Ongelezen create-comment-title = Schrijf een Reactie edit-comment-title = Bewerk Reactie comment-number-title = Reactie #{ $number } comment-in-reply-to-link = Als antwoord op comment-show-replies-button = Toon { $count } { $count -> [one] antwoord *[other] antwoorden } comment-reply-button = Antwoord mark-as-answer-button = Markeer als Antwoord unmark-as-answer-button = Deselecteren als Antwoord comment-answer-badge = Antwoord comments-locked-message = Reacties zijn vergrendeld. lock-comments-button = Vergrendel Reacties unlock-comments-button = Ontgrendel Reacties composer-placeholder = Schrijf een reactie... composer-reply-to-placeholder = Antwoord aan { $userName }... composer-replying-to-label = Antwoord aan composer-clear-reply-button = Wissen composer-submit = Plaatsen delete-comment-confirm-message = Weet u zeker dat u deze reactie wilt verwijderen? comment-removed-message = Reactie verwijderd comment-removed-tooltip = { $user } heeft { $timestamp } verwijderd ## Moderation remove-button = Verwijderen removed-by-label = Verwijderd door removal-reason-label = Reden van verwijdering removal-reason-unspecified-label = Niet opgegeven removal-message-label = Bericht aan auteur report-button = Melden report-confirm-button = Melding indienen report-note-placeholder = Voeg een notitie toe (optioneel) report-system-user = Systeem user-actions-label = Gebruikersacties user-actions-suspend-label = Schors { $user } user-actions-suspend-days = Dagen user-actions-suspend-weeks = Weken user-actions-suspend-indefinitely = Onbepaald approve-button = Goedkeuren flag-dismiss-button = Afwijzen report-reason-off-topic-label = Buiten onderwerp report-reason-off-topic-description = Deze inhoud is niet relevant voor de huidige discussie. report-reason-inappropriate-label = Ongepast report-reason-inappropriate-description = Deze inhoud is beledigend, grof of in strijd met de gemeenschapsrichtlijnen. report-reason-spam-label = Spam report-reason-spam-description = Deze inhoud is reclame of vandalisme. report-reason-other-label = Overig report-reason-other-description = Deze inhoud vereist om een andere reden aandacht. report-reason-approval-label = In afwachting van goedkeuring moderation-title = Moderatie moderation-empty-message = Geen meldingen in afwachting moderation-finished-message = Je bent helemaal bij. pending-approval-title = In afwachting van goedkeuring ## Misc quote-button = Citeren attribution-timestamp-created-label = Geplaatst attribution-timestamp-edited-label = Bewerkt ## Filters filter-alphabetical = Alfabetisch filter-following = Volgend filter-ignoring = Negerend filter-newest = Nieuwste filter-latest = Laatste filter-oldest = Oudste filter-top = Top filter-top-all-time = Altijd filter-top-year = Jaar filter-top-quarter = Kwartaal filter-top-month = Maand filter-top-week = Week filter-top-day = Dag filter-trending = Populair filter-trash = Prullenbak ## Followables follow-button = Volgen follow-button-following = Volgend follow-button-ignored = Genegeerd ignore-button = Negeren unfollow-button = Ontvolgen unignore-button = Niet meer negeren channel-follow-description = Ontvang een melding wanneer er nieuwe berichten zijn in dit kanaal. post-follow-description = Ontvang een melding wanneer er nieuwe reacties zijn op dit bericht. post-following-badge = Volgend post-ignored-badge = Genegeerd ## Index menu-button = Menu navigation-title = Forum Navigatie post-feed-new-activity-button = Nieuwe Activiteit post-feed-new-activity-heading = Nieuwe Activiteit post-feed-empty-message = Geen Berichten post-feed-controls-layout-heading = Weergeven als ================================================ FILE: lang/nl/install.ftl ================================================ ### Installation ## Groups group-guest = Gast group-member = Lid group-admin = Beheerder group-moderator = Moderator group-quarantine = Quarantaine ## Reactions reaction-set-emoji = Emoji reaction-type-like = Vind ik leuk reaction-type-love = Liefde reaction-type-laugh = Lachen reaction-type-wow = Wauw reaction-type-sad = Verdrietig reaction-type-angry = Boos reaction-set-votes = Stemmen reaction-type-upvote = Stem omhoog ## Structure announcements-name = Aankondigingen announcements-description = Nieuws en andere updates van het team. introductions-name = Introducties introductions-description = Nieuw in de gemeenschap? Stel jezelf voor! support-name = Ondersteuning support-description = Hulp nodig bij de installatie, het gebruik en het aanpassen van ons product. ideas-name = Ideeën ideas-description = Heb je een idee? We horen het graag! staff-name = Alleen voor Personeel staff-description = Een privékanaal voor het personeel. guide-title = Gemeenschapsgids guide-body = Welkom bij { $forumName }, en bedankt voor je deelname! We willen dat iedereen het meeste uit deze gemeenschap haalt, dus vragen we je om deze richtlijnen te lezen en te volgen. - **Wees beschaafd.** Dit is een plek om kennis en interesses te delen via gesprekken. Wees vriendelijk, geduldig en respectvol naar iedereen, inclusief mensen buiten de gemeenschap. - **Geen persoonlijke aanvallen.** Het bekritiseren van ideeën, door middel van beredeneerde argumenten, is een belangrijk onderdeel van wat we hier doen. Maar het is niet oké als dat ontaardt in persoonlijke aanvallen. Andere lastig vallen of ander uitsluitend gedrag zijn nooit aanvaardbaar. - **Ga uit van goede bedoelingen.** Wanneer er meningsverschillen zijn, probeer dan te begrijpen waarom, altijd uitgaande van de goede bedoelingen van de tegenpartij. Onthoud dat verschillende mensen verschillende meningen hebben, en dat dit oké is. ================================================ FILE: lang/nl/notifications.ftl ================================================ ### Notifications title = Notificaties mark-all-as-read-button = Alles als gelezen markeren preferences-button = Notificatievoorkeuren empty-message = Geen Notificaties ## Unsubscribe unsubscribe-link = Afmelden voor deze notificaties unsubscribe-success-message = Je bent afgemeld voor deze notificaties. manage-notification-preferences-link = Beheer notificatievoorkeuren ## Mention mention-description = Vermeldingen en antwoorden op mijn reacties mention-title = Vermeld in { $post } mention-reason = Je ontvangt dit omdat je geabonneerd bent op notificaties voor dit bericht. mention-unsubscribe = Afmelden voor notificaties voor dit bericht ## Content Approved post-approved-title = Bericht goedgekeurd: { $post } comment-approved-title = Reactie goedgekeurd in { $post } ## New Comment new-comment-description = Nieuwe reacties op gevolgde berichten new-comment-title = Nieuwe reactie in { $post } new-comment-reason = Je ontvangt dit omdat je dit bericht volgt. new-comment-unsubscribe = Dit bericht niet meer volgen ## New Post new-post-description = Nieuwe berichten in gevolgde kanalen new-post-title = Nieuw bericht in { $channel }: { $post } new-post-reason = Je ontvangt dit omdat je dit kanaal volgt. new-post-unsubscribe = Dit kanaal niet meer volgen ## New Flag new-flag-description = Meldingen in kanalen die ik modereer flagged-post-title = Bericht gemeld: { $post } flagged-comment-title = Reactie gemeld in { $post } new-flag-reason = Je ontvangt dit omdat je een kanaal modereert. new-flag-unsubscribe = Afmelden voor meldingsnotificaties ## Content Removed post-removed-title = Bericht verwijderd: { $post } comment-removed-title = Reactie verwijderd in { $post } ## Common view-post-button = Bekijk Bericht view-comment-button = Bekijk Reactie ================================================ FILE: lang/nl/passwords.php ================================================ 'Je wachtwoord is gereset!', 'sent' => 'We hebben je een link gestuurd om je wachtwoord te resetten!', 'throttled' => 'Wacht even voordat je het opnieuw probeert.', 'token' => 'Dit token voor wachtwoordreset is ongeldig.', 'user' => 'We kunnen geen gebruiker vinden met dat e-mailadres.', ]; ================================================ FILE: lang/nl/system.ftl ================================================ ## Accessibility skip-to-main-content-link = Ga naar de hoofdinhoud ## Errors fatal-error-heading = Er is iets fout gegaan try-again-button = Probeer opnieuw fatal-error-message = Er is iets fout gegaan! Herlaad de pagina en probeer het opnieuw. too-many-requests-message = Je gaat een beetje te snel! Neem even pauze en probeer het zo meteen opnieuw. forbidden-message = Je hebt geen toestemming om dit te doen. session-expired-message = Je sessie is verlopen. Herlaad de pagina en probeer het opnieuw. validation-errors-message = De volgende fouten zijn gevonden: ## Generic Buttons & Links save-changes-button = Wijzigingen opslaan create-button = Toevoegen cancel-button = Annuleren change-button = Wijzigen continue-button = Doorgaan actions-button = Acties learn-more-link = Meer info delete-button = Verwijderen edit-link = Bewerken copy-link-button = Link kopiëren controls-button = Bediening more-button = Meer loading = Laden show-more-button = Toon meer ## Post Feed Layouts layout-list = Lijst layout-cards = Kaarten ## Actions confirm-action-title = Actie bevestigen delete-confirm-button = Verwijderen link-copied-message = Link gekopieerd naar het klembord. ## Users deleted-user = Verwijderde gebruiker user-list-overflow = { $count } anderen ## Pagination pagination-first-link = Eerste pagination-previous-link = Vorige pagination-next-link = Volgende pagination-last-link = Laatste load-more-button = Meer page-number-prefix = Pagina page-number-heading = Pagina { $number } ## Theme Switcher theme-button = Thema theme-light = Licht theme-dark = Donker theme-automatic = Automatisch ## Text Editor text-editor-heading = Kop text-editor-bold = Vet text-editor-italic = Cursief text-editor-quote = Citaat text-editor-code = Code text-editor-link = Link text-editor-bulleted-list = Lijst met opsommingstekens text-editor-numbered-list = Genummerde lijst text-editor-mention = Vermeld een gebruiker text-editor-emoji = Emoji invoegen text-editor-attachment = Bestanden bijvoegen text-editor-preview = Voorbeeld ## Icon Picker icon-field-label = Icoon icon-picker-change-button = Wijzigen icon-picker-none-option = Geen icon-picker-emoji-option = Emoji icon-picker-emoji-description = Voer één enkel emoji-teken in. icon-picker-svg-option = SVG-icoon icon-picker-svg-description = Voer de naam in van een icoon uit een van de volgende geïnstalleerde sets: { $sets }. icon-picker-svg-search-link = Iconen zoeken icon-picker-image-option = Afbeelding ## Abilities ability-view = Bekijken ability-comment = Reageren ability-post = Bericht ability-moderate = Modereren ability-assign-tags = Tags toewijzen ## 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/nl/user.ftl ================================================ ### User ## Account Settings account-settings-title = Accountinstellingen delete-account-button = Verwijder je account delete-account-confirmation-title = Weet je zeker dat je je account wilt verwijderen? delete-account-confirmation-description = Je accountgegevens zullen worden verwijderd. Je bijdragen blijven bewaard maar worden gemarkeerd als anoniem. Dit kan niet ongedaan worden gemaakt. delete-account-success-message = Je account is verwijderd. ## Notification Preferences notification-preferences-title = Notificatievoorkeuren notifications-label = Notificaties notification-channel-web = Web notification-channel-email = E-mail notifications-following-label = Volgende follow-on-comment-label = Automatisch berichten volgen waarop ik reageer notification-preferences-saved-message = Notificatievoorkeuren opgeslagen. ## Edit Profile edit-profile-title = Bewerk Profiel profile-saved-message = Profiel opgeslagen. avatar-label = Avatar remove-avatar-label = Avatar verwijderen headline-label = Kop headline-description = Beschrijf jezelf in een paar woorden. Dit wordt naast je naam weergegeven. bio-label = Bio bio-description = Schrijf meer over jezelf. Dit wordt op je profiel weergegeven. location-label = Locatie website-label = Website privacy-title = Privacy show-online-label = Laat zien wanneer ik voor het laatst online was ## Comments user-comments-title = Reacties van { $userName } comments-empty-message = Geen Reacties ## Posts user-posts-title = Berichten van { $userName } posts-empty-message = Geen Berichten ## User Menu profile-link = Profiel preferences-link = Voorkeuren administration-link = Beheer log-out-link = Uitloggen ## Profile user-joined-text = Lid sinds user-last-seen-text = Laatst gezien online-label = Online ## Sidebar posts-link = Berichten comments-link = Reacties preferences-heading = Voorkeuren account-settings-link = Account edit-profile-link = Profiel notification-preferences-link = Notificaties ## Admin suspend-button = Schorsen edit-suspension-button = Schorsing bewerken suspend-user-title = Schors Gebruiker not-suspended-label = Niet geschorst suspended-indefinitely-label = Onbepaald geschorst suspended-until-label = Geschorst tot... suspended-badge = Geschorst suspended-message = Je account is geschorst. copy-impersonation-url-button = Kopieer Impersonatie-URL impersonation-url-copied-message = Impersonatie-URL gekopieerd - open het in een nieuw privévenster. ================================================ FILE: lang/nl/validation.php ================================================ 'Het :attribute veld moet geaccepteerd worden.', 'accepted_if' => 'Het :attribute veld moet geaccepteerd worden wanneer :other gelijk is aan :value.', 'active_url' => 'Het :attribute veld moet een geldige URL zijn.', 'after' => 'Het :attribute veld moet een datum zijn na :date.', 'after_or_equal' => 'Het :attribute veld moet een datum zijn na of gelijk aan :date.', 'alpha' => 'Het :attribute veld mag alleen letters bevatten.', 'alpha_dash' => 'Het :attribute veld mag alleen letters, cijfers, streepjes en onderstrepingstekens bevatten.', 'alpha_num' => 'Het :attribute veld mag alleen letters en cijfers bevatten.', 'array' => 'Het :attribute veld moet een array zijn.', 'ascii' => 'Het :attribute veld mag alleen enkelbyte alfanumerieke tekens en symbolen bevatten.', 'before' => 'Het :attribute veld moet een datum zijn voor :date.', 'before_or_equal' => 'Het :attribute veld moet een datum zijn voor of gelijk aan :date.', 'between' => [ 'array' => 'Het :attribute veld moet tussen :min en :max items hebben.', 'file' => 'Het :attribute veld moet tussen :min en :max kilobytes zijn.', 'numeric' => 'Het :attribute veld moet tussen :min en :max zijn.', 'string' => 'Het :attribute veld moet tussen :min en :max karakters zijn.', ], 'boolean' => 'Het :attribute veld moet waar of onwaar zijn.', 'confirmed' => 'De bevestiging van :attribute komt niet overeen.', 'current_password' => 'Het wachtwoord is niet correct.', 'date' => 'Het :attribute veld moet een geldige datum zijn.', 'date_equals' => 'Het :attribute veld moet een datum gelijk aan :date zijn.', 'date_format' => 'Het :attribute veld komt niet overeen met het formaat :format.', 'decimal' => 'Het :attribute veld moet :decimal decimalen hebben.', 'declined' => 'Het :attribute veld moet afgewezen worden.', 'declined_if' => 'Het :attribute veld moet afgewezen worden wanneer :other gelijk is aan :value.', 'different' => 'Het :attribute veld en :other moeten verschillend zijn.', 'digits' => 'Het :attribute veld moet :digits cijfers zijn.', 'digits_between' => 'Het :attribute veld moet tussen :min en :max cijfers zijn.', 'dimensions' => 'Het :attribute veld heeft ongeldige afbeeldingsdimensies.', 'distinct' => 'Het :attribute veld heeft een dubbele waarde.', 'doesnt_end_with' => 'Het :attribute veld mag niet eindigen met een van de volgende: :values.', 'doesnt_start_with' => 'Het :attribute veld mag niet beginnen met een van de volgende: :values.', 'email' => 'Het :attribute veld moet een geldig e-mailadres zijn.', 'ends_with' => 'Het :attribute veld moet eindigen met een van de volgende: :values.', 'enum' => 'De geselecteerde :attribute is ongeldig.', 'exists' => 'De geselecteerde :attribute is ongeldig.', 'file' => 'Het :attribute veld moet een bestand zijn.', 'filled' => 'Het :attribute veld moet een waarde hebben.', 'gt' => [ 'array' => 'Het :attribute veld moet meer dan :value items hebben.', 'file' => 'Het :attribute veld moet groter zijn dan :value kilobytes.', 'numeric' => 'Het :attribute veld moet groter zijn dan :value.', 'string' => 'Het :attribute veld moet meer dan :value karakters zijn.', ], 'gte' => [ 'array' => 'Het :attribute veld moet :value items of meer hebben.', 'file' => 'Het :attribute veld moet groter dan of gelijk aan :value kilobytes zijn.', 'numeric' => 'Het :attribute veld moet groter dan of gelijk aan :value zijn.', 'string' => 'Het :attribute veld moet groter dan of gelijk aan :value karakters zijn.', ], 'image' => 'Het :attribute veld moet een afbeelding zijn.', 'in' => 'De geselecteerde :attribute is ongeldig.', 'in_array' => 'Het :attribute veld bestaat niet in :other.', 'integer' => 'Het :attribute veld moet een geheel getal zijn.', 'ip' => 'Het :attribute veld moet een geldig IP-adres zijn.', 'ipv4' => 'Het :attribute veld moet een geldig IPv4-adres zijn.', 'ipv6' => 'Het :attribute veld moet een geldig IPv6-adres zijn.', 'json' => 'Het :attribute veld moet een geldige JSON string zijn.', 'lowercase' => 'Het :attribute veld moet in kleine letters zijn.', 'lt' => [ 'array' => 'Het :attribute veld moet minder dan :value items hebben.', 'file' => 'Het :attribute veld moet minder dan :value kilobytes zijn.', 'numeric' => 'Het :attribute veld moet minder dan :value zijn.', 'string' => 'Het :attribute veld moet minder dan :value karakters zijn.', ], 'lte' => [ 'array' => 'Het :attribute veld mag niet meer dan :value items hebben.', 'file' => 'Het :attribute veld moet minder dan of gelijk aan :value kilobytes zijn.', 'numeric' => 'Het :attribute veld moet minder dan of gelijk aan :value zijn.', 'string' => 'Het :attribute veld moet minder dan of gelijk aan :value karakters zijn.', ], 'mac_address' => 'Het :attribute veld moet een geldig MAC-adres zijn.', 'max' => [ 'array' => 'Het :attribute veld mag niet meer dan :max items hebben.', 'file' => 'Het :attribute veld mag niet groter zijn dan :max kilobytes.', 'numeric' => 'Het :attribute veld mag niet groter zijn dan :max.', 'string' => 'Het :attribute veld mag niet meer dan :max karakters zijn.', ], 'max_digits' => 'Het :attribute veld mag niet meer dan :max cijfers hebben.', 'mimes' => 'Het :attribute veld moet een bestand zijn van het type: :values.', 'mimetypes' => 'Het :attribute veld moet een bestand zijn van het type: :values.', 'min' => [ 'array' => 'Het :attribute veld moet minimaal :min items hebben.', 'file' => 'Het :attribute veld moet minimaal :min kilobytes zijn.', 'numeric' => 'Het :attribute veld moet minimaal :min zijn.', 'string' => 'Het :attribute veld moet minimaal :min karakters zijn.', ], 'min_digits' => 'Het :attribute veld moet minimaal :min cijfers hebben.', 'missing' => 'Het :attribute veld moet ontbreken.', 'missing_if' => 'Het :attribute veld moet ontbreken wanneer :other gelijk is aan :value.', 'missing_unless' => 'Het :attribute veld moet ontbreken tenzij :other gelijk is aan :value.', 'missing_with' => 'Het :attribute veld moet ontbreken wanneer :values aanwezig is.', 'missing_with_all' => 'Het :attribute veld moet ontbreken wanneer :values aanwezig zijn.', 'multiple_of' => 'Het :attribute veld moet een veelvoud zijn van :value.', 'not_in' => 'De geselecteerde :attribute is ongeldig.', 'not_regex' => 'Het formaat van :attribute is ongeldig.', 'numeric' => 'Het :attribute veld moet een nummer zijn.', 'password' => [ 'letters' => 'Het :attribute veld moet ten minste één letter bevatten.', 'mixed' => 'Het :attribute veld moet ten minste één hoofdletter en één kleine letter bevatten.', 'numbers' => 'Het :attribute veld moet ten minste één nummer bevatten.', 'symbols' => 'Het :attribute veld moet ten minste één symbool bevatten.', 'uncompromised' => 'Het gegeven :attribute is verschenen in een datalek. Kies een ander :attribute.', ], 'present' => 'Het :attribute veld moet aanwezig zijn.', 'prohibited' => 'Het :attribute veld is verboden.', 'prohibited_if' => 'Het :attribute veld is verboden wanneer :other gelijk is aan :value.', 'prohibited_unless' => 'Het :attribute veld is verboden tenzij :other in :values zit.', 'prohibits' => 'Het :attribute veld verbiedt de aanwezigheid van :other.', 'regex' => 'Het formaat van :attribute is ongeldig.', 'required' => 'Het :attribute veld is verplicht.', 'required_array_keys' => 'Het :attribute veld moet ingaves bevatten voor: :values.', 'required_if' => 'Het :attribute veld is verplicht wanneer :other gelijk is aan :value.', 'required_if_accepted' => 'Het :attribute veld is verplicht wanneer :other geaccepteerd is.', 'required_unless' => 'Het :attribute veld is verplicht tenzij :other in :values zit.', 'required_with' => 'Het :attribute veld is verplicht wanneer :values aanwezig is.', 'required_with_all' => 'Het :attribute veld is verplicht wanneer :values aanwezig zijn.', 'required_without' => 'Het :attribute veld is verplicht wanneer :values niet aanwezig is.', 'required_without_all' => 'Het :attribute veld is verplicht wanneer geen van :values aanwezig zijn.', 'same' => 'Het :attribute en :other moeten overeenkomen.', 'size' => [ 'array' => 'Het :attribute veld moet :size items bevatten.', 'file' => 'Het :attribute veld moet :size kilobytes zijn.', 'numeric' => 'Het :attribute veld moet :size zijn.', 'string' => 'Het :attribute veld moet :size karakters zijn.', ], 'starts_with' => 'Het :attribute veld moet beginnen met een van de volgende: :values.', 'string' => 'Het :attribute veld moet een string zijn.', 'timezone' => 'Het :attribute veld moet een geldige tijdzone zijn.', 'unique' => 'Het :attribute is al in gebruik.', 'uploaded' => 'Het :attribute werd niet geüploaded.', 'uppercase' => 'Het :attribute veld moet in hoofdletters zijn.', 'url' => 'Het :attribute veld moet een geldige URL zijn.', 'ulid' => 'Het :attribute veld moet een geldige ULID zijn.', 'uuid' => 'Het :attribute veld moet een geldige UUID zijn.', ]; ================================================ FILE: lang/ru/auth.ftl ================================================ ### Auth ## Laravel strings ## https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/auth.php failed = Эти учетные данные не соответствуют нашим записям. password = Предоставленный пароль неверен. throttle = Слишком много попыток входа. Повторите попытку через { $seconds } секунд. ## Login login-title = Войдите в свою учетную запись login-submit = Вход login-register-prompt = У вас нет аккаунта? login-register-link = Зарегистрироваться continue-with-provider = Продолжить с { $provider } email-label = Электронная почта password-label = Пароль remember-me-label = Запомнить меня forgot-password-link = Забыли пароль? ## Forgot Password forgot-password-title = Забыли пароль? forgot-password-introduction = Запросите ссылку для сброса пароля, введя свой адрес электронной почты ниже. forgot-password-submit = Отправить ссылку для сброса пароля reset-password-title = Сброс пароля new-password-label = Новый пароль confirm-password-label = Подтвердите пароль reset-password-submit = Сброс пароля reset-password-mail-subject = Сбросить пароль reset-password-mail-body = Мы получили запрос на сброс пароля для вашей учетной записи на { $forum }. Если это были не вы, никаких дальнейших действий не требуется. Срок действия этой ссылки истекает через { $minutes } минут. reset-password-mail-button = Сброс пароля ## Register register-title = Создать аккаунт name-label = Имя пользователя register-submit = Создать аккаунт register-login-prompt = У вас уже есть аккаунт? register-login-link = Вход ## Confirm Password confirm-password-title = Подтвердите ваш пароль confirm-password-introduction = Пожалуйста, подтвердите свой пароль, прежде чем продолжить. confirm-password-submit = Подтвердить ## Email Verification email-verification-sent-message = Мы отправили электронное письмо с подтверждением на { $email }. Если оно не придет в ближайшее время, проверьте папку со спамом. email-verification-resend-button = Отправить снова email-verification-required-message = Вы должны подтвердить свой адрес электронной почты. email-verification-success-message = Спасибо за подтверждение вашей электронной почты! email-verification-mail-subject = Подтвердите адрес электронной почты email-verification-mail-body = Нажмите кнопку ниже, чтобы подтвердить свой адрес электронной почты. Если у вас нет учетной записи на { $forum }, никаких дальнейших действий не требуется. email-verification-mail-button = Подтвердите адрес электронной почты ================================================ FILE: lang/ru/cp.ftl ================================================ ### Localization for Waterhole Control Panel title = Панель управления ## Dashboard dashboard-title = Панель управления configure-mail-message = Для того, чтобы Waterhole мог отправлять письма с подтверждением, вам необходимо настроить почтовый драйвер. debug-mode-on-message = Режим отладки включен. Чувствительные значения конфигурации могут быть видны. getting-started-title = Начало работы с Waterhole getting-started-strategy-title = Документация getting-started-strategy-description = Узнайте, как построить успешное сообщество с помощью Waterhole. getting-started-structure-title = Настройка структуры getting-started-structure-description = Настройте каналы и страницы, которые составляют основу вашего сообщества. getting-started-groups-title = Определение групп пользователей getting-started-groups-description = Создайте группы для модераторов, персонала и суперпользователей. getting-started-design-title = Присоединитесь к сообществу Waterhole getting-started-design-description = Задавайте вопросы, делитесь советами и узнавайте, как получить максимальную отдачу от вашего сообщества. dashboard-users-title = Пользователи dashboard-posts-title = Сообщения dashboard-comments-title = Комментарии period-today = Сегодня period-last-7-days = Последние 7 дней period-last-4-weeks = Последние 4 недели period-last-3-months = Последние 3 месяца period-last-12-months = Последние 12 месяцев period-this-month = Текущий месяц period-this-quarter = Текущий квартал period-this-year = Текущий год period-all-time = За все время period-current-heading = Текущий период preiod-previous-heading = Предыдущий период ## Structure structure-title = Структура structure-channel-label = Канал structure-page-label = Страница structure-link-label = Ссылка structure-heading-label = Заголовок structure-visibility-public-label = Публичный structure-visibility-members-label = Участники structure-navigation-title = Навигация structure-navigation-description = Переместите элементы сюда, чтобы отображать их в меню навигации. structure-unlisted-title = Скрытые structure-unlisted-description = Переместите элементы сюда, чтобы скрыть их из меню навигации. delete-structure-confirm-message = Вы уверены, что хотите удалить этот узел? ## Structure - Heading edit-heading-title = Редактировать заголовок create-heading-title = Создать заголовок heading-name-label = Название ## Structure - Link edit-link-title = Редактировать ссылку create-link-title = Создать ссылку link-details-title = Детали link-name-label = Название link-url-label = URL-адрес link-permissions-title = Разрешения ## Structure - Page edit-page-title = Редактировать страницу create-page-title = Создать страницу page-details-title = Детали page-name-label = Название page-slug-label = ЧПУ (Slug) page-slug-url-label = Эта страница будет доступна по адресу: page-body-label = Содержание page-permissions-title = Разрешения ## Structure - Channel edit-channel-title = Редактировать канал create-channel-title = Создать канал channel-details-title = Детали channel-name-label = Название channel-slug-label = ЧПУ (Slug) channel-slug-url-label = Этот канал будет доступен по адресу: channel-description-label = Описание channel-description-description = Краткое описание назначения этого канала. channel-options-title = Параметры channel-visibility-label = Видимость channel-ignore-label = По умолчанию игнорируется channel-ignore-description = Скрыть сообщения в этом канале из ленты для всех пользователей, если они явно не подписаны на него. channel-layout-title = Разметка channel-layout-label = Разметка channel-layout-show-author-label = Показывать автора сообщения channel-layout-show-excerpt-label = Показывать отрывок сообщения channel-filters-label = Фильтры channel-custom-filters-label = Использовать пользовательские фильтры для этого канала channel-custom-filters-description = Переопределите глобальные фильтры для этого канала. channel-permissions-title = Разрешения channel-approval-label = Одобрение channel-approval-moderators-exempt = Модераторы освобождены от одобрения. channel-require-approval-posts-label = Требовать одобрения для сообщений channel-require-approval-comments-label = Требовать одобрения для комментариев channel-features-title = Возможности channel-reactions-label = Реакции channel-reactions-posts-label = Сообщения channel-reactions-comments-label = Комментарии reaction-set-picker-default = По умолчанию ({ $name }) reaction-set-picker-none = Нет channel-taxonomies-label = Таксономии channel-answers-label = Ответы channel-enable-answers-label = Включить ответы в этом канале channel-enable-answers-description = Разрешить авторам сообщений отмечать комментарии как ответы. channel-posting-title = Размещение channel-instructions-label = Инструкции по размещению channel-instructions-description = Укажите инструкции, которые будут отображаться пользователям при создании сообщений в этом канале. channel-similar-posts-title = Похожие сообщения channel-show-similar-posts-label = Показывать похожие сообщения из этого канала на основе названия delete-channel-title = Удалить канал: delete-channel-posts-label = Удалить { $count } { $count -> [one] сообщение *[few] сообщения *[other] сообщений } move-to-channel-posts-label = Переместить { $count } { $count -> [one] сообщение *[few] сообщения *[other] сообщений } в другой канал ## Groups groups-title = Группы create-group-button = Создать группу group-user-count = { $count } { $count -> [one] пользователь *[few] пользователя *[other] пользователей } edit-group-title = Редактировать группу create-group-title = Создать группу group-details-title = Детали group-name-label = Название group-appearance-label = Внешний вид group-show-as-badge-label = Отображать эту группу как значок пользователя group-color-label = Цвет group-icon-label = Иконка group-rules-title = Участие group-auto-assign-label = Автоматически назначать эту группу новым участникам group-rules-requires-approval-label = Требовать одобрения контента новых участников group-rules-remove-after-approval-label = Удалять из группы после одобрения group-permissions-title = Разрешения group-global-permissions-title = Глобальные разрешения group-structure-permissions-title = Разрешения структуры group-permission-suspend-users-label = Разрешить приостанавливать пользователей delete-group-confirm-message = Вы уверены, что хотите удалить эту группу? ## Users users-title = Пользователи users-filter-placeholder = Фильтр пользователей users-filter-group-description = Фильтр по группе create-user-button = Создать пользователя users-name-column = Имя users-email-column = Эл. почта users-groups-column = Группы users-created-at-column = Создан users-last-seen-at-column = Последний визит users-empty-message = Нет результатов edit-user-title = Редактировать пользователя create-user-title = Создать пользователя user-account-title = Аккаунт user-name-label = Имя user-email-label = Эл. почта user-password-label = Пароль user-set-password-label = Установить новый пароль user-groups-label = Группы user-profile-title = Профиль user-created-message = Пользователь создан. user-saved-message = Пользователь сохранен. delete-user-title = Удалить { $count -> [one] пользователя: *[few] { $count } пользователя *[other] { $count } пользователей } keep-user-content-label = Сохранить контент и отметить как анонимный delete-user-content-label = Удалить контент навсегда delete-user-success-message = Пользователь удален. ## Reactions reactions-title = Реакции reaction-sets-title = Наборы реакций create-reaction-set-button = Создать набор реакций edit-reaction-set-title = Редактировать набор реакций create-reaction-set-title = Создать набор реакций reaction-set-details-title = Детали reaction-set-name-label = Название reaction-set-usage-label = Использование reaction-set-default-posts = Использовать по умолчанию для сообщений reaction-set-default-comments = Использовать по умолчанию для комментариев delete-reaction-set-confirm-message = Вы уверены, что хотите удалить этот набор реакций? reaction-set-saved-message = Набор реакций сохранен. reaction-types-title = Типы реакций reaction-types-empty-message = Нет типов реакций reaction-types-add-button = Добавить edit-reaction-type-title = Редактировать тип реакции create-reaction-type-title = Создать тип реакции reaction-type-name-label = Название reaction-type-score-label = Очки reaction-type-score-description = Количество очков, присваиваемых этой реакции. delete-reaction-type-confirm-message = Вы уверены, что хотите удалить этот тип реакции? reaction-type-saved-message = Тип реакции сохранен. ## Taxonomies taxonomies-title = Таксономии create-taxonomy-button = Создать таксономию create-taxonomy-title = Создать таксономию edit-taxonomy-title = Редактировать таксономию taxonomy-details-title = Детали taxonomy-permissions-title = Разрешения taxonomy-tags-title = Теги taxonomy-name-label = Название taxonomy-options-title = Параметры taxonomy-required-label = Требовать выбор тега при создании сообщения taxonomy-allow-multiple-label = Разрешить выбор нескольких тегов taxonomy-saved-message = Таксономия сохранена. delete-taxonomy-confirm-message = Вы уверены, что хотите удалить эту таксономию? create-tag-title = Создать тег edit-tag-title = Редактировать тег tag-name-label = Название tag-saved-message = Тег сохранен. delete-tag-confirm-message = Вы уверены, что хотите удалить этот тег? ## Licensing license-error-message = Ваш лицензионный ключ не может быть проверен из-за ошибки связи с API Waterhole. ({ $status }) license-invalid-message = Пожалуйста, приобретите или введите действительный лицензионный ключ для этого сайта в соответствии с лицензионным соглашением. license-expired-message = У вас нет лицензии на использование этой версии Waterhole. Пожалуйста, снизьте версию или продлите свою лицензию. license-suspended-message = Ваша лицензия Waterhole была приостановлена. Пожалуйста, свяжитесь с нами для получения дополнительной информации. trial-badge = Пробная версия licensed-badge = Лицензировано unlicensed-badge = Без лицензии ================================================ FILE: lang/ru/forum.ftl ================================================ ### Forum feed-link = Лента ## Header log-in = Вход register = Регистрация ## Search search-placeholder = Поиск по всем дискусиям search-results-title = Результаты поиска для "{ $query }" search-button = Поиск search-filter-button = Фильтр search-showing-results-title = Показывается { $total } { $total -> [one] результат *[other] результаты } search-showing-results-non-exhaustive-title = Показывается { $total }+ { $total -> [one] результат *[other] результаты } search-sort-relevance = Сортировать по релевантности search-sort-latest = Сортировать по последним search-sort-top = Сортировать по топу search-empty-message = Результатов не найдено search-keywords-too-short-message = Ваши ключевые слова слишком короткие — попробуйте что-нибудь подлиннее. ## Posts post-activity-replied = ответил post-activity-posted = опубликовано post-new-badge = Новый post-new-badge-tooltip = Новая дискуссия post-locked-badge = Заблокировано post-answered-badge = Ответил post-trash-badge = Корзина post-removed-message = Сообщение удалено post-answered-by = Ответил post-view-answer-link = Посмотреть ответ post-unread-comments-badge-tooltip = { $count } { $count -> [one] непрочитанный комментарий *[other] непрочитанные комментарии } post-comments-heading = { $count } { $count -> [one] комментарий *[other] комментарии } mark-as-read-instruction = Нажмите, чтобы отметить как прочитанное post-comments-link = { $count } { $count -> [one] комментарий *[other] комментарии } add-reaction-button = Добавить реакцию move-post-title = Перенести { $count -> [one] Дискуссию: *[other] { $count } Дискуссии } move-to-channel-button = Перенести в канал move-to-channel-confirm-button = Перенести mark-as-read-button = Пометить, как прочитанное create-post-button = Создать дискуссию create-post-title = Новая дискуссия post-channel-label = Канал post-submit-button = Создать edit-post-title = Редактировать дискуссию edit-post-link = Редактировать дискуссию post-title-label = Заголовок similar-posts-label = Посмотрите эти похожие дискуссии: post-body-label = Содержимое channel-picker-placeholder = Выберите канал delete-post-confirm-message = Вы уверены, что хотите удалить эту запись? delete-post-success-message = Дискуссия удалено. original-post-link = Оригинальная дискуссия pin-to-top-button = Закрепить сверху unpin-button = Открепить post-comment-button = Комментировать move-to-trash-button = Переместить в корзину restore-button = Восстановить delete-forever-button = Удалить навсегда ## Comments comments-unread-heading = Не прочитано comments-unread-link = Не прочитано create-comment-title = Написать комментарий edit-comment-title = Редактировать комментарий comment-number-title = Комментарий #{ $number } comment-in-reply-to-link = В ответ на comment-show-replies-button = Показать { $count } { $count -> [one] ответ *[other] ответов } comment-reply-button = Ответить mark-as-answer-button = Отметить как ответ unmark-as-answer-button = Снять пометку как ответ comment-answer-badge = Ответить comments-locked-message = Комментарии заблокированы. lock-comments-button = Заблокировать комментарии unlock-comments-button = Разблокировать комментарии composer-placeholder = Написать комментарий... composer-reply-to-placeholder = Ответить { $userName }... composer-replying-to-label = Ответить composer-clear-reply-button = Очисить composer-submit = Опубликовать delete-comment-confirm-message = Вы уверенны, что хотите удалить этот комментарий? comment-removed-message = Комментарий удален comment-removed-tooltip = { $user } удалил { $timestamp } ## Moderation remove-button = Удалить removed-by-label = Удалено пользователем removal-reason-label = Причина удаления removal-reason-unspecified-label = Не указана removal-message-label = Сообщение автору report-button = Пожаловаться report-confirm-button = Отправить жалобу report-note-placeholder = Добавьте заметку (необязательно) report-system-user = Система user-actions-label = Действия пользователя user-actions-suspend-label = Приостановить { $user } user-actions-suspend-days = Дни user-actions-suspend-weeks = Недели user-actions-suspend-indefinitely = Бессрочно approve-button = Одобрить flag-dismiss-button = Отклонить report-reason-off-topic-label = Не по теме report-reason-off-topic-description = Этот контент не относится к текущему обсуждению. report-reason-inappropriate-label = Неприемлемо report-reason-inappropriate-description = Этот контент оскорбителен, содержит злоупотребления или нарушает правила сообщества. report-reason-spam-label = Спам report-reason-spam-description = Этот контент является рекламой или вандализмом. report-reason-other-label = Другое report-reason-other-description = Этот контент требует внимания по другой причине. report-reason-approval-label = Ожидает одобрения moderation-title = Модерация moderation-empty-message = Нет ожидающих жалоб moderation-finished-message = Вы все просмотрели. pending-approval-title = Ожидает одобрения ## Misc quote-button = Цитировать attribution-timestamp-created-label = Опубликовано attribution-timestamp-edited-label = Отредактировано ## Filters filter-alphabetical = Алфавитный filter-following = Подписка filter-ignoring = Игнорирование  filter-newest = Новые filter-latest = Последние filter-oldest = Старые filter-top = Топ filter-top-all-time = За все время filter-top-year = Год filter-top-quarter = Четверть filter-top-month = Месяц filter-top-week = Неделя filter-top-day = День filter-trending = Популярые filter-trash = Корзина ## Followables follow-button = Подписаться follow-button-following = Подписаться follow-button-ignored = Игнорируется ignore-button = Игнорировать unfollow-button = Отписаться unignore-button = Перестать игнорировать channel-follow-description = Получайте уведомления, когда на этом канале появляются новые сообщения. post-follow-description = Получайте уведомления, когда к этому посту появляются новые комментарии. post-following-badge = Подписаться post-ignored-badge = Игнорируется ## Index menu-button = Меню navigation-title = Навигация по форуму post-feed-new-activity-button = Новая активность post-feed-new-activity-heading = овая активность post-feed-empty-message = Нет сообщений post-feed-controls-layout-heading = Показать как ================================================ FILE: lang/ru/install.ftl ================================================ ### Installation ## Groups group-guest = Гость group-member = Участник group-admin = Администратор group-moderator = Модератор group-quarantine = Карантин ## Reactions reaction-set-emoji = Эмодзи reaction-type-like = Нравится reaction-type-love = Любовь reaction-type-laugh = Смех reaction-type-wow = Вау reaction-type-sad = Грусть reaction-type-angry = Злость reaction-set-votes = Голоса reaction-type-upvote = Голос вверх ## Structure announcements-name = Объявления announcements-description = Новости и другие обновления от команды. introductions-name = Представления introductions-description = Новичок в сообществе? Представьтесь! support-name = Поддержка support-description = Получите помощь по установке, использованию и настройке нашего продукта. ideas-name = Идеи ideas-description = У вас есть идея? Мы хотим ее услышать! staff-name = Только для сотрудников staff-description = Частный канал для обсуждения сотрудниками. guide-title = Руководство по сообществу guide-body = Добро пожаловать в { $forumName } и спасибо, что присоединились к нам! Мы хотим, чтобы каждый получал максимум удовольствия от этого сообщества, поэтому просим вас прочитать и следовать этим руководствам. - **Будьте вежливы.** Это место, где можно делиться знаниями и интересами через разговоры. Будьте добрыми, терпеливыми и уважительными ко всем, включая людей вне сообщества Waterhole. - **Нет личных нападок.** Критика идей с помощью обоснованных аргументов является важной частью нашей работы. Однако это не означает, что это должно переходить в личные нападки. Харассмент и другое исключительное поведение неприемлемы. - **Предположите добросовестность.** Когда возникает разногласие, старайтесь понять, почему оно возникло, всегда исходя из добрых намерений. Помните, что у разных людей могут быть разные взгляды на проблемы, и это нормально. ================================================ FILE: lang/ru/notifications.ftl ================================================ ### Notifications title = Уведомления mark-all-as-read-button = Отметить все как прочитанное preferences-button = Настройки уведомлений empty-message = Нет уведомлений ## Unsubscribe unsubscribe-link = Отписаться от этих уведомлений unsubscribe-success-message = Вы отписались от этих уведомлений. manage-notification-preferences-link = Управлять настройками уведомлений ## Mention mention-description = Упоминания и ответы на мои комментарии mention-title = Упомянут в { $post } mention-reason = Вы получили это, потому что подписаны на уведомления об упоминаниях. mention-unsubscribe = Отписаться от уведомлений об упоминаниях ## Content Approved post-approved-title = Сообщение одобрено: { $post } comment-approved-title = Комментарий одобрен в { $post } ## New Comment new-comment-description = Новые комментарии в отслеживаемых сообщениях new-comment-title = Новый комментарий в { $post } new-comment-reason = Вы получили это, потому что следите за этим сообщением. new-comment-unsubscribe = Перестать следить за этим сообщением ## New Post new-post-description = Новые сообщения в отслеживаемых каналах new-post-title = Новый пост в { $channel }: { $post } new-post-reason = Вы получили это, потому что следите за этим каналом. new-post-unsubscribe = Перестать следить за этим каналом ## New Flag new-flag-description = Жалобы в каналах, которые я модерирую flagged-post-title = Сообщение помечено: { $post } flagged-comment-title = Комментарий помечен в { $post } new-flag-reason = Вы получили это, потому что модерируете канал. new-flag-unsubscribe = Отписаться от уведомлений о жалобах ## Content Removed post-removed-title = Сообщение удалено: { $post } comment-removed-title = Комментарий удален в { $post } ## Common view-post-button = Просмотреть сообщение view-comment-button = Просмотреть комментарий ================================================ FILE: lang/ru/passwords.php ================================================ 'Ваш пароль был сброшен!', 'sent' => 'Мы отправили вам ссылку для сброса пароля по электронной почте!', 'throttled' => 'Пожалуйста, подождите перед повторной попыткой.', 'token' => 'Этот токен для сброса пароля недействителен.', 'user' => 'Мы не можем найти пользователя с указанным адресом электронной почты.', ]; ================================================ FILE: lang/ru/system.ftl ================================================ ## Accessibility skip-to-main-content-link = Перейти к основному содержанию ## Errors fatal-error-heading = Что-то пошло не так try-again-button = Попробуйте еще раз fatal-error-message = Что-то пошло не так! Пожалуйста, обновите страницу и попробуйте еще раз. too-many-requests-message = Сделайте перерыв и повторите попытку через мгновение. forbidden-message = У вас нет на это разрешения. session-expired-message = Сессия истекла. Пожалуйста, перезагрузите страницу и попробуйте снова. validation-errors-message = Были обнаружены следующие ошибки: ## Generic Buttons & Links save-changes-button = Сохранить изменения create-button = Создать cancel-button = Отменить change-button = Изменить continue-button = Продолжить actions-button = Действия learn-more-link = Узнать больше delete-button = Удалить edit-link = Редактировать copy-link-button = Копировать ссылку controls-button = Действия more-button = Больше loading = Загрузка show-more-button = Показать больше ## Post Feed Layouts layout-list = Список layout-cards = Карточки ## Actions confirm-action-title = Подтвердить действие delete-confirm-button = Удалить link-copied-message = Ссылка скопирована в буфер обмена. ## Users deleted-user = Удалить пользователя user-list-overflow = { $count } другие ## Pagination pagination-first-link = Первая pagination-previous-link = Предыдущая pagination-next-link = Следующая pagination-last-link = Последняя load-more-button = Загрузить еще page-number-prefix = Страница page-number-heading = Страница { $number } ## Theme Switcher theme-button = Тема theme-light = Светлая theme-dark = Темная theme-automatic = Автоматическая ## Text Editor text-editor-heading = Заголовок text-editor-bold = Жирный text-editor-italic = Курсив text-editor-quote = Цитата text-editor-code = Код text-editor-link = Ссылка text-editor-bulleted-list = Маркированный список text-editor-numbered-list = Нумерованный список text-editor-mention = Упомянуть пользователя text-editor-emoji = Вставить эмодзи text-editor-attachment = Прикрепить файлы text-editor-preview = Предпросмотр ## Icon Picker icon-field-label = Иконка icon-picker-change-button = Изменить icon-picker-none-option = Нет icon-picker-emoji-option = Эмодзи icon-picker-emoji-description = Введите один символ эмодзи. icon-picker-svg-option = Иконка SVG icon-picker-svg-description = Введите название иконки из одного из установленных наборов: { $sets }. icon-picker-svg-search-link = Поиск иконок icon-picker-image-option = Изображение ## Abilities ability-view = Просмотр ability-comment = Комментирование ability-post = Опубликование ability-moderate = Модерация ability-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/ru/user.ftl ================================================ ### User ## Account Settings account-settings-title = Настройки аккаунта delete-account-button = Удалить аккаунт delete-account-confirmation-title = Вы уверены, что хотите удалить свой аккаунт? delete-account-confirmation-description = Ваши данные аккаунта будут удалены. Ваши вклады будут сохранены, но помечены как анонимные. Это действие нельзя отменить. delete-account-success-message = Ваш аккаунт был удален. ## Notification Preferences notification-preferences-title = Настройки уведомлений notifications-label = Уведомления notification-channel-web = Веб-платформа notification-channel-email = Электронная почта notifications-following-label = Подписка follow-on-comment-label = Автоматически подписываться на посты, на которые я оставляю комментарии notification-preferences-saved-message = Настройки уведомлений сохранены. ## Edit Profile edit-profile-title = Редактирование профиля profile-saved-message = Профиль сохранен. avatar-label = Аватар remove-avatar-label = Удалить аватар headline-label = Заголовок headline-description = Опишите себя в нескольких словах. Это будет отображаться рядом с вашим именем. bio-label = Биография bio-description = Расскажите больше о себе. Это будет отображаться на вашем профиле. location-label = Местоположение website-label = Веб-сайт privacy-title = Конфиденциальность show-online-label = Показывать, когда я был(а) в сети ## Comments user-comments-title = Комментарии { $userName } comments-empty-message = Комментариев нет ## Posts user-posts-title = Дискуссии пользователя { $userName } posts-empty-message = Нет постов ## User Menu profile-link = Профиль preferences-link = Настройки administration-link = Администрирование log-out-link = Выйти ## Profile user-joined-text = Присоединился user-last-seen-text = Был в сети online-label = В сети ## Sidebar posts-link = Сообщения comments-link = Комментарии preferences-heading = Настройки account-settings-link = Аккаунт edit-profile-link = Профиль notification-preferences-link = Уведомления ## Admin suspend-button = Приостановить edit-suspension-button = Редактировать приостановку suspend-user-title = Приостановить not-suspended-label = Не приостановлен suspended-indefinitely-label = Бессрочная приостановка suspended-until-label = Приостановлен до... suspended-badge = Приостановлен suspended-message = Ваш аккаунт приостановлен. copy-impersonation-url-button = Копировать URL для подмены impersonation-url-copied-message = URL для подмены скопирован – откройте его в новом приватном окне. ================================================ FILE: lang/ru/validation.php ================================================ 'Поле :attribute должно быть принято.', 'accepted_if' => 'Поле :attribute должно быть принято, когда :other равно :value.', 'active_url' => 'Поле :attribute должно быть корректным URL.', 'after' => 'Поле :attribute должно быть датой после :date.', 'after_or_equal' => 'Поле :attribute должно быть датой после или равной :date.', 'alpha' => 'Поле :attribute должно содержать только буквы.', 'alpha_dash' => 'Поле :attribute должно содержать только буквы, цифры, дефисы и подчеркивания.', 'alpha_num' => 'Поле :attribute должно содержать только буквы и цифры.', 'array' => 'Поле :attribute должно быть массивом.', 'ascii' => 'Поле :attribute должно содержать только однобайтовые алфавитно-цифровые символы и символы.', 'before' => 'Поле :attribute должно быть датой до :date.', 'before_or_equal' => 'Поле :attribute должно быть датой до или равной :date.', 'between' => [ 'array' => 'Поле :attribute должно содержать от :min до :max элементов.', 'file' => 'Поле :attribute должно быть от :min до :max килобайт.', 'numeric' => 'Поле :attribute должно быть от :min до :max.', 'string' => 'Поле :attribute должно быть от :min до :max символов.', ], 'boolean' => 'Поле :attribute должно быть true или false.', 'confirmed' => 'Подтверждение поля :attribute не совпадает.', 'current_password' => 'Неверный пароль.', 'date' => 'Поле :attribute должно быть корректной датой.', 'date_equals' => 'Поле :attribute должно быть датой, равной :date.', 'date_format' => 'Поле :attribute должно соответствовать формату :format.', 'decimal' => 'Поле :attribute должно иметь :decimal десятичных знаков.', 'declined' => 'Поле :attribute должно быть отклонено.', 'declined_if' => 'Поле :attribute должно быть отклонено, когда :other равно :value.', 'different' => 'Поле :attribute и :other должны быть разными.', 'digits' => 'Поле :attribute должно быть :digits цифрами.', 'digits_between' => 'Поле :attribute должно быть от :min до :max цифр.', 'dimensions' => 'Поле :attribute имеет недопустимые размеры изображения.', 'distinct' => 'Поле :attribute имеет повторяющееся значение.', 'doesnt_end_with' => 'Поле :attribute не должно оканчиваться на одно из следующих значений: :values.', 'doesnt_start_with' => 'Поле :attribute не должно начинаться с одного из следующих значений: :values.', 'email' => 'Поле :attribute должно быть корректным адресом электронной почты.', 'ends_with' => 'Поле :attribute должно оканчиваться одним из следующих значений: :values.', 'enum' => 'Выбранное значение :attribute недопустимо.', 'exists' => 'Выбранное значение :attribute недопустимо.', 'file' => 'Поле :attribute должно быть файлом.', 'filled' => 'Поле :attribute должно иметь значение.', 'gt' => [ 'array' => 'Поле :attribute должно содержать больше :value элементов.', 'file' => 'Поле :attribute должно быть больше :value килобайт.', 'numeric' => 'Поле :attribute должно быть больше :value.', 'string' => 'Поле :attribute должно быть больше :value символов.', ], 'gte' => [ 'array' => 'Поле :attribute должно содержать :value элементов или больше.', 'file' => 'Поле :attribute должно быть больше или равно :value килобайт.', 'numeric' => 'Поле :attribute должно быть больше или равно :value.', 'string' => 'Поле :attribute должно быть больше или равно :value символов.', ], 'image' => 'Поле :attribute должно быть изображением.', 'in' => 'Выбранное значение :attribute недопустимо.', 'in_array' => 'Поле :attribute должно существовать в :other.', 'integer' => 'Поле :attribute должно быть целым числом.', 'ip' => 'Поле :attribute должно быть корректным IP-адресом.', 'ipv4' => 'Поле :attribute должно быть корректным IPv4-адресом.', 'ipv6' => 'Поле :attribute должно быть корректным IPv6-адресом.', 'json' => 'Поле :attribute должно быть корректной JSON-строкой.', 'lowercase' => 'Поле :attribute должно быть в нижнем регистре.', 'lt' => [ 'array' => 'Поле :attribute должно содержать меньше :value элементов.', 'file' => 'Поле :attribute должно быть меньше :value килобайт.', 'numeric' => 'Поле :attribute должно быть меньше :value.', 'string' => 'Поле :attribute должно быть меньше :value символов.', ], 'lte' => [ 'array' => 'Поле :attribute не должно содержать более :value элементов.', 'file' => 'Поле :attribute должно быть меньше или равно :value килобайт.', 'numeric' => 'Поле :attribute должно быть меньше или равно :value.', 'string' => 'Поле :attribute должно быть меньше или равно :value символам.', ], 'mac_address' => 'Поле :attribute должно быть действительным MAC-адресом.', 'max' => [ 'array' => 'Поле :attribute не должно содержать более :max элементов.', 'file' => 'Поле :attribute должно быть не больше :max килобайт.', 'numeric' => 'Поле :attribute должно быть не больше :max.', 'string' => 'Поле :attribute должно быть не больше :max символов.', ], 'max_digits' => 'Поле :attribute не должно содержать более :max цифр.', 'mimes' => 'Поле :attribute должно быть файлом типа: :values.', 'mimetypes' => 'Поле :attribute должно быть файлом типа: :values.', 'min' => [ 'array' => 'Поле :attribute должно содержать как минимум :min элементов.', 'file' => 'Поле :attribute должно быть не меньше :min килобайт.', 'numeric' => 'Поле :attribute должно быть не меньше :min.', 'string' => 'Поле :attribute должно быть не меньше :min символов.', ], 'min_digits' => 'Поле :attribute должно содержать как минимум :min цифр.', 'missing' => 'Поле :attribute должно отсутствовать.', 'missing_if' => 'Поле :attribute должно отсутствовать, когда :other равно :value.', 'missing_unless' => 'Поле :attribute должно отсутствовать, если :other не равно :value.', 'missing_with' => 'Поле :attribute должно отсутствовать, когда присутствует :values.', 'missing_with_all' => 'Поле :attribute должно отсутствовать, когда присутствуют :values.', 'multiple_of' => 'Поле :attribute должно быть кратным :value.', 'not_in' => 'Выбранное значение :attribute недопустимо.', 'not_regex' => 'Неверный формат поля :attribute.', 'numeric' => 'Поле :attribute должно быть числом.', 'password' => [ 'letters' => 'Поле :attribute должно содержать хотя бы одну букву.', 'mixed' => 'Поле :attribute должно содержать хотя бы одну прописную и одну строчную букву.', 'numbers' => 'Поле :attribute должно содержать хотя бы одну цифру.', 'symbols' => 'Поле :attribute должно содержать хотя бы один символ.', 'uncompromised' => 'Введенный :attribute появился в утечке данных. Пожалуйста, выберите другой :attribute.', ], 'present' => 'Поле :attribute должно быть заполнено.', 'prohibited' => 'Поле :attribute запрещено.', 'prohibited_if' => 'Поле :attribute запрещено, когда :other равно :value.', 'prohibited_unless' => 'Поле :attribute запрещено, если :other не входит в :values.', 'prohibits' => 'Поле :attribute запрещает наличие :other.', 'regex' => 'Неверный формат поля :attribute.', 'required' => 'Поле :attribute является обязательным.', 'required_array_keys' => 'Поле :attribute должно содержать записи для: :values.', 'required_if' => 'Поле :attribute является обязательным, когда :other равно :value.', 'required_if_accepted' => 'Поле :attribute является обязательным, когда :other принято.', 'required_unless' => 'Поле :attribute является обязательным, если :other не входит в :values.', 'required_with' => 'Поле :attribute является обязательным, когда присутствует :values.', 'required_with_all' => 'Поле :attribute является обязательным, когда присутствуют все :values.', 'required_without' => 'Поле :attribute является обязательным, когда отсутствует :values.', 'required_without_all' => 'Поле :attribute является обязательным, когда отсутствуют все :values.', 'same' => 'Поле :attribute должно совпадать с :other.', 'size' => [ 'array' => 'Поле :attribute должно содержать :size элементов.', 'file' => 'Поле :attribute должно быть :size килобайт.', 'numeric' => 'Поле :attribute должно быть :size.', 'string' => 'Поле :attribute должно содержать :size символов.', ], 'starts_with' => 'Поле :attribute должно начинаться с одного из следующих значений: :values.', 'string' => 'Поле :attribute должно быть строкой.', 'timezone' => 'Поле :attribute должно быть допустимым часовым поясом.', 'unique' => 'Поле :attribute уже занято.', 'uploaded' => 'Не удалось загрузить файл :attribute.', 'uppercase' => 'Поле :attribute должно быть в верхнем регистре.', 'url' => 'Поле :attribute должно быть допустимым URL.', 'ulid' => 'Поле :attribute должно быть допустимым ULID.', 'uuid' => 'Поле :attribute должно быть допустимым UUID.', ]; ================================================ FILE: lang/zh-Hant/auth.ftl ================================================ ### Auth ## Laravel strings ## https://github.com/laravel/framework/blob/master/src/Illuminate/Translation/lang/en/auth.php failed = 憑證與我們的記錄不符。 password = 提供的密碼不正確。 throttle = 登入嘗試過多。請在 { $seconds } 秒後再試。 ## Login login-title = 登入您的帳號 login-submit = 登入 login-register-prompt = 沒有帳號嗎? login-register-link = 註冊 continue-with-provider = 使用 { $provider } 繼續 email-label = 電子郵件 password-label = 密碼 remember-me-label = 記住我 forgot-password-link = 忘記密碼? ## Forgot Password forgot-password-title = 忘記密碼? forgot-password-introduction = 輸入您的電子郵件地址以請求重設密碼連結。 forgot-password-submit = 發送重設密碼連結 reset-password-title = 重設密碼 new-password-label = 新密碼 confirm-password-label = 確認密碼 reset-password-submit = 重設密碼 reset-password-mail-subject = 重設您的密碼 reset-password-mail-body = 我們收到了您在 { $forum } 上的密碼重設請求。如果這不是您的操作,則無需進一步操作。此連結將在 { $minutes } 分鐘後過期。 reset-password-mail-button = 重設密碼 ## Register register-title = 建立帳號 name-label = 使用者名稱 register-submit = 建立帳號 register-login-prompt = 已經有帳號了嗎? register-login-link = 登入 ## Confirm Password confirm-password-title = 檢查密碼 confirm-password-introduction = 在繼續之前,請重新輸入您的密碼。 confirm-password-submit = 確認 ## Email Verification email-verification-sent-message = 我們已經向 { $email } 發送了一封確認郵件。如果沒有收到,請檢查您的垃圾郵件資料夾。 email-verification-resend-button = 重新發送 email-verification-required-message = 您必須驗證您的電子郵件地址。 email-verification-success-message = 感謝您驗證您的電子郵件! email-verification-mail-subject = 驗證電子郵件地址 email-verification-mail-body = 請點擊下面的按鈕驗證您的電子郵件地址。如果您在 { $forum } 上沒有帳號,則無需進一步操作。 email-verification-mail-button = 驗證電子郵件地址 ================================================ FILE: lang/zh-Hant/cp.ftl ================================================ ### Localization for Waterhole Control Panel title = 控制台 ## Dashboard dashboard-title = 儀表板 configure-mail-message = 您需要配置郵件驅動程序,以便 Waterhole 能夠發送驗證郵件及寄送通知。 debug-mode-on-message = 調試模式已啟用。敏感配置值可能會被暴露。 getting-started-title = 開始使用 Waterhole getting-started-strategy-title = 閱讀文檔 getting-started-strategy-description = 學習如何通過 Waterhole 構建一個成功的社區。 getting-started-structure-title = 設置您的佈局 getting-started-structure-description = 配置構成您社區框架的頻道和頁面。 getting-started-groups-title = 定義用戶組 getting-started-groups-description = 為版主、工作人員和超級用戶設置用戶組。 getting-started-design-title = 加入 Waterhole 社區 getting-started-design-description = 提出問題、分享技巧,並了解如何充分利用您的社區。 dashboard-users-title = 用戶 dashboard-posts-title = 帖子 dashboard-comments-title = 評論 period-today = 今天 period-last-7-days = 最近 7 天 period-last-4-weeks = 最近 4 週 period-last-3-months = 最近 3 個月 period-last-12-months = 最近 12 個月 period-this-month = 本月 period-this-quarter = 本季 period-this-year = 今年 period-all-time = 所有時間 period-current-heading = 當前時期 preiod-previous-heading = 上一時期 ## Structure structure-title = 佈局 structure-channel-label = 頻道 structure-page-label = 頁面 structure-link-label = 連結 structure-heading-label = 標題 structure-visibility-public-label = 公開 structure-visibility-members-label = 會員 structure-navigation-title = 導航 structure-navigation-description = 將項目移至此處以在導航菜單中顯示。 structure-unlisted-title = 不列入清單 structure-unlisted-description = 將項目移至此處以從導航菜單中隱藏。 delete-structure-confirm-message = 您確定要刪除此佈局嗎? ## Structure - Heading edit-heading-title = 編輯標題 create-heading-title = 建立標題 heading-name-label = 名稱 ## Structure - Link edit-link-title = 編輯連結 create-link-title = 建立連結 link-details-title = 詳細資料 link-name-label = 名稱 link-url-label = 網址 link-permissions-title = 權限 ## Structure - Page edit-page-title = 編輯頁面 create-page-title = 建立頁面 page-details-title = 詳細資料 page-name-label = 名稱 page-slug-label = 網址別名 page-slug-url-label = 此頁面將可透過以下網址存取: page-body-label = 內容 page-permissions-title = 權限 ## Structure - Channel edit-channel-title = 編輯頻道 create-channel-title = 建立頻道 channel-details-title = 詳細資料 channel-name-label = 名稱 channel-slug-label = 網址別名 channel-slug-url-label = 此頻道將可透過以下網址存取: channel-description-label = 描述 channel-description-description = 簡要描述此頻道的用途。 channel-options-title = 選項 channel-visibility-label = 可見性 channel-ignore-label = 預設為"忽略" channel-ignore-description = 對於所有使用者,在動態消息中隱藏此頻道的帖子,除非他們明確追蹤該頻道。 channel-layout-title = 顯示式樣 channel-layout-label = 格式 channel-layout-show-author-label = 顯示發帖者 channel-layout-show-excerpt-label = 顯示摘要 channel-filters-label = 篩選器 channel-custom-filters-label = 使用自訂篩選器 channel-custom-filters-description = 覆蓋此頻道的全域篩選器。 channel-permissions-title = 權限 channel-approval-label = 核准 channel-approval-moderators-exempt = 版主不需核准。 channel-require-approval-posts-label = 貼文需核准 channel-require-approval-comments-label = 評論需核准 channel-features-title = 功能 channel-reactions-label = 回應 channel-reactions-posts-label = 帖子 channel-reactions-comments-label = 評論 reaction-set-picker-default = 預設({ $name }) reaction-set-picker-none = 無 channel-taxonomies-label = 標籤 channel-answers-label = 答案 channel-enable-answers-label = 啟用此頻道的答案功能 channel-enable-answers-description = 允許帖子作者將評論標記為答案。 channel-posting-title = 發帖 channel-instructions-label = 發帖指南 channel-instructions-description = 提供給使用者在此頻道中創建帖子時顯示的指示。 channel-similar-posts-title = 相似帖子 channel-show-similar-posts-label = 根據標題顯示此頻道中的相似帖子 delete-channel-title = 刪除頻道: delete-channel-posts-label = 刪除 { $count } { $count -> [one] 帖子 *[other] 帖子 } move-to-channel-posts-label = 將 { $count } { $count -> [one] 帖子 *[other] 帖子 } 移至其他頻道 ## Groups groups-title = 群組 create-group-button = 建立群組 group-user-count = { $count } { $count -> [one] 使用者 *[other] 使用者 } edit-group-title = 編輯群組 create-group-title = 建立群組 group-details-title = 詳細資訊 group-name-label = 名稱 group-appearance-label = 外觀 group-show-as-badge-label = 以使用者徽章顯示此群組 group-color-label = 顏色 group-icon-label = 圖示 group-rules-title = 參與 group-auto-assign-label = 自動將此群組指派給新成員 group-rules-requires-approval-label = 新成員的內容需核准 group-rules-remove-after-approval-label = 核准後從群組移除 group-permissions-title = 權限 group-global-permissions-title = 全域權限 group-structure-permissions-title = 結構權限 group-permission-suspend-users-label = 允許停權使用者 delete-group-confirm-message = 確定要刪除這個群組嗎? ## Users users-title = 會員用戶 users-filter-placeholder = 篩選用戶 users-filter-group-description = 依群組篩選 create-user-button = 建立用戶 users-name-column = 姓名 users-email-column = 電子郵件 users-groups-column = 群組 users-created-at-column = 建立時間 users-last-seen-at-column = 最後登入時間 users-empty-message = 找不到結果 edit-user-title = 編輯用戶 create-user-title = 建立用戶 user-account-title = 帳戶 user-name-label = 姓名 user-email-label = 電子郵件 user-password-label = 密碼 user-set-password-label = 設定新密碼 user-groups-label = 群組 user-profile-title = 個人資料 user-created-message = 用戶已建立。 user-saved-message = 用戶已儲存。 delete-user-title = 刪除 { $count -> [one] 用戶: *[other] { $count } 用戶 } keep-user-content-label = 保留內容並標記為匿名 delete-user-content-label = 永久刪除內容 delete-user-success-message = 使用者已刪除。 ## Reactions reactions-title = 心情回應 reaction-sets-title = 表情集 create-reaction-set-button = 建立表情集 edit-reaction-set-title = 編輯表情集 create-reaction-set-title = 建立表情集 reaction-set-details-title = 詳細資訊 reaction-set-name-label = 名稱 reaction-set-usage-label = 設置 reaction-set-default-posts = 預設於文章使用 reaction-set-default-comments = 預設於評論使用 delete-reaction-set-confirm-message = 確定要刪除此表情集嗎? reaction-set-saved-message = 表情集已儲存 reaction-types-title = 反應類型 reaction-types-empty-message = 沒有設置表情集 reaction-types-add-button = 建立 edit-reaction-type-title = 編輯表情 create-reaction-type-title = 建立表情 reaction-type-name-label = 名稱 reaction-type-score-label = 分數 reaction-type-score-description = 此表情的分數值 delete-reaction-type-confirm-message = 確定要刪除此表情嗎? reaction-type-saved-message = 表情已儲存 ## Taxonomies taxonomies-title = 分類法 create-taxonomy-button = 建立分類法 create-taxonomy-title = 建立分類法 edit-taxonomy-title = 編輯分類法 taxonomy-details-title = 詳細資訊 taxonomy-permissions-title = 權限 taxonomy-tags-title = 標籤 taxonomy-name-label = 名稱 taxonomy-options-title = 選項 taxonomy-required-label = 發表文章時,要求選擇標籤 taxonomy-allow-multiple-label = 允許選擇多個標籤 taxonomy-saved-message = 分類法已儲存。 delete-taxonomy-confirm-message = 確定要刪除此分類法嗎? create-tag-title = 建立標籤 edit-tag-title = 編輯標籤 tag-name-label = 名稱 tag-saved-message = 標籤已儲存。 delete-tag-confirm-message = 確定要刪除此標籤嗎? ## Licensing license-error-message = 無法驗證您的許可證,因為與 Waterhole API 通訊時發生錯誤({ $status })。 license-invalid-message = 請購買或輸入有效的許可證金鑰,以符合許可協議。 license-expired-message = 您無權使用此版本的 Waterhole。請降級或更新您的許可證。 license-suspended-message = 您的 Waterhole 許可證已被暫停。請聯繫我們瞭解更多訊息。 trial-badge = 試用版 licensed-badge = 已許可 unlicensed-badge = 未許可 ================================================ FILE: lang/zh-Hant/forum.ftl ================================================ ### Forum feed-link = 動態消息 ## Header log-in = 登入 register = 註冊 ## Search search-placeholder = 站內文章搜尋 search-results-title = "{ $query }" 的搜尋結果 search-button = 搜尋 search-filter-button = 篩選 search-showing-results-title = 顯示 { $total } { $total -> [one] 個結果 *[other] 個結果 } search-showing-results-non-exhaustive-title = 顯示 { $total }+ { $total -> [one] 個結果 *[other] 個結果 } search-sort-relevance = 相關性排序 search-sort-latest = 最新排序 search-sort-top = 熱門排序 search-empty-message = 找不到結果 search-keywords-too-short-message = 您的關鍵字太短了,請嘗試使用更長的關鍵字。 ## Posts post-activity-replied = 回覆於 post-activity-posted = 發佈於 post-new-badge = 新 post-new-badge-tooltip = 新的貼文 post-locked-badge = 已鎖定 post-answered-badge = 已回答 post-trash-badge = 已刪除 post-removed-message = 貼文已移除 post-answered-by = 最佳答案 post-view-answer-link = 查看答案 post-unread-comments-badge-tooltip = { $count } { $count -> [one] 個未讀評論 *[other] 個未讀評論 } post-comments-heading = { $count } { $count -> [one] 個評論 *[other] 個評論 } mark-as-read-instruction = 點擊標記為已讀 post-comments-link = { $count } { $count -> [one] 個評論 *[other] 個評論 } add-reaction-button = 表達心情 move-post-title = 移動 { $count -> [one] 個貼文: *[other] { $count } 個貼文 } move-to-channel-button = 移動頻道 move-to-channel-confirm-button = 移動 mark-as-read-button = 標記為已讀 create-post-button = 發表文章 create-post-title = 新增文章 post-channel-label = 頻道 post-submit-button = 發表 edit-post-title = 編輯文章 edit-post-link = 編輯文章 post-title-label = 標題 similar-posts-label = 查看相似文章: post-body-label = 內容 channel-picker-placeholder = 選擇一個頻道 delete-post-confirm-message = 您確定要刪除此文章嗎? delete-post-success-message = 文章已刪除。 original-post-link = 原始主題 pin-to-top-button = 置頂 unpin-button = 取消置頂 post-comment-button = 發表評論 move-to-trash-button = 移至回收桶 restore-button = 還原 delete-forever-button = 永久刪除 ## Comments comments-unread-heading = 未讀 comments-unread-link = 未讀 create-comment-title = 發表評論 edit-comment-title = 編輯評論 comment-number-title = 評論 #{ $number } comment-in-reply-to-link = 回覆給 comment-show-replies-button = 顯示 { $count } { $count -> [one] 個回覆 *[other] 個回覆 } comment-reply-button = 回覆 mark-as-answer-button = 標記為最佳答案 unmark-as-answer-button = 取消最佳答案 comment-answer-badge = 最佳答案 comments-locked-message = 評論已鎖定。 lock-comments-button = 鎖定評論 unlock-comments-button = 解鎖評論 composer-placeholder = 撰寫評論… composer-reply-to-placeholder = 回覆 { $userName }… composer-replying-to-label = 正在回覆 composer-clear-reply-button = 清除 composer-submit = 發表 delete-comment-confirm-message = 您確定要刪除此評論嗎? comment-removed-message = 評論已移除 comment-removed-tooltip = { $user } 已移除 { $timestamp } ## Moderation remove-button = 移除 removed-by-label = 移除者 removal-reason-label = 移除原因 removal-reason-unspecified-label = 未指定 removal-message-label = 給作者的訊息 report-button = 檢舉 report-confirm-button = 提交檢舉 report-note-placeholder = 新增備註(選填) report-system-user = 系統 user-actions-label = 使用者動作 user-actions-suspend-label = 停權 { $user } user-actions-suspend-days = 天 user-actions-suspend-weeks = 週 user-actions-suspend-indefinitely = 永久 approve-button = 核准 flag-dismiss-button = 忽略 report-reason-off-topic-label = 離題 report-reason-off-topic-description = 此內容與目前討論無關。 report-reason-inappropriate-label = 不當 report-reason-inappropriate-description = 此內容具冒犯性、辱罵或違反社群規範。 report-reason-spam-label = 垃圾訊息 report-reason-spam-description = 此內容為廣告或惡意破壞。 report-reason-other-label = 其他 report-reason-other-description = 此內容因其他原因需要注意。 report-reason-approval-label = 等待核准 moderation-title = 審核 moderation-empty-message = 沒有待處理的檢舉 moderation-finished-message = 都處理完了。 pending-approval-title = 等待核准 ## Misc quote-button = 引用 attribution-timestamp-created-label = 發佈 attribution-timestamp-edited-label = 已編輯 ## Filters filter-alphabetical = 字母順序 filter-following = 追蹤中 filter-ignoring = 已忽略 filter-newest = 近期主題 filter-latest = 最新評論 filter-oldest = 舊文排序 filter-top = 熱門討論 filter-top-all-time = 無限制 filter-top-year = 全年 filter-top-quarter = 季度 filter-top-month = 本月 filter-top-week = 當週 filter-top-day = 今日 filter-trending = 流行趨勢 filter-trash = 回收筒 ## Followables follow-button = 追蹤 follow-button-following = 追蹤中 follow-button-ignored = 已忽略 ignore-button = 忽略 unfollow-button = 取消追蹤 unignore-button = 取消忽略 channel-follow-description = 此頻道有新貼文時通知我。 post-follow-description = 此貼文有新留言時通知我。 post-following-badge = 追蹤中 post-ignored-badge = 已忽略 ## Index menu-button = 選單 navigation-title = 論壇導覽 post-feed-new-activity-button = 新活動 post-feed-new-activity-heading = 新活動 post-feed-empty-message = 沒有貼文 post-feed-controls-layout-heading = 顯示方式 ================================================ FILE: lang/zh-Hant/header.ftl ================================================ ================================================ FILE: lang/zh-Hant/install.ftl ================================================ ### Installation ## Groups group-guest = 訪客 group-member = 會員 group-admin = 管理員 group-moderator = 版主 group-quarantine = 隔離 ## Reactions reaction-set-emoji = 表情符號 reaction-type-like = 讚 reaction-type-love = 愛心 reaction-type-laugh = 笑臉 reaction-type-wow = 哇 reaction-type-sad = 傷心 reaction-type-angry = 生氣 reaction-set-votes = 投票 reaction-type-upvote = 讚成 ## Structure announcements-name = 公告 announcements-description = 團隊的最新消息和其他更新。 introductions-name = 自我介紹 introductions-description = 是新來的嗎?在這裡介紹一下自己吧! support-name = 技術支援 support-description = 在設定、使用和自訂產品方面需要幫助嗎? ideas-name = 想法 ideas-description = 有什麼想法嗎?我們想聽聽您的意見! staff-name = 僅限員工 staff-description = 員工討論的私密頻道。 guide-title = 社群指南 guide-body = 歡迎來到 { $forumName },感謝您的加入!為了讓每個人都能充分參與這個社群,請您閱讀並遵守以下準則。 - **保持文明** 這是一個透過對話分享知識和興趣的場所。對待每個人,包括 Waterhole 社群之外的人,要友善、耐心和尊重。 - **禁止人身攻擊** 批評觀點是我們在這裡進行的重要部分,但不能讓它演變成人身攻擊。騷擾和其他排斥行為絕不可接受。 - **信任善意** 在存在分歧時,試著理解為什麼,始終假設對方有善意。請記住,不同的人對問題有不同的觀點,這是正常的。 ================================================ FILE: lang/zh-Hant/notifications.ftl ================================================ ### Notifications title = 通知 mark-all-as-read-button = 全部標記為已讀 preferences-button = 通知偏好設定 empty-message = 沒有通知 ## Unsubscribe unsubscribe-link = 取消訂閱這些通知 unsubscribe-success-message = 您已成功取消訂閱這些通知。 manage-notification-preferences-link = 管理通知偏好設定 ## Mention mention-description = 提及我或回覆我評論的通知 mention-title = 在 { $post } 中提及了您 mention-reason = 您收到此通知是因為您已訂閱提及通知。 mention-unsubscribe = 取消訂閱提及通知 ## Content Approved post-approved-title = 貼文已核准:{ $post } comment-approved-title = 評論已在 { $post } 中核准 ## New Comment new-comment-description = 我追蹤的貼文有新評論 new-comment-title = { $post } 有新評論 new-comment-reason = 您收到此通知是因為您正在追蹤此貼文。 new-comment-unsubscribe = 取消追蹤此貼文 ## New Post new-post-description = 我追蹤的頻道有新貼文 new-post-title = { $channel } 中有新貼文:{ $post } new-post-reason = 您收到此通知是因為您正在追蹤此頻道。 new-post-unsubscribe = 取消追蹤此頻道 ## New Flag new-flag-description = 我所管理頻道中的檢舉 flagged-post-title = 貼文已被檢舉:{ $post } flagged-comment-title = 評論已被檢舉於 { $post } new-flag-reason = 您收到此通知是因為您管理某個頻道。 new-flag-unsubscribe = 取消訂閱檢舉通知 ## Content Removed post-removed-title = 貼文已移除:{ $post } comment-removed-title = 評論已在 { $post } 中移除 ## Common view-post-button = 查看貼文 view-comment-button = 查看評論 ================================================ FILE: lang/zh-Hant/passwords.php ================================================ '您的密碼已重設。', 'sent' => '我們已將密碼重設連結發送到您的電子郵件信箱。', 'throttled' => '請稍候再試。', 'token' => '此密碼重設令牌無效。', 'user' => '我們找不到使用該電子郵件地址的使用者。', ]; ================================================ FILE: lang/zh-Hant/system.ftl ================================================ ## Accessibility skip-to-main-content-link = 跳至主要內容 ## Errors fatal-error-heading = 發生錯誤 try-again-button = 重試 fatal-error-message = 發生錯誤!請重新載入頁面並重試。 too-many-requests-message = 您的操作速度有點快!請稍作休息,然後再試一次。 forbidden-message = 您無權執行此操作。 session-expired-message = 您的登入已逾時,請重新載入頁面並再試一次。 validation-errors-message = 發生以下錯誤: ## Generic Buttons & Links save-changes-button = 儲存變更 create-button = 建立 cancel-button = 取消 change-button = 更改 continue-button = 繼續 actions-button = 操作 learn-more-link = 了解更多 delete-button = 刪除 edit-link = 編輯 copy-link-button = 複製連結 controls-button = 選單 more-button = 更多 loading = 載入中 show-more-button = 顯示更多 ## Post Feed Layouts layout-list = 列表 layout-cards = 卡片 ## Actions confirm-action-title = 確認操作 delete-confirm-button = 刪除 link-copied-message = 連結已複製到剪貼簿。 ## Users deleted-user = [已註銷] user-list-overflow = 還有 { $count } 人 ## Pagination pagination-first-link = 第一頁 pagination-previous-link = 上一頁 pagination-next-link = 下一頁 pagination-last-link = 最新評論 load-more-button = 載入更多 page-number-prefix = 頁面 page-number-heading = 第 { $number } 頁 ## Theme Switcher theme-button = 主題 theme-light = 明亮模式 theme-dark = 暗黑模式 theme-automatic = 自動 ## Text Editor text-editor-heading = 標題 text-editor-bold = 粗體 text-editor-italic = 斜體 text-editor-quote = 引用 text-editor-code = 代碼 text-editor-link = 鏈接 text-editor-bulleted-list = 無序列表 text-editor-numbered-list = 有序列表 text-editor-mention = 提及使用者 text-editor-emoji = 插入表情符號 text-editor-attachment = 附加檔案 text-editor-preview = 預覽 ## Icon Picker icon-field-label = 圖示 icon-picker-change-button = 變更 icon-picker-none-option = 無 icon-picker-emoji-option = 表情符號 icon-picker-emoji-description = 輸入一個表情符號字符。 icon-picker-svg-option = SVG 圖示 icon-picker-svg-description = 輸入從以下安裝的集合中的一個圖示名稱:{ $sets }。 icon-picker-svg-search-link = 搜尋圖示 icon-picker-image-option = 圖片 ## Abilities ability-view = 檢視 ability-comment = 評論 ability-post = 張貼 ability-moderate = 審核 ability-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/zh-Hant/user.ftl ================================================ ### User ## Account Settings account-settings-title = 帳戶設定 delete-account-button = 刪除帳戶 delete-account-confirmation-title = 您確定要刪除您的帳戶嗎? delete-account-confirmation-description = 您的帳戶資料將被移除。您的貢獻將會保留,但會以匿名方式顯示。此操作無法復原。 delete-account-success-message = 您的帳戶已被刪除。 ## Notification Preferences notification-preferences-title = 通知偏好設定 notifications-label = 通知 notification-channel-web = 網頁 notification-channel-email = 電子郵件 notifications-following-label = 追蹤 follow-on-comment-label = 在我評論的貼文上自動追蹤 notification-preferences-saved-message = 通知偏好設定已儲存。 ## Edit Profile edit-profile-title = 編輯個人檔案 profile-saved-message = 個人檔案已儲存。 avatar-label = 頭像 remove-avatar-label = 移除頭像 headline-label = 標語 headline-description = 用簡短的文字介紹自己,將顯示在您的名稱旁。 bio-label = 個人簡介 bio-description = 更詳細地介紹自己,將顯示在您的個人檔案中。 location-label = 位置 website-label = 網站 privacy-title = 隱私 show-online-label = 顯示上次上線時間 ## Comments user-comments-title = { $userName } 的評論 comments-empty-message = 沒有評論 ## Posts user-posts-title = { $userName } 的貼文 posts-empty-message = 沒有貼文 ## User Menu profile-link = 個人檔案 preferences-link = 偏好設定 administration-link = 管理 log-out-link = 登出 ## Profile user-joined-text = 加入於 user-last-seen-text = 最後上線 online-label = 線上 ## Sidebar posts-link = 貼文 comments-link = 評論 preferences-heading = 偏好設定 account-settings-link = 帳戶 edit-profile-link = 個人檔案 notification-preferences-link = 通知 ## Admin suspend-button = 停權 edit-suspension-button = 編輯停權 suspend-user-title = 停權使用者 not-suspended-label = 未停權 suspended-indefinitely-label = 無限期停權 suspended-until-label = 停權至… suspended-badge = 已停權 suspended-message = 您的帳戶已被停權。 copy-impersonation-url-button = 複製模擬登入網址 impersonation-url-copied-message = 模擬登入網址已複製,請在新的無痕視窗中開啟。 ================================================ FILE: lang/zh-Hant/validation.php ================================================ '必須接受 :attribute 欄位。', 'accepted_if' => '當 :other 是 :value 時,必須接受 :attribute 欄位。', 'active_url' => ':attribute 欄位必須是有效的網址。', 'after' => ':attribute 欄位必須是 :date 之後的日期。', 'after_or_equal' => ':attribute 欄位必須是 :date 之後或等於 :date 的日期。', 'alpha' => ':attribute 欄位只能包含字母。', 'alpha_dash' => ':attribute 欄位只能包含字母、數字、破折號和底線。', 'alpha_num' => ':attribute 欄位只能包含字母和數字。', 'any_of' => '欄位 :attribute 無效。', 'array' => ':attribute 欄位必須是一個陣列。', 'ascii' => ':attribute 欄位只能包含單位元組的字母數字字元與符號。', 'before' => ':attribute 欄位必須是 :date 之前的日期。', 'before_or_equal' => ':attribute 欄位必須是 :date 之前或等於 :date 的日期。', 'between' => [ 'array' => ':attribute 欄位必須包含 :min 到 :max 個項目。', 'file' => ':attribute 欄位必須在 :min 到 :max KB 之間。', 'numeric' => ':attribute 欄位必須在 :min 到 :max 之間。', 'string' => ':attribute 欄位必須包含 :min 到 :max 個字元。', ], 'boolean' => ':attribute 欄位必須是 true 或 false。', 'can' => '欄位 :attribute 包含未授權的值。', 'confirmed' => ':attribute 欄位的確認不符。', 'contains' => '欄位 :attribute 缺少必要的值。', 'current_password' => '密碼不正確。', 'date' => ':attribute 欄位必須是有效的日期。', 'date_equals' => ':attribute 欄位必須是等於 :date 的日期。', 'date_format' => ':attribute 欄位必須符合格式 :format。', 'decimal' => ':attribute 欄位必須有 :decimal 位小數。', 'declined' => ':attribute 欄位必須為拒絕。', 'declined_if' => '當 :other 為 :value 時,:attribute 欄位必須為拒絕。', 'different' => ':attribute 欄位與 :other 必須不同。', 'digits' => ':attribute 欄位必須是 :digits 位數字。', 'digits_between' => ':attribute 欄位必須是 :min 到 :max 位數字。', 'dimensions' => ':attribute 欄位的圖片尺寸無效。', 'distinct' => ':attribute 欄位包含重複的值。', 'doesnt_contain' => '欄位 :attribute 不得包含以下任何值::values。', 'doesnt_end_with' => ':attribute 欄位不得以下列任一項結尾::values。', 'doesnt_start_with' => ':attribute 欄位不得以下列任一項開頭::values。', 'email' => ':attribute 欄位必須是有效的電子郵件地址。', 'encoding' => '欄位 :attribute 必須使用 :encoding 編碼。', 'ends_with' => ':attribute 欄位必須以下列任一項結尾::values。', 'enum' => '所選的 :attribute 無效。', 'exists' => '所選的 :attribute 無效。', 'extensions' => '欄位 :attribute 必須具有以下副檔名之一::values。', 'file' => ':attribute 欄位必須是一個檔案。', 'filled' => ':attribute 欄位必須有值。', 'gt' => [ 'array' => ':attribute 欄位必須多於 :value 個項目。', 'file' => ':attribute 欄位必須大於 :value KB。', 'numeric' => ':attribute 欄位必須大於 :value。', 'string' => ':attribute 欄位必須多於 :value 個字元。', ], 'gte' => [ 'array' => ':attribute 欄位必須至少有 :value 個項目。', 'file' => ':attribute 欄位必須大於或等於 :value KB。', 'numeric' => ':attribute 欄位必須大於或等於 :value。', 'string' => ':attribute 欄位必須大於或等於 :value 個字元。', ], 'hex_color' => ':attribute 欄位必須是有效的十六進位顏色。', 'image' => ':attribute 欄位必須是圖片。', 'in' => '所選的 :attribute 無效。', 'in_array' => ':attribute 欄位必須存在於 :other 中。', 'in_array_keys' => '欄位 :attribute 必須至少包含以下其中一個鍵值::values。', 'integer' => ':attribute 欄位必須是整數。', 'ip' => ':attribute 欄位必須是有效的 IP 位址。', 'ipv4' => ':attribute 欄位必須是有效的 IPv4 位址。', 'ipv6' => ':attribute 欄位必須是有效的 IPv6 位址。', 'json' => ':attribute 欄位必須是有效的 JSON 字串。', 'list' => ':attribute 欄位必須是一個清單。', 'lowercase' => ':attribute 欄位必須為小寫。', 'lt' => [ 'array' => ':attribute 欄位必須少於 :value 個項目。', 'file' => ':attribute 欄位必須小於 :value KB。', 'numeric' => ':attribute 欄位必須小於 :value。', 'string' => ':attribute 欄位必須少於 :value 個字元。', ], 'lte' => [ 'array' => ':attribute 欄位不得超過 :value 個項目。', 'file' => ':attribute 欄位必須小於或等於 :value KB。', 'numeric' => ':attribute 欄位必須小於或等於 :value。', 'string' => ':attribute 欄位必須小於或等於 :value 個字元。', ], 'mac_address' => ':attribute 欄位必須是有效的 MAC 位址。', 'max' => [ 'array' => ':attribute 欄位不得超過 :max 個項目。', 'file' => ':attribute 欄位不得大於 :max KB。', 'numeric' => ':attribute 欄位不得大於 :max。', 'string' => ':attribute 欄位不得超過 :max 個字元。', ], 'max_digits' => ':attribute 欄位不得超過 :max 位數字。', 'mimes' => ':attribute 欄位必須是以下類型的檔案::values。', 'mimetypes' => ':attribute 欄位必須是以下 MIME 類型的檔案::values。', 'min' => [ 'array' => ':attribute 欄位至少必須有 :min 個項目。', 'file' => ':attribute 欄位至少必須為 :min KB。', 'numeric' => ':attribute 欄位至少必須為 :min。', 'string' => ':attribute 欄位至少必須為 :min 個字元。', ], 'min_digits' => ':attribute 欄位至少必須有 :min 位數字。', 'missing' => ':attribute 欄位不得出現。', 'missing_if' => '當 :other 為 :value 時,:attribute 欄位不得出現。', 'missing_unless' => '除非 :other 為 :value,否則 :attribute 欄位不得出現。', 'missing_with' => '當 :values 存在時,:attribute 欄位不得出現。', 'missing_with_all' => '當 :values 全部存在時,:attribute 欄位不得出現。', 'multiple_of' => ':attribute 欄位必須是 :value 的倍數。', 'not_in' => '所選的 :attribute 無效。', 'not_regex' => ':attribute 欄位的格式無效。', 'numeric' => ':attribute 欄位必須是數字。', 'password' => [ 'letters' => ':attribute 欄位必須至少包含一個字母。', 'mixed' => ':attribute 欄位必須至少包含一個大寫字母與一個小寫字母。', 'numbers' => ':attribute 欄位必須至少包含一個數字。', 'symbols' => ':attribute 欄位必須至少包含一個符號。', 'uncompromised' => '提供的 :attribute 曾出現在資料外洩事件中,請改用其他 :attribute。', ], 'present' => ':attribute 欄位必須存在。', 'present_if' => '當 :other 為 :value 時,:attribute 欄位必須存在。', 'present_unless' => '除非 :other 為 :value,否則 :attribute 欄位必須存在。', 'present_with' => '當 :values 存在時,:attribute 欄位必須存在。', 'present_with_all' => '當 :values 全部存在時,:attribute 欄位必須存在。', 'prohibited' => ':attribute 欄位被禁止。', 'prohibited_if' => '當 :other 為 :value 時,:attribute 欄位被禁止。', 'prohibited_if_accepted' => '當 :other 被接受時,:attribute 欄位被禁止。', 'prohibited_if_declined' => '當 :other 被拒絕時,:attribute 欄位被禁止。', 'prohibited_unless' => '除非 :other 位於 :values 中,否則 :attribute 欄位被禁止。', 'prohibits' => ':attribute 欄位禁止 :other 出現。', 'regex' => ':attribute 欄位的格式無效。', 'required' => ':attribute 欄位為必填。', 'required_array_keys' => ':attribute 欄位必須包含以下鍵值::values。', 'required_if' => '當 :other 為 :value 時,:attribute 欄位為必填。', 'required_if_accepted' => '當 :other 被接受時,:attribute 欄位為必填。', 'required_if_declined' => '當 :other 被拒絕時,:attribute 欄位為必填。', 'required_unless' => '除非 :other 位於 :values 中,否則 :attribute 欄位為必填。', 'required_with' => '當 :values 存在時,:attribute 欄位為必填。', 'required_with_all' => '當 :values 全部存在時,:attribute 欄位為必填。', 'required_without' => '當 :values 不存在時,:attribute 欄位為必填。', 'required_without_all' => '當 :values 全部不存在時,:attribute 欄位為必填。', 'same' => ':attribute 欄位必須與 :other 相同。', 'size' => [ 'array' => ':attribute 欄位必須包含 :size 個項目。', 'file' => ':attribute 欄位大小必須為 :size KB。', 'numeric' => ':attribute 欄位必須為 :size。', 'string' => ':attribute 欄位長度必須為 :size 個字元。', ], 'starts_with' => ':attribute 欄位必須以下列任一項開頭::values。', 'string' => ':attribute 欄位必須為字串。', 'timezone' => ':attribute 欄位必須是有效的時區。', 'unique' => ':attribute 已經被使用。', 'uploaded' => ':attribute 上傳失敗。', 'uppercase' => ':attribute 欄位必須為大寫。', 'url' => ':attribute 欄位必須是有效的網址。', 'ulid' => ':attribute 欄位必須是有效的 ULID。', 'uuid' => ':attribute 欄位必須是有效的 UUID。', ]; ================================================ FILE: package.json ================================================ { "type": "module", "packageManager": "pnpm@10.28.1", "scripts": { "dev": "DEV=1 tsdown", "build": "tsdown", "prettier": "prettier --write '**/*' --ignore-unknown", "release": "release-it" }, "devDependencies": { "@csstools/postcss-global-data": "^4.0.0", "@dnd-kit/abstract": "^0.2.3", "@dnd-kit/dom": "^0.2.3", "@floating-ui/dom": "^1.7.4", "@github/combobox-nav": "^3.0.1", "@github/hotkey": "^3.1.1", "@github/paste-markdown": "^1.5.3", "@github/relative-time-element": "^5.0.0", "@github/text-expander-element": "^2.9.4", "@hotwired/stimulus": "^3.2.2", "@hotwired/turbo": "^8.0.21", "@prettier/plugin-php": "^0.24.0", "@release-it/bumper": "^7.0.5", "@release-it/keep-a-changelog": "^7.0.0", "@types/hotwired__turbo": "^8.0.5", "@types/lodash-es": "^4.17.12", "@types/node": "^25.0.10", "animated-scroll-to": "^2.3.2", "emoji-picker-element": "^1.28.1", "highlight.js": "^11.11.1", "inclusive-elements": "^0.5.1", "ky": "^1.14.2", "laravel-echo": "^2.3.0", "lodash-es": "^4.17.23", "postcss": "^8.5.6", "postcss-each": "^1.1.0", "postcss-import": "^16.1.1", "postcss-mixins": "^12.1.2", "postcss-preset-env": "^11.1.1", "postcss-scss": "^4.0.9", "prettier": "^3.8.1", "prettier-plugin-blade": "^2.1.21", "pusher-js": "^8.4.0", "release-it": "^19.2.4", "rollup-plugin-postcss": "^4.0.2", "sticky-observer": "^1.0.1", "text-field-edit": "^4.1.1", "textarea-editor": "^2.1.1", "tsdown": "^0.20.1", "typescript": "^5.9.3", "uplot": "^1.6.32", "vanilla-colorful": "^0.7.2" } } ================================================ FILE: phpstan.dist.neon ================================================ includes: - ./vendor/larastan/larastan/extension.neon parameters: paths: - src/ level: 1 checkOctaneCompatibility: true ================================================ FILE: phpunit.xml ================================================ tests/Feature src ================================================ FILE: postcss.config.cjs ================================================ module.exports = { parser: 'postcss-scss', // for single-line comment support plugins: [ require('postcss-import'), require('@csstools/postcss-global-data')({ files: ['./resources/css/system/breakpoints.css'], }), require('postcss-each'), require('postcss-mixins')({ mixinsFiles: ['./resources/css/system/mixins.css'], }), require('postcss-preset-env')({ stage: 2, features: { 'nesting-rules': true, // Stage 1 }, }), ], }; ================================================ FILE: resources/css/cp/_dashboard.css ================================================ .cp-dashboard__widgets { display: flex; flex-wrap: wrap; align-items: stretch; margin: calc(-1 * var(--space-lg) / 2); > * { width: var(--cp-dashboard-widget-width, 100%); height: var(--cp-dashboard-widget-height, auto); padding: calc(var(--space-lg) / 2); min-width: 30ch; flex-grow: 1; } & turbo-frame, .card { height: 100%; } } .line-chart-widget { min-height: 14em; } .getting-started__grid { --grid-min: 35ch; } ================================================ FILE: resources/css/cp/_permission-grid.css ================================================ .permission-grid { & thead th { width: 9ch; padding-inline: var(--space-xxs); text-align: center; vertical-align: top; } } ================================================ FILE: resources/css/cp/_structure.css ================================================ .cp-structure { padding: 0; overflow: hidden; & li { border-top: 1px solid var(--color-stroke); } > :first-child { border-top: 0; } .placeholder:not(:only-child) { display: none; } } .cp-structure__node { list-style: none; } .drag-handle { display: flex; color: var(--color-muted); cursor: move; > * { opacity: 0.5; } .no-js & { display: none; } } [data-dnd-dragging='true'] { border: 0 !important; background: var(--color-bg); border-radius: var(--radius); box-shadow: var(--shadow-md); } .cp-structure__label { font-weight: var(--weight-medium); } ================================================ FILE: resources/css/cp/app.css ================================================ @import '_dashboard.css'; @import '_permission-grid.css'; @import '_structure.css'; .container { max-width: none; } .cp__content { max-width: 110ch; margin-inline: auto; } .cp-title { margin-bottom: var(--space-lg); } .sortable > * { transition: transform 0.3s; } .cp-help { text-align: center; font-size: var(--text-xs); margin-top: var(--space-xl); } ================================================ FILE: resources/css/global/_auth.css ================================================ .auth-button[data-provider='facebook'] { background-color: #4267b2; color: #fff; } .auth-button[data-provider^='twitter'] { background-color: #1da1f2; color: #fff; } .auth-button[data-provider='linkedin'] { background-color: #0077b5; color: #fff; } .auth-button[data-provider='google'] { background-color: #fff; color: #555; border: 1px solid var(--color-stroke); } .auth-button[data-provider='github'] { background-color: #333; color: #fff; } .auth-button[data-provider='gitlab'] { background-color: #e24329; color: #fff; } .auth-button[data-provider='bitbucket'] { background-color: #205081; color: #fff; } ================================================ FILE: resources/css/global/_channel-card.css ================================================ .channel-card__inner { flex-basis: 30ch; } .channel-card__info { flex-basis: 30ch; } ================================================ FILE: resources/css/global/_comment.css ================================================ .comment { --comment-padding: var(--space-lg); --comment-padding-left: var(--comment-padding); padding: var(--comment-padding); padding-left: var(--comment-padding-left); transition: background 0.2s; @media (--md-up) { --comment-padding-left: calc( var(--attribution-avatar-size) + var(--space-md) + var(--comment-padding) ); .attribution { padding-left: 0; } .attribution__info { display: inline; margin-left: var(--space-xxs); } } &.is-highlighted { background: var(--color-warning-soft); } &.is-answer { border: 2px solid var(--color-success); box-shadow: inset 0 0 10px 2px var(--color-success-soft); border-radius: var(--radius); } } .comment.is-removed { padding-top: var(--space-md); background: var(--palette-fill); &.is-expanded > .removed-banner { margin-bottom: var(--space-lg); .icon-tabler-chevron-right { transform: rotate(90deg); } } &:not(.is-expanded) { padding-bottom: var(--space-md); > .removed-banner ~ * { display: none; } } } @media (--sm) { .comment.is-removed:not(.is-expanded) .removed-banner__attribution { display: none; } } @media (--md-up) { .comment__icon { position: absolute; margin-left: calc(-1 * (var(--attribution-avatar-size) + var(--space-md))); width: var(--attribution-avatar-size); text-align: right; } } // The "in reply to" bit in the comment header .comment__parent { margin-top: var(--space-xs); width: fit-content; > a { color: var(--color-muted); font-size: var(--text-xs); font-weight: var(--weight-medium); } } .comment__parent-tooltip { max-width: 80ch; overflow: hidden; text-align: left; padding: 0; .comment { --comment-padding: var(--space-md); } .comment > * + * { margin-top: var(--space-xs); } } .comment__replies { margin-top: var(--space-md); .comment__parent { display: none; } .comment { --comment-padding: var(--space-md); } } .comment-list { .card__row { padding: 0; } #page_1 + .card__row { border-top: 0; } } ================================================ FILE: resources/css/global/_composer.css ================================================ .composer { --height-transition-duration: 0s; border-radius: var(--radius); background: var(--color-bg); transition: box-shadow 0.2s, border 0.2s, height var(--height-transition-duration), bottom 0.2s; max-height: calc(100vh - var(--header-height)); position: sticky; bottom: calc(-1 * var(--radius)); // The composer is "static" (cannot be opened/closed) on a standalone comment page &.is-static { position: static; height: 70vh !important; .composer__close { visibility: hidden; width: var(--space-xs); } } &:not(.is-open) { --height-transition-duration: 0.2s; height: 4.75em !important; // override user resizing bottom: -4.75em; .composer__form { display: none; } } &.is-open { --color-bg: var(--palette-surface); --focus-shadow: 0 0 0 transparent; height: 300px; min-height: 200px; box-shadow: var(--focus-shadow), var(--shadow-md); padding-bottom: var(--radius); z-index: calc(var(--z-index-header) + 1); &:focus-within { --focus-shadow: 0 0 0 2px var(--color-accent); } .composer__placeholder { display: none; } } } @media (--sm) { .composer.is-open { margin-inline: calc(-1 * var(--space-gutter)); border-radius: 0; } } .composer__placeholder { border: 2px dashed var(--color-stroke); border-radius: var(--radius); padding: var(--space-md); cursor: text; transition: box-shadow 0.2s, border 0.2s, color 0.2s; text-decoration: none !important; &:hover { box-shadow: var(--shadow-md); border-color: transparent; color: inherit; } .avatar { width: var(--control-height); } } .composer__form { .text-editor { min-height: 0; border: 0; box-shadow: none; } .text-editor__input { resize: none; } } .composer__handle { position: absolute; left: 100px; right: 100px; top: -5px; height: 20px; cursor: ns-resize; touch-action: none; &::before { content: ''; position: absolute; top: 10px; left: 50%; transform: translateX(-50%); width: 20%; height: 5px; border-radius: var(--radius); background: var(--color-fill); } } .composer__toolbar { padding: var(--space-xxs); border-bottom: 1px solid var(--color-stroke); } // The "replying to" bit .composer__parent { padding-left: var(--space-sm); } ================================================ FILE: resources/css/global/_emoji.css ================================================ .emoji { display: inline-block; } span.emoji { transform: scale(1.2); } img.emoji { height: 1.2em; width: 1.2em; vertical-align: -0.2em; } .icon .emoji { width: 100%; height: 100%; vertical-align: 0; } ================================================ FILE: resources/css/global/_flags.css ================================================ .flag-container { border: 2px solid var(--color-activity); box-shadow: inset 0 0 10px 2px var(--color-activity-soft); border-radius: var(--radius) !important; overflow: clip; > .alert { border-radius: 0; } } .flags-menu { max-width: 50ch; } ================================================ FILE: resources/css/global/_header.css ================================================ .header { --color-bg: var(--palette-surface); position: sticky; top: -1px; // ensures that .is-stuck only applies when scrolled down z-index: var(--z-index-header); transition: box-shadow 0.2s; background: var(--color-bg); box-shadow: var(--shadow-sm); .container { height: var(--header-height); } } .header-breadcrumb { color: var(--color-muted); transition: opacity 0.2s, transform 0.2s; margin-left: var(--space-xs); flex-shrink: 99; &::before { content: '\203A'; margin: 0 var(--space-xs); } &[hidden] { display: block !important; visibility: hidden; transform: translateY(10px); opacity: 0; transition: opacity 0.2s, transform 0.2s, visibility 0s 0.2s; } } .header-search__form { margin-right: var(--space-xs); input { width: 30ch; } } .header-user { margin-left: var(--space-xs); } .email-verification-banner { padding-block: var(--space-md); } ================================================ FILE: resources/css/global/_index.css ================================================ // When the sidebar becomes horizontal, move the create post button to the right side. @media (--md-down) { .index-sidebar .index-create-post { margin-left: auto; } } .index-footer { margin-top: var(--space-lg); } ================================================ FILE: resources/css/global/_notifications.css ================================================ .notifications-menu, .moderation-menu { width: 55ch; max-width: 100%; max-height: 40em; .menu-item { margin-top: 2px; } } .notification { & strong { font-weight: var(--weight-medium); color: var(--color-accent-text); } &.is-unread { background-color: var(--color-bg); background-image: linear-gradient( var(--color-activity-soft), var(--color-activity-soft) ); > .icon, .notification__time, strong { color: var(--color-activity-text); } } } .notification-grid { .choice { width: 8ch; } } .alert--notification { background-color: var(--color-bg); background-image: linear-gradient( var(--color-activity-soft), var(--color-activity-soft) ); .alert__message { margin: calc(-1 * var(--space-xs)); line-height: unset; } .notification__time { display: none; } } ================================================ FILE: resources/css/global/_post-feed.css ================================================ .post-feed__pinned { --grid-min: 31ch; } .post-feed__refresh { position: sticky; top: calc(var(--header-height) + var(--space-md)); > * { position: absolute; left: 50%; transform: translateX(-50%); } .btn { box-shadow: var(--shadow-md); } } .post-list > :first-child > .post-list-item:first-of-type { border-top: 0; } .post-list-item { padding: var(--space-md); } @media (--md-up) { .post-list-item { padding-left: var(--space-lg); } } .post-list-item__avatar { width: 2.5rem; text-decoration: none !important; flex-shrink: 0; } .post-list-item__avatar, .post-list-item__end, .post-list-item__controls { margin-top: 3px; } @media (--sm) { .post-list-item__main { width: 100%; } .post-list-item__upper { flex-wrap: wrap; gap: var(--space-xs); } .post-list-item__end { flex-direction: row-reverse; } } .post-title-link { padding: 10px 0; margin: -10px 0; display: block; color: inherit; .not-logged-in &:visited, .is-read & { color: var(--color-muted); } } .is-read .post-list-item__unread { display: none; } .post-cards { .post-card { margin-bottom: var(--space-lg); } } // Hide the channel label from posts when we're viewing a specific channel [data-route='waterhole.channels.show'] .post-feed__content .channel-label { display: none; } ================================================ FILE: resources/css/global/_post-page.css ================================================ .post-header { .post-tags-summary { .tag { font-size: var(--text-sm); } } .attribution, .post-title { width: 100%; } } .post-page { .sidebar { flex-basis: 16ch; } } #comments { scroll-margin-top: calc(var(--space-lg) + var(--header-height)); } .comments-pagination__pages { max-height: 20rem; } ================================================ FILE: resources/css/global/_reactions.css ================================================ .reactions-menu { border-radius: 999px; overflow: visible; min-width: 0; max-width: none; display: flex; flex-direction: row; & button { transition: transform 0.2s; transform-origin: bottom; padding: 2px; &:hover { transform: scale(1.2); } } } .reactions-condensed { .icon { position: relative; margin-left: -4px; filter: drop-shadow(1px 0 0 var(--color-bg)); } &[data-count='0'] { display: none; } } .reaction[data-count='0'] .icon { filter: grayscale(0.9); opacity: 0.3; } ================================================ FILE: resources/css/global/_search.css ================================================ .search-results .post-list-item__title a:visited { color: var(--color-muted); } ================================================ FILE: resources/css/global/_text-editor.css ================================================ .text-editor { padding: 0; height: auto; min-height: 15em; } .text-editor__toolbar { margin: var(--space-xxs); margin-bottom: 0; .is-previewing & { z-index: 1; pointer-events: none; > * { pointer-events: all; } > :not(.text-editor__preview-button) { display: none; } } } .text-editor__expander { position: relative; } .text-editor__input { width: 100%; outline: none; padding: var(--space-md); padding-top: var(--space-xs); resize: vertical; border: 0; background: transparent; max-height: 70vh; position: relative; box-shadow: none !important; &[hidden] { display: initial !important; visibility: hidden; } } .text-editor__preview { overflow: auto; padding: var(--space-md); } ================================================ FILE: resources/css/global/_user-profile.css ================================================ .user-profile__card { .avatar { width: 12ch; } } .user-profile__content { flex-basis: 60ch; } .user-profile__controls { float: right; margin-left: -100%; position: relative; } ================================================ FILE: resources/css/global/app.css ================================================ @import '../system/system.css'; @import '_auth.css'; @import '_channel-card.css'; @import '_comment.css'; @import '_composer.css'; @import '_emoji.css'; @import '_flags.css'; @import '_header.css'; @import '_index.css'; @import '_notifications.css'; @import '_post-feed.css'; @import '_post-page.css'; @import '_reactions.css'; @import '_search.css'; @import '_text-editor.css'; @import '_user-profile.css'; ================================================ FILE: resources/css/system/_alert.css ================================================ .alert { border-radius: var(--radius); padding: var(--space-sm) var(--space-md); background: var(--color-fill); display: flex; align-items: flex-start; font-size: var(--text-xs); gap: var(--space-sm); line-height: var(--line-height-expanded); } .alert__icon { display: flex; font-size: var(--text-md); line-height: var(--line-height-default); } .alert__message { min-width: 0; flex-grow: 1; } .alert__actions { display: flex; align-items: center; margin-block: calc(-1 * var(--space-xs)); margin-right: calc(-1 * var(--space-sm)); margin-left: auto; gap: var(--space-sm); } ================================================ FILE: resources/css/system/_alerts.css ================================================ .alerts { display: flex; flex-direction: column; align-items: center; gap: var(--space-sm); padding: var(--space-sm); pointer-events: none; position: fixed; top: 0; left: 0; right: 0; z-index: var(--z-index-alerts); > * { pointer-events: auto; box-shadow: var(--shadow-md); } @media (--sm) { align-items: stretch; top: auto; bottom: 0; } @media (--md-up) { > * { max-width: 50ch; } } } ================================================ FILE: resources/css/system/_attribution.css ================================================ :root { --attribution-avatar-size: 2.5em; } .attribution { padding-left: calc(var(--attribution-avatar-size) + var(--space-md)); .avatar { position: absolute; margin-left: calc(-1 * (var(--attribution-avatar-size) + var(--space-md))); width: var(--attribution-avatar-size); height: var(--attribution-avatar-size); } } .attribution__link { color: inherit; font-weight: var(--weight-medium); text-decoration: none !important; margin-right: var(--space-xxs); &:hover .attribution__name { text-decoration: underline; } } .attribution__info { display: block; font-size: var(--text-xs); color: var(--color-muted); margin-top: var(--space-xxs); > * + *::before { content: ' \00B7 '; } } ================================================ FILE: resources/css/system/_avatar.css ================================================ .avatar { border-radius: 100%; background: var(--color-stroke); width: 100%; height: 100%; aspect-ratio: 1; & text { font-size: 50px; fill: var(--color-bg); } } ================================================ FILE: resources/css/system/_badge.css ================================================ .badge, .tag { border-radius: 999px; background: var(--color-fill); color: var(--color-muted); border: 0; margin: 0; font-size: var(--text-xxs); font-weight: var(--weight-medium); line-height: 1.2; display: inline-flex; align-items: center; justify-content: center; min-width: 2.5ch; min-height: 1.7em; text-align: center; padding: 0 0.6em; vertical-align: middle; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex-shrink: 0; > .icon:first-child { margin-left: -0.2em; margin-right: 0.2em; } .icon { stroke-width: 2; } } .group-badge { background-color: var(--group-color, var(--color-fill)); color: var(--group-color-constrast, var(--color-muted)); } .badge--hidden { border: 1px dashed var(--color-stroke); background-color: transparent; } .suspended-badge { background: var(--color-muted); color: var(--color-bg); } .tag { border-radius: 4px; font-weight: normal; padding: 0 0.5em; font-size: var(--text-xs); } ================================================ FILE: resources/css/system/_base.css ================================================ :root { scroll-behavior: auto; } html { background: var(--color-bg); color: var(--color-text); font-family: var(--font-text); font-size: var(--text-sm); line-height: var(--line-height-default); @media (--sm) { font-size: 95%; } } input, textarea, select { color: var(--color-text); } * { overflow-wrap: anywhere; -webkit-tap-highlight-color: transparent; } a, .link { color: var(--color-accent-text); text-decoration: none; cursor: pointer; &:hover { text-decoration: underline; } } hr { border: 0; border-top: 1px solid var(--color-stroke); margin: var(--space-xl) 0; } strong { font-weight: var(--weight-bold); } mark { background: transparent; font-weight: var(--weight-bold); color: var(--color-accent-text); } pre, code { font-family: var(--font-mono); } :focus { outline: 2px solid var(--color-accent); outline-offset: 2px; } [tabindex='-1']:focus { outline: none; } :focus:not(:focus-visible) { outline: none; } .waterhole { display: flex; flex-direction: column; align-items: stretch; min-height: 100vh; min-height: 100svh; } .waterhole__main { flex-grow: 1; display: flex; flex-direction: column; // Bug on Chrome 121: textarea with scroll-margin-top scrolls the // viewport when selecting text *:not(textarea) { scroll-margin-top: var(--header-height); } } @media (prefers-reduced-motion: no-preference) { ui-popup > .enter-active, ui-popup > .leave-active { transition: transform 0.15s, opacity 0.15s; } ui-popup > .enter-from, ui-popup > .leave-to { transform: scale(0); opacity: 0; } ui-popup::part(backdrop), ui-popup > :nth-child(2) { z-index: var(--z-index-overlay); } } [data-placement='bottom'] { transform-origin: top center; } [data-placement='bottom-start'] { transform-origin: top left; } [data-placement='bottom-end'] { transform-origin: top right; } [data-placement='top'] { transform-origin: bottom center; } [data-placement='top-start'] { transform-origin: bottom left; } [data-placement='top-end'] { transform-origin: bottom right; } [data-placement='left'] { transform-origin: right center; } [data-placement='left-start'] { transform-origin: right top; } [data-placement='left-end'] { transform-origin: right bottom; } [data-placement='right'] { transform-origin: left center; } [data-placement='right-start'] { transform-origin: left top; } [data-placement='right-end'] { transform-origin: left bottom; } [data-placement^='top'] { margin-top: calc(-1 * var(--space-xs)); } [data-placement^='bottom'] { margin-top: var(--space-xs); } [data-placement^='left'] { margin-left: calc(-1 * var(--space-xs)); } [data-placement^='right'] { margin-left: var(--space-xs); } ================================================ FILE: resources/css/system/_block-link.css ================================================ .block-link { display: block; color: inherit; text-decoration: none !important; border-radius: var(--radius); padding: var(--space-md); &:hover { background: var(--color-fill); } &:active { filter: var(--filter-active); } } ================================================ FILE: resources/css/system/_breadcrumb.css ================================================ .breadcrumb { list-style: none; padding: 0; color: var(--color-muted); > * { display: inline; } > * + ::before { content: '\203A'; margin: 0 var(--space-xxs); color: var(--color-muted); } [aria-current='page'] { color: var(--color-text); } } ================================================ FILE: resources/css/system/_btn.css ================================================ .btn { --btn-height: var(--control-height); --btn-padding: calc(0.4 * var(--btn-height)); height: var(--btn-height); background: var(--color-fill); color: var(--color-text); border-radius: var(--control-radius); border: 0; margin: 0; display: inline-flex; gap: var(--space-xxs); align-items: center; justify-content: center; padding: 0 var(--btn-padding); text-decoration: none !important; font-weight: var(--weight-medium); white-space: nowrap; vertical-align: middle; flex-shrink: 0; @mixin clickable; } // Outline .btn--outline { border: 1px solid var(--color-stroke); background: transparent; color: var(--color-muted); &:hover:not(:disabled, .is-disabled, .is-inert) { background: var(--color-bg); } } // Transparent :where(:not([open])) > .btn--transparent:where(:not(:hover, .is-hovered, :focus, .is-focused)), .btn--transparent:is(:disabled, .is-disabled), .btn--transparent:not(button, a, [role='button'], [role='link']) { background: transparent; color: var(--color-muted); } // Sizes .btn--sm { --btn-height: var(--control-height-small); --btn-padding: calc(0.3 * var(--btn-height)); font-size: 87.5%; } .btn--narrow { --btn-padding: calc(0.3 * var(--btn-height)); } .btn--wide { --btn-padding: calc(0.5 * var(--btn-height)); } .btn--start { margin-left: calc(-1 * var(--btn-padding)); } .btn--end { margin-right: calc(-1 * var(--btn-padding)); } // Icon button .btn--icon { width: var(--btn-height); padding: 0; border-radius: 100px; position: relative; .avatar { width: 100%; height: 100%; } .icon { font-size: 120%; } .badge { position: absolute; top: 0; right: 0; } .label { // .visually-hidden clip: rect(0 0 0 0); clip-path: inset(50%); height: 1px; overflow: hidden; position: absolute; white-space: nowrap; width: 1px; } } // Active state .btn { &.is-active, &[aria-pressed='true'], :checked + & { color: var(--color-accent-text) !important; background: var(--color-accent-soft) !important; border-color: transparent; } } // Button group .btn-group { display: flex; align-items: stretch; gap: 1px; > :first-child:not(:only-child) { &, > .btn { border-top-right-radius: 0; border-bottom-right-radius: 0; } } > :not(:first-child, :last-child) { &, > .btn { border-radius: 0; } } > :last-child:not(:only-child) { &, > .btn { border-top-left-radius: 0; border-bottom-left-radius: 0; } } } ================================================ FILE: resources/css/system/_card.css ================================================ .card { --color-bg: var(--palette-surface); border-radius: var(--radius); background: var(--color-bg); box-shadow: var(--shadow-sm); overflow: clip; } .card .card, .dialog .card { border: 1px solid var(--color-fill); } .card__header { padding: var(--space-sm) var(--space-md); border-radius: var(--radius) var(--radius) 0 0; background: var(--color-bg); &summary { @mixin clickable; transform: none !important; outline: none !important; &::marker, &::-webkit-details-marker { color: var(--color-stroke); margin-right: var(--space-sm); } &:focus-visible { background: var(--color-accent-soft); } } } details.card:not([open]) .card__header { border-radius: var(--radius); } .card__body { padding: min(var(--space-gutter), var(--space-lg)); } .card__row { padding: var(--space-sm) var(--space-md); :not(.divider) + & { border-top: 1px solid var(--color-fill); } } .card-list { > * { margin-bottom: var(--space-lg); } } @media (--sm) { .container .card:not(.card .card) { margin-inline: calc(-1 * var(--space-gutter)) !important; border-radius: 0; > .card__header { border-radius: 0; } } } .card, .card__row { &:target { background: var(--color-warning-soft); } } ================================================ FILE: resources/css/system/_channel-label.css ================================================ .channel-label { display: inline-flex; align-items: center; gap: var(--space-xxs); vertical-align: bottom; color: inherit; text-decoration: none; &a:hover > :last-child { text-decoration: underline; } } ================================================ FILE: resources/css/system/_channel-picker.css ================================================ .channel-picker { .menu-item { padding: var(--space-sm) var(--space-md); gap: var(--space-md); > .icon:first-child { font-size: var(--text-lg); } } .menu-heading { padding-inline: var(--space-md); &:not(:first-child) { padding-top: var(--space-md); } } } ================================================ FILE: resources/css/system/_choice.css ================================================ .choice { cursor: pointer; display: flex; align-items: flex-start; gap: var(--space-sm); > :disabled + * { color: var(--color-muted); } } .choice-indent { margin-left: calc(var(--space-sm) + 1.2em); } input[type='checkbox'], input[type='radio'] { -webkit-appearance: none; appearance: none; background-color: var(--color-bg); margin: 0; font: inherit; color: currentColor; width: 1.2em; height: 1.2em; flex-shrink: 0; border: 2px solid var(--color-stroke); vertical-align: -0.2em; position: relative; cursor: pointer; &:checked { border: 0; } &:checked::before { content: ''; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); background: var(--color-accent-contrast); } &:not(:disabled, [aria-disabled='true']) { &:active { filter: var(--filter-active); } &:checked { background: var(--color-accent); } } &:disabled, &[aria-disabled='true'] { background: var(--color-stroke); border: 0; &:checked::before { background: var(--color-muted); } } } input[type='checkbox'] { border-radius: 0.3em; &:checked::before { width: 60%; height: 60%; clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%); } } input[type='radio'] { border-radius: 100%; &:checked::before { width: 40%; height: 40%; border-radius: 100%; } } ================================================ FILE: resources/css/system/_color-picker.css ================================================ .color-picker__picker { position: absolute; z-index: var(--z-index-overlay); box-shadow: var(--shadow-md); margin-top: 6px; border-radius: var(--radius); } .color-picker__swatch, .swatch { display: inline-block; vertical-align: middle; width: 1.5em; height: 1.5em; border-radius: 4px; border: 1px solid hsl(var(--palette-text-hsl) / 0.1); } ================================================ FILE: resources/css/system/_combobox.css ================================================ .combobox { position: relative; } .combobox__list { position: absolute; top: 100%; left: 0; max-width: none !important; width: 100% !important; } ================================================ FILE: resources/css/system/_dialog.css ================================================ .dialog { --color-bg: var(--palette-surface); margin-left: auto; margin-right: auto; max-width: 100%; border-radius: var(--radius); box-shadow: var(--shadow-sm); background: var(--color-bg); color: var(--color-text); } .dialog__header { display: flex; align-items: center; gap: var(--space-md); padding: var(--space-xl); padding-bottom: 0; } .dialog__body { padding: var(--space-xl); } .dialog--sm { width: 45ch; } @media (--sm) { .dialog__header, .dialog__body { padding: var(--space-gutter); } .dialog__header { padding-bottom: 0; } .container .dialog { margin-inline: calc(-1 * var(--space-gutter)) !important; border-radius: 0; max-width: none; width: calc(100% + 2 * var(--space-gutter)); } } ================================================ FILE: resources/css/system/_divider.css ================================================ .divider { display: flex; align-items: center; color: var(--color-muted); text-transform: uppercase; font-size: var(--text-xxs); font-weight: var(--weight-bold); padding: var(--space-xs) 0; &::before, &::after { content: ''; flex-grow: 1; border-bottom: 2px solid; } &:not(:empty) { &::before { margin-right: 5px; } &::after { margin-left: 5px; } } } ================================================ FILE: resources/css/system/_emoji-picker.css ================================================ .emoji-picker { padding: 0; max-width: none; & emoji-picker { --border-color: var(--color-stroke); --border-size: 0; --background: var(--color-bg); --button-hover-background: var(--color-fill); --button-active-background: var(--color-fill); --category-font-color: var(--color-muted); --indicator-color: var(--color-accent); --input-border-color: var(--color-stroke); --input-border-radius: var(--radius); --input-font-color: var(--color-text); --input-placeholder-color: var(--color-muted); --input-padding: 0.4em 0.7em; --outline-color: var(--color-accent); } } ================================================ FILE: resources/css/system/_form.css ================================================ .field { display: flex; flex-wrap: wrap; column-gap: var(--space-md); row-gap: var(--space-xs); align-items: flex-start; > :first-child:not(:only-child) { flex-basis: 20%; min-width: 15ch; flex-shrink: 0; flex-grow: 1; } > :nth-child(2) { flex-basis: calc(80% - var(--space-md)); flex-grow: 999; min-width: 0; margin: 0; } } .stacked-fields { .field > :first-child { flex-basis: 100%; } } .field__label { font-size: var(--text-xs); font-weight: var(--weight-medium); } .field__description { font-size: var(--text-xs); color: var(--color-muted); } .field__status { font-size: var(--text-xs); font-weight: var(--weight-medium); color: var(--color-muted); .has-error & { color: var(--color-danger-text); } } ================================================ FILE: resources/css/system/_highlightjs.css ================================================ :root, [data-theme='light'] { /*! Theme: GitHub Description: Light theme as seen on github.com Author: github.com Maintainer: @Hirse Updated: 2021-05-15 Outdated base version: https://github.com/primer/github-syntax-light Current colors taken from GitHub's CSS */ .hljs { color: #24292e; } .hljs-doctag, .hljs-keyword, .hljs-meta .hljs-keyword, .hljs-template-tag, .hljs-template-variable, .hljs-type, .hljs-variable.language_ { /* prettylights-syntax-keyword */ color: #d73a49; } .hljs-title, .hljs-title.class_, .hljs-title.class_.inherited__, .hljs-title.function_ { /* prettylights-syntax-entity */ color: #6f42c1; } .hljs-attr, .hljs-attribute, .hljs-literal, .hljs-meta, .hljs-number, .hljs-operator, .hljs-variable, .hljs-selector-attr, .hljs-selector-class, .hljs-selector-id { /* prettylights-syntax-constant */ color: #005cc5; } .hljs-regexp, .hljs-string, .hljs-meta .hljs-string { /* prettylights-syntax-string */ color: #032f62; } .hljs-built_in, .hljs-symbol { /* prettylights-syntax-variable */ color: #e36209; } .hljs-comment, .hljs-code, .hljs-formula { /* prettylights-syntax-comment */ color: #6a737d; } .hljs-name, .hljs-quote, .hljs-selector-tag, .hljs-selector-pseudo { /* prettylights-syntax-entity-tag */ color: #22863a; } .hljs-subst { /* prettylights-syntax-storage-modifier-import */ color: #24292e; } .hljs-section { /* prettylights-syntax-markup-heading */ color: #005cc5; font-weight: bold; } .hljs-bullet { /* prettylights-syntax-markup-list */ color: #735c0f; } .hljs-emphasis { /* prettylights-syntax-markup-italic */ color: #24292e; font-style: italic; } .hljs-strong { /* prettylights-syntax-markup-bold */ color: #24292e; font-weight: bold; } .hljs-addition { /* prettylights-syntax-markup-inserted */ color: #22863a; background-color: #f0fff4; } .hljs-deletion { /* prettylights-syntax-markup-deleted */ color: #b31d28; background-color: #ffeef0; } .hljs-char.escape_, .hljs-link, .hljs-params, .hljs-property, .hljs-punctuation, .hljs-tag { /* purposely ignored */ } } [data-theme='dark'] { /*! Theme: GitHub Dark Description: Dark theme as seen on github.com Author: github.com Maintainer: @Hirse Updated: 2021-05-15 Outdated base version: https://github.com/primer/github-syntax-dark Current colors taken from GitHub's CSS */ .hljs { color: #c9d1d9; } .hljs-doctag, .hljs-keyword, .hljs-meta .hljs-keyword, .hljs-template-tag, .hljs-template-variable, .hljs-type, .hljs-variable.language_ { /* prettylights-syntax-keyword */ color: #ff7b72; } .hljs-title, .hljs-title.class_, .hljs-title.class_.inherited__, .hljs-title.function_ { /* prettylights-syntax-entity */ color: #d2a8ff; } .hljs-attr, .hljs-attribute, .hljs-literal, .hljs-meta, .hljs-number, .hljs-operator, .hljs-variable, .hljs-selector-attr, .hljs-selector-class, .hljs-selector-id { /* prettylights-syntax-constant */ color: #79c0ff; } .hljs-regexp, .hljs-string, .hljs-meta .hljs-string { /* prettylights-syntax-string */ color: #a5d6ff; } .hljs-built_in, .hljs-symbol { /* prettylights-syntax-variable */ color: #ffa657; } .hljs-comment, .hljs-code, .hljs-formula { /* prettylights-syntax-comment */ color: #8b949e; } .hljs-name, .hljs-quote, .hljs-selector-tag, .hljs-selector-pseudo { /* prettylights-syntax-entity-tag */ color: #7ee787; } .hljs-subst { /* prettylights-syntax-storage-modifier-import */ color: #c9d1d9; } .hljs-section { /* prettylights-syntax-markup-heading */ color: #1f6feb; font-weight: bold; } .hljs-bullet { /* prettylights-syntax-markup-list */ color: #f2cc60; } .hljs-emphasis { /* prettylights-syntax-markup-italic */ color: #c9d1d9; font-style: italic; } .hljs-strong { /* prettylights-syntax-markup-bold */ color: #c9d1d9; font-weight: bold; } .hljs-addition { /* prettylights-syntax-markup-inserted */ color: #aff5b4; background-color: #033a16; } .hljs-deletion { /* prettylights-syntax-markup-deleted */ color: #ffdcd7; background-color: #67060c; } .hljs-char.escape_, .hljs-link, .hljs-params, .hljs-property, .hljs-punctuation, .hljs-tag { /* purposely ignored */ } } ================================================ FILE: resources/css/system/_icon.css ================================================ .icon { display: inline-block; height: 1.2em; width: 1.2em; vertical-align: -0.2em; flex-shrink: 0; object-fit: contain; stroke-width: 1.5; } .icon--thin { stroke-width: 1; } .icon--thick { stroke-width: 2; } .icon--narrow { margin-left: -0.2em; margin-right: -0.2em; } .with-icon { display: inline-flex; align-items: baseline; vertical-align: baseline; > .icon { margin-right: 0.2em; align-self: center; &:not(:first-child) { margin-left: 0.2em; } } } .icon-tabler-lock circle { display: none; } .dot { display: inline-block; width: 10px; height: 10px; margin: 0.3em 0.1em; border-radius: 100%; background: currentColor; vertical-align: -5px; } ================================================ FILE: resources/css/system/_input.css ================================================ input:where( [type='date'], [type='datetime-local'], [type='email'], [type='file'], [type='month'], [type='number'], [type='password'], [type='search'], [type='tel'], [type='text'], [type='time'], [type='url'], [type='week'] ), textarea, select, .input { display: block; width: 100%; border: 1px solid var(--color-stroke); background: var(--color-bg); color: var(--color-text); height: var(--control-height); box-sizing: border-box; border-radius: var(--control-radius); padding: 0.55em 0.7em; -webkit-appearance: none; &:focus, &:focus-within { outline: none; border-color: var(--color-accent); box-shadow: inset 0 0 0 1px var(--color-accent); } &:disabled { background: var(--color-fill); } .has-error & { border-color: var(--color-danger); } } input[type='file'] { overflow: hidden; &:not(:disabled):not([readonly]) { cursor: pointer; } &::file-selector-button { padding: 0 var(--space-md) 0 0; margin: 0; width: auto; background: none; color: var(--color-accent-text); font-weight: var(--weight-bold); pointer-events: none; border: 0; } } *::placeholder { color: var(--color-muted); } textarea, .textarea, select[multiple] { height: auto; padding: 0.7rem; border-radius: var(--radius); } select:not([multiple]), .select { cursor: default; background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="%23888"%3E%3Cpath fill-rule="evenodd" d="M10 3a1 1 0 01.707.293l3 3a1 1 0 01-1.414 1.414L10 5.414 7.707 7.707a1 1 0 01-1.414-1.414l3-3A1 1 0 0110 3zm-3.707 9.293a1 1 0 011.414 0L10 14.586l2.293-2.293a1 1 0 011.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z" clip-rule="evenodd" /%3E%3C/svg%3E'); background-position: center right 0.5em; background-size: 1.25em; background-repeat: no-repeat; padding-right: 2em; } *:invalid + .hide-if-invalid { visibility: hidden; } .input-container { --input-container-padding-start: 2.6em; --input-container-padding-end: 2.6em; display: flex; align-items: center; > :not(input, .input, select, script) { display: flex; align-items: center; justify-content: center; position: relative; &:first-child { width: var(--input-container-padding-start); margin-right: calc(-1 * var(--input-container-padding-start)); } &:last-child { width: var(--input-container-padding-end); margin-left: calc(-1 * var(--input-container-padding-end)); } } > :is(input, .input, select) { &:nth-child(2) { padding-left: var(--input-container-padding-start); } &:nth-last-child(2) { padding-right: var(--input-container-padding-end); } } } ================================================ FILE: resources/css/system/_mention.css ================================================ .mention { color: inherit; border-radius: var(--radius); font-weight: var(--weight-bold); } .mention--self { background: var(--color-warning-soft); color: var(--color-warning-text); border-radius: 4px; margin: -2px; padding: 2px; } ================================================ FILE: resources/css/system/_menu.css ================================================ .menu { --color-bg: var(--palette-surface); --color-text: var(--palette-text); display: block; background: var(--color-bg); color: var(--color-text); box-shadow: var(--shadow-md); padding: var(--space-xs); border-radius: var(--radius); min-width: 15ch; width: max-content; max-width: 30ch; z-index: var(--z-index-overlay); font-size: var(--text-xs); overflow: auto; } .menu--lg { max-width: 50ch; } .menu-item { border-radius: calc(var(--radius) * 2 / 3); border: 0; background: transparent; appearance: none; margin: 0; display: flex; gap: var(--space-xs); width: 100%; align-items: flex-start; padding: var(--space-xs); text-decoration: none !important; color: var(--color-text); transform: none !important; text-align: left; @mixin clickable; &:not(.is-inert):is( :hover, .is-hovered, :focus, .is-focused, [aria-selected='true'] ) { background: var(--color-fill); outline: none; } &:not(.is-inert).color-danger:is(:hover, .is-hovered) { background: var(--color-danger); color: var(--color-danger-contrast); } &.is-active, &[aria-current='page'], &[aria-checked='true'] { color: var(--color-accent-text); background: var(--color-accent-soft); } } .menu-item__title { display: block; font-weight: var(--weight-medium); } .menu-item__description { display: block; color: var(--color-muted); font-size: 90%; margin-top: var(--space-xxs); } .menu-item__check { margin-left: auto; .menu-item:not(.is-active, [aria-current='page'], [aria-checked='true']) & { visibility: hidden; } } .menu-divider { margin: var(--space-xs); + .menu-divider, .menu > &:first-child, .menu > &:last-child { display: none; } } .menu-heading { padding: var(--space-xs); color: var(--color-muted); font-family: var(--font-text); font-size: var(--text-xxs); font-weight: var(--weight-medium); text-transform: uppercase; } .menu-sticky { position: sticky; top: calc(-1 * var(--space-sm)); margin-top: calc(-1 * var(--space-sm)); padding-top: var(--space-xs); background: var(--color-bg); z-index: 1; } ui-popup:has(> .drawer)::part(backdrop) { background: var(--color-overlay); } .drawer { background: var(--color-bg); position: fixed !important; left: 0 !important; top: 0 !important; max-height: none !important; margin: 0; height: 100vh; width: min(70vw, 30ch); box-shadow: var(--shadow-md); padding: var(--space-lg); z-index: var(--z-index-overlay); overflow: auto; &.enter-from, &.leave-to { transform: translateX(-100%); opacity: initial; } } .drawer--right { left: auto !important; right: 0 !important; &.enter-from, &.leave-to { transform: translateX(100%); } } ================================================ FILE: resources/css/system/_modal.css ================================================ /* Style the modal container */ ui-modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; align-items: flex-start; justify-content: center; z-index: var(--z-index-overlay); padding: var(--space-xxxl) var(--space-gutter); overflow: auto; &:not([hidden]) { display: flex; } .dialog { box-shadow: var(--shadow-md); border: 0; } } /* Style the backdrop */ ui-modal::part(backdrop) { background: var(--color-overlay); } ui-modal::part(content) { max-width: 100%; } /* Transitions using hello-goodbye */ @media (prefers-reduced-motion: no-preference) { ui-modal.enter-active, ui-modal.leave-active { transition: opacity 0.3s; } ui-modal.enter-from, ui-modal.leave-to { opacity: 0; } ui-modal.enter-active::part(content), ui-modal.leave-active::part(content) { transition: transform 0.3s cubic-bezier(0.54, 1.12, 0.38, 1.11), opacity 0.3s; } ui-modal.enter-from::part(content), ui-modal.leave-to::part(content) { transform: scale(0.7); opacity: 0; } } ================================================ FILE: resources/css/system/_nav.css ================================================ .nav { list-style: none; margin-inline: 0; padding-inline: 0; } .nav-heading { margin-bottom: var(--space-xs); padding: 0 var(--space-sm); width: 100%; color: var(--color-muted); font-family: var(--font-text); font-size: var(--text-xxs); font-weight: var(--weight-medium); text-transform: uppercase; * + & { margin-top: var(--space-lg); } } .nav-link { display: flex; align-items: center; gap: var(--space-xs); min-height: var(--control-height); padding: var(--space-xs) var(--space-sm); font-weight: var(--weight-medium); text-decoration: none !important; color: var(--color-text); border-radius: var(--control-radius); > :not(.icon) { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } > .icon { font-size: 120%; } > [class^='icon-fa'] { padding: 2px; } > .badge { margin-left: auto; } @mixin clickable; transform: none !important; &:hover, &:focus { background: var(--color-fill); } &.is-active, &[aria-current='page'] { color: var(--color-accent-text); background: var(--color-accent-soft); .badge { background: inherit; color: inherit; } } } @media (--md-down) { // Allow the responsive nav button to shrink down to 10ch before wrapping .collapsible-nav { flex: 1 1 10ch; min-width: 0; max-width: fit-content; } } @media (--lg-up) { .collapsible-nav { > :first-child { display: none; } > :last-child { display: contents !important; } } } ================================================ FILE: resources/css/system/_placeholder.css ================================================ .placeholder { display: flex; flex-direction: column; align-items: center; gap: var(--space-sm); text-align: center; color: var(--color-muted); padding: var(--space-xl) 0; > * { max-width: 50ch; } } .placeholder__icon { width: 4em; height: 4em; stroke-width: 1.5px; } ================================================ FILE: resources/css/system/_reset.css ================================================ // Inspired by https://github.com/andy-piccalilli/modern-css-reset *, *::before, *::after { box-sizing: border-box; margin: 0; } input, button, textarea, select { font: inherit; } [hidden] { display: none !important; } [role='list'] { list-style: none; padding: 0; } button { appearance: none; background: transparent; border: 0; color: inherit; cursor: pointer; margin: 0; padding: 0; } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } } ================================================ FILE: resources/css/system/_sidebar.css ================================================ :root { --sidebar-width: 25ch; } .with-sidebar { display: flex; align-items: flex-start; justify-content: center; gap: var(--space-gutter); } .with-sidebar > :not(.sidebar) { flex-grow: 999; min-width: 0; } .sidebar { display: flex; } @media (--md-down) { .with-sidebar { flex-direction: column; gap: var(--space-md); align-items: stretch; } .with-sidebar > :not(.sidebar) { width: 100%; } .sidebar { flex-direction: row; flex-wrap: wrap; } .sidebar--bottom { position: sticky; bottom: 0; margin-inline: calc(-1 * var(--space-gutter)); padding-inline: var(--space-gutter); background: var(--color-bg); width: calc(100% + 2 * var(--space-gutter)) !important; padding-block: var(--space-sm); flex-wrap: nowrap !important; flex-direction: row !important; flex-basis: auto !important; align-items: center; z-index: var(--z-index-header); &.is-stuck { box-shadow: var(--shadow-sm); } } } @media (--lg-up) { .sidebar { flex-basis: var(--sidebar-width); flex-shrink: 0; flex-direction: column; } .sidebar--sticky { position: sticky; top: var(--header-height); margin-block: calc(-1 * var(--space-gutter)); padding-block: var(--space-gutter); max-height: calc(100vh - var(--header-height) - 2 * var(--space-gutter)); overflow: auto; box-sizing: content-box; } .sidebar__collapsed { display: none; } } ================================================ FILE: resources/css/system/_skip-link.css ================================================ .skip-link { color: var(--color-accent-contrast); background-color: var(--color-accent); padding: var(--space-xs); position: absolute; top: -10rem; &:focus { position: absolute; z-index: var(--z-index-overlay); top: var(--space-xs); left: var(--space-xs); } } ================================================ FILE: resources/css/system/_spinner.css ================================================ .spinner { display: inline-flex; flex-direction: column; align-items: center; gap: var(--space-sm); color: var(--color-muted); &::before { content: ''; display: block; margin: 0 auto; @mixin spinner; } } .spinner--sm { padding: 0; vertical-align: -0.3em; &::before { width: 1.2em; height: 1.2em; border-width: 0.25em; } } .spinner--block { display: flex; padding: var(--space-md); } @keyframes spinner { from { transform: rotate(0deg); } to { transform: rotate(359deg); } } ================================================ FILE: resources/css/system/_table.css ================================================ .table-container { overflow: auto; max-width: 100%; width: fit-content; * { overflow-wrap: normal; } & table { width: 100%; border: 0; } } table { border-spacing: 0; border-collapse: collapse; &, td, th { border: 1px solid var(--color-fill); } & td, th { padding: var(--space-sm); text-align: left; } & th { font-weight: var(--weight-bold); } } .table-container table, .table { font-size: var(--text-xs); border-collapse: separate; & td, th { padding: var(--space-sm); text-align: left; border-width: 1px 0 0; } & th { font-weight: var(--weight-bold); } & thead { & td, th { border-width: 0; } } } td.choice-cell { padding: 0; position: relative; min-width: 4ch; > * { position: absolute; top: 0; left: 0; right: 0; bottom: 0; display: flex; align-items: center; justify-content: center; cursor: pointer; &:not(.is-disabled):hover, &.is-highlighted { background: var(--color-fill); } } } .is-highlighted { background: var(--color-fill); } ================================================ FILE: resources/css/system/_tabs.css ================================================ .tabs { display: flex; flex-wrap: wrap; align-items: center; margin-inline: calc(-1 * var(--space-sm)); } .tab { color: var(--color-muted); font-weight: var(--weight-medium); text-decoration: none !important; padding: var(--space-xs) var(--space-sm); white-space: nowrap; min-width: 2ch; text-align: center; position: relative; flex-shrink: 0; overflow: hidden; text-overflow: ellipsis; &:not(.is-disabled, [aria-disabled='true']) { &:hover, &.is-hovered { color: var(--color-text); } } &.is-active, &[aria-current='page'], &[aria-selected='true'] { color: var(--color-accent-text) !important; &::after { content: ''; position: absolute; bottom: 0; left: 50%; transform: translateX(-50%); min-width: 2ch; width: calc(100% - 2 * var(--space-sm)); background: var(--color-accent-soft); height: 4px; border-radius: var(--radius); } } &.is-disabled, &[aria-disabled='true'] { opacity: 0.3; cursor: default; } } .tabs--vertical { margin-right: 0; flex-direction: column; flex-wrap: nowrap; align-items: stretch; font-size: var(--text-xs); .tab { display: block; text-align: left; padding-block: var(--space-xxs); padding-inline: var(--space-sm); &.is-active, &[aria-current='page'], &[aria-selected='true'] { &::after { width: 4px; height: calc(100% - 2 * var(--space-xxs)); bottom: var(--space-xxs); left: 0; transform: none; min-width: 0; } } } } ================================================ FILE: resources/css/system/_tooltip.css ================================================ ui-tooltip { // .visually-hidden clip: rect(0 0 0 0); clip-path: inset(50%); height: 1px; overflow: hidden; position: absolute; white-space: nowrap; width: 1px; } .tooltip { background: var(--color-emphasis); border-radius: var(--radius); box-shadow: var(--space-md); color: var(--color-emphasis-contrast); font-size: var(--text-xs); font-weight: var(--weight-medium); max-width: 30ch; padding: var(--space-xs) var(--space-sm); z-index: var(--z-index-overlay); text-align: center; overflow: hidden; --color-text: var(--color-emphasis-contrast); --color-muted: rgb(255 255 255 / 0.5); --color-accent: var(--color-text); & small { font-size: var(--text-xxs); color: var(--color-muted); } &.enter-active, &.leave-active { transition: opacity 0.2s, transform 0.2s; } &.enter-from, &.leave-to { opacity: 0; transform: scale(0.95); } } .tooltip--block { text-align: left; padding: var(--space-xs) var(--space-sm); font-size: var(--text-xxs); } ================================================ FILE: resources/css/system/_turbo.css ================================================ turbo-frame { display: block; } .busy-spinner[aria-busy='true'] { position: relative; min-height: 4em; visibility: hidden; &::after { visibility: visible; content: ''; position: absolute; z-index: 2; left: calc(50% - 1em); top: var(--space-md); @mixin spinner; } } .turbo-progress-bar { background-color: var(--color-accent); } .next-page { position: relative; &::before { content: ''; position: absolute; top: -100px; bottom: -100px; } } ================================================ FILE: resources/css/system/_typography.css ================================================ .h1, .h2, .h3, h1, h2, h3 { font-family: var(--font-display); } .h4, .h5, .h6, h4, h5, h6 { font-family: var(--font-text); } .h1, h1 { font-size: var(--text-xxl); font-weight: var(--weight-bold); line-height: var(--line-height-condensed); } .h2, h2 { font-size: var(--text-xl); font-weight: var(--weight-bold); line-height: var(--line-height-condensed); } .h3, h3 { font-size: var(--text-lg); font-weight: var(--weight-bold); } .h4, h4 { font-size: var(--text-md); font-weight: var(--weight-bold); } .h5, h5 { font-size: var(--text-sm); font-weight: var(--weight-bold); } .h6, h6 { font-size: var(--text-xs); font-weight: var(--weight-bold); } .subtitle { color: var(--color-muted); font-family: var(--font-text); font-size: var(--text-xxs); font-weight: var(--weight-medium); text-transform: uppercase; } .lead { font-size: var(--text-md); line-height: var(--line-height-expanded); } .content { overflow-wrap: break-word; line-height: var(--line-height-expanded); } :where(.content) { > * + *, li p { margin-top: 1em; } > * + :is(h1, h2, h3, h4, h5, h6) { margin-top: 1.8em; } & a { text-decoration: underline; } & ol { list-style-position: outside; padding-left: 2em; } & ul { list-style: disc outside; padding-left: 2em; & ul { list-style-type: circle; & ul { list-style-type: square; } } } & blockquote { color: var(--color-muted); border-left: 5px solid var(--color-fill); padding-left: var(--space-md); > * + * { margin-top: 1em; } } & figcaption { color: var(--color-muted); font-size: 90%; } & code { font-family: var(--font-mono); font-size: 80%; background: var(--color-fill-soft); color: var(--color-accent-text); padding: 3px; border-radius: 4px; } & pre code { display: block; overflow: auto; background: var(--color-fill); color: inherit; border-radius: var(--radius); padding: var(--space-md) !important; } & :is(img, video):not([class]) { max-width: 100%; height: auto; } & hr:not([class]) { border: 0; border-top: 3px solid var(--color-stroke); margin: 2em 0; } } :where(.content--compact) { > * + * { margin-top: 1em; } & h1, h2, h3, h4, h5, h6 { font-size: 100%; } } ================================================ FILE: resources/css/system/_user-label.css ================================================ .user-label { display: inline-flex; align-items: baseline; gap: var(--space-xxs); vertical-align: baseline; color: inherit; text-decoration: none; .avatar { width: 18px; height: 18px; align-self: center; } } ================================================ FILE: resources/css/system/_utils.css ================================================ // Accessibility .visually-hidden { clip: rect(0 0 0 0); clip-path: inset(50%); height: 1px; overflow: hidden; position: absolute; white-space: nowrap; width: 1px; } // Layout .container { margin-inline: auto; padding-inline: var(--space-gutter); max-width: 72rem; width: 100%; } .section { padding-block: var(--space-gutter); } // Typographic measure .measure { max-width: var(--measure); } // Size @each $size in (px, xxs, xs, sm, md, lg, xl, xxl, xxxl, gutter) { .gap-$(size) { gap: var(--space-$(size)); } .gap-x-$(size) { column-gap: var(--space-$(size)); } .gap-y-$(size) { row-gap: var(--space-$(size)); } .p-$(size) { padding: var(--space-$(size)); } .px-$(size) { padding-inline: var(--space-$(size)); } .py-$(size) { padding-block: var(--space-$(size)); } .m-$(size) { margin: var(--space-$(size)); } .mx-$(size) { margin-inline: var(--space-$(size)); } .my-$(size) { margin-block: var(--space-$(size)); } .mt-$(size) { margin-top: var(--space-$(size)); } .-m-$(size) { margin: calc(-1 * var(--space-$(size))); } .-mx-$(size) { margin-inline: calc(-1 * var(--space-$(size))); } .-my-$(size) { margin-block: calc(-1 * var(--space-$(size))); } .-mt-$(size) { margin-top: calc(-1 * var(--space-$(size))); } } // Flexbox and Grid .stack { display: flex; flex-direction: column; &.reverse { flex-direction: column-reverse; } } .row { display: flex; align-items: center; &.reverse { flex-direction: row-reverse; } } .grid { display: grid; grid-template-columns: repeat( auto-fill, minmax(min(var(--grid-min, 15ch), 100%), 1fr) ); } .grid-fit { display: grid; grid-template-columns: repeat( auto-fit, minmax(min(var(--grid-min, 15ch), 100%), 1fr) ); } .block { display: block; width: 100%; } .inline { display: inline; vertical-align: middle; } .inline-block { display: inline-block; } .justify-center { justify-content: center; } .justify-end { justify-content: flex-end; } .justify-start { justify-content: flex-start; } .justify-between { justify-content: space-between; } .align-center { align-items: center; } .align-start { align-items: flex-start; } .align-end { align-items: flex-end; } .align-baseline { align-items: baseline; } .align-stretch { align-items: stretch; } .align-self-center { align-self: center; } .align-self-start { align-self: flex-start; } .align-self-end { align-self: flex-end; } .align-self-baseline { align-self: baseline; } .align-self-stretch { align-self: stretch; } .push-start { margin-inline-end: auto; } .push-center { margin-inline: auto; } .push-end { margin-inline-start: auto; } @media (--sm) { .break-sm { order: 999; width: 100%; flex-grow: 1; } } .grow { flex-grow: 1; } .shrink { min-width: 0; } .no-shrink { flex-shrink: 0; } .full-width { width: 100%; } .full-height { height: 100%; } .wrap { flex-wrap: wrap; } .wrap-reverse { flex-wrap: wrap-reverse; } .nowrap { flex-wrap: nowrap; white-space: nowrap; } .dividers { > * + * { border-top: 1px solid var(--color-stroke); margin-top: var(--space-lg); padding-top: var(--space-lg); } } // Float .float-left { float: left; } .float-right { float: right; } // Overflow .overflow-ellipsis { white-space: nowrap; text-overflow: ellipsis; overflow: hidden; } .overflow-visible { overflow: visible; } .overflow-hidden { overflow: hidden; } .scrollable, .scrollable-x, .scrollable-y { overflow: auto; -ms-overflow-style: none; scrollbar-width: none; &::-webkit-scrollbar { display: none; } &::before, &::after { content: ''; display: block; position: sticky; z-index: 10; flex-shrink: 0; pointer-events: none; opacity: 0; transition: opacity 0.5s; } } .scrollable-x { &::before, &::after { width: 40px; margin-left: -40px; align-self: stretch; } &::before { left: 0; background-image: linear-gradient(to right, var(--color-bg), transparent); } &::after { right: 0; background-image: linear-gradient(to left, var(--color-bg), transparent); } &.is-scrolled-right::before, &.is-scrolled-left::after { opacity: 1; } } .scrollable-y { &::before, &::after { height: 40px; margin-top: -40px; width: 100%; } &::before { top: 0; background-image: linear-gradient(to bottom, var(--color-bg), transparent); } &::after { bottom: 0; background-image: linear-gradient(to top, var(--color-bg), transparent); } &.is-scrolled-down::before, &.is-scrolled-up::after { opacity: 1; } } // Rotation .rotate-90 { transform: rotate(90deg); } .rotate-180 { transform: rotate(180deg); } .rotate-270 { transform: rotate(270deg); } .flip-horizontal { transform: scaleX(-1); } .flip-vertical { transform: scaleY(-1); } // Text Alignment .text-left { text-align: left; } .text-center { text-align: center; } .text-right { text-align: right; } // Text Color .color-text { color: var(--color-text); } .color-muted { color: var(--color-muted); } .color-accent { color: var(--color-accent-text); } .color-success { color: var(--color-success-text); } .color-warning { color: var(--color-warning-text); } .color-danger { color: var(--color-danger-text); } .color-activity { color: var(--color-activity-text); } .color-inherit { color: inherit; } // Text Size .text-xxs { font-size: var(--text-xxs); } .text-xs { font-size: var(--text-xs); } .text-sm { font-size: var(--text-sm); } .text-md { font-size: var(--text-md); } .text-lg { font-size: var(--text-lg); } .text-xl { font-size: var(--text-xl); } .text-xxl { font-size: var(--text-xxl); } // Animation .animate-shake { animation: shake 0.8s; } @keyframes shake { 10%, 90% { transform: translateX(-1px); } 20%, 80% { transform: translateX(2px); } 30%, 50%, 70% { transform: translateX(-4px); } 40%, 60% { transform: translateX(4px); } } .animate-appear { animation: appear 0.5s; } @keyframes appear { 0% { transform: scale(0.9); opacity: 0; } 100% { transform: none; opacity: 1; } } // Background Color .bg-emphasis, .bg-accent, .bg-success, .bg-warning, .bg-danger, .bg-activity { --color-fill: rgb(255 255 255 / 0.1); --color-stroke: rgb(255 255 255 / 0.25); --color-muted: var(--color-text); --color-accent: var(--color-text); --color-accent-text: var(--color-text); background-color: var(--color-bg); color: var(--color-text); } .bg-fill { background-color: var(--color-fill); } .bg-fill-soft { background-color: var(--color-fill-soft); } .bg-emphasis { --color-bg: var(--palette-emphasis); --color-text: var(--palette-emphasis-contrast); } .bg-accent { --color-bg: var(--palette-accent); --color-text: var(--palette-accent-contrast); } .bg-accent-soft { background-color: var(--color-accent-soft); color: var(--color-accent-text); } .bg-success { --color-bg: var(--palette-success); --color-text: var(--palette-success-contrast); } .bg-success-soft { background-color: var(--color-success-soft); color: var(--color-success-text); } .bg-warning { --color-bg: var(--palette-warning); --color-text: var(--palette-warning-contrast); } .bg-warning-soft { background-color: var(--color-warning-soft); color: var(--color-warning-text); } .bg-danger { --color-bg: var(--palette-danger); --color-text: var(--palette-danger-contrast); } .bg-danger-soft { background-color: var(--color-danger-soft); color: var(--color-danger-text); } .bg-activity { --color-bg: var(--palette-activity); --color-text: var(--palette-activity-contrast); } .bg-activity-soft { background-color: var(--color-activity-soft); color: var(--color-activity-text); } // Interactions .no-pointer { pointer-events: none; } .no-select { user-select: none; -webkit-user-select: none; } .clickable { @mixin clickable; } .cursor-default { cursor: default !important; } .cursor-help { cursor: help !important; } .cursor-pointer { cursor: pointer !important; } // JavaScript .js .no-js-only, .no-js .js-only { display: none !important; } // Border Radius .rounded { border-radius: var(--radius); } .pill { border-radius: 999px; } // Overlay .overlay-container { position: relative; } .overlay, .has-overlay::before { position: absolute !important; // !important to override .busy-spinner top: 0; left: 0; right: 0; bottom: 0; } .has-overlay::before { content: ''; } // Truncated .truncated { overflow: hidden; position: relative; max-height: 15em; } .truncated__expander { position: absolute; left: 0; right: 0; bottom: 0; width: 100%; height: 5em; background: linear-gradient(to bottom, transparent, var(--color-bg) 60%); display: flex; align-items: flex-end; } // Font Family .font-text { font-family: var(--font-text); } .font-display { font-family: var(--font-display); } .font-mono { font-family: var(--font-mono); } // Font Weight .weight-normal { font-weight: var(--weight-normal); } .weight-medium { font-weight: var(--weight-medium); } .weight-bold { font-weight: var(--weight-bold); } // Underline .underline { text-decoration: underline; } .no-underline { text-decoration: none; } // Responsive Hiding @media (--sm) { .hide-sm { display: none !important; } } @media (--md-up) { .hide-md-up { display: none !important; } } @media (--md-down) { .hide-md-down { display: none !important; } } @media (--lg-up) { .hide-lg-up { display: none !important; } } @media (--lg-down) { .hide-lg-down { display: none !important; } } .hide-if-not-only-child:not(:only-child), .hide-if-empty:empty { display: none; } // Dark mode [data-theme='dark'] .light-only, [data-theme='light'] .dark-only { display: none; } ================================================ FILE: resources/css/system/_variables.css ================================================ :root, [data-theme='light'] { color-scheme: light; // Background color --palette-bg-hsl: 250 38% 98%; --palette-bg: hsl(var(--palette-bg-hsl)); // Surface color --palette-surface-hsl: 255 100% 100%; --palette-surface: hsl(var(--palette-surface-hsl)); // Text color --palette-text-hsl: 0 0% 0%; --palette-text: hsl(var(--palette-text-hsl)); // Muted color --palette-muted-hsl: 250 20% 50%; --palette-muted: hsl(var(--palette-muted-hsl)); --palette-fill: hsl(var(--palette-muted-hsl) / 0.1); --palette-fill-soft: hsl(var(--palette-muted-hsl) / 0.05); --palette-stroke: hsl(var(--palette-muted-hsl) / 0.25); // Emphasis color --palette-emphasis: hsl(217, 16%, 22%); --palette-emphasis-contrast: #fff; // Accent color --palette-accent-h: 252; --palette-accent-s: 93%; --palette-accent-l: 58%; --palette-accent: hsl( var(--palette-accent-h) var(--palette-accent-s) var(--palette-accent-l) ); --palette-accent-contrast: #fff; --palette-accent-soft: hsl( var(--palette-accent-h) var(--palette-accent-s) 92% ); --palette-accent-text: hsl( var(--palette-accent-h) var(--palette-accent-s) calc(var(--palette-accent-l) * 0.9) ); // Danger color --palette-danger-h: 0; --palette-danger-s: 100%; --palette-danger-l: 38%; --palette-danger: hsl( var(--palette-danger-h) var(--palette-danger-s) var(--palette-danger-l) ); --palette-danger-contrast: #fff; --palette-danger-soft: hsl( var(--palette-danger-h) var(--palette-danger-s) 92% ); --palette-danger-text: hsl( var(--palette-danger-h) var(--palette-danger-s) calc(var(--palette-danger-l) * 0.9) ); // Warning color --palette-warning-h: 60; --palette-warning-s: 100%; --palette-warning-l: 45%; --palette-warning: hsl( var(--palette-warning-h) var(--palette-warning-s) var(--palette-warning-l) ); --palette-warning-contrast: hsl( var(--palette-warning-h) var(--palette-warning-s) 15% ); --palette-warning-soft: hsl( var(--palette-warning-h) var(--palette-warning-s) 92% ); --palette-warning-text: hsl( var(--palette-warning-h) var(--palette-warning-s) 24% ); // Success color --palette-success-h: 127; --palette-success-s: 100%; --palette-success-l: 27%; --palette-success: hsl( var(--palette-success-h) var(--palette-success-s) var(--palette-success-l) ); --palette-success-contrast: #fff; --palette-success-soft: hsl( var(--palette-success-h) var(--palette-success-s) 92% ); --palette-success-text: hsl( var(--palette-success-h) var(--palette-success-s) calc(var(--palette-success-l) * 0.9) ); // Activity color --palette-activity-h: 23; --palette-activity-s: 100%; --palette-activity-l: 45%; --palette-activity: hsl( var(--palette-activity-h) var(--palette-activity-s) var(--palette-activity-l) ); --palette-activity-contrast: #fff; --palette-activity-soft: hsl( var(--palette-activity-h) var(--palette-activity-s) 92% ); --palette-activity-text: hsl( var(--palette-activity-h) var(--palette-activity-s) calc(var(--palette-activity-l) * 0.9) ); } [data-theme='dark'] { color-scheme: dark; --palette-bg-hsl: 250 20% 8%; --palette-surface-hsl: 250 20% 12%; --palette-text-hsl: 250 20% 93%; --palette-muted-hsl: 250 20% 60%; --palette-accent-soft: hsl( var(--palette-accent-h) var(--palette-accent-s) 20% ); --palette-accent-text: hsl( var(--palette-accent-h) var(--palette-accent-s) calc(var(--palette-accent-l) * 1.3) ); --palette-danger-soft: hsl( var(--palette-danger-h) var(--palette-danger-s) 10% ); --palette-danger-text: hsl( var(--palette-danger-h) var(--palette-danger-s) calc(var(--palette-danger-l) * 1.3) ); --palette-warning-soft: hsl( var(--palette-warning-h) var(--palette-warning-s) 10% ); --palette-warning-text: hsl( var(--palette-warning-h) var(--palette-warning-s) 40% ); --palette-success-soft: hsl( var(--palette-success-h) var(--palette-success-s) 10% ); --palette-success-text: hsl( var(--palette-success-h) var(--palette-success-s) calc(var(--palette-success-l) * 1.3) ); --palette-activity-soft: hsl( var(--palette-activity-h) var(--palette-activity-s) 10% ); --palette-activity-text: hsl( var(--palette-activity-h) var(--palette-activity-s) calc(var(--palette-activity-l) * 1.3) ); } :root { // Shadows --shadow-sm: 0 1px 4px var(--palette-fill); --shadow-md: 0 0 0 1px var(--palette-fill), 0 5px 15px var(--palette-stroke); // Overlays --color-overlay: rgb(0 0 0 / 0.5); // Filters --filter-hover: brightness(0.95); --filter-active: brightness(0.9); // Spacing --ratio: 1.5; --space-px: 1px; --space-xxs: calc(var(--space-xs) / var(--ratio)); --space-xs: calc(var(--space-sm) / var(--ratio)); --space-sm: calc(var(--space-md) / var(--ratio)); --space-md: 1rem; --space-lg: calc(var(--space-md) * var(--ratio)); --space-xl: calc(var(--space-lg) * var(--ratio)); --space-xxl: calc(var(--space-xl) * var(--ratio)); --space-xxxl: calc(var(--space-xxl) * var(--ratio)); --space-gutter: clamp(var(--space-lg), 3vw, var(--space-xl)); // Font --font-system: system-ui; --font-text: var(--font-system); --font-display: var(--font-text); --font-mono: SFMono-Regular, Menlo, Monaco, Consolas, 'Courier New', monospace; // Font weights --weight-normal: 400; --weight-medium: 500; --weight-bold: 600; // Line height --line-height-default: 1.3; --line-height-condensed: 1.2; --line-height-expanded: 1.5; // Typographic measure --measure: 92ch; // Z-indexes --z-index-header: 100; --z-index-overlay: 200; --z-index-alerts: 300; // Font size --text-xxs: 0.8rem; --text-xs: 0.875rem; --text-sm: 1rem; --text-md: 1.125rem; --text-lg: 1.5rem; --text-xl: 2rem; --text-xxl: 2.5rem; // Border radius --radius: 10px; // Controls --control-height: 2.5em; --control-height-small: 2.3em; --control-radius: var(--radius); // Header --header-height: 4rem; } :root, .menu { --color-bg: var(--palette-bg); --color-surface: var(--palette-surface); --color-text: var(--palette-text); --color-muted: var(--palette-muted); --color-fill: var(--palette-fill); --color-fill-soft: var(--palette-fill-soft); --color-stroke: var(--palette-stroke); --color-emphasis: var(--palette-emphasis); --color-emphasis-contrast: var(--palette-emphasis-contrast); --color-accent: var(--palette-accent); --color-accent-contrast: var(--palette-accent-contrast); --color-accent-soft: var(--palette-accent-soft); --color-accent-text: var(--palette-accent-text); --color-danger: var(--palette-danger); --color-danger-contrast: var(--palette-danger-contrast); --color-danger-soft: var(--palette-danger-soft); --color-danger-text: var(--palette-danger-text); --color-warning: var(--palette-warning); --color-warning-contrast: var(--palette-warning-contrast); --color-warning-soft: var(--palette-warning-soft); --color-warning-text: var(--palette-warning-text); --color-success: var(--palette-success); --color-success-contrast: var(--palette-success-contrast); --color-success-soft: var(--palette-success-soft); --color-success-text: var(--palette-success-text); --color-activity: var(--palette-activity); --color-activity-contrast: var(--palette-activity-contrast); --color-activity-soft: var(--palette-activity-soft); --color-activity-text: var(--palette-activity-text); } ================================================ FILE: resources/css/system/breakpoints.css ================================================ @custom-media --sm (width <= 40rem); @custom-media --md-up (width > 40rem); @custom-media --md-down (width <= 52rem); @custom-media --md (--md-up) and (--md-down); @custom-media --lg-up (width > 52rem); @custom-media --lg-down (width <= 68rem); @custom-media --lg (--lg-up) and (--lg-down); @custom-media --xl-up (width > 68rem); ================================================ FILE: resources/css/system/mixins.css ================================================ @define-mixin clickable { &:is(:disabled, .is-disabled) { opacity: 0.5; cursor: default; } &.is-inert { cursor: default; } &:not(:disabled, .is-disabled, .is-inert) { cursor: pointer; &:is(:hover, .is-hovered, :focus, .is-focused, [aria-selected='true']) { filter: var(--filter-hover); } &:is(:active) { filter: var(--filter-active); } &:active { transform: scale(0.97); } } } @define-mixin spinner { width: 2em; height: 2em; border: 0.35em solid var(--color-fill); border-top-color: var(--color-stroke); border-radius: 50%; animation: spinner 0.6s infinite linear; } ================================================ FILE: resources/css/system/system.css ================================================ @import '_variables.css'; // Base styles @import '_reset.css'; @import '_base.css'; @import '_typography.css'; // Base components @import '_alert.css'; @import '_alerts.css'; @import '_attribution.css'; @import '_avatar.css'; @import '_badge.css'; @import '_block-link.css'; @import '_breadcrumb.css'; @import '_btn.css'; @import '_card.css'; @import '_channel-label.css'; @import '_channel-picker.css'; @import '_choice.css'; @import '_color-picker.css'; @import '_combobox.css'; @import '_dialog.css'; @import '_divider.css'; @import '_form.css'; @import '_highlightjs.css'; @import '_icon.css'; @import '_input.css'; @import '_mention.css'; @import '_menu.css'; @import '_modal.css'; @import '_nav.css'; @import '_placeholder.css'; @import '_sidebar.css'; @import '_skip-link.css'; @import '_spinner.css'; @import '_table.css'; @import '_tabs.css'; @import '_tooltip.css'; @import '_turbo.css'; @import '_user-label.css'; // Other components @import '_emoji-picker.css'; // Utils @import '_utils.css'; ================================================ FILE: resources/dist/cp.css ================================================ .cp-dashboard__widgets{align-items:stretch;display:flex;flex-wrap:wrap;margin:calc(var(--space-lg)*-1/2)}.cp-dashboard__widgets>*{flex-grow:1;height:auto;height:var(--cp-dashboard-widget-height,auto);min-width:30ch;padding:calc(var(--space-lg)/2);width:100%;width:var(--cp-dashboard-widget-width,100%)}.cp-dashboard__widgets .card,.cp-dashboard__widgets turbo-frame{height:100%}.line-chart-widget{min-height:14em}.getting-started__grid{--grid-min:35ch}.permission-grid thead th{padding-left:var(--space-xxs);padding-right:var(--space-xxs);text-align:center;vertical-align:top;width:9ch}.cp-structure{overflow:hidden;padding:0}.cp-structure li{border-top:1px solid var(--color-stroke)}.cp-structure>:first-child{border-top:0}.cp-structure .placeholder:not(:only-child){display:none}.cp-structure__node{list-style:none}.drag-handle{color:var(--color-muted);cursor:move;display:flex}.drag-handle>*{opacity:.5}.no-js .drag-handle{display:none}[data-dnd-dragging=true]{background:var(--color-bg);border:0!important;border-radius:var(--radius);box-shadow:var(--shadow-md)}.cp-structure__label{font-weight:var(--weight-medium)}.container{max-width:none}.cp__content{margin-left:auto;margin-right:auto;max-width:110ch}.cp-title{margin-bottom:var(--space-lg)}.sortable>*{transition:transform .3s}.cp-help{font-size:var(--text-xs);margin-top:var(--space-xl);text-align:center}.uplot,.uplot *,.uplot :after,.uplot :before{box-sizing:border-box}.uplot{font-family:system-ui,Segoe UI,Ubuntu,Cantarell,Noto Sans,-apple-system,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;width:-moz-min-content;width:min-content}.u-title{font-size:18px;font-weight:700;text-align:center}.u-wrap{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.u-over,.u-under{position:absolute}.u-under{overflow:hidden}.uplot canvas{display:block;height:100%;position:relative;width:100%}.u-axis{position:absolute}.u-legend{font-size:14px;margin:auto;text-align:center}.u-inline{display:block}.u-inline *{display:inline-block}.u-inline tr{margin-right:16px}.u-legend th{font-weight:600}.u-legend th>*{display:inline-block;vertical-align:middle}.u-legend .u-marker{background-clip:padding-box!important;height:1em;margin-right:4px;width:1em}.u-inline.u-live th:after{content:":";vertical-align:middle}.u-inline:not(.u-live) .u-value{display:none}.u-series>*{padding:4px}.u-series th{cursor:pointer}.u-legend .u-off>*{opacity:.3}.u-select{background:rgba(0,0,0,.07)}.u-cursor-x,.u-cursor-y,.u-select{pointer-events:none;position:absolute}.u-cursor-x,.u-cursor-y{left:0;top:0;will-change:transform}.u-hz .u-cursor-x,.u-vt .u-cursor-y{border-right:1px dashed #607d8b;height:100%}.u-hz .u-cursor-y,.u-vt .u-cursor-x{border-bottom:1px dashed #607d8b;width:100%}.u-cursor-pt{background-clip:padding-box!important;border:0 solid;border-radius:50%;left:0;pointer-events:none;position:absolute;top:0;will-change:transform}.u-axis.u-off,.u-cursor-pt.u-off,.u-cursor-x.u-off,.u-cursor-y.u-off,.u-select.u-off{display:none} ================================================ FILE: resources/dist/cp.js ================================================ (function(){var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n&&e(r,Symbol.toStringTag,{value:`Module`}),r};let n=(e,t=0,n=1)=>e>n?n:eMath.round(n*e)/n;360/(Math.PI*2);let i=e=>p(a(e)),a=e=>(e[0]===`#`&&(e=e.substring(1)),e.length<6?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16),a:e.length===4?r(parseInt(e[3]+e[3],16)/255,2):1}:{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16),a:e.length===8?r(parseInt(e.substring(6,8),16)/255,2):1}),o=e=>f(u(e)),s=({h:e,s:t,v:n,a:i})=>{let a=(200-t)*n/100;return{h:r(e),s:r(a>0&&a<200?t*n/100/(a<=100?a:200-a)*100:0),l:r(a/2),a:r(i,2)}},c=e=>{let{h:t,s:n,l:r}=s(e);return`hsl(${t}, ${n}%, ${r}%)`},l=e=>{let{h:t,s:n,l:r,a:i}=s(e);return`hsla(${t}, ${n}%, ${r}%, ${i})`},u=({h:e,s:t,v:n,a:i})=>{e=e/360*6,t/=100,n/=100;let a=Math.floor(e),o=n*(1-t),s=n*(1-(e-a)*t),c=n*(1-(1-e+a)*t),l=a%6;return{r:r([n,s,o,o,c,n][l]*255),g:r([c,n,n,s,o,o][l]*255),b:r([o,o,c,n,n,s][l]*255),a:r(i,2)}},d=e=>{let t=e.toString(16);return t.length<2?`0`+t:t},f=({r:e,g:t,b:n,a:i})=>{let a=i<1?d(r(i*255)):``;return`#`+d(e)+d(t)+d(n)+a},p=({r:e,g:t,b:n,a:i})=>{let a=Math.max(e,t,n),o=a-Math.min(e,t,n),s=o?a===e?(t-n)/o:a===t?2+(n-e)/o:4+(e-t)/o:0;return{h:r(60*(s<0?s+6:s)),s:r(a?o/a*100:0),v:r(a/255*100),a:i}},m=(e,t)=>{if(e===t)return!0;for(let n in e)if(e[n]!==t[n])return!1;return!0},h=(e,t)=>e.toLowerCase()===t.toLowerCase()?!0:m(a(e),a(t)),g={},_=e=>{let t=g[e];return t||(t=document.createElement(`template`),t.innerHTML=e,g[e]=t),t},v=(e,t,n)=>{e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n}))},y=!1,b=e=>`touches`in e,x=e=>y&&!b(e)?!1:(y||=b(e),!0),S=(e,t)=>{let r=b(t)?t.touches[0]:t,i=e.el.getBoundingClientRect();v(e.el,`move`,e.getMove({x:n((r.pageX-(i.left+window.pageXOffset))/i.width),y:n((r.pageY-(i.top+window.pageYOffset))/i.height)}))},C=(e,t)=>{let n=t.keyCode;n>40||e.xy&&n<37||n<33||(t.preventDefault(),v(e.el,`move`,e.getMove({x:n===39?.01:n===37?-.01:n===34?.05:n===33?-.05:n===35?1:n===36?-1:0,y:n===40?.01:n===38?-.01:0},!0)))};var w=class{constructor(e,t,n,r){let i=_(`
`);e.appendChild(i.content.cloneNode(!0));let a=e.querySelector(`[part=${t}]`);a.addEventListener(`mousedown`,this),a.addEventListener(`touchstart`,this),a.addEventListener(`keydown`,this),this.el=a,this.xy=r,this.nodes=[a.firstChild,a]}set dragging(e){let t=e?document.addEventListener:document.removeEventListener;t(y?`touchmove`:`mousemove`,this),t(y?`touchend`:`mouseup`,this)}handleEvent(e){switch(e.type){case`mousedown`:case`touchstart`:if(e.preventDefault(),!x(e)||!y&&e.button!=0)return;this.el.focus(),S(this,e),this.dragging=!0;break;case`mousemove`:case`touchmove`:e.preventDefault(),S(this,e);break;case`mouseup`:case`touchend`:this.dragging=!1;break;case`keydown`:C(this,e);break}}style(e){e.forEach((e,t)=>{for(let n in e)this.nodes[t].style.setProperty(n,e[n])})}},T=class extends w{constructor(e){super(e,`hue`,`aria-label="Hue" aria-valuemin="0" aria-valuemax="360"`,!1)}update({h:e}){this.h=e,this.style([{left:`${e/360*100}%`,color:c({h:e,s:100,v:100,a:1})}]),this.el.setAttribute(`aria-valuenow`,`${r(e)}`)}getMove(e,t){return{h:t?n(this.h+e.x*360,0,360):360*e.x}}},E=class extends w{constructor(e){super(e,`saturation`,`aria-label="Color"`,!0)}update(e){this.hsva=e,this.style([{top:`${100-e.v}%`,left:`${e.s}%`,color:c(e)},{"background-color":c({h:e.h,s:100,v:100,a:1})}]),this.el.setAttribute(`aria-valuetext`,`Saturation ${r(e.s)}%, Brightness ${r(e.v)}%`)}getMove(e,t){return{s:t?n(this.hsva.s+e.x*100,0,100):e.x*100,v:t?n(this.hsva.v-e.y*100,0,100):Math.round(100-e.y*100)}}},D=`:host{display:flex;flex-direction:column;position:relative;width:200px;height:200px;user-select:none;-webkit-user-select:none;cursor:default}:host([hidden]){display:none!important}[role=slider]{position:relative;touch-action:none;user-select:none;-webkit-user-select:none;outline:0}[role=slider]:last-child{border-radius:0 0 8px 8px}[part$=pointer]{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;display:flex;place-content:center center;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}[part$=pointer]::after{content:"";width:100%;height:100%;border-radius:inherit;background-color:currentColor}[role=slider]:focus [part$=pointer]{transform:translate(-50%,-50%) scale(1.1)}`,O=`[part=hue]{flex:0 0 24px;background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}[part=hue-pointer]{top:50%;z-index:2}`,ee=`[part=saturation]{flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,rgba(255,255,255,0));box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}[part=saturation-pointer]{z-index:3}`;let te=Symbol(`same`),k=Symbol(`color`),ne=Symbol(`hsva`),re=Symbol(`update`),ie=Symbol(`parts`),ae=Symbol(`css`),oe=Symbol(`sliders`);var se=class extends HTMLElement{static get observedAttributes(){return[`color`]}get[ae](){return[D,O,ee]}get[oe](){return[E,T]}get color(){return this[k]}set color(e){if(!this[te](e)){let t=this.colorModel.toHsva(e);this[re](t),this[k]=e}}constructor(){super();let e=_(``),t=this.attachShadow({mode:`open`});t.appendChild(e.content.cloneNode(!0)),t.addEventListener(`move`,this),this[ie]=this[oe].map(e=>new e(t))}connectedCallback(){if(this.hasOwnProperty(`color`)){let e=this.color;delete this.color,this.color=e}else this.color||=this.colorModel.defaultColor}attributeChangedCallback(e,t,n){let r=this.colorModel.fromAttr(n);this[te](r)||(this.color=r)}handleEvent(e){let t=this[ne],n={...t,...e.detail};this[re](n);let r;!m(n,t)&&!this[te](r=this.colorModel.fromHsva(n))&&(this[k]=r,v(this,`color-changed`,{value:r}))}[te](e){return this.color&&this.colorModel.equal(e,this.color)}[re](e){this[ne]=e,this[ie].forEach(t=>t.update(e))}},A=class extends w{constructor(e){super(e,`alpha`,`aria-label="Alpha" aria-valuemin="0" aria-valuemax="1"`,!1)}update(e){this.hsva=e;let t=l({...e,a:0}),n=l({...e,a:1}),i=e.a*100;this.style([{left:`${i}%`,color:l(e)},{"--gradient":`linear-gradient(90deg, ${t}, ${n}`}]);let a=r(i);this.el.setAttribute(`aria-valuenow`,`${a}`),this.el.setAttribute(`aria-valuetext`,`${a}%`)}getMove(e,t){return{a:t?n(this.hsva.a+e.x):e.x}}},j=`[part=alpha]{flex:0 0 24px}[part=alpha]::after{display:block;content:"";position:absolute;top:0;left:0;right:0;bottom:0;border-radius:inherit;background-image:var(--gradient);box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}[part^=alpha]{background-color:#fff;background-image:url('data:image/svg+xml,')}[part=alpha-pointer]{top:50%}`,M=class extends se{get[ae](){return[...super[ae],j]}get[oe](){return[...super[oe],A]}};let ce={defaultColor:`#0001`,toHsva:i,fromHsva:o,equal:h,fromAttr:e=>e};var N=class extends M{get colorModel(){return ce}},P=class extends N{};customElements.define(`hex-alpha-color-picker`,P);let le=/^#?([0-9A-F]{3,8})$/i,ue=(e,t)=>{let n=le.exec(e),r=n?n[1].length:0;return r===3||r===6||!!t&&r===4||!!t&&r===8},de=_(``),fe=(e,t)=>e.replace(/([^0-9A-F]+)/gi,``).substring(0,t?8:6),pe=Symbol(`alpha`),me=Symbol(`color`),he=Symbol(`saved`),ge=Symbol(`input`),_e=Symbol(`init`),ve=Symbol(`prefix`),ye=Symbol(`update`);var be=class extends HTMLElement{static get observedAttributes(){return[`alpha`,`color`,`prefixed`]}get color(){return this[me]}set color(e){this[me]=e,this[ye](e)}get alpha(){return this[pe]}set alpha(e){this[pe]=e,this.toggleAttribute(`alpha`,e);let t=this.color;t&&!ue(t,e)&&(this.color=t.startsWith(`#`)?t.substring(0,t.length===5?4:7):t.substring(0,t.length===4?3:6))}get prefixed(){return this[ve]}set prefixed(e){this[ve]=e,this.toggleAttribute(`prefixed`,e),this[ye](this.color)}constructor(){super();let e=this.attachShadow({mode:`open`});e.appendChild(de.content.cloneNode(!0)),e.firstElementChild.addEventListener(`slotchange`,()=>this[_e](e))}connectedCallback(){if(this[_e](this.shadowRoot),this.hasOwnProperty(`alpha`)){let e=this.alpha;delete this.alpha,this.alpha=e}else this.alpha=this.hasAttribute(`alpha`);if(this.hasOwnProperty(`prefixed`)){let e=this.prefixed;delete this.prefixed,this.prefixed=e}else this.prefixed=this.hasAttribute(`prefixed`);if(this.hasOwnProperty(`color`)){let e=this.color;delete this.color,this.color=e}else this.color==null?this.color=this.getAttribute(`color`)||``:this[me]&&this[ye](this[me])}handleEvent(e){let{value:t}=e.target;switch(e.type){case`input`:let e=fe(t,this.alpha);this[he]=this.color,(ue(e,this.alpha)||t===``)&&(this.color=e,this.dispatchEvent(new CustomEvent(`color-changed`,{bubbles:!0,detail:{value:e?`#`+e:``}})));break;case`blur`:t&&!ue(t,this.alpha)&&(this.color=this[he])}}attributeChangedCallback(e,t,n){e===`color`&&this.color!==n&&(this.color=n);let r=n!=null;e===`alpha`&&this.alpha!==r&&(this.alpha=r),e===`prefixed`&&this.prefixed!==r&&(this.prefixed=r)}[_e](e){let t=this.querySelector(`input`);if(!t){let n;for(;n=this.firstChild;)n.remove();t=e.querySelector(`input`)}t.addEventListener(`input`,this),t.addEventListener(`blur`,this),this[ge]=t,this[ye](this.color)}[ye](e){this[ge]&&(this[ge].value=e==null||e==``?``:(this.prefixed?`#`:``)+fe(e,this.alpha))}},xe=class extends be{};customElements.define(`hex-input`,xe);function Se(e){return e.toLowerCase().replace(/[^a-z0-9]/gi,`-`).replace(/-+/g,`-`).replace(/-$|^-/g,``)}function Ce(e){return Object.entries(e).map(([e,t])=>({identifier:e.match(/\.\/controllers\/(.*)\.ts$/)[1].replace(/\//g,`--`).replace(/_/g,`-`).replace(/-controller$/,``),controllerConstructor:t.default}))}function we(e){return e.replace(/(?:[_-])([a-z0-9])/g,(e,t)=>t.toUpperCase())}function F(e){return we(e.replace(/--/g,`-`).replace(/__/g,`_`))}function I(e){return e.charAt(0).toUpperCase()+e.slice(1)}function Te(e){return e.replace(/([A-Z])/g,(e,t)=>`-${t.toLowerCase()}`)}function Ee(e){return e!=null}function De(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Oe(e,t){let n=Ae(e);return Array.from(n.reduce((e,n)=>(je(n,t).forEach(t=>e.add(t)),e),new Set))}function ke(e,t){return Ae(e).reduce((e,n)=>(e.push(...Me(n,t)),e),[])}function Ae(e){let t=[];for(;e;)t.push(e),e=Object.getPrototypeOf(e);return t.reverse()}function je(e,t){let n=e[t];return Array.isArray(n)?n:[]}function Me(e,t){let n=e[t];return n?Object.keys(n).map(e=>[e,n[e]]):[]}typeof Object.getOwnPropertySymbols==`function`||Object.getOwnPropertyNames,(()=>{function e(e){function t(){return Reflect.construct(e,arguments,new.target)}return t.prototype=Object.create(e.prototype,{constructor:{value:t}}),Reflect.setPrototypeOf(t,e),t}function t(){let t=e(function(){this.a.call(this)});return t.prototype.a=function(){},new t}try{return t(),e}catch{return e=>class extends e{}}})(),Object.assign(Object.assign({enter:`Enter`,tab:`Tab`,esc:`Escape`,space:` `,up:`ArrowUp`,down:`ArrowDown`,left:`ArrowLeft`,right:`ArrowRight`,home:`Home`,end:`End`,page_up:`PageUp`,page_down:`PageDown`},Ne(`abcdefghijklmnopqrstuvwxyz`.split(``).map(e=>[e,e]))),Ne(`0123456789`.split(``).map(e=>[e,e])));function Ne(e){return e.reduce((e,[t,n])=>Object.assign(Object.assign({},e),{[t]:n}),{})}function Pe(e){return Oe(e,`classes`).reduce((e,t)=>Object.assign(e,Fe(t)),{})}function Fe(e){return{[`${e}Class`]:{get(){let{classes:t}=this;if(t.has(e))return t.get(e);{let n=t.getAttributeName(e);throw Error(`Missing attribute "${n}"`)}}},[`${e}Classes`]:{get(){return this.classes.getAll(e)}},[`has${I(e)}Class`]:{get(){return this.classes.has(e)}}}}function Ie(e){return Oe(e,`outlets`).reduce((e,t)=>Object.assign(e,ze(t)),{})}function Le(e,t,n){return e.application.getControllerForElementAndIdentifier(t,n)}function Re(e,t,n){let r=Le(e,t,n);if(r||(e.application.router.proposeToConnectScopeForElementAndIdentifier(t,n),r=Le(e,t,n),r))return r}function ze(e){let t=F(e);return{[`${t}Outlet`]:{get(){let t=this.outlets.find(e),n=this.outlets.getSelectorForOutletName(e);if(t){let n=Re(this,t,e);if(n)return n;throw Error(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`)}throw Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${n}".`)}},[`${t}Outlets`]:{get(){let t=this.outlets.findAll(e);return t.length>0?t.map(t=>{let n=Re(this,t,e);if(n)return n;console.warn(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`,t)}).filter(e=>e):[]}},[`${t}OutletElement`]:{get(){let t=this.outlets.find(e),n=this.outlets.getSelectorForOutletName(e);if(t)return t;throw Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${n}".`)}},[`${t}OutletElements`]:{get(){return this.outlets.findAll(e)}},[`has${I(t)}Outlet`]:{get(){return this.outlets.has(e)}}}}function Be(e){return Oe(e,`targets`).reduce((e,t)=>Object.assign(e,Ve(t)),{})}function Ve(e){return{[`${e}Target`]:{get(){let t=this.targets.find(e);if(t)return t;throw Error(`Missing target element "${e}" for "${this.identifier}" controller`)}},[`${e}Targets`]:{get(){return this.targets.findAll(e)}},[`has${I(e)}Target`]:{get(){return this.targets.has(e)}}}}function He(e){let t=ke(e,`values`);return t.reduce((e,t)=>Object.assign(e,Ue(t)),{valueDescriptorMap:{get(){return t.reduce((e,t)=>{let n=We(t,this.identifier),r=this.data.getAttributeNameForKey(n.key);return Object.assign(e,{[r]:n})},{})}}})}function Ue(e,t){let n=We(e,t),{key:r,name:i,reader:a,writer:o}=n;return{[i]:{get(){let e=this.data.get(r);return e===null?n.defaultValue:a(e)},set(e){e===void 0?this.data.delete(r):this.data.set(r,o(e))}},[`has${I(i)}`]:{get(){return this.data.has(r)||n.hasCustomDefaultValue}}}}function We([e,t],n){return Xe({controller:n,token:e,typeDefinition:t})}function Ge(e){switch(e){case Array:return`array`;case Boolean:return`boolean`;case Number:return`number`;case Object:return`object`;case String:return`string`}}function Ke(e){switch(typeof e){case`boolean`:return`boolean`;case`number`:return`number`;case`string`:return`string`}if(Array.isArray(e))return`array`;if(Object.prototype.toString.call(e)===`[object Object]`)return`object`}function qe(e){let{controller:t,token:n,typeObject:r}=e,i=Ee(r.type),a=Ee(r.default),o=i&&a,s=i&&!a,c=!i&&a,l=Ge(r.type),u=Ke(e.typeObject.default);if(s)return l;if(c)return u;if(l!==u){let e=t?`${t}.${n}`:n;throw Error(`The specified default value for the Stimulus Value "${e}" must match the defined type "${l}". The provided default value of "${r.default}" is of type "${u}".`)}if(o)return l}function Je(e){let{controller:t,token:n,typeDefinition:r}=e,i=qe({controller:t,token:n,typeObject:r}),a=Ke(r),o=Ge(r),s=i||a||o;if(s)return s;let c=t?`${t}.${r}`:n;throw Error(`Unknown value type "${c}" for "${n}" value`)}function Ye(e){let t=Ge(e);if(t)return Ze[t];let n=De(e,`default`),r=De(e,`type`),i=e;if(n)return i.default;if(r){let{type:e}=i,t=Ge(e);if(t)return Ze[t]}return e}function Xe(e){let{token:t,typeDefinition:n}=e,r=`${Te(t)}-value`,i=Je(e);return{type:i,key:r,name:we(r),get defaultValue(){return Ye(n)},get hasCustomDefaultValue(){return Ke(n)!==void 0},reader:Qe[i],writer:$e[i]||$e.default}}let Ze={get array(){return[]},boolean:!1,number:0,get object(){return{}},string:``},Qe={array(e){let t=JSON.parse(e);if(!Array.isArray(t))throw TypeError(`expected value of type "array" but instead got value "${e}" of type "${Ke(t)}"`);return t},boolean(e){return!(e==`0`||String(e).toLowerCase()==`false`)},number(e){return Number(e.replace(/_/g,``))},object(e){let t=JSON.parse(e);if(typeof t!=`object`||!t||Array.isArray(t))throw TypeError(`expected value of type "object" but instead got value "${e}" of type "${Ke(t)}"`);return t},string(e){return e}},$e={default:tt,array:et,object:et};function et(e){return JSON.stringify(e)}function tt(e){return`${e}`}var nt=class{constructor(e){this.context=e}static get shouldLoad(){return!0}static afterLoad(e,t){}get application(){return this.context.application}get scope(){return this.context.scope}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get targets(){return this.scope.targets}get outlets(){return this.scope.outlets}get classes(){return this.scope.classes}get data(){return this.scope.data}initialize(){}connect(){}disconnect(){}dispatch(e,{target:t=this.element,detail:n={},prefix:r=this.identifier,bubbles:i=!0,cancelable:a=!0}={}){let o=r?`${r}:${e}`:e,s=new CustomEvent(o,{detail:n,bubbles:i,cancelable:a});return t.dispatchEvent(s),s}};nt.blessings=[Pe,Be,He,Ie],nt.targets=[],nt.outlets=[],nt.values={};var rt=t({default:()=>it}),it=class extends nt{static{this.targets=[`input`,`picker`,`swatch`]}show(){clearTimeout(this.timeout),this.pickerTarget.hidden=!1}hide(){clearTimeout(this.timeout),this.timeout=window.setTimeout(()=>this.pickerTarget.hidden=!0)}colorChanged(e){this.inputTarget.color=e.detail.value,this.pickerTarget.color=e.detail.value,this.swatchTarget.style.backgroundColor=e.detail.value}},at=class{constructor(e,t,{tabInsertsSuggestions:n,firstOptionSelectionMode:r,scrollIntoViewOptions:i}={}){this.input=e,this.list=t,this.tabInsertsSuggestions=n??!0,this.firstOptionSelectionMode=r??`none`,this.scrollIntoViewOptions=i??{block:`nearest`,inline:`nearest`},this.isComposing=!1,t.id||=`combobox-${Math.random().toString().slice(2,6)}`,this.ctrlBindings=!!navigator.userAgent.match(/Macintosh/),this.keyboardEventHandler=e=>ot(e,this),this.compositionEventHandler=e=>ft(e,this),this.inputHandler=this.clearSelection.bind(this),e.setAttribute(`role`,`combobox`),e.setAttribute(`aria-controls`,t.id),e.setAttribute(`aria-expanded`,`false`),e.setAttribute(`aria-autocomplete`,`list`),e.setAttribute(`aria-haspopup`,`listbox`)}destroy(){this.clearSelection(),this.stop(),this.input.removeAttribute(`role`),this.input.removeAttribute(`aria-controls`),this.input.removeAttribute(`aria-expanded`),this.input.removeAttribute(`aria-autocomplete`),this.input.removeAttribute(`aria-haspopup`)}start(){this.input.setAttribute(`aria-expanded`,`true`),this.input.addEventListener(`compositionstart`,this.compositionEventHandler),this.input.addEventListener(`compositionend`,this.compositionEventHandler),this.input.addEventListener(`input`,this.inputHandler),this.input.addEventListener(`keydown`,this.keyboardEventHandler),this.list.addEventListener(`click`,st),this.resetSelection()}stop(){this.clearSelection(),this.input.setAttribute(`aria-expanded`,`false`),this.input.removeEventListener(`compositionstart`,this.compositionEventHandler),this.input.removeEventListener(`compositionend`,this.compositionEventHandler),this.input.removeEventListener(`input`,this.inputHandler),this.input.removeEventListener(`keydown`,this.keyboardEventHandler),this.list.removeEventListener(`click`,st)}indicateDefaultOption(){var e;this.firstOptionSelectionMode===`active`?(e=Array.from(this.list.querySelectorAll(`[role="option"]:not([aria-disabled="true"])`)).filter(dt)[0])==null||e.setAttribute(`data-combobox-option-default`,`true`):this.firstOptionSelectionMode===`selected`&&this.navigate(1)}navigate(e=1){let t=Array.from(this.list.querySelectorAll(`[aria-selected="true"]`)).filter(dt)[0],n=Array.from(this.list.querySelectorAll(`[role="option"]`)).filter(dt),r=n.indexOf(t);if(r===n.length-1&&e===1||r===0&&e===-1){this.clearSelection(),this.input.focus();return}let i=e===1?0:n.length-1;if(t&&r>=0){let t=r+e;t>=0&&t0||e.offsetHeight>0)}function ft(e,t){t.isComposing=e.type===`compositionstart`,document.getElementById(t.input.getAttribute(`aria-controls`)||``)&&t.clearSelection()}function pt(e){return e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement}function mt(e,t){let n=e.ownerDocument.activeElement;if(n===e)return t();try{return e.focus(),t()}finally{e.blur(),n instanceof HTMLElement&&n.focus()}}function ht(e,t){t===``?e.execCommand(`delete`):e.execCommand(`insertText`,!1,t)}function gt(e,t){mt(e,()=>{ht(e.ownerDocument,t)})}function _t(e,t){if(pt(e))e.select(),gt(e,t);else{let n=e.ownerDocument;mt(e,()=>{n.execCommand(`selectAll`,!1,t),ht(n,t)})}}let vt=_t;var yt=t({default:()=>xt});let bt=/([^\s"]*)"([^"]*)(?:"|$)|[^\s"]+/gi;var xt=class extends nt{static{this.targets=[`input`,`list`]}connect(){this.combobox=new at(this.inputTarget,this.listTarget)}focus(){this.combobox?.start(),this.update()}blur(){this.combobox?.stop(),this.listTarget.hidden=!0}tokens(){let e=this.inputTarget.value.matchAll(bt);return Array.from(e).reverse()}currentToken(){let e=this.inputTarget.selectionStart||0;return this.tokens().find(t=>t.index!==void 0&&t.index=e)}update(){let e=this.tokens(),t=this.currentToken(),n=t&&t[0].toLowerCase(),r=Array.from(this.listTarget.children),i=[];r.forEach(t=>{let r=(t.dataset.value||t.textContent)?.trim().toLowerCase()||``;e.some(e=>e[0].toLowerCase()===r)?t.hidden=!0:n?t.hidden=!r.startsWith(n)||n.includes(`:`)===r.endsWith(`:`):(t.hidden=i.some(e=>r.startsWith(e)),i.push(r))}),this.listTarget.hidden=!r.some(e=>!e.hidden)}commit(e){let t=e.target,n=this.currentToken(),r=(t.dataset.value||t.textContent)?.trim()||``;vt(this.inputTarget,this.inputTarget.value.slice(0,n?.index)+r+(r.endsWith(`:`)?``:` `))}preventBlur(e){e.preventDefault()}},St=t({default:()=>Ct}),Ct=class extends nt{static{this.targets=[`form`]}submit(){setTimeout(()=>{this.formTarget.requestSubmit()})}},wt=t({default:()=>Tt}),Tt=class extends nt{static{this.targets=[`preview`,`form`,`emoji`]}change(){this.previewTarget.hidden=!0,this.formTarget.hidden=!1}emojiTargetConnected(e){let t=e.querySelector(`input`),n=e.querySelector(`ui-popup`),r=e.querySelector(`button`),i=e.querySelector(`emoji-picker`);t.type=`hidden`,n.hidden=!1,i.addEventListener(`emoji-click`,e=>{t.value=e.detail.unicode||``,r.innerHTML=t.value,n.open=!1})}},Et=typeof global==`object`&&global&&global.Object===Object&&global,Dt=typeof self==`object`&&self&&self.Object===Object&&self,Ot=Et||Dt||Function(`return this`)(),kt=Ot.Symbol,At=Object.prototype,jt=At.hasOwnProperty,Mt=At.toString,Nt=kt?kt.toStringTag:void 0;function Pt(e){var t=jt.call(e,Nt),n=e[Nt];try{e[Nt]=void 0;var r=!0}catch{}var i=Mt.call(e);return r&&(t?e[Nt]=n:delete e[Nt]),i}var Ft=Pt,It=Object.prototype.toString;function Lt(e){return It.call(e)}var Rt=Lt,zt=`[object Null]`,Bt=`[object Undefined]`,Vt=kt?kt.toStringTag:void 0;function Ht(e){return e==null?e===void 0?Bt:zt:Vt&&Vt in Object(e)?Ft(e):Rt(e)}var Ut=Ht;function Wt(e){return typeof e==`object`&&!!e}var Gt=Wt,Kt=`[object Symbol]`;function qt(e){return typeof e==`symbol`||Gt(e)&&Ut(e)==Kt}var Jt=qt,Yt=/\s/;function Xt(e){for(var t=e.length;t--&&Yt.test(e.charAt(t)););return t}var Zt=Xt,Qt=/^\s+/;function $t(e){return e&&e.slice(0,Zt(e)+1).replace(Qt,``)}var en=$t;function tn(e){var t=typeof e;return e!=null&&(t==`object`||t==`function`)}var nn=tn,rn=NaN,an=/^[-+]0x[0-9a-f]+$/i,on=/^0b[01]+$/i,sn=/^0o[0-7]+$/i,cn=parseInt;function ln(e){if(typeof e==`number`)return e;if(Jt(e))return rn;if(nn(e)){var t=typeof e.valueOf==`function`?e.valueOf():e;e=nn(t)?t+``:t}if(typeof e!=`string`)return e===0?e:+e;e=en(e);var n=on.test(e);return n||sn.test(e)?cn(e.slice(2),n?2:8):an.test(e)?rn:+e}var un=ln,dn=function(){return Ot.Date.now()},L=`Expected a function`,R=Math.max,fn=Math.min;function pn(e,t,n){var r,i,a,o,s,c,l=0,u=!1,d=!1,f=!0;if(typeof e!=`function`)throw TypeError(L);t=un(t)||0,nn(n)&&(u=!!n.leading,d=`maxWait`in n,a=d?R(un(n.maxWait)||0,t):a,f=`trailing`in n?!!n.trailing:f);function p(t){var n=r,a=i;return r=i=void 0,l=t,o=e.apply(a,n),o}function m(e){return l=e,s=setTimeout(_,t),u?p(e):o}function h(e){var n=e-c,r=e-l,i=t-n;return d?fn(i,a-r):i}function g(e){var n=e-c,r=e-l;return c===void 0||n>=t||n<0||d&&r>=a}function _(){var e=dn();if(g(e))return v(e);s=setTimeout(_,h(e))}function v(e){return s=void 0,f&&r?p(e):(r=i=void 0,o)}function y(){s!==void 0&&clearTimeout(s),l=0,r=c=i=s=void 0}function b(){return s===void 0?o:v(dn())}function x(){var e=dn(),n=g(e);if(r=arguments,i=this,c=e,n){if(s===void 0)return m(c);if(d)return clearTimeout(s),s=setTimeout(_,t),p(c)}return s===void 0&&(s=setTimeout(_,t)),o}return x.cancel=y,x.flush=b,x}var mn=pn,hn=t({default:()=>z}),z=class extends nt{constructor(...e){super(...e),this.debouncedSubmit=mn(this.submit,250)}input(e){e.target.value?this.debouncedSubmit():this.submit()}submit(){this.element.form?.requestSubmit()}};let gn=`u-off`,_n=`u-label`,vn=`width`,yn=`height`,bn=`bottom`,xn=`left`,Sn=`right`,Cn=`#000`,wn=Cn+`0`,Tn=`mousemove`,En=`mousedown`,Dn=`mouseup`,On=`mouseenter`,kn=`mouseleave`,An=`dblclick`,jn=`change`,Mn=`dppxchange`,Nn=typeof window<`u`,Pn=Nn?document:null,Fn=Nn?window:null,In=Nn?navigator:null,B,Ln;function Rn(){let e=devicePixelRatio;B!=e&&(B=e,Ln&&Qn(jn,Ln,Rn),Ln=matchMedia(`(min-resolution: ${B-.001}dppx) and (max-resolution: ${B+.001}dppx)`),Zn(jn,Ln,Rn),Fn.dispatchEvent(new CustomEvent(Mn)))}function zn(e,t){if(t!=null){let n=e.classList;!n.contains(t)&&n.add(t)}}function Bn(e,t){let n=e.classList;n.contains(t)&&n.remove(t)}function V(e,t,n){e.style[t]=n+`px`}function Vn(e,t,n,r){let i=Pn.createElement(e);return t!=null&&zn(i,t),n?.insertBefore(i,r),i}function Hn(e,t){return Vn(`div`,e,t)}let Un=new WeakMap;function Wn(e,t,n,r,i){let a=`translate(`+t+`px,`+n+`px)`;a!=Un.get(e)&&(e.style.transform=a,Un.set(e,a),t<0||n<0||t>r||n>i?zn(e,gn):Bn(e,gn))}let Gn=new WeakMap;function Kn(e,t,n){let r=t+n;r!=Gn.get(e)&&(Gn.set(e,r),e.style.background=t,e.style.borderColor=n)}let qn=new WeakMap;function Jn(e,t,n,r){let i=t+``+n;i!=qn.get(e)&&(qn.set(e,i),e.style.height=n+`px`,e.style.width=t+`px`,e.style.marginLeft=r?-t/2+`px`:0,e.style.marginTop=r?-n/2+`px`:0)}let Yn={passive:!0},Xn={...Yn,capture:!0};function Zn(e,t,n,r){t.addEventListener(e,n,r?Xn:Yn)}function Qn(e,t,n,r){t.removeEventListener(e,n,Yn)}Nn&&Rn();function $n(e,t,n,r){let i;n||=0,r||=t.length-1;let a=r<=2147483647;for(;r-n>1;)i=a?n+r>>1:br((n+r)/2),t[i]{let i=-1,a=-1;for(let a=n;a<=r;a++)if(e(t[a])){i=a;break}for(let i=r;i>=n;i--)if(e(t[i])){a=i;break}return[i,a]}}let tr=e=>e!=null,nr=e=>e!=null&&e>0,rr=er(tr),ir=er(nr);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=e[t],c=e[t];if(t>-1)if(r==1)s=e[t],c=e[n];else if(r==-1)s=e[n],c=e[t];else for(let r=t;r<=n;r++){let t=e[r];o(t)&&(tc&&(c=t))}return[s??U,c??-U]}function or(e,t,n,r){let i=Er(e),a=Er(t);e==t&&(i==-1?(e*=n,t/=n):(e/=n,t*=n));let o=n==10?Dr:Or,s=i==1?br:Sr,c=a==1?Sr:br,l=s(o(yr(e))),u=c(o(yr(t))),d=Tr(n,l),f=Tr(n,u);return n==10&&(l<0&&(d=G(d,-l)),u<0&&(f=G(f,-u))),r||n==2?(e=d*i,t=f*a):(e=Wr(e,d),t=Ur(t,f)),[e,t]}function sr(e,t,n,r){let i=or(e,t,n,r);return e==0&&(i[0]=0),t==0&&(i[1]=0),i}let cr=.1,lr={mode:3,pad:cr},ur={pad:0,soft:null,mode:0},dr={min:ur,max:ur};function fr(e,t,n,r){return ti(n)?mr(e,t,n):(ur.pad=n,ur.soft=r?0:null,ur.mode=r?3:0,mr(e,t,dr))}function H(e,t){return e??t}function pr(e,t,n){for(t=H(t,0),n=H(n,e.length-1);t<=n;){if(e[t]!=null)return!0;t++}return!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.hard,-U),c=H(i.hard,U),l=H(r.soft,U),u=H(i.soft,-U),d=H(r.mode,0),f=H(i.mode,0),p=t-e,m=Dr(p),h=wr(yr(e),yr(t)),g=yr(Dr(h)-m);(p<1e-24||g>10)&&(p=0,(e==0||t==0)&&(p=1e-24,d==2&&l!=U&&(a=0),f==2&&u!=-U&&(o=0)));let _=p||h||1e3,v=Tr(10,br(Dr(_))),y=G(Wr(e-_*(p==0?e==0?.1:1:a),v/10),24),b=e>=l&&(d==1||d==3&&y<=l||d==2&&y>=l)?l:U,x=wr(s,y=b?b:Cr(b,y)),S=G(Ur(t+_*(p==0?t==0?.1:1:o),v/10),24),C=t<=u&&(f==1||f==3&&S>=u||f==2&&S<=u)?u:-U,w=Cr(c,S>C&&t<=C?C:wr(C,S));return x==w&&x==0&&(w=100),[x,w]}let hr=new Intl.NumberFormat(Nn?In.language:`en-US`),gr=e=>hr.format(e),_r=Math,vr=_r.PI,yr=_r.abs,br=_r.floor,xr=_r.round,Sr=_r.ceil,Cr=_r.min,wr=_r.max,Tr=_r.pow,Er=_r.sign,Dr=_r.log10,Or=_r.log2,kr=(e,t=1)=>_r.sinh(e)*t,Ar=(e,t=1)=>_r.asinh(e/t),U=1/0;function jr(e){return(Dr((e^e>>31)-(e>>31))|0)+1}function Mr(e,t,n){return Cr(wr(e,t),n)}function Nr(e){return typeof e==`function`}function W(e){return Nr(e)?e:()=>e}let Pr=()=>{},Fr=e=>e,Ir=(e,t)=>t,Lr=e=>null,Rr=e=>!0,zr=(e,t)=>e==t,Br=/\.\d*?(?=9{6,}|0{6,})/gm,Vr=e=>{if(Qr(e)||Gr.has(e))return e;let t=`${e}`,n=t.match(Br);if(n==null)return e;let r=n[0].length-1;if(t.indexOf(`e-`)!=-1){let[e,n]=t.split(`e`);return+`${Vr(e)}e${n}`}return G(e,r)};function Hr(e,t){return Vr(G(Vr(e/t))*t)}function Ur(e,t){return Vr(Sr(Vr(e/t))*t)}function Wr(e,t){return Vr(br(Vr(e/t))*t)}function G(e,t=0){if(Qr(e))return e;let n=10**t;return xr(e*n*(1+2**-52))/n}let Gr=new Map;function Kr(e){return((``+e).split(`.`)[1]||``).length}function qr(e,t,n,r){let i=[],a=r.map(Kr);for(let o=t;o=0?0:t)+(o>=a[s]?0:a[s]),u=e==10?c:G(c,l);i.push(u),Gr.set(u,l)}}return i}let Jr={},Yr=[],Xr=[null,null],Zr=Array.isArray,Qr=Number.isInteger,$r=e=>e===void 0;function ei(e){return typeof e==`string`}function ti(e){let t=!1;if(e!=null){let n=e.constructor;t=n==null||n==Object}return t}function ni(e){return typeof e==`object`&&!!e}let ri=Object.getPrototypeOf(Uint8Array),ii=`__proto__`;function ai(e,t=ti){let n;if(Zr(e)){let r=e.find(e=>e!=null);if(Zr(r)||t(r)){n=Array(e.length);for(let r=0;ra){for(i=o-1;i>=0&&e[i]==null;)e[i--]=null;for(i=o+1;ie-t)],i=r[0].length,a=new Map;for(let e=0;e`u`?e=>Promise.resolve().then(e):queueMicrotask;function ui(e){let t=e[0],n=t.length,r=Array(n);for(let e=0;et[e]-t[n]);let i=[];for(let t=0;t=r&&e[i]==null;)i--;if(i<=r)return!0;let a=wr(1,br((i-r+1)/t));for(let t=e[r],n=r+a;n<=i;n+=a){let r=e[n];if(r!=null){if(r<=t)return!1;t=r}}return!0}let pi=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],mi=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`];function hi(e){return e.slice(0,3)}let gi=mi.map(hi),_i={MMMM:pi,MMM:pi.map(hi),WWWW:mi,WWW:gi};function vi(e){return(e<10?`0`:``)+e}function yi(e){return(e<10?`00`:e<100?`0`:``)+e}let bi={YYYY:e=>e.getFullYear(),YY:e=>(e.getFullYear()+``).slice(2),MMMM:(e,t)=>t.MMMM[e.getMonth()],MMM:(e,t)=>t.MMM[e.getMonth()],MM:e=>vi(e.getMonth()+1),M:e=>e.getMonth()+1,DD:e=>vi(e.getDate()),D:e=>e.getDate(),WWWW:(e,t)=>t.WWWW[e.getDay()],WWW:(e,t)=>t.WWW[e.getDay()],HH:e=>vi(e.getHours()),H:e=>e.getHours(),h:e=>{let t=e.getHours();return t==0?12:t>12?t-12:t},AA:e=>e.getHours()>=12?`PM`:`AM`,aa:e=>e.getHours()>=12?`pm`:`am`,a:e=>e.getHours()>=12?`p`:`a`,mm:e=>vi(e.getMinutes()),m:e=>e.getMinutes(),ss:e=>vi(e.getSeconds()),s:e=>e.getSeconds(),fff:e=>yi(e.getMilliseconds())};function xi(e,t){t||=_i;let n=[],r=/\{([a-z]+)\}|[^{]+/gi,i;for(;i=r.exec(e);)n.push(i[0][0]==`{`?bi[i[1]]:i[0]);return e=>{let r=``;for(let i=0;ie%1==0,Ti=[1,2,2.5,5],Ei=qr(10,-32,0,Ti),Di=qr(10,0,32,Ti),Oi=Di.filter(wi),ki=Ei.concat(Di),Ai=`{YYYY}`,ji=` `+Ai,Mi=`{M}/{D}`,Ni=` `+Mi,Pi=Ni+`/{YY}`,Fi=`{aa}`,Ii=`{h}:{mm}`+Fi,Li=` `+Ii,Ri=`:{ss}`;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?qr(10,0,3,Ti).filter(wi):qr(10,-3,0,Ti)).concat([t,t*5,t*10,t*15,t*30,n,n*5,n*10,n*15,n*30,r,r*2,r*3,r*4,r*6,r*8,r*12,i,i*2,i*3,i*4,i*5,i*6,i*7,i*8,i*9,i*10,i*15,a,a*2,a*3,a*4,a*6,o,o*2,o*5,o*10,o*25,o*50,o*100]),c=[[o,Ai,null,null,null,null,null,null,1],[i*28,`{MMM}`,ji,null,null,null,null,null,1],[i,Mi,ji,null,null,null,null,null,1],[r,`{h}`+Fi,Pi,null,Ni,null,null,null,1],[n,Ii,Pi,null,Ni,null,null,null,1],[t,Ri,Pi+` {h}:{mm}{aa}`,null,Ni+` {h}:{mm}{aa}`,null,Li,null,1],[e,Ri+`.{fff}`,Pi+` {h}:{mm}{aa}`,null,Ni+` {h}:{mm}{aa}`,null,Li,null,1]];function l(t){return(s,c,l,u,d,f)=>{let p=[],m=d>=o,h=d>=a&&d=i?i:d,o=y+(br(l)-br(_))+Ur(_-y,a);p.push(o);let m=t(o),h=m.getHours()+m.getMinutes()/n+m.getSeconds()/r,g=d/r,v=f/s.axes[c]._space;for(;o=G(o+d,e==1?0:3),!(o>u);)if(g>1){let e=br(G(h+g,6))%24,n=t(o).getHours()-e;n>1&&(n=-1),o-=n*r,h=(h+g)%24;let i=p[p.length-1];G((o-i)/d,3)*v>=.7&&p.push(o)}else p.push(o)}return p}}return[s,c,l]}let[Bi,Vi,Hi]=zi(1),[Ui,Wi,Gi]=zi(.001);qr(2,-53,53,[1]);function Ki(e,t){return e.map(e=>e.map((n,r)=>r==0||r==8||n==null?n:t(r==1||e[8]==0?n:e[1]+n)))}function qi(e,t){return(n,r,i,a,o)=>{let s=t.find(e=>o>=e[0])||t[t.length-1],c,l,u,d,f,p;return r.map(t=>{let n=e(t),r=n.getFullYear(),i=n.getMonth(),a=n.getDate(),o=n.getHours(),m=n.getMinutes(),h=n.getSeconds(),g=r!=c&&s[2]||i!=l&&s[3]||a!=u&&s[4]||o!=d&&s[5]||m!=f&&s[6]||h!=p&&s[7]||s[1];return c=r,l=i,u=a,d=o,f=m,p=h,g(n)})}}function Ji(e,t){let n=xi(t);return(t,r,i,a,o)=>r.map(t=>n(e(t)))}function Yi(e,t,n){return new Date(e,t,n)}function Xi(e,t){return t(e)}function Zi(e,t){return(n,r,i,a)=>a==null?`--`:t(e(r))}function Qi(e,t){let n=e.series[t];return n.width?n.stroke(e,t):n.points.width?n.points.stroke(e,t):null}function $i(e,t){return e.series[t].fill(e,t)}let ea={show:!0,live:!0,isolate:!1,mount:Pr,markers:{show:!0,width:2,stroke:Qi,fill:$i,dash:`solid`},idx:null,idxs:null,values:[]};function ta(e,t){let n=e.cursor.points,r=Hn(),i=n.size(e,t);V(r,vn,i),V(r,yn,i);let a=i/-2;V(r,`marginLeft`,a),V(r,`marginTop`,a);let o=n.width(e,t,i);return o&&V(r,`borderWidth`,o),r}function na(e,t){let n=e.series[t].points;return n._fill||n._stroke}function ra(e,t){let n=e.series[t].points;return n._stroke||n._fill}function ia(e,t){return e.series[t].points.size}let aa=[0,0];function oa(e,t,n){return aa[0]=t,aa[1]=n,aa}function sa(e,t,n,r=!0){return e=>{e.button==0&&(!r||e.target==t)&&n(e)}}function ca(e,t,n,r=!0){return e=>{(!r||e.target==t)&&n(e)}}let la={show:!0,x:!0,y:!0,lock:!1,move:oa,points:{one:!1,show:ta,size:ia,width:0,stroke:ra,fill:na},bind:{mousedown:sa,mouseup:sa,click:sa,dblclick:sa,mousemove:ca,mouseleave:ca,mouseenter:ca},drag:{setScale:!0,x:!0,y:!1,dist:0,uni:null,click:(e,t)=>{t.stopPropagation(),t.stopImmediatePropagation()},_x:!1,_y:!1},focus:{dist:(e,t,n,r,i)=>r-i,prox:-1,bias:0},hover:{skip:[void 0],prox:null,bias:0},left:-10,top:-10,idx:null,dataIdx:null,idxs:null,event:null},ua={show:!0,stroke:`rgba(0,0,0,0.07)`,width:2},da=oi({},ua,{filter:Ir}),fa=oi({},da,{size:10}),pa=oi({},ua,{show:!1}),ma=`12px system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"`,ha=`bold `+ma,ga=1.5,_a={show:!0,scale:`x`,stroke:Cn,space:50,gap:5,alignTo:1,size:50,labelGap:0,labelSize:30,labelFont:ha,side:2,grid:da,ticks:fa,border:pa,font:ma,lineGap:ga,rotate:0},va={show:!0,scale:`x`,auto:!1,sorted:1,min:U,max:-U,idxs:[]};function ya(e,t,n,r,i){return t.map(e=>e==null?``:gr(e))}function ba(e,t,n,r,i,a,o){let s=[],c=Gr.get(i)||0;n=o?n:G(Ur(n,i),c);for(let e=n;e<=r;e=G(e+i,c))s.push(Object.is(e,-0)?0:e);return s}function xa(e,t,n,r,i,a,o){let s=[],c=e.scales[e.axes[t].scale].log;i=Tr(c,br((c==10?Dr:Or)(n))),c==10&&(i=ki[$n(i,ki)]);let l=n,u=i*c;c==10&&(u=ki[$n(u,ki)]);do s.push(l),l+=i,c==10&&!Gr.has(l)&&(l=G(l,Gr.get(i))),l>=u&&(i=l,u=i*c,c==10&&(u=ki[$n(u,ki)]));while(l<=r);return s}function Sa(e,t,n,r,i,a,o){let s=e.scales[e.axes[t].scale].asinh,c=r>s?xa(e,t,wr(s,n),r,i):[s],l=r>=0&&n<=0?[0]:[];return(n<-s?xa(e,t,wr(s,-r),-n,i):[s]).reverse().map(e=>-e).concat(l,c)}let Ca=/./,wa=/[12357]/,Ta=/[125]/,Ea=/1/,Da=(e,t,n,r)=>e.map((e,i)=>t==4&&e==0||i%r==0&&n.test(e.toExponential()[e<0?1:0])?e:null);function Oa(e,t,n,r,i){let a=e.axes[n],o=a.scale,s=e.scales[o],c=e.valToPos,l=a._space,u=c(10,o),d=c(9,o)-u>=l?Ca:c(7,o)-u>=l?wa:c(5,o)-u>=l?Ta:Ea;if(d==Ea){let e=yr(c(1,o)-u);if(ei,Ia={show:!0,auto:!0,sorted:0,gaps:Fa,alpha:1,facets:[oi({},Pa,{scale:`x`}),oi({},Pa,{scale:`y`})]},La={scale:`y`,auto:!0,sorted:0,show:!0,spanGaps:!1,gaps:Fa,alpha:1,points:{show:Na,filter:null},values:null,min:U,max:-U,idxs:[],path:null,clip:null};function Ra(e,t,n,r,i){return n/10}let za={time:!0,auto:!0,distr:1,log:10,asinh:1,min:null,max:null,dir:1,ori:0},Ba=oi({},za,{time:!1,ori:1}),Va={};function Ha(e,t){let n=Va[e];return n||(n={key:e,plots:[],sub(e){n.plots.push(e)},unsub(e){n.plots=n.plots.filter(t=>t!=e)},pub(e,t,r,i,a,o,s){for(let c=0;c{let h=e.pxRound,g=s.dir*(s.ori==0?1:-1),_=s.ori==0?eo:to,v,y;g==1?(v=n,y=r):(v=r,y=n);let b=h(l(t[v],s,p,d)),x=h(u(o[v],c,m,f)),S=h(l(t[y],s,p,d)),C=h(u(a==1?c.max:c.min,c,m,f)),w=new Path2D(i);return _(w,S,C),_(w,b,C),_(w,b,x),w})}function qa(e,t,n,r,i,a){let o=null;if(e.length>0){o=new Path2D;let s=t==0?no:ro,c=n;for(let t=0;tn[0]){let e=n[0]-c;e>0&&s(o,c,r,e,r+a),c=n[1]}}let l=n+i-c;l>0&&s(o,c,r-10/2,l,r+a+10)}return o}function Ja(e,t,n){let r=e[e.length-1];r&&r[0]==t?r[1]=n:e.push([t,n])}function Ya(e,t,n,r,i,a,o){let s=[],c=e.length;for(let l=i==1?n:r;l>=n&&l<=r;l+=i)if(t[l]===null){let u=l,d=l;if(i==1)for(;++l<=r&&t[l]===null;)d=l;else for(;--l>=n&&t[l]===null;)d=l;let f=a(e[u]),p=d==u?f:a(e[d]),m=u-i;f=o<=0&&m>=0&&m=0&&h>=0&&h=f&&s.push([f,p])}return s}function Xa(e){return e==0?Fr:e==1?xr:t=>Hr(t,e)}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)}:(e,t,n,r,i,a)=>{e.arcTo(n,t,i,r,a)},r=e==0?(e,t,n,r,i)=>{e.rect(t,n,r,i)}:(e,t,n,r,i)=>{e.rect(n,t,i,r)};return(e,i,a,o,s,c=0,l=0)=>{c==0&&l==0?r(e,i,a,o,s):(c=Cr(c,o/2,s/2),l=Cr(l,o/2,s/2),t(e,i+c,a),n(e,i+o,a,i+o,a+s,c),n(e,i+o,a+s,i,a+s,l),n(e,i,a+s,i,a,l),n(e,i,a,i+o,a,c),e.closePath())}}let Qa=(e,t,n)=>{e.moveTo(t,n)},$a=(e,t,n)=>{e.moveTo(n,t)},eo=(e,t,n)=>{e.lineTo(t,n)},to=(e,t,n)=>{e.lineTo(n,t)},no=Za(0),ro=Za(1),io=(e,t,n,r,i,a)=>{e.arc(t,n,r,i,a)},ao=(e,t,n,r,i,a)=>{e.arc(n,t,r,i,a)},oo=(e,t,n,r,i,a,o)=>{e.bezierCurveTo(t,n,r,i,a,o)},so=(e,t,n,r,i,a,o)=>{e.bezierCurveTo(n,t,i,r,o,a)};function co(e){return(e,t,n,r,i)=>Ua(e,t,(t,a,o,s,c,l,u,d,f,p,m)=>{let{pxRound:h,points:g}=t,_,v;s.ori==0?(_=Qa,v=io):(_=$a,v=ao);let y=G(g.width*B,3),b=(g.size-g.width)/2*B,x=G(b*2,3),S=new Path2D,C=new Path2D,{left:w,top:T,width:E,height:D}=e.bbox;no(C,w-x,T-x,E+x*2,D+x*2);let O=e=>{if(o[e]!=null){let t=h(l(a[e],s,p,d)),n=h(u(o[e],c,m,f));_(S,t+b,n),v(S,t,n,b,0,vr*2)}};if(i)i.forEach(O);else for(let e=n;e<=r;e++)O(e);return{stroke:y>0?S:null,fill:S,clip:C,flags:3}})}function lo(e){return(t,n,r,i,a,o)=>{r!=i&&(a!=r&&o!=r&&e(t,n,r),a!=i&&o!=i&&e(t,n,i),e(t,n,o))}}let uo=lo(eo),fo=lo(to);function po(e){let t=H(e?.alignGaps,0);return(e,n,r,i)=>Ua(e,n,(a,o,s,c,l,u,d,f,p,m,h)=>{[r,i]=rr(s,r,i);let g=a.pxRound,_=e=>g(u(e,c,m,f)),v=e=>g(d(e,l,h,p)),y,b;c.ori==0?(y=eo,b=uo):(y=to,b=fo);let x=c.dir*(c.ori==0?1:-1),S={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:1},C=S.stroke,w=!1;if(i-r>=m*4){let t=t=>e.posToVal(t,c.key,!0),n=null,a=null,l,u,d=_(o[x==1?r:i]),f=_(o[r]),p=_(o[i]),m=t(x==1?f+1:p-1);for(let e=x==1?r:i;e>=r&&e<=i;e+=x){let r=o[e],i=(x==1?rm)?d:_(r),c=s[e];i==d?c==null?c===null&&(w=!0):(u=c,n==null?(y(C,i,v(u)),l=n=a=u):ua&&(a=u)):(n!=null&&b(C,d,v(n),v(a),v(l),v(u)),c==null?(n=a=null,c===null&&(w=!0)):(u=c,y(C,i,v(u)),n=a=l=u),d=i,m=t(d+x))}n!=null&&n!=a&&d!=null&&b(C,d,v(n),v(a),v(l),v(u))}else for(let e=x==1?r:i;e>=r&&e<=i;e+=x){let t=s[e];t===null?w=!0:t!=null&&y(C,_(o[e]),v(t))}let[T,E]=Wa(e,n);if(a.fill!=null||T!=0){let t=S.fill=new Path2D(C),s=v(a.fillTo(e,n,a.min,a.max,T)),c=_(o[r]),l=_(o[i]);x==-1&&([l,c]=[c,l]),y(t,l,s),y(t,c,s)}if(!a.spanGaps){let l=[];w&&l.push(...Ya(o,s,r,i,x,_,t)),S.gaps=l=a.gaps(e,n,r,i,l),S.clip=qa(l,c.ori,f,p,m,h)}return E!=0&&(S.band=E==2?[Ka(e,n,r,i,C,-1),Ka(e,n,r,i,C,1)]:Ka(e,n,r,i,C,E)),S})}function mo(e){let t=H(e.align,1),n=H(e.ascDesc,!1),r=H(e.alignGaps,0),i=H(e.extend,!1);return(e,a,o,s)=>Ua(e,a,(c,l,u,d,f,p,m,h,g,_,v)=>{[o,s]=rr(u,o,s);let y=c.pxRound,{left:b,width:x}=e.bbox,S=e=>y(p(e,d,_,h)),C=e=>y(m(e,f,v,g)),w=d.ori==0?eo:to,T={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:1},E=T.stroke,D=d.dir*(d.ori==0?1:-1),O=C(u[D==1?o:s]),ee=S(l[D==1?o:s]),te=ee,k=ee;i&&t==-1&&(k=b,w(E,k,O)),w(E,ee,O);for(let e=D==1?o:s;e>=o&&e<=s;e+=D){let n=u[e];if(n==null)continue;let r=S(l[e]),i=C(n);t==1?w(E,r,O):w(E,te,i),w(E,r,i),O=i,te=r}let ne=te;i&&t==1&&(ne=b+x,w(E,ne,O));let[re,ie]=Wa(e,a);if(c.fill!=null||re!=0){let t=T.fill=new Path2D(E),n=C(c.fillTo(e,a,c.min,c.max,re));w(t,ne,n),w(t,k,n)}if(!c.spanGaps){let i=[];i.push(...Ya(l,u,o,s,D,S,r));let f=c.width*B/2,p=n||t==1?f:-f,m=n||t==-1?-f:f;i.forEach(e=>{e[0]+=p,e[1]+=m}),T.gaps=i=c.gaps(e,a,o,s,i),T.clip=qa(i,d.ori,h,g,_,v)}return ie!=0&&(T.band=ie==2?[Ka(e,a,o,s,E,-1),Ka(e,a,o,s,E,1)]:Ka(e,a,o,s,E,ie)),T})}function ho(e,t,n,r,i,a,o=U){if(e.length>1){let s=null;for(let c=0,l=1/0;c{}),{fill:d,stroke:f}=l;return(e,t,i,p)=>Ua(e,t,(m,h,g,_,v,y,b,x,S,C,w)=>{let T=m.pxRound,E=n,D=r*B,O=s*B,ee=c*B,te,k;_.ori==0?[te,k]=a(e,t):[k,te]=a(e,t);let ne=_.dir*(_.ori==0?1:-1),re=_.ori==0?no:ro,ie=_.ori==0?u:(e,t,n,r,i,a,o)=>{u(e,t,n,i,r,o,a)},ae=H(e.bands,Yr).find(e=>e.series[0]==t),oe=ae==null?0:ae.dir,se=m.fillTo(e,t,m.min,m.max,oe),A=T(b(se,v,w,S)),j,M,ce,N=C,P=T(m.width*B),le=!1,ue=null,de=null,fe=null,pe=null;d!=null&&(P==0||f!=null)&&(le=!0,ue=d.values(e,t,i,p),de=new Map,new Set(ue).forEach(e=>{e!=null&&de.set(e,new Path2D)}),P>0&&(fe=f.values(e,t,i,p),pe=new Map,new Set(fe).forEach(e=>{e!=null&&pe.set(e,new Path2D)})));let{x0:me,size:he}=l;if(me!=null&&he!=null){E=1,h=me.values(e,t,i,p),me.unit==2&&(h=h.map(t=>e.posToVal(x+t*C,_.key,!0)));let n=he.values(e,t,i,p);M=he.unit==2?n[0]*C:y(n[0],_,C,x)-y(0,_,C,x),N=ho(h,g,y,_,C,x,N),ce=N-M+D}else N=ho(h,g,y,_,C,x,N),ce=N*o+D,M=N-ce;ce<1&&(ce=0),P>=M/2&&(P=0),ce<5&&(T=Fr);let ge=ce>0,_e=N-ce-(ge?P:0);M=T(Mr(_e,ee,O)),j=(E==0?M/2:E==ne?0:M)-E*ne*((E==0?D/2:0)+(ge?P/2:0));let ve={stroke:null,fill:null,clip:null,band:null,gaps:null,flags:0},ye=le?null:new Path2D,be=null;if(ae!=null)be=e.data[ae.series[1]];else{let{y0:n,y1:r}=l;n!=null&&r!=null&&(g=r.values(e,t,i,p),be=n.values(e,t,i,p))}let xe=te*M,Se=k*M;for(let n=ne==1?i:p;n>=i&&n<=p;n+=ne){let r=g[n];if(r==null)continue;if(be!=null){let e=be[n]??0;if(r-e==0)continue;A=b(e,v,w,S)}let i=y(_.distr!=2||l!=null?h[n]:n,_,C,x),a=b(H(r,se),v,w,S),o=T(i-j),s=T(wr(a,A)),c=T(Cr(a,A)),u=s-c;if(r!=null){let i=r<0?Se:xe,a=r<0?xe:Se;le?(P>0&&fe[n]!=null&&re(pe.get(fe[n]),o,c+br(P/2),M,wr(0,u-P),i,a),ue[n]!=null&&re(de.get(ue[n]),o,c+br(P/2),M,wr(0,u-P),i,a)):re(ye,o,c+br(P/2),M,wr(0,u-P),i,a),ie(e,t,n,o-P/2,c,M+P,u)}}return P>0?ve.stroke=le?pe:ye:le||(ve._fill=m.width==0?m._fill:m._stroke??m._fill,ve.width=0),ve.fill=le?de:ye,ve})}function _o(e,t){let n=H(t?.alignGaps,0);return(t,r,i,a)=>Ua(t,r,(o,s,c,l,u,d,f,p,m,h,g)=>{[i,a]=rr(c,i,a);let _=o.pxRound,v=e=>_(d(e,l,h,p)),y=e=>_(f(e,u,g,m)),b,x,S;l.ori==0?(b=Qa,S=eo,x=oo):(b=$a,S=to,x=so);let C=l.dir*(l.ori==0?1:-1),w=v(s[C==1?i:a]),T=w,E=[],D=[];for(let e=C==1?i:a;e>=i&&e<=a;e+=C)if(c[e]!=null){let t=s[e],n=v(t);E.push(T=n),D.push(y(c[e]))}let O={stroke:e(E,D,b,S,x,_),fill:null,clip:null,band:null,gaps:null,flags:1},ee=O.stroke,[te,k]=Wa(t,r);if(o.fill!=null||te!=0){let e=O.fill=new Path2D(ee),n=y(o.fillTo(t,r,o.min,o.max,te));S(e,T,n),S(e,w,n)}if(!o.spanGaps){let e=[];e.push(...Ya(s,c,i,a,C,v,n)),O.gaps=e=o.gaps(t,r,i,a,e),O.clip=qa(e,l.ori,p,m,h,g)}return k!=0&&(O.band=k==2?[Ka(t,r,i,a,ee,-1),Ka(t,r,i,a,ee,1)]:Ka(t,r,i,a,ee,k)),O})}function vo(e){return _o(yo,e)}function yo(e,t,n,r,i,a){let o=e.length;if(o<2)return null;let s=new Path2D;if(n(s,e[0],t[0]),o==2)r(s,e[1],t[1]);else{let n=Array(o),r=Array(o-1),a=Array(o-1),c=Array(o-1);for(let n=0;n0!=r[e]>0?n[e]=0:(n[e]=3*(c[e-1]+c[e])/((2*c[e]+c[e-1])/r[e-1]+(c[e]+2*c[e-1])/r[e]),isFinite(n[e])||(n[e]=0));n[o-1]=r[o-2];for(let r=0;r{Lo.pxRatio=B}));let So=po(),Co=co();function wo(e,t,n,r){return(r?[e[0],e[1]].concat(e.slice(2)):[e[0]].concat(e.slice(1))).map((e,r)=>Eo(e,r,t,n))}function To(e,t){return e.map((e,n)=>n==0?{}:oi({},t,e))}function Eo(e,t,n,r){return oi({},t==0?n:r,e)}function Do(e,t,n){return t==null?Xr:[t,n]}let Oo=Do;function ko(e,t,n){return t==null?Xr:fr(t,n,cr,!0)}function Ao(e,t,n,r){return t==null?Xr:or(t,n,e.scales[r].log,!1)}let jo=Ao;function Mo(e,t,n,r){return t==null?Xr:sr(t,n,e.scales[r].log,!1)}let No=Mo;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 e=n[s],t=r*e/o;if(t>=i&&a+(e<5?Gr.get(e):0)<=17)return[e,t]}while(++s(t=xr((n=+r)*B))+`px`),[e,t,n]}function Io(e){e.show&&[e.font,e.labelFont].forEach(e=>{let t=G(e[2]*B,1);e[0]=e[0].replace(/[0-9.]+px/,t+`px`),e[1]=t})}function Lo(e,t,n){let r={mode:H(e.mode,1)},i=r.mode;function a(e,t,n,r){let i=t.valToPct(e);return r+n*(t.dir==-1?1-i:i)}function o(e,t,n,r){let i=t.valToPct(e);return r+n*(t.dir==-1?i:1-i)}function s(e,t,n,r){return t.ori==0?a(e,t,n,r):o(e,t,n,r)}r.valToPosH=a,r.valToPosV=o;let c=!1;r.status=0;let l=r.root=Hn(`uplot`);if(e.id!=null&&(l.id=e.id),zn(l,e.class),e.title){let t=Hn(`u-title`,l);t.textContent=e.title}let u=Vn(`canvas`),d=r.ctx=u.getContext(`2d`),f=Hn(`u-wrap`,l);Zn(`click`,f,e=>{e.target===m&&(L!=cn||R!=ln)&&pn.click(r,e)},!0);let p=r.under=Hn(`u-under`,f);f.appendChild(u);let m=r.over=Hn(`u-over`,f);e=ai(e);let h=+H(e.pxAlign,1),g=Xa(h);(e.plugins||[]).forEach(t=>{t.opts&&(e=t.opts(r,e)||e)});let _=e.ms||.001,v=r.series=i==1?wo(e.series||[],va,La,!1):To(e.series||[null],Ia),y=r.axes=wo(e.axes||[],_a,ja,!0),b=r.scales={},x=r.bands=e.bands||[];x.forEach(e=>{e.fill=W(e.fill||null),e.dir=H(e.dir,-1)});let S=i==2?v[1].facets[0].scale:v[0].scale,C={axes:Gt,series:Pt},w=(e.drawOrder||[`axes`,`series`]).map(e=>C[e]);function T(e){let t=e.distr==3?t=>Dr(t>0?t:e.clamp(r,t,e.min,e.max,e.key)):e.distr==4?t=>Ar(t,e.asinh):e.distr==100?t=>e.fwd(t):e=>e;return n=>{let r=t(n),{_min:i,_max:a}=e,o=a-i;return(r-i)/o}}function E(t){let n=b[t];if(n==null){let r=(e.scales||Jr)[t]||Jr;if(r.from!=null){E(r.from);let e=oi({},b[r.from],r,{key:t});e.valToPct=T(e),b[t]=e}else{n=b[t]=oi({},t==S?za:Ba,r),n.key=t;let e=n.time,a=n.range,o=Zr(a);if((t!=S||i==2&&!e)&&(o&&(a[0]==null||a[1]==null)&&(a={min:a[0]==null?lr:{mode:1,hard:a[0],soft:a[0]},max:a[1]==null?lr:{mode:1,hard:a[1],soft:a[1]}},o=!1),!o&&ti(a))){let e=a;a=(t,n,r)=>n==null?Xr:fr(n,r,e)}n.range=W(a||(e?Oo:t==S?n.distr==3?jo:n.distr==4?No:Do:n.distr==3?Ao:n.distr==4?Mo:ko)),n.auto=W(o?!1:n.auto),n.clamp=W(n.clamp||Ra),n._min=n._max=null,n.valToPct=T(n)}}}for(let t in E(`x`),E(`y`),i==1&&v.forEach(e=>{E(e.scale)}),y.forEach(e=>{E(e.scale)}),e.scales)E(t);let D=b[S],O=D.distr,ee,te;D.ori==0?(zn(l,`u-hz`),ee=a,te=o):(zn(l,`u-vt`),ee=o,te=a);let k={};for(let e in b){let t=b[e];(t.min!=null||t.max!=null)&&(k[e]={min:t.min,max:t.max},t.min=t.max=null)}let ne=e.tzDate||(e=>new Date(xr(e/_))),re=e.fmtDate||xi,ie=_==1?Hi(ne):Gi(ne),ae=qi(ne,Ki(_==1?Vi:Wi,re)),oe=Zi(ne,Xi(`{YYYY}-{MM}-{DD} {h}:{mm}{aa}`,re)),se=[],A=r.legend=oi({},ea,e.legend),j=r.cursor=oi({},la,{drag:{y:i==2}},e.cursor),M=A.show,ce=j.show,N=A.markers;A.idxs=se,N.width=W(N.width),N.dash=W(N.dash),N.stroke=W(N.stroke),N.fill=W(N.fill);let P,le,ue,de=[],fe=[],pe,me=!1,he={};if(A.live){let e=v[1]?v[1].values:null;for(let t in me=e!=null,pe=me?e(r,1,0):{_:0},pe)he[t]=`--`}if(M)if(P=Vn(`table`,`u-legend`,l),ue=Vn(`tbody`,null,P),A.mount(r,P),me){le=Vn(`thead`,null,P,ue);let e=Vn(`tr`,null,le);for(var ge in Vn(`th`,null,e),pe)Vn(`th`,_n,e).textContent=ge}else zn(P,`u-inline`),A.live&&zn(P,`u-live`);let _e={show:!0},ve={show:!1};function ye(e,t){if(t==0&&(me||!A.live||i==2))return Xr;let n=[],a=Vn(`tr`,`u-series`,ue,ue.childNodes[t]);zn(a,e.class),e.show||zn(a,gn);let o=Vn(`th`,null,a);if(N.show){let e=Hn(`u-marker`,o);if(t>0){let n=N.width(r,t);n&&(e.style.border=n+`px `+N.dash(r,t)+` `+N.stroke(r,t)),e.style.background=N.fill(r,t)}}let s=Hn(_n,o);for(var c in e.label instanceof HTMLElement?s.appendChild(e.label):s.textContent=e.label,t>0&&(N.show||(s.style.color=e.width>0?N.stroke(r,t):N.fill(r,t)),xe(`click`,o,t=>{if(j._lock)return;qe(t);let n=v.indexOf(e);if((t.ctrlKey||t.metaKey)!=A.isolate){let e=v.some((e,t)=>t>0&&t!=n&&e.show);v.forEach((t,r)=>{r>0&&Ln(r,e?r==n?_e:ve:_e,!0,hi.setSeries)})}else Ln(n,{show:!e.show},!0,hi.setSeries)},!1),Xe&&xe(On,o,t=>{j._lock||(qe(t),Ln(v.indexOf(e),tr,!0,hi.setSeries))},!1)),pe){let e=Vn(`td`,`u-value`,a);e.textContent=`--`,n.push(e)}return[a,n]}let be=new Map;function xe(e,t,n,i=!0){let a=be.get(t)||{},o=j.bind[e](r,t,n,i);o&&(Zn(e,t,a[e]=o),be.set(t,a))}function Se(e,t,n){let r=be.get(t)||{};for(let n in r)(e==null||n==e)&&(Qn(n,t,r[n]),delete r[n]);e??be.delete(t)}let Ce=0,we=0,F=0,I=0,Te=0,Ee=0,De=Te,Oe=Ee,ke=F,Ae=I,je=0,Me=0,Ne=0,Pe=0;r.bbox={};let Fe=!1,Ie=!1,Le=!1,Re=!1,ze=!1,Be=!1;function Ve(e,t,n){(n||e!=r.width||t!=r.height)&&He(e,t),Kt(!1),Le=!0,Ie=!0,Zt()}function He(e,t){r.width=Ce=F=e,r.height=we=I=t,Te=Ee=0,Ge(),Ke();let n=r.bbox;je=n.left=Hr(Te*B,.5),Me=n.top=Hr(Ee*B,.5),Ne=n.width=Hr(F*B,.5),Pe=n.height=Hr(I*B,.5)}function Ue(){let e=!1,t=0;for(;!e;){t++;let n=Ut(t),i=Wt(t);e=t==3||n&&i,e||(He(r.width,r.height),Ie=!0)}}function We({width:e,height:t}){Ve(e,t)}r.setSize=We;function Ge(){let e=!1,t=!1,n=!1,r=!1;y.forEach((i,a)=>{if(i.show&&i._show){let{side:a,_size:o}=i,s=a%2,c=o+(i.label==null?0:i.labelSize);c>0&&(s?(F-=c,a==3?(Te+=c,r=!0):n=!0):(I-=c,a==0?(Ee+=c,e=!0):t=!0))}}),at[0]=e,at[1]=n,at[2]=t,at[3]=r,F-=lt[1]+lt[3],Te+=lt[3],I-=lt[2]+lt[0],Ee+=lt[0]}function Ke(){let e=Te+F,t=Ee+I,n=Te,r=Ee;function i(i,a){switch(i){case 1:return e+=a,e-a;case 2:return t+=a,t-a;case 3:return n-=a,n+a;case 0:return r-=a,r+a}}y.forEach((e,t)=>{if(e.show&&e._show){let t=e.side;e._pos=i(t,e._size),e.label!=null&&(e._lpos=i(t,e.labelSize))}})}if(j.dataIdx==null){let e=j.hover,n=e.skip=new Set(e.skip??[]);n.add(void 0);let r=e.prox=W(e.prox),i=e.bias??=0;j.dataIdx=(e,a,o,s)=>{if(a==0)return o;let c=o,l=r(e,a,o,s)??U,u=l>=0&&l0;)n.has(m[r])||(e=r);if(i==0||i==1)for(r=o;t==null&&r++l&&(c=null);return c}}let qe=e=>{j.event=e};j.idxs=se,j._lock=!1;let Je=j.points;Je.show=W(Je.show),Je.size=W(Je.size),Je.stroke=W(Je.stroke),Je.width=W(Je.width),Je.fill=W(Je.fill);let Ye=r.focus=oi({},e.focus||{alpha:.3},j.focus),Xe=Ye.prox>=0,Ze=Xe&&Je.one,Qe=[],$e=[],et=[];function tt(e,t){let n=Je.show(r,t);if(n instanceof HTMLElement)return zn(n,`u-cursor-pt`),zn(n,e.class),Wn(n,-10,-10,F,I),m.insertBefore(n,Qe[t]),n}function nt(e,t){if(i==1||t>0){let t=i==1&&b[e.scale].time,n=e.value;e.value=t?ei(n)?Zi(ne,Xi(n,re)):n||oe:n||Aa,e.label=e.label||(t?`Time`:`Value`)}if(Ze||t>0){e.width=e.width==null?1:e.width,e.paths=e.paths||So||Lr,e.fillTo=W(e.fillTo||Ga),e.pxAlign=+H(e.pxAlign,h),e.pxRound=Xa(e.pxAlign),e.stroke=W(e.stroke||null),e.fill=W(e.fill||null),e._stroke=e._fill=e._paths=e._focus=null;let t=Ma(wr(1,e.width),1),n=e.points=oi({},{size:t,width:wr(1,t*.2),stroke:e.stroke,space:t*2,paths:Co,_stroke:null,_fill:null},e.points);n.show=W(n.show),n.filter=W(n.filter),n.fill=W(n.fill),n.stroke=W(n.stroke),n.paths=W(n.paths),n.pxAlign=e.pxAlign}if(M){let n=ye(e,t);de.splice(t,0,n[0]),fe.splice(t,0,n[1]),A.values.push(null)}if(ce){se.splice(t,0,null);let n=null;Ze?t==0&&(n=tt(e,t)):t>0&&(n=tt(e,t)),Qe.splice(t,0,n),$e.splice(t,0,0),et.splice(t,0,0)}pi(`addSeries`,t)}function rt(e,t){t??=v.length,e=i==1?Eo(e,t,va,La):Eo(e,t,{},Ia),v.splice(t,0,e),nt(v[t],t)}r.addSeries=rt;function it(e){if(v.splice(e,1),M){A.values.splice(e,1),fe.splice(e,1);let t=de.splice(e,1)[0];Se(null,t.firstChild),t.remove()}ce&&(se.splice(e,1),Qe.splice(e,1)[0].remove(),$e.splice(e,1),et.splice(e,1)),pi(`delSeries`,e)}r.delSeries=it;let at=[!1,!1,!1,!1];function ot(e,t){if(e._show=e.show,e.show){let n=e.side%2,i=b[e.scale];i??=(e.scale=n?v[1].scale:S,b[e.scale]);let a=i.time;e.size=W(e.size),e.space=W(e.space),e.rotate=W(e.rotate),Zr(e.incrs)&&e.incrs.forEach(e=>{!Gr.has(e)&&Gr.set(e,Kr(e))}),e.incrs=W(e.incrs||(i.distr==2?Oi:a?_==1?Bi:Ui:ki)),e.splits=W(e.splits||(a&&i.distr==1?ie:i.distr==3?xa:i.distr==4?Sa:ba)),e.stroke=W(e.stroke),e.grid.stroke=W(e.grid.stroke),e.ticks.stroke=W(e.ticks.stroke),e.border.stroke=W(e.border.stroke);let o=e.values;e.values=Zr(o)&&!Zr(o[0])?W(o):a?Zr(o)?qi(ne,Ki(o,re)):ei(o)?Ji(ne,o):o||ae:o||ya,e.filter=W(e.filter||(i.distr>=3&&i.log==10?Oa:i.distr==3&&i.log==2?ka:Ir)),e.font=Fo(e.font),e.labelFont=Fo(e.labelFont),e._size=e.size(r,null,t,0),e._space=e._rotate=e._incrs=e._found=e._splits=e._values=null,e._size>0&&(at[t]=!0,e._el=Hn(`u-axis`,f))}}function st(e,t,n,r){let[i,a,o,s]=n,c=t%2,l=0;return c==0&&(s||a)&&(l=t==0&&!i||t==2&&!o?xr(_a.size/3):0),c==1&&(i||o)&&(l=t==1&&!a||t==3&&!s?xr(ja.size/2):0),l}let ct=r.padding=(e.padding||[st,st,st,st]).map(e=>W(H(e,st))),lt=r._padding=ct.map((e,t)=>e(r,t,at,0)),ut,dt=null,ft=null,pt=i==1?v[0].idxs:null,mt=null,ht=!1;function gt(e,n){if(t=e??[],r.data=r._data=t,i==2){ut=0;for(let e=1;e=0,Be=!0,Zt()}}r.setData=gt;function _t(){ht=!0;let e,n;i==1&&(ut>0?(dt=pt[0]=0,ft=pt[1]=ut-1,e=t[0][dt],n=t[0][ft],O==2?(e=dt,n=ft):e==n&&(O==3?[e,n]=or(e,e,D.log,!1):O==4?[e,n]=sr(e,e,D.log,!1):D.time?n=e+xr(86400/_):[e,n]=fr(e,n,cr,!0))):(dt=pt[0]=e=null,ft=pt[1]=n=null)),In(S,e,n)}let vt,yt,bt,xt,St,Ct,wt,Tt,Et,Dt;function Ot(e,t,n,r,i,a){e??=wn,n??=Yr,r??=`butt`,i??=wn,a??=`round`,e!=vt&&(d.strokeStyle=vt=e),i!=yt&&(d.fillStyle=yt=i),t!=bt&&(d.lineWidth=bt=t),a!=St&&(d.lineJoin=St=a),r!=Ct&&(d.lineCap=Ct=r),n!=xt&&d.setLineDash(xt=n)}function kt(e,t,n,r){t!=yt&&(d.fillStyle=yt=t),e!=wt&&(d.font=wt=e),n!=Tt&&(d.textAlign=Tt=n),r!=Et&&(d.textBaseline=Et=r)}function At(e,t,n,i,a=0){if(i.length>0&&e.auto(r,ht)&&(t==null||t.min==null)){let t=H(dt,0),r=H(ft,i.length-1),o=n.min==null?ar(i,t,r,a,e.distr==3):[n.min,n.max];e.min=Cr(e.min,n.min=o[0]),e.max=wr(e.max,n.max=o[1])}}let jt={min:null,max:null};function Mt(){for(let e in b){let t=b[e];k[e]==null&&(t.min==null||k[S]!=null&&t.auto(r,ht))&&(k[e]=jt)}for(let e in b){let t=b[e];k[e]==null&&t.from!=null&&k[t.from]!=null&&(k[e]=jt)}k[S]!=null&&Kt(!0);let e={};for(let t in k){let n=k[t];if(n!=null){let a=e[t]=ai(b[t],ni);if(n.min!=null)oi(a,n);else if(t!=S||i==2)if(ut==0&&a.from==null){let e=a.range(r,null,null,t);a.min=e[0],a.max=e[1]}else a.min=U,a.max=-U}}if(ut>0)for(let n in v.forEach((n,a)=>{if(i==1){let i=n.scale,o=k[i];if(o==null)return;let s=e[i];if(a==0){let e=s.range(r,s.min,s.max,i);s.min=e[0],s.max=e[1],dt=$n(s.min,t[0]),ft=$n(s.max,t[0]),ft-dt>1&&(t[0][dt]s.max&&ft--),n.min=mt[dt],n.max=mt[ft]}else n.show&&n.auto&&At(s,o,n,t[a],n.sorted);n.idxs[0]=dt,n.idxs[1]=ft}else if(a>0&&n.show&&n.auto){let[r,i]=n.facets,o=r.scale,s=i.scale,[c,l]=t[a],u=e[o],d=e[s];u!=null&&At(u,k[o],r,c,r.sorted),d!=null&&At(d,k[s],i,l,i.sorted),n.min=i.min,n.max=i.max}}),e){let t=e[n],i=k[n];if(t.from==null&&(i==null||i.min==null)){let e=t.range(r,t.min==U?null:t.min,t.max==-U?null:t.max,n);t.min=e[0],t.max=e[1]}}for(let t in e){let n=e[t];if(n.from!=null){let i=e[n.from];if(i.min==null)n.min=n.max=null;else{let e=n.range(r,i.min,i.max,t);n.min=e[0],n.max=e[1]}}}let n={},a=!1;for(let t in e){let r=e[t],i=b[t];if(i.min!=r.min||i.max!=r.max){i.min=r.min,i.max=r.max;let e=i.distr;i._min=e==3?Dr(i.min):e==4?Ar(i.min,i.asinh):e==100?i.fwd(i.min):i.min,i._max=e==3?Dr(i.max):e==4?Ar(i.max,i.asinh):e==100?i.fwd(i.max):i.max,n[t]=a=!0}}if(a){for(let e in v.forEach((e,t)=>{i==2?t>0&&n.y&&(e._paths=null):n[e.scale]&&(e._paths=null)}),n)Le=!0,pi(`setScale`,e);ce&&j.left>=0&&(Re=Be=!0)}for(let e in k)k[e]=null}function Nt(e){let t=Mr(dt-1,0,ut-1),n=Mr(ft+1,0,ut-1);for(;e[t]==null&&t>0;)t--;for(;e[n]==null&&n0){let e=v.some(e=>e._focus)&&Dt!=Ye.alpha;e&&(d.globalAlpha=Dt=Ye.alpha),v.forEach((e,n)=>{if(n>0&&e.show&&(Ft(n,!1),Ft(n,!0),e._paths==null)){let a=Dt;Dt!=e.alpha&&(d.globalAlpha=Dt=e.alpha);let o=i==2?[0,t[n][0].length-1]:Nt(t[n]);e._paths=e.paths(r,n,o[0],o[1]),Dt!=a&&(d.globalAlpha=Dt=a)}}),v.forEach((e,t)=>{if(t>0&&e.show){let n=Dt;Dt!=e.alpha&&(d.globalAlpha=Dt=e.alpha),e._paths!=null&&It(t,!1);{let n=e._paths==null?null:e._paths.gaps,i=e.points.show(r,t,dt,ft,n),a=e.points.filter(r,t,i,n);(i||a)&&(e.points._paths=e.points.paths(r,t,dt,ft,a),It(t,!0))}Dt!=n&&(d.globalAlpha=Dt=n),pi(`drawSeries`,t)}}),e&&(d.globalAlpha=Dt=1)}}function Ft(e,t){let n=t?v[e].points:v[e];n._stroke=n.stroke(r,e),n._fill=n.fill(r,e)}function It(e,t){let n=t?v[e].points:v[e],{stroke:r,fill:i,clip:a,flags:o,_stroke:s=n._stroke,_fill:c=n._fill,_width:l=n.width}=n._paths;l=G(l*B,3);let u=null,f=l%2/2;t&&c==null&&(c=l>0?`#fff`:s);let p=n.pxAlign==1&&f>0;if(p&&d.translate(f,f),!t){let e=je-l/2,t=Me-l/2,n=Ne+l,r=Pe+l;u=new Path2D,u.rect(e,t,n,r)}t?Rt(s,l,n.dash,n.cap,c,r,i,o,a):Lt(e,s,l,n.dash,n.cap,c,r,i,o,u,a),p&&d.translate(-f,-f)}function Lt(e,n,i,a,o,s,c,l,u,d,f){let p=!1;u!=0&&x.forEach((m,h)=>{if(m.series[0]==e){let e=v[m.series[1]],g=t[m.series[1]],_=(e._paths||Jr).band;Zr(_)&&(_=m.dir==1?_[0]:_[1]);let y,b=null;e.show&&_&&pr(g,dt,ft)?(b=m.fill(r,h)||s,y=e._paths.clip):_=null,Rt(n,i,a,o,b,c,l,u,d,f,y,_),p=!0}}),p||Rt(n,i,a,o,s,c,l,u,d,f)}function Rt(e,t,n,r,i,a,o,s,c,l,u,f){Ot(e,t,n,r,i),(c||l||f)&&(d.save(),c&&d.clip(c),l&&d.clip(l)),f?(s&3)==3?(d.clip(f),u&&d.clip(u),Bt(i,o),zt(e,a,t)):s&2?(Bt(i,o),d.clip(f),zt(e,a,t)):s&1&&(d.save(),d.clip(f),u&&d.clip(u),Bt(i,o),d.restore(),zt(e,a,t)):(Bt(i,o),zt(e,a,t)),(c||l||f)&&d.restore()}function zt(e,t,n){n>0&&(t instanceof Map?t.forEach((e,t)=>{d.strokeStyle=vt=t,d.stroke(e)}):t!=null&&e&&d.stroke(t))}function Bt(e,t){t instanceof Map?t.forEach((e,t)=>{d.fillStyle=yt=t,d.fill(e)}):t!=null&&e&&d.fill(t)}function Vt(e,t,n,i){let a=y[e],o;if(i<=0)o=[0,0];else{let s=a._space=a.space(r,e,t,n,i);o=Po(t,n,a._incrs=a.incrs(r,e,t,n,i,s),i,s)}return a._found=o}function Ht(e,t,n,r,i,a,o,s,c,l){let u=o%2/2;h==1&&d.translate(u,u),Ot(s,o,c,l,s),d.beginPath();let f,p,m,g,_=i+(r==0||r==3?-a:a);n==0?(p=i,g=_):(f=i,m=_);for(let r=0;r{if(!n.show)return;let a=b[n.scale];if(a.min==null){n._show&&(t=!1,n._show=!1,Kt(!1));return}else n._show||(t=!1,n._show=!0,Kt(!1));let o=n.side,s=o%2,{min:c,max:l}=a,[u,d]=Vt(i,c,l,s==0?F:I);if(d==0)return;let f=a.distr==2,p=n._splits=n.splits(r,i,c,l,u,d,f),m=a.distr==2?p.map(e=>mt[e]):p,h=a.distr==2?mt[p[1]]-mt[p[0]]:u,g=n._values=n.values(r,n.filter(r,m,i,d,h),i,d,h);n._rotate=o==2?n.rotate(r,g,i,d):0;let _=n._size;n._size=Sr(n.size(r,g,i,e)),_!=null&&n._size!=_&&(t=!1)}),t}function Wt(e){let t=!0;return ct.forEach((n,i)=>{let a=n(r,i,at,e);a!=lt[i]&&(t=!1),lt[i]=a}),t}function Gt(){for(let e=0;emt[e]):_,x=p.distr==2?mt[_[1]]-mt[_[0]]:u,S=t.ticks,C=t.border,w=S.show?S.size:0,T=xr(w*B),E=xr((t.alignTo==2?t._size-w-t.gap:t.gap)*B),D=t._rotate*-vr/180,O=g(t._pos*B),ee=O+(T+E)*l;o=i==0?ee:0,a=i==1?ee:0;let te=t.font[0];kt(te,c,t.align==1?xn:t.align==2?Sn:D>0?xn:D<0?Sn:i==0?`center`:n==3?Sn:xn,D||i==1?`middle`:n==2?`top`:bn);let k=t.font[1]*t.lineGap,ne=_.map(e=>g(s(e,p,m,h))),re=t._values;for(let e=0;e{n>0&&(t._paths=null,e&&(i==1?(t.min=null,t.max=null):t.facets.forEach(e=>{e.min=null,e.max=null})))})}let qt=!1,Jt=!1,Yt=[];function Xt(){Jt=!1;for(let e=0;e0&&queueMicrotask(Xt)}r.batch=Qt;function $t(){if(Fe&&=(Mt(),!1),Le&&=(Ue(),!1),Ie){if(V(p,xn,Te),V(p,`top`,Ee),V(p,vn,F),V(p,yn,I),V(m,xn,Te),V(m,`top`,Ee),V(m,vn,F),V(m,yn,I),V(f,vn,Ce),V(f,yn,we),u.width=xr(Ce*B),u.height=xr(we*B),y.forEach(({_el:e,_show:t,_size:n,_pos:r,side:i})=>{if(e!=null)if(t){let t=i===3||i===0?n:0,a=i%2==1;V(e,a?`left`:`top`,r-t),V(e,a?`width`:`height`,n),V(e,a?`top`:`left`,a?Ee:Te),V(e,a?`height`:`width`,a?I:F),Bn(e,gn)}else zn(e,gn)}),vt=yt=bt=St=Ct=wt=Tt=Et=xt=null,Dt=1,jr(!0),Te!=De||Ee!=Oe||F!=ke||I!=Ae){Kt(!1);let e=F/ke,t=I/Ae;if(ce&&!Re&&j.left>=0){j.left*=e,j.top*=t,rn&&Wn(rn,xr(j.left),0,F,I),an&&Wn(an,0,xr(j.top),F,I);for(let n=0;n=0&&z.width>0)for(let n in z.left*=e,z.width*=e,z.top*=t,z.height*=t,Br)V(Cn,n,z[n]);De=Te,Oe=Ee,ke=F,Ae=I}pi(`setSize`),Ie=!1}Ce>0&&we>0&&(d.clearRect(0,0,u.width,u.height),pi(`drawClear`),w.forEach(e=>e()),pi(`draw`)),z.show&&ze&&(jn(z),ze=!1),ce&&Re&&(Er(null,!0,!1),Re=!1),A.show&&A.live&&Be&&(_r(),Be=!1),c||(c=!0,r.status=1,pi(`ready`)),ht=!1,qt=!1}r.redraw=(e,t)=>{Le=t||!1,e===!1?Zt():In(S,D.min,D.max)};function en(e,n){let i=b[e];if(i.from==null){if(ut==0){let t=i.range(r,n.min,n.max,e);n.min=t[0],n.max=t[1]}if(n.min>n.max){let e=n.min;n.min=n.max,n.max=e}if(ut>1&&n.min!=null&&n.max!=null&&n.max-n.min<1e-16)return;e==S&&i.distr==2&&ut>0&&(n.min=$n(n.min,t[0]),n.max=$n(n.max,t[0]),n.min==n.max&&n.max++),k[e]=n,Fe=!0,Zt()}}r.setScale=en;let tn,nn,rn,an,on,sn,cn,ln,un,dn,L,R,fn=!1,pn=j.drag,mn=pn.x,hn=pn.y;ce&&(j.x&&(tn=Hn(`u-cursor-x`,m)),j.y&&(nn=Hn(`u-cursor-y`,m)),D.ori==0?(rn=tn,an=nn):(rn=nn,an=tn),L=j.left,R=j.top);let z=r.select=oi({show:!0,over:!0,left:0,width:0,top:0,height:0},e.select),Cn=z.show?Hn(`u-select`,z.over?m:p):null;function jn(e,t){if(z.show){for(let t in e)z[t]=e[t],t in Br&&V(Cn,t,e[t]);t!==!1&&pi(`setSelect`)}}r.setSelect=jn;function Nn(e){if(v[e].show)M&&Bn(de[e],gn);else if(M&&zn(de[e],gn),ce){let t=Ze?Qe[0]:Qe[e];t!=null&&Wn(t,-10,-10,F,I)}}function In(e,t,n){en(e,{min:t,max:n})}function Ln(e,t,n,a){t.focus!=null&&nr(e),t.show!=null&&v.forEach((n,r)=>{r>0&&(e==r||e==null)&&(n.show=t.show,Nn(r),i==2?(In(n.facets[0].scale,null,null),In(n.facets[1].scale,null,null)):In(n.scale,null,null),Zt())}),n!==!1&&pi(`setSeries`,e,t),a&&vi(`setSeries`,r,e,t)}r.setSeries=Ln;function Rn(e,t){oi(x[e],t)}function Un(e,t){e.fill=W(e.fill||null),e.dir=H(e.dir,-1),t??=x.length,x.splice(t,0,e)}function Gn(e){e==null?x.length=0:x.splice(e,1)}r.addBand=Un,r.setBand=Rn,r.delBand=Gn;function qn(e,t){v[e].alpha=t,ce&&Qe[e]!=null&&(Qe[e].style.opacity=t),M&&de[e]&&(de[e].style.opacity=t)}let Yn,Xn,er,tr={focus:!0};function nr(e){if(e!=er){let t=e==null,n=Ye.alpha!=1;v.forEach((r,a)=>{if(i==1||a>0){let i=t||a==0||a==e;r._focus=t?null:i,n&&qn(a,i?1:Ye.alpha)}}),er=e,n&&Zt()}}M&&Xe&&xe(kn,P,e=>{j._lock||(qe(e),er!=null&&Ln(null,tr,!0,hi.setSeries))});function rr(e,t,n){let r=b[t];n&&(e=e/B-(r.ori==1?Ee:Te));let i=F;r.ori==1&&(i=I,e=i-e),r.dir==-1&&(e=i-e);let a=r._min,o=r._max,s=e/i,c=a+(o-a)*s,l=r.distr;return l==3?Tr(10,c):l==4?kr(c,r.asinh):l==100?r.bwd(c):c}function ir(e,n){return $n(rr(e,S,n),t[0],dt,ft)}r.valToIdx=e=>$n(e,t[0]),r.posToIdx=ir,r.posToVal=rr,r.valToPos=(e,t,n)=>b[t].ori==0?a(e,b[t],n?Ne:F,n?je:0):o(e,b[t],n?Pe:I,n?Me:0),r.setCursor=(e,t,n)=>{L=e.left,R=e.top,Er(null,t,n)};function ur(e,t){V(Cn,xn,z.left=e),V(Cn,vn,z.width=t)}function dr(e,t){V(Cn,`top`,z.top=e),V(Cn,yn,z.height=t)}let mr=D.ori==0?ur:dr,hr=D.ori==1?ur:dr;function gr(){if(M&&A.live)for(let e=i==2?1:0;e{se[t]=e}):$r(e.idx)||se.fill(e.idx),A.idx=se[0]),M&&A.live){for(let e=0;e0||i==1&&!me)&&br(e,se[e]);gr()}Be=!1,t!==!1&&pi(`setLegend`)}r.setLegend=_r;function br(e,n){let i=v[e],a=e==0&&O==2?mt:t[e],o;me?o=i.values(r,e,n)??he:(o=i.value(r,n==null?null:a[n],e,n),o=o==null?he:{_:o}),A.values[e]=o}function Er(e,n,a){un=L,dn=R,[L,R]=j.move(r,L,R),j.left=L,j.top=R,ce&&(rn&&Wn(rn,xr(L),0,F,I),an&&Wn(an,0,xr(R),F,I));let o,s=dt>ft;Yn=U,Xn=null;let c=D.ori==0?F:I,l=D.ori==1?F:I;if(L<0||ut==0||s){o=j.idx=null;for(let e=0;e0&&g.show){let n=x==null?-10:x==o?a:ee(i==1?t[0][x]:t[e][0][x],D,c,0),_=S==null?-10:te(S,i==1?b[g.scale]:b[g.facets[1].scale],l,0);if(Xe&&S!=null){let t=D.ori==1?L:R,n=yr(Ye.dist(r,e,x,_,t));if(n=0?1:-1,o=i>=0?1:-1;o==a&&(o==1?r==1?S>=i:S<=i:r==1?S<=i:S>=i)&&(Yn=n,Xn=e)}else Yn=n,Xn=e}}if(Be||Ze){let t,i;D.ori==0?(t=n,i=_):(t=_,i=n);let a,o,c,l,g,v,y=!0,b=Je.bbox;if(b!=null){y=!1;let t=b(r,e);c=t.left,l=t.top,a=t.width,o=t.height}else c=t,l=i,a=o=Je.size(r,e);if(v=Je.fill(r,e),g=Je.stroke(r,e),Ze)e==Xn&&Yn<=Ye.prox&&(s=c,u=l,d=a,f=o,p=y,m=v,h=g);else{let t=Qe[e];t!=null&&($e[e]=c,et[e]=l,Jn(t,a,o,y),Kn(t,v,g),Wn(t,Sr(c),Sr(l),F,I))}}}}if(Ze){let e=Ye.prox;if(Be||(er==null?Yn<=e:Yn>e||Xn!=er)){let e=Qe[0];e!=null&&($e[0]=s,et[0]=u,Jn(e,d,f,p),Kn(e,m,h),Wn(e,Sr(s),Sr(u),F,I))}}}if(z.show&&fn)if(e!=null){let[t,n]=hi.scales,[r,i]=hi.match,[a,o]=e.cursor.sync.scales,s=e.cursor.drag;if(mn=s._x,hn=s._y,mn||hn){let{left:s,top:u,width:d,height:f}=e.select,p=e.scales[a].ori,m=e.posToVal,h,g,_,v,y,x=t!=null&&r(t,a),S=n!=null&&i(n,o);x&&mn?(p==0?(h=s,g=d):(h=u,g=f),_=b[t],v=ee(m(h,a),_,c,0),y=ee(m(h+g,a),_,c,0),mr(Cr(v,y),yr(y-v))):mr(0,c),S&&hn?(p==1?(h=s,g=d):(h=u,g=f),_=b[n],v=te(m(h,o),_,l,0),y=te(m(h+g,o),_,l,0),hr(Cr(v,y),yr(y-v))):hr(0,l)}else Vr()}else{let e=yr(un-on),t=yr(dn-sn);if(D.ori==1){let n=e;e=t,t=n}mn=pn.x&&e>=pn.dist,hn=pn.y&&t>=pn.dist;let n=pn.uni;n==null?pn.x&&pn.y&&(mn||hn)&&(mn=hn=!0):mn&&hn&&(mn=e>=n,hn=t>=n,!mn&&!hn&&(t>e?hn=!0:mn=!0));let r,i;mn&&(D.ori==0?(r=cn,i=L):(r=ln,i=R),mr(Cr(r,i),yr(i-r)),hn||hr(0,l)),hn&&(D.ori==1?(r=cn,i=L):(r=ln,i=R),hr(Cr(r,i),yr(i-r)),mn||mr(0,c)),!mn&&!hn&&(mr(0,0),hr(0,0))}if(pn._x=mn,pn._y=hn,e==null){if(a){if(gi!=null){let[e,t]=hi.scales;hi.values[0]=e==null?null:rr(D.ori==0?L:R,e),hi.values[1]=t==null?null:rr(D.ori==1?L:R,t)}vi(Tn,r,L,R,F,I,o)}if(Xe){let e=a&&hi.setSeries,t=Ye.prox;er==null?Yn<=t&&Ln(Xn,tr,!0,e):Yn>t?Ln(null,tr,!0,e):Xn!=er&&Ln(Xn,tr,!0,e)}}Be&&(A.idx=o,_r()),n!==!1&&pi(`setCursor`)}let Or=null;Object.defineProperty(r,`rect`,{get(){return Or??jr(!1),Or}});function jr(e=!1){e?Or=null:(Or=m.getBoundingClientRect(),pi(`syncRect`,Or))}function Pr(e,t,n,r,i,a,o){j._lock||fn&&e!=null&&e.movementX==0&&e.movementY==0||(Fr(e,t,n,r,i,a,o,!1,e!=null),e==null?Er(t,!0,!1):Er(null,!0,!0))}function Fr(e,t,n,i,a,o,c,l,u){if(Or??jr(!1),qe(e),e!=null)n=e.clientX-Or.left,i=e.clientY-Or.top;else{if(n<0||i<0){L=-10,R=-10;return}let[e,r]=hi.scales,c=t.cursor.sync,[l,u]=c.values,[d,f]=c.scales,[p,m]=hi.match,h=t.axes[0].side%2==1,g=D.ori==0?F:I,_=D.ori==1?F:I,v=h?o:a,y=h?a:o,x=h?i:n,S=h?n:i;if(n=d==null?x/v*g:p(e,d)?s(l,b[e],g,0):-10,i=f==null?S/y*_:m(r,f)?s(u,b[r],_,0):-10,D.ori==1){let e=n;n=i,i=e}}u&&(t==null||t.cursor.event.type==Tn)&&((n<=1||n>=F-1)&&(n=Hr(n,F)),(i<=1||i>=I-1)&&(i=Hr(i,I))),l?(on=n,sn=i,[cn,ln]=j.move(r,n,i)):(L=n,R=i)}let Br={width:0,height:0,left:0,top:0};function Vr(){jn(Br,!1)}let Ur,Wr,qr,Qr;function ri(e,t,n,i,a,o,s){fn=!0,mn=hn=pn._x=pn._y=!1,Fr(e,t,n,i,a,o,s,!0,!1),e!=null&&(xe(Dn,Pn,ii,!1),vi(En,r,cn,ln,F,I,null));let{left:c,top:l,width:u,height:d}=z;Ur=c,Wr=l,qr=u,Qr=d}function ii(e,t,n,i,a,o,s){fn=pn._x=pn._y=!1,Fr(e,t,n,i,a,o,s,!1,!0);let{left:c,top:l,width:u,height:d}=z,f=u>0||d>0,p=Ur!=c||Wr!=l||qr!=u||Qr!=d;if(f&&p&&jn(z),pn.setScale&&f&&p){let e=c,t=u,n=l,r=d;if(D.ori==1&&(e=l,t=d,n=c,r=u),mn&&In(S,rr(e,S),rr(e+t,S)),hn)for(let e in b){let t=b[e];e!=S&&t.from==null&&t.min!=U&&In(e,rr(n+r,e),rr(n,e))}Vr()}else j.lock&&(j._lock=!j._lock,Er(t,!0,e!=null));e!=null&&(Se(Dn,Pn),vi(Dn,r,L,R,F,I,null))}function si(e,t,n,r,i,a,o){if(j._lock)return;qe(e);let s=fn;if(fn){let e=!0,t=!0,n,r;D.ori==0?(n=mn,r=hn):(n=hn,r=mn),n&&r&&(e=L<=10||L>=F-10,t=R<=10||R>=I-10),n&&e&&(L=L{let a=hi.match[2];n=a(r,t,n),n!=-1&&Ln(n,i,!0,!1)},ce&&(xe(En,m,ri),xe(Tn,m,Pr),xe(On,m,e=>{qe(e),jr(!1)}),xe(kn,m,si),xe(An,m,ci),bo.add(r),r.syncRect=jr);let fi=r.hooks=e.hooks||{};function pi(e,t,n){Jt?Yt.push([e,t,n]):e in fi&&fi[e].forEach(e=>{e.call(null,r,t,n)})}(e.plugins||[]).forEach(e=>{for(let t in e.hooks)fi[t]=(fi[t]||[]).concat(e.hooks[t])});let mi=(e,t,n)=>n,hi=oi({key:null,setSeries:!1,filters:{pub:Rr,sub:Rr},scales:[S,v[1]?v[1].scale:null],match:[zr,zr,mi],values:[null,null]},j.sync);hi.match.length==2&&hi.match.push(mi),j.sync=hi;let gi=hi.key,_i=Ha(gi);function vi(e,t,n,r,i,a,o){hi.filters.pub(e,t,n,r,i,a,o)&&_i.pub(e,t,n,r,i,a,o)}_i.sub(r);function yi(e,t,n,r,i,a,o){hi.filters.sub(e,t,n,r,i,a,o)&&di[e](null,t,n,r,i,a,o)}r.pub=yi;function bi(){_i.unsub(r),bo.delete(r),be.clear(),Qn(Mn,Fn,ui),l.remove(),P?.remove(),pi(`destroy`)}r.destroy=bi;function Si(){pi(`init`,e,t),gt(t||e.data,!1),k[S]?en(S,k[S]):_t(),ze=z.show&&(z.width>0||z.height>0),Re=Be=!0,Ve(e.width,e.height)}return v.forEach(nt),y.forEach(ot),n?n instanceof HTMLElement?(n.appendChild(l),Si()):n(r,Si):Si(),r}Lo.assign=oi,Lo.fmtNum=gr,Lo.rangeNum=fr,Lo.rangeLog=or,Lo.rangeAsinh=sr,Lo.orient=Ua,Lo.pxRatio=B,Lo.join=ci,Lo.fmtDate=xi,Lo.tzDate=Ci,Lo.sync=Ha;{Lo.addGap=Ja,Lo.clipGaps=qa;let e=Lo.paths={points:co};e.linear=po,e.stepped=mo,e.bars=go,e.spline=vo}var Ro=t({default:()=>zo}),zo=class extends nt{static{this.targets=[`table`,`chart`,`summary`,`legend`,`legendAmount`,`legendPeriod`,`axis`]}getSize(){return{width:this.chartTarget.offsetWidth,height:this.chartTarget.offsetHeight}}connect(){this.tableTarget.hidden=!0,this.chartTarget.hidden=!1,this.axisTarget.hidden=!1,this.observer=new ResizeObserver(()=>{this.uplot?.setSize(this.getSize())}),this.observer.observe(this.chartTarget);let e=getComputedStyle(document.documentElement),t={...this.getSize(),padding:[1,1,1,1],series:[{},{stroke:e.getPropertyValue(`--color-stroke`),width:2,points:{show:!1}},{stroke:e.getPropertyValue(`--color-accent`),width:2,points:{show:!1}}],cursor:{y:!1},axes:[{show:!1},{show:!1}],scales:{y:{range:(e,t,n)=>[t,n]}},select:{show:!1},legend:{show:!1},hooks:{init:[e=>{e.over.addEventListener(`mouseenter`,()=>{this.summaryTarget.hidden=!0,this.legendTarget.hidden=!1}),e.over.addEventListener(`mouseleave`,()=>{this.summaryTarget.hidden=!1,this.legendTarget.hidden=!0})}],setCursor:[e=>{let{idx:t}=e.cursor;this.legendAmountTarget.textContent=typeof t==`number`?Lo.fmtNum(e.data[2][t]||0):``,this.legendPeriodTarget.textContent=typeof t==`number`?n[t].textContent:``}]}},n=Array.from(this.tableTarget.querySelectorAll(`thead th`)).slice(1);this.uplot=new Lo(t,[n.map(e=>Number(e.dataset.timestamp)),...Array.from(this.tableTarget.querySelectorAll(`tbody tr`)).reverse().map(e=>Array.from(e.querySelectorAll(`td`)).map(e=>Number(e.textContent)))],this.chartTarget)}disconnect(){this.observer?.disconnect(),this.uplot?.destroy()}},Bo=t({default:()=>Vo}),Vo=class extends nt{constructor(...e){super(...e),this.mouseover=e=>{let t=e.target;if(t.closest(`thead th`)){let e=Array.from(t.parentElement.children).indexOf(t);this.element.querySelector(`colgroup`).children[e].classList.add(`is-highlighted`),this.element.style.cursor=`pointer`}t.closest(`tbody th`)&&(t.closest(`tr`).classList.add(`is-highlighted`),this.element.style.cursor=`pointer`)},this.reset=()=>{this.element.querySelectorAll(`col, tr`).forEach(e=>e.classList.remove(`is-highlighted`)),this.element.style.cursor=``},this.click=e=>{let t=e.target;if(t.closest(`thead th`)){let e=Array.from(t.parentElement.children).indexOf(t),n=Array.from(this.element.querySelectorAll(`tbody tr td:nth-child(${e+1}) input[type="checkbox"]`)).filter(e=>!this.disabled?.includes(e)),r=!n.find(e=>!e.disabled&&e.getAttribute(`aria-disabled`)!==`true`)?.checked;n.forEach(e=>e.checked=r)}if(t.closest(`tbody th`)){let e=Array.from(t.closest(`tr`).querySelectorAll(`td input[type="checkbox"]`)).filter(e=>!this.disabled?.includes(e)),n=!e.find(e=>!e.disabled&&e.getAttribute(`aria-disabled`)!==`true`)?.checked;e.forEach(e=>e.checked=n)}this.update()}}connect(){this.disabled=Array.from(this.element.querySelectorAll(`input:disabled`)),this.update(),this.element.addEventListener(`click`,this.click),this.element.addEventListener(`mouseover`,this.mouseover),this.element.addEventListener(`mouseout`,this.reset)}disconnect(){this.element.removeEventListener(`click`,this.click),this.element.removeEventListener(`mouseover`,this.mouseover),this.element.removeEventListener(`mouseout`,this.reset)}update(){this.element.querySelectorAll(`tbody td input[type="checkbox"]`).forEach(e=>{this.disabled?.includes(e)||(e.disabled=!1)}),this.element.querySelectorAll(`[data-implied-by], [data-depends-on]`).forEach(e=>{e.dataset.impliedBy?.trim().split(/\s+/).filter(Boolean).forEach(t=>{let n=document.querySelector(`[name="${t}"]:last-of-type`);n&&n.checked&&(e.checked=!0,e.disabled=!0)}),e.dataset.dependsOn?.trim().split(/\s+/).filter(Boolean).forEach(t=>{let n=document.querySelector(`[name="${t}"]:last-of-type`);n&&!n.checked&&(e.checked=!1,e.disabled=!0)})})}},Ho=t({default:()=>Uo}),Uo=class extends nt{constructor(...e){super(...e),this.locked=!1}static{this.targets=[`slug`,`mirror`]}updateName(e){let t=e.target;this.locked||(this.slugTarget.value=Se(t.value),this.mirror())}updateSlug(e){let t=e.target;this.mirror(),this.locked=!!t.value}mirror(){this.mirrorTargets.forEach(e=>{e.textContent=this.slugTarget.value})}},Wo=Symbol.for(`preact-signals`);function Go(){if(Jo>1)Jo--;else{for(var e,t=!1;qo!==void 0;){var n=qo;for(qo=void 0,Yo++;n!==void 0;){var r=n.o;if(n.o=void 0,n.f&=-3,!(8&n.f)&&es(n))try{n.c()}catch(n){t||=(e=n,!0)}n=r}}if(Yo=0,Jo--,t)throw e}}function Ko(e){if(Jo>0)return e();Jo++;try{return e()}finally{Go()}}var K=void 0;function q(e){var t=K;K=void 0;try{return e()}finally{K=t}}var qo=void 0,Jo=0,Yo=0,Xo=0;function Zo(e){if(K!==void 0){var t=e.n;if(t===void 0||t.t!==K)return t={i:0,S:e,p:K.s,n:void 0,t:K,e:void 0,x:void 0,r:t},K.s!==void 0&&(K.s.n=t),K.s=t,e.n=t,32&K.f&&e.S(t),t;if(t.i===-1)return t.i=0,t.n!==void 0&&(t.n.p=t.p,t.p!==void 0&&(t.p.n=t.n),t.p=K.s,t.n=void 0,K.s.n=t,K.s=t),t}}function Qo(e,t){this.v=e,this.i=0,this.n=void 0,this.t=void 0,this.W=t?.watched,this.Z=t?.unwatched,this.name=t?.name}Qo.prototype.brand=Wo,Qo.prototype.h=function(){return!0},Qo.prototype.S=function(e){var t=this,n=this.t;n!==e&&e.e===void 0&&(e.x=n,this.t=e,n===void 0?q(function(){var e;(e=t.W)==null||e.call(t)}):n.e=e)},Qo.prototype.U=function(e){var t=this;if(this.t!==void 0){var n=e.e,r=e.x;n!==void 0&&(n.x=r,e.e=void 0),r!==void 0&&(r.e=n,e.x=void 0),e===this.t&&(this.t=r,r===void 0&&q(function(){var e;(e=t.Z)==null||e.call(t)}))}},Qo.prototype.subscribe=function(e){var t=this;return ls(function(){var n=t.value,r=K;K=void 0;try{e(n)}finally{K=r}},{name:`sub`})},Qo.prototype.valueOf=function(){return this.value},Qo.prototype.toString=function(){return this.value+``},Qo.prototype.toJSON=function(){return this.value},Qo.prototype.peek=function(){var e=K;K=void 0;try{return this.value}finally{K=e}},Object.defineProperty(Qo.prototype,`value`,{get:function(){var e=Zo(this);return e!==void 0&&(e.i=this.i),this.v},set:function(e){if(e!==this.v){if(Yo>100)throw Error(`Cycle detected`);this.v=e,this.i++,Xo++,Jo++;try{for(var t=this.t;t!==void 0;t=t.x)t.t.N()}finally{Go()}}}});function $o(e,t){return new Qo(e,t)}function es(e){for(var t=e.s;t!==void 0;t=t.n)if(t.S.i!==t.i||!t.S.h()||t.S.i!==t.i)return!0;return!1}function ts(e){for(var t=e.s;t!==void 0;t=t.n){var n=t.S.n;if(n!==void 0&&(t.r=n),t.S.n=t,t.i=-1,t.n===void 0){e.s=t;break}}}function ns(e){for(var t=e.s,n=void 0;t!==void 0;){var r=t.p;t.i===-1?(t.S.U(t),r!==void 0&&(r.n=t.n),t.n!==void 0&&(t.n.p=r)):n=t,t.S.n=t.r,t.r!==void 0&&(t.r=void 0),t=r}e.s=n}function rs(e,t){Qo.call(this,void 0),this.x=e,this.s=void 0,this.g=Xo-1,this.f=4,this.W=t?.watched,this.Z=t?.unwatched,this.name=t?.name}rs.prototype=new Qo,rs.prototype.h=function(){if(this.f&=-3,1&this.f)return!1;if((36&this.f)==32||(this.f&=-5,this.g===Xo))return!0;if(this.g=Xo,this.f|=1,this.i>0&&!es(this))return this.f&=-2,!0;var e=K;try{ts(this),K=this;var t=this.x();(16&this.f||this.v!==t||this.i===0)&&(this.v=t,this.f&=-17,this.i++)}catch(e){this.v=e,this.f|=16,this.i++}return K=e,ns(this),this.f&=-2,!0},rs.prototype.S=function(e){if(this.t===void 0){this.f|=36;for(var t=this.s;t!==void 0;t=t.n)t.S.S(t)}Qo.prototype.S.call(this,e)},rs.prototype.U=function(e){if(this.t!==void 0&&(Qo.prototype.U.call(this,e),this.t===void 0)){this.f&=-33;for(var t=this.s;t!==void 0;t=t.n)t.S.U(t)}},rs.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var e=this.t;e!==void 0;e=e.x)e.t.N()}},Object.defineProperty(rs.prototype,`value`,{get:function(){if(1&this.f)throw Error(`Cycle detected`);var e=Zo(this);if(this.h(),e!==void 0&&(e.i=this.i),16&this.f)throw this.v;return this.v}});function is(e,t){return new rs(e,t)}function as(e){var t=e.u;if(e.u=void 0,typeof t==`function`){Jo++;var n=K;K=void 0;try{t()}catch(t){throw e.f&=-2,e.f|=8,os(e),t}finally{K=n,Go()}}}function os(e){for(var t=e.s;t!==void 0;t=t.n)t.S.U(t);e.x=void 0,e.s=void 0,as(e)}function ss(e){if(K!==this)throw Error(`Out-of-order effect`);ns(this),K=e,this.f&=-2,8&this.f&&os(this),Go()}function cs(e,t){this.x=e,this.u=void 0,this.s=void 0,this.o=void 0,this.f=32,this.name=t?.name}cs.prototype.c=function(){var e=this.S();try{if(8&this.f||this.x===void 0)return;var t=this.x();typeof t==`function`&&(this.u=t)}finally{e()}},cs.prototype.S=function(){if(1&this.f)throw Error(`Cycle detected`);this.f|=1,this.f&=-9,as(this),ts(this),Jo++;var e=K;return K=this,ss.bind(this,e)},cs.prototype.N=function(){2&this.f||(this.f|=2,this.o=qo,qo=this)},cs.prototype.d=function(){this.f|=8,1&this.f||os(this)},cs.prototype.dispose=function(){this.d()};function ls(e,t){var n=new cs(e,t);try{n.c()}catch(e){throw n.d(),e}var r=n.d.bind(n);return r[Symbol.dispose]=r,r}var us=Object.create,ds=Object.defineProperty,fs=Object.defineProperties,ps=Object.getOwnPropertyDescriptor,ms=Object.getOwnPropertyDescriptors,hs=Object.getOwnPropertySymbols,gs=Object.prototype.hasOwnProperty,_s=Object.prototype.propertyIsEnumerable,vs=(e,t)=>(t=Symbol[e])?t:Symbol.for(`Symbol.`+e),ys=e=>{throw TypeError(e)},bs=(e,t,n)=>t in e?ds(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,xs=(e,t)=>{for(var n in t||={})gs.call(t,n)&&bs(e,n,t[n]);if(hs)for(var n of hs(t))_s.call(t,n)&&bs(e,n,t[n]);return e},Ss=(e,t)=>fs(e,ms(t)),Cs=(e,t)=>ds(e,`name`,{value:t,configurable:!0}),ws=e=>[,,,us(e?.[vs(`metadata`)]??null)],Ts=[`class`,`method`,`getter`,`setter`,`accessor`,`field`,`value`,`get`,`set`],Es=e=>e!==void 0&&typeof e!=`function`?ys(`Function expected`):e,Ds=(e,t,n,r,i)=>({kind:Ts[e],name:t,metadata:r,addInitializer:e=>n._?ys(`Already initialized`):i.push(Es(e||null))}),Os=(e,t)=>bs(t,vs(`metadata`),e[3]),ks=(e,t,n,r)=>{for(var i=0,a=e[t>>1],o=a&&a.length;i{var o,s,c,l,u,d=t&7,f=!!(t&8),p=!!(t&16),m=d>3?e.length+1:d?f?1:2:0,h=Ts[d+5],g=d>3&&(e[m-1]=[]),_=e[m]||(e[m]=[]),v=d&&(!p&&!f&&(i=i.prototype),d<5&&(d>3||!p)&&ps(d<4?i:{get[n](){return Ns(this,a)},set[n](e){return Fs(this,a,e)}},n));d?p&&d<4&&Cs(a,(d>2?`set `:d>1?`get `:``)+n):Cs(i,n);for(var y=r.length-1;y>=0;y--)l=Ds(d,n,c={},e[3],_),d&&(l.static=f,l.private=p,u=l.access={has:p?e=>Ms(i,e):e=>n in e},d^3&&(u.get=p?e=>(d^1?Ns:Is)(e,i,d^4?a:v.get):e=>e[n]),d>2&&(u.set=p?(e,t)=>Fs(e,i,t,d^4?a:v.set):(e,t)=>e[n]=t)),s=(0,r[y])(d?d<4?p?a:v[h]:d>4?void 0:{get:v.get,set:v.set}:i,l),c._=1,d^4||s===void 0?Es(s)&&(d>4?g.unshift(s):d?p?a=s:v[h]=s:i=s):typeof s!=`object`||!s?ys(`Object expected`):(Es(o=s.get)&&(v.get=o),Es(o=s.set)&&(v.set=o),Es(o=s.init)&&g.unshift(o));return d||Os(e,i),v&&ds(i,n,v),p?d^4?a:v:i},js=(e,t,n)=>t.has(e)||ys(`Cannot `+n),Ms=(e,t)=>Object(t)===t?e.has(t):ys(`Cannot use the "in" operator on this value`),Ns=(e,t,n)=>(js(e,t,`read from private field`),n?n.call(e):t.get(e)),Ps=(e,t,n)=>t.has(e)?ys(`Cannot add the same private member more than once`):t instanceof WeakSet?t.add(e):t.set(e,n),Fs=(e,t,n,r)=>(js(e,t,`write to private field`),r?r.call(e,n):t.set(e,n),n),Is=(e,t,n)=>(js(e,t,`access private method`),n);function Ls(e,t){if(t){let n;return is(()=>{let r=e();return r&&n&&t(n,r)?n:(n=r,r)})}return is(e)}function Rs(e,t){if(Object.is(e,t))return!0;if(e===null||t===null)return!1;if(typeof e==`function`&&typeof t==`function`)return e===t;if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0}if(Array.isArray(e))return!Array.isArray(t)||e.length!==t.length?!1:!e.some((e,n)=>!Rs(e,t[n]));if(typeof e==`object`&&typeof t==`object`){let n=Object.keys(e),r=Object.keys(t);return n.length===r.length?!n.some(n=>!Rs(e[n],t[n])):!1}return!1}function J({get:e},t){return{init(e){return $o(e)},get(){return e.call(this).value},set(t){let n=e.call(this);n.peek()!==t&&(n.value=t)}}}function zs(e,t){let n=new WeakMap;return function(){let t=n.get(this);return t||(t=Ls(e.bind(this)),n.set(this,t)),t.value}}function Bs(e=!0){return function(t,n){n.addInitializer(function(){let t=n.kind===`field`||n.static?this:Object.getPrototypeOf(this),r=Object.getOwnPropertyDescriptor(t,n.name);r&&Object.defineProperty(t,n.name,Ss(xs({},r),{enumerable:e}))})}}function Vs(...e){let t=e.map(e=>ls(e));return()=>t.forEach(e=>e())}var Hs,Us,Ws,Gs,Ks,qs=[J],Js,Ys,Xs,Zs,Qs,$s,ec,tc,nc,rc,ic,ac,oc,sc;Ks=[J],Gs=[J],Ws=[Bs()],Us=[Bs()],Hs=[Bs()];var cc=class{constructor(e,t=Object.is){this.defaultValue=e,this.equals=t,ks(Js,5,this),Ps(this,$s),Ps(this,Ys,ks(Js,8,this)),ks(Js,11,this),Ps(this,ec,ks(Js,12,this)),ks(Js,15,this),Ps(this,ic,ks(Js,16,this)),ks(Js,19,this),this.reset=this.reset.bind(this),this.reset()}get current(){return Ns(this,$s,oc)}get initial(){return Ns(this,$s,Zs)}get previous(){return Ns(this,$s,nc)}set current(e){let t=q(()=>Ns(this,$s,oc));e&&t&&this.equals(t,e)||Ko(()=>{Ns(this,$s,Zs)||Fs(this,$s,e,Qs),Fs(this,$s,t,rc),Fs(this,$s,e,sc)})}reset(e=this.defaultValue){Ko(()=>{Fs(this,$s,void 0,rc),Fs(this,$s,e,Qs),Fs(this,$s,e,sc)})}};Js=ws(null),Ys=new WeakMap,$s=new WeakSet,ec=new WeakMap,ic=new WeakMap,Xs=As(Js,20,`#initial`,qs,$s,Ys),Zs=Xs.get,Qs=Xs.set,tc=As(Js,20,`#previous`,Ks,$s,ec),nc=tc.get,rc=tc.set,ac=As(Js,20,`#current`,Gs,$s,ic),oc=ac.get,sc=ac.set,As(Js,2,`current`,Ws,cc),As(Js,2,`initial`,Us,cc),As(Js,2,`previous`,Hs,cc),Os(Js,cc);function lc(e){return q(()=>{let t={};for(let n in e)t[n]=e[n];return t})}var uc,dc=class{constructor(){Ps(this,uc,new WeakMap)}get(e,t){return e?Ns(this,uc).get(e)?.get(t):void 0}set(e,t,n){if(e)return Ns(this,uc).has(e)||Ns(this,uc).set(e,new Map),Ns(this,uc).get(e)?.set(t,n)}clear(e){return e?Ns(this,uc).get(e)?.clear():void 0}};uc=new WeakMap;var fc=Object.create,pc=Object.defineProperty,mc=Object.getOwnPropertyDescriptor,hc=Object.getOwnPropertySymbols,gc=Object.prototype.hasOwnProperty,_c=Object.prototype.propertyIsEnumerable,vc=(e,t)=>(t=Symbol[e])?t:Symbol.for(`Symbol.`+e),yc=e=>{throw TypeError(e)},bc=Math.pow,xc=(e,t,n)=>t in e?pc(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Sc=(e,t)=>{for(var n in t||={})gc.call(t,n)&&xc(e,n,t[n]);if(hc)for(var n of hc(t))_c.call(t,n)&&xc(e,n,t[n]);return e},Cc=(e,t)=>pc(e,`name`,{value:t,configurable:!0}),wc=e=>[,,,fc(e?.[vc(`metadata`)]??null)],Tc=[`class`,`method`,`getter`,`setter`,`accessor`,`field`,`value`,`get`,`set`],Ec=e=>e!==void 0&&typeof e!=`function`?yc(`Function expected`):e,Dc=(e,t,n,r,i)=>({kind:Tc[e],name:t,metadata:r,addInitializer:e=>n._?yc(`Already initialized`):i.push(Ec(e||null))}),Oc=(e,t)=>xc(t,vc(`metadata`),e[3]),kc=(e,t,n,r)=>{for(var i=0,a=e[t>>1],o=a&&a.length;i{var o,s,c,l,u,d=t&7,f=!!(t&8),p=!!(t&16),m=d>3?e.length+1:d?f?1:2:0,h=Tc[d+5],g=d>3&&(e[m-1]=[]),_=e[m]||(e[m]=[]),v=d&&(!p&&!f&&(i=i.prototype),d<5&&(d>3||!p)&&mc(d<4?i:{get[n](){return Nc(this,a)},set[n](e){return Fc(this,a,e)}},n));d?p&&d<4&&Cc(a,(d>2?`set `:d>1?`get `:``)+n):Cc(i,n);for(var y=r.length-1;y>=0;y--)l=Dc(d,n,c={},e[3],_),d&&(l.static=f,l.private=p,u=l.access={has:p?e=>Mc(i,e):e=>n in e},d^3&&(u.get=p?e=>(d^1?Nc:Ic)(e,i,d^4?a:v.get):e=>e[n]),d>2&&(u.set=p?(e,t)=>Fc(e,i,t,d^4?a:v.set):(e,t)=>e[n]=t)),s=(0,r[y])(d?d<4?p?a:v[h]:d>4?void 0:{get:v.get,set:v.set}:i,l),c._=1,d^4||s===void 0?Ec(s)&&(d>4?g.unshift(s):d?p?a=s:v[h]=s:i=s):typeof s!=`object`||!s?yc(`Object expected`):(Ec(o=s.get)&&(v.get=o),Ec(o=s.set)&&(v.set=o),Ec(o=s.init)&&g.unshift(o));return d||Oc(e,i),v&&pc(i,n,v),p?d^4?a:v:i},jc=(e,t,n)=>t.has(e)||yc(`Cannot `+n),Mc=(e,t)=>Object(t)===t?e.has(t):yc(`Cannot use the "in" operator on this value`),Nc=(e,t,n)=>(jc(e,t,`read from private field`),n?n.call(e):t.get(e)),Pc=(e,t,n)=>t.has(e)?yc(`Cannot add the same private member more than once`):t instanceof WeakSet?t.add(e):t.set(e,n),Fc=(e,t,n,r)=>(jc(e,t,`write to private field`),r?r.call(e,n):t.set(e,n),n),Ic=(e,t,n)=>(jc(e,t,`access private method`),n),Lc=class e{constructor(e,t){this.x=e,this.y=t}static delta(t,n){return new e(t.x-n.x,t.y-n.y)}static distance(e,t){return Math.hypot(e.x-t.x,e.y-t.y)}static equals(e,t){return e.x===t.x&&e.y===t.y}static from({x:t,y:n}){return new e(t,n)}},Rc=class e{constructor(e,t,n,r){this.left=e,this.top=t,this.width=n,this.height=r,this.scale={x:1,y:1}}get inverseScale(){return{x:1/this.scale.x,y:1/this.scale.y}}translate(t,n){let{top:r,left:i,width:a,height:o,scale:s}=this,c=new e(i+t,r+n,a,o);return c.scale=Sc({},s),c}get boundingRectangle(){let{width:e,height:t,left:n,top:r,right:i,bottom:a}=this;return{width:e,height:t,left:n,top:r,right:i,bottom:a}}get center(){let{left:e,top:t,right:n,bottom:r}=this;return new Lc((e+n)/2,(t+r)/2)}get area(){let{width:e,height:t}=this;return e*t}equals(t){if(!(t instanceof e))return!1;let{left:n,top:r,width:i,height:a}=this;return n===t.left&&r===t.top&&i===t.width&&a===t.height}containsPoint(e){let{top:t,left:n,bottom:r,right:i}=this;return t<=e.y&&e.y<=r&&n<=e.x&&e.x<=i}intersectionArea(t){return t instanceof e?zc(this,t):0}intersectionRatio(e){let{area:t}=this,n=this.intersectionArea(e);return n/(e.area+t-n)}get bottom(){let{top:e,height:t}=this;return e+t}get right(){let{left:e,width:t}=this;return e+t}get aspectRatio(){let{width:e,height:t}=this;return e/t}get corners(){return[{x:this.left,y:this.top},{x:this.right,y:this.top},{x:this.left,y:this.bottom},{x:this.right,y:this.bottom}]}static from({top:t,left:n,width:r,height:i}){return new e(n,t,r,i)}static delta(e,t,n={x:`center`,y:`center`}){let r=(e,t)=>{let r=n[t],i=t===`x`?e.left:e.top,a=t===`x`?e.width:e.height;return r==`start`?i:r==`end`?i+a:i+a/2};return Lc.delta({x:r(e,`x`),y:r(e,`y`)},{x:r(t,`x`),y:r(t,`y`)})}static intersectionRatio(t,n){return e.from(t).intersectionRatio(e.from(n))}};function zc(e,t){let n=Math.max(t.top,e.top),r=Math.max(t.left,e.left),i=Math.min(t.left+t.width,e.left+e.width),a=Math.min(t.top+t.height,e.top+e.height),o=i-r,s=a-n;return rLc.equals(e,t)),kc(Wc,5,this),Pc(this,Uc,0),this.velocity={x:0,y:0}}get delta(){return Lc.delta(this.current,this.initial)}get direction(){let{current:e,previous:t}=this;if(!t)return null;let n={x:e.x-t.x,y:e.y-t.y};return!n.x&&!n.y?null:Math.abs(n.x)>Math.abs(n.y)?n.x>0?`right`:`left`:n.y>0?`down`:`up`}get current(){return super.current}set current(e){let{current:t}=this,n=Lc.from(e),r={x:n.x-t.x,y:n.y-t.y},i=Date.now(),a=i-Nc(this,Uc),o=e=>Math.round(e/a*100);Ko(()=>{Fc(this,Uc,i),this.velocity={x:o(r.x),y:o(r.y)},super.current=n})}reset(e=this.defaultValue){super.reset(Lc.from(e)),this.velocity={x:0,y:0}}};Wc=wc(Hc),Uc=new WeakMap,Ac(Wc,2,`delta`,Vc,Gc),Ac(Wc,2,`direction`,Bc,Gc),Oc(Wc,Gc);function Kc({x:e,y:t},n){let r=Math.abs(e),i=Math.abs(t);return typeof n==`number`?Math.sqrt(bc(r,2)+bc(i,2))>n:`x`in n&&`y`in n?r>n.x&&i>n.y:`x`in n?r>n.x:`y`in n?i>n.y:!1}var qc=(e=>(e.Horizontal=`x`,e.Vertical=`y`,e))(qc||{}),Jc=Object.values(qc),Yc=Object.create,Xc=Object.defineProperty,Zc=Object.defineProperties,Qc=Object.getOwnPropertyDescriptor,$c=Object.getOwnPropertyDescriptors,el=Object.getOwnPropertySymbols,tl=Object.prototype.hasOwnProperty,nl=Object.prototype.propertyIsEnumerable,rl=(e,t)=>(t=Symbol[e])?t:Symbol.for(`Symbol.`+e),il=e=>{throw TypeError(e)},al=(e,t,n)=>t in e?Xc(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,ol=(e,t)=>{for(var n in t||={})tl.call(t,n)&&al(e,n,t[n]);if(el)for(var n of el(t))nl.call(t,n)&&al(e,n,t[n]);return e},sl=(e,t)=>Zc(e,$c(t)),cl=(e,t)=>Xc(e,`name`,{value:t,configurable:!0}),ll=(e,t)=>{var n={};for(var r in e)tl.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&el)for(var r of el(e))t.indexOf(r)<0&&nl.call(e,r)&&(n[r]=e[r]);return n},ul=e=>[,,,Yc(e?.[rl(`metadata`)]??null)],dl=[`class`,`method`,`getter`,`setter`,`accessor`,`field`,`value`,`get`,`set`],fl=e=>e!==void 0&&typeof e!=`function`?il(`Function expected`):e,pl=(e,t,n,r,i)=>({kind:dl[e],name:t,metadata:r,addInitializer:e=>n._?il(`Already initialized`):i.push(fl(e||null))}),ml=(e,t)=>al(t,rl(`metadata`),e[3]),Y=(e,t,n,r)=>{for(var i=0,a=e[t>>1],o=a&&a.length;i{var o,s,c,l,u,d=t&7,f=!!(t&8),p=!!(t&16),m=d>3?e.length+1:d?f?1:2:0,h=dl[d+5],g=d>3&&(e[m-1]=[]),_=e[m]||(e[m]=[]),v=d&&(!p&&!f&&(i=i.prototype),d<5&&(d>3||!p)&&Qc(d<4?i:{get[n](){return _l(this,a)},set[n](e){return vl(this,a,e)}},n));d?p&&d<4&&cl(a,(d>2?`set `:d>1?`get `:``)+n):cl(i,n);for(var y=r.length-1;y>=0;y--)l=pl(d,n,c={},e[3],_),d&&(l.static=f,l.private=p,u=l.access={has:p?e=>gl(i,e):e=>n in e},d^3&&(u.get=p?e=>(d^1?_l:yl)(e,i,d^4?a:v.get):e=>e[n]),d>2&&(u.set=p?(e,t)=>vl(e,i,t,d^4?a:v.set):(e,t)=>e[n]=t)),s=(0,r[y])(d?d<4?p?a:v[h]:d>4?void 0:{get:v.get,set:v.set}:i,l),c._=1,d^4||s===void 0?fl(s)&&(d>4?g.unshift(s):d?p?a=s:v[h]=s:i=s):typeof s!=`object`||!s?il(`Object expected`):(fl(o=s.get)&&(v.get=o),fl(o=s.set)&&(v.set=o),fl(o=s.init)&&g.unshift(o));return d||ml(e,i),v&&Xc(i,n,v),p?d^4?a:v:i},hl=(e,t,n)=>t.has(e)||il(`Cannot `+n),gl=(e,t)=>Object(t)===t?e.has(t):il(`Cannot use the "in" operator on this value`),_l=(e,t,n)=>(hl(e,t,`read from private field`),n?n.call(e):t.get(e)),Z=(e,t,n)=>t.has(e)?il(`Cannot add the same private member more than once`):t instanceof WeakSet?t.add(e):t.set(e,n),vl=(e,t,n,r)=>(hl(e,t,`write to private field`),r?r.call(e,n):t.set(e,n),n),yl=(e,t,n)=>(hl(e,t,`access private method`),n);function bl(e,t){return{plugin:e,options:t}}function xl(e){return t=>bl(e,t)}function Sl(e){return typeof e==`function`?{plugin:e,options:void 0}:e}var Cl=[J],wl,Tl,El,Dl=class{constructor(e,t){this.manager=e,this.options=t,Z(this,Tl,Y(wl,8,this,!1)),Y(wl,11,this),Z(this,El,new Set)}enable(){this.disabled=!1}disable(){this.disabled=!0}isDisabled(){return q(()=>this.disabled)}configure(e){this.options=e}registerEffect(e){let t=ls(e.bind(this));return _l(this,El).add(t),t}destroy(){_l(this,El).forEach(e=>e())}static configure(e){return bl(this,e)}};wl=ul(null),Tl=new WeakMap,El=new WeakMap,X(wl,4,`disabled`,Cl,Dl,Tl),ml(wl,Dl);var Ol=class extends Dl{},kl,Al=class{constructor(e){this.manager=e,this.instances=new Map,Z(this,kl,[])}get values(){return Array.from(this.instances.values())}set values(e){let t=e.map(Sl).reduceRight((e,t)=>e.some(({plugin:e})=>e===t.plugin)?e:[t,...e],[]),n=t.map(({plugin:e})=>e);for(let e of _l(this,kl))if(!n.includes(e)){if(e.prototype instanceof Ol)continue;this.unregister(e)}for(let{plugin:e,options:n}of t)this.register(e,n);vl(this,kl,n)}get(e){return this.instances.get(e)}register(e,t){let n=this.instances.get(e);if(n)return n.options!==t&&(n.options=t),n;let r=new e(this.manager,t);return this.instances.set(e,r),r}unregister(e){let t=this.instances.get(e);t&&(t.destroy(),this.instances.delete(e))}destroy(){for(let e of this.instances.values())e.destroy();this.instances.clear()}};kl=new WeakMap;function jl(e,t){return e.priority===t.priority?e.type===t.type?t.value-e.value:t.type-e.type:t.priority-e.priority}var Ml=[],Nl,Pl,Fl=class extends Dl{constructor(e){super(e),Z(this,Nl),Z(this,Pl),this.computeCollisions=this.computeCollisions.bind(this),vl(this,Pl,$o(Ml)),this.destroy=Vs(()=>{let e=this.computeCollisions(),t=q(()=>this.manager.dragOperation.position.current);if(e!==Ml){let e=_l(this,Nl);if(vl(this,Nl,t),e&&t.x==e.x&&t.y==e.y)return}else vl(this,Nl,void 0);_l(this,Pl).value=e},()=>{let{dragOperation:e}=this.manager;e.status.initialized&&this.forceUpdate()})}forceUpdate(e=!0){q(()=>{e?_l(this,Pl).value=this.computeCollisions():vl(this,Nl,void 0)})}computeCollisions(e,t){let{registry:n,dragOperation:r}=this.manager,{source:i,shape:a,status:o}=r;if(!o.initialized||!a)return Ml;let s=[],c=[];for(let a of e??n.droppables){if(a.disabled||i&&!a.accepts(i))continue;let e=t??a.collisionDetector;if(!e)continue;c.push(a),a.shape;let n=q(()=>e({droppable:a,dragOperation:r}));n&&(a.collisionPriority!=null&&(n.priority=a.collisionPriority),s.push(n))}return c.length===0?Ml:(s.sort(jl),s)}get collisions(){return _l(this,Pl).value}};Nl=new WeakMap,Pl=new WeakMap;var Il=class{constructor(){this.registry=new Map}addEventListener(e,t){let{registry:n}=this,r=new Set(n.get(e));return r.add(t),n.set(e,r),()=>this.removeEventListener(e,t)}removeEventListener(e,t){let{registry:n}=this,r=new Set(n.get(e));r.delete(t),n.set(e,r)}dispatch(e,...t){let{registry:n}=this,r=n.get(e);if(r)for(let e of r)e(...t)}},Ll=class extends Il{constructor(e){super(),this.manager=e}dispatch(e,t){let n=[t,this.manager];super.dispatch(e,...n)}};function Rl(e,t=!0){let n=!1;return sl(ol({},e),{cancelable:t,get defaultPrevented(){return n},preventDefault(){t&&(n=!0)}})}var zl=class extends Ol{constructor(e){super(e);let t=(e,t)=>e.map(({id:e})=>e).join(``)===t.map(({id:e})=>e).join(``),n=[];this.destroy=Vs(()=>{let{dragOperation:t,collisionObserver:r}=e;t.status.initializing&&(n=[],r.enable())},()=>{let{collisionObserver:r,monitor:i}=e,{collisions:a}=r;if(r.isDisabled())return;let o=Rl({collisions:a});if(i.dispatch(`collision`,o),o.defaultPrevented||t(a,n))return;n=a;let[s]=a;q(()=>{s?.id!==e.dragOperation.target?.id&&(r.disable(),e.actions.setDropTarget(s?.id).then(()=>{r.enable()}))})})}},Bl=(e=>(e[e.Lowest=0]=`Lowest`,e[e.Low=1]=`Low`,e[e.Normal=2]=`Normal`,e[e.High=3]=`High`,e[e.Highest=4]=`Highest`,e))(Bl||{}),Vl=(e=>(e[e.Collision=0]=`Collision`,e[e.ShapeIntersection=1]=`ShapeIntersection`,e[e.PointerIntersection=2]=`PointerIntersection`,e))(Vl||{}),Hl,Ul,Wl,Gl,Kl,ql,Jl=[J],Yl,Xl;ql=[zs],Kl=[zs],Gl=[zs],Wl=[zs],Ul=[zs],Hl=[zs];var Zl=class{constructor(){Y(Yl,5,this),Z(this,Xl,Y(Yl,8,this,`idle`)),Y(Yl,11,this)}get current(){return this.value}get idle(){return this.value===`idle`}get initializing(){return this.value===`initializing`}get initialized(){let{value:e}=this;return e!==`idle`&&e!==`initialization-pending`}get dragging(){return this.value===`dragging`}get dropped(){return this.value===`dropped`}set(e){this.value=e}};Yl=ul(null),Xl=new WeakMap,X(Yl,4,`value`,Jl,Zl,Xl),X(Yl,2,`current`,ql,Zl),X(Yl,2,`idle`,Kl,Zl),X(Yl,2,`initializing`,Gl,Zl),X(Yl,2,`initialized`,Wl,Zl),X(Yl,2,`dragging`,Ul,Zl),X(Yl,2,`dropped`,Hl,Zl),ml(Yl,Zl);var Ql=class{constructor(e){this.manager=e}setDragSource(e){let{dragOperation:t}=this.manager;t.sourceIdentifier=typeof e==`string`||typeof e==`number`?e:e.id}setDropTarget(e){return q(()=>{let{dragOperation:t}=this.manager,n=e??null;if(t.targetIdentifier===n)return Promise.resolve(!1);t.targetIdentifier=n;let r=Rl({operation:t.snapshot()});return t.status.dragging&&this.manager.monitor.dispatch(`dragover`,r),this.manager.renderer.rendering.then(()=>r.defaultPrevented)})}start(e){return q(()=>{let{dragOperation:t}=this.manager;if(e.source!=null&&this.setDragSource(e.source),!t.source)throw Error(`Cannot start a drag operation without a drag source`);if(!t.status.idle)throw Error(`Cannot start a drag operation while another is active`);let n=new AbortController,{event:r,coordinates:i}=e;Ko(()=>{t.status.set(`initialization-pending`),t.shape=null,t.canceled=!1,t.activatorEvent=r??null,t.position.reset(i)});let a=Rl({operation:t.snapshot()});return this.manager.monitor.dispatch(`beforedragstart`,a),a.defaultPrevented?(t.reset(),n.abort(),n):(t.status.set(`initializing`),t.controller=n,this.manager.renderer.rendering.then(()=>{if(n.signal.aborted)return;let{status:e}=t;e.current===`initializing`&&(t.status.set(`dragging`),this.manager.monitor.dispatch(`dragstart`,{nativeEvent:r,operation:t.snapshot(),cancelable:!1}))}),n)})}move(e){return q(()=>{let{dragOperation:t}=this.manager,{status:n,controller:r}=t;if(!n.dragging||!r||r.signal.aborted)return;let i=Rl({nativeEvent:e.event,operation:t.snapshot(),by:e.by,to:e.to},e.cancelable??!0);(e.propagate??!0)&&this.manager.monitor.dispatch(`dragmove`,i),queueMicrotask(()=>{if(i.defaultPrevented)return;let n=e.to??{x:t.position.current.x+(e.by?.x??0),y:t.position.current.y+(e.by?.y??0)};t.position.current=n})})}stop(e={}){return q(()=>{let{dragOperation:t}=this.manager,{controller:n}=t;if(!n||n.signal.aborted)return;let r,i=()=>{let e={resume:()=>{},abort:()=>{}};return r=new Promise((t,n)=>{e.resume=t,e.abort=n}),e};n.abort();let a=()=>{this.manager.renderer.rendering.then(()=>{t.status.set(`dropped`);let e=q(()=>t.source?.status===`dropping`),r=()=>{t.controller===n&&(t.controller=void 0),t.reset()};if(e){let{source:e}=t,n=ls(()=>{e?.status===`idle`&&(n(),r())})}else this.manager.renderer.rendering.then(r)})};t.canceled=e.canceled??!1,this.manager.monitor.dispatch(`dragend`,{nativeEvent:e.event,operation:t.snapshot(),canceled:e.canceled??!1,suspend:i}),r?r.then(a).catch(()=>t.reset()):a()})}},$l,eu,tu,nu=[J],ru,iu,au,ou,su;tu=[J],eu=[J],$l=[J];var cu=class{constructor(e,t){Z(this,iu,Y(ru,8,this)),Y(ru,11,this),Z(this,au,Y(ru,12,this)),Y(ru,15,this),Z(this,ou,Y(ru,16,this)),Y(ru,19,this),Z(this,su,Y(ru,20,this)),Y(ru,23,this);let{effects:n,id:r,data:i={},disabled:a=!1,register:o=!0}=e,s=r;this.manager=t,this.id=r,this.data=i,this.disabled=a,this.effects=()=>[()=>{let{id:e,manager:t}=this;if(e!==s)return t?.registry.register(this),()=>t?.registry.unregister(this)},...n?.()??[]],this.register=this.register.bind(this),this.unregister=this.unregister.bind(this),this.destroy=this.destroy.bind(this),t&&o&&queueMicrotask(this.register)}register(){return this.manager?.registry.register(this)}unregister(){var e;(e=this.manager)==null||e.registry.unregister(this)}destroy(){var e;(e=this.manager)==null||e.registry.unregister(this)}};ru=ul(null),iu=new WeakMap,au=new WeakMap,ou=new WeakMap,su=new WeakMap,X(ru,4,`manager`,nu,cu,iu),X(ru,4,`id`,tu,cu,au),X(ru,4,`data`,eu,cu,ou),X(ru,4,`disabled`,$l,cu,su),ml(ru,cu);var lu=class{constructor(){this.map=$o(new Map),this.cleanupFunctions=new WeakMap,this.register=(e,t)=>{let n=this.map.peek(),r=n.get(e),i=()=>this.unregister(e,t);if(r===t)return i;r&&(this.cleanupFunctions.get(r)?.(),this.cleanupFunctions.delete(r));let a=new Map(n);a.set(e,t),this.map.value=a;let o=Vs(...t.effects());return this.cleanupFunctions.set(t,o),i},this.unregister=(e,t)=>{let n=this.map.peek();if(n.get(e)!==t)return;this.cleanupFunctions.get(t)?.(),this.cleanupFunctions.delete(t);let r=new Map(n);r.delete(e),this.map.value=r}}[Symbol.iterator](){return this.map.peek().values()}get value(){return this.map.value.values()}has(e){return this.map.value.has(e)}get(e){return this.map.value.get(e)}destroy(){for(let e of this)this.cleanupFunctions.get(e)?.(),e.destroy();this.map.value=new Map}},uu,du,fu,pu,mu,hu,gu,_u,vu,yu,bu,xu=class extends (gu=cu,hu=[J],mu=[J],pu=[J],fu=[zs],du=[zs],uu=[zs],gu){constructor(e,t){var n=e,{modifiers:r,type:i,sensors:a}=n,o=ll(n,[`modifiers`,`type`,`sensors`]);super(o,t),Y(_u,5,this),Z(this,vu,Y(_u,8,this)),Y(_u,11,this),Z(this,yu,Y(_u,12,this)),Y(_u,15,this),Z(this,bu,Y(_u,16,this,this.isDragSource?`dragging`:`idle`)),Y(_u,19,this),this.type=i,this.sensors=a,this.modifiers=r,this.alignment=o.alignment}get isDropping(){return this.status===`dropping`&&this.isDragSource}get isDragging(){return this.status===`dragging`&&this.isDragSource}get isDragSource(){return this.manager?.dragOperation.source?.id===this.id}};_u=ul(gu),vu=new WeakMap,yu=new WeakMap,bu=new WeakMap,X(_u,4,`type`,hu,xu,vu),X(_u,4,`modifiers`,mu,xu,yu),X(_u,4,`status`,pu,xu,bu),X(_u,2,`isDropping`,fu,xu),X(_u,2,`isDragging`,du,xu),X(_u,2,`isDragSource`,uu,xu),ml(_u,xu);var Su,Cu,wu,Tu,Eu,Du,Ou,ku,Au,ju,Mu,Nu,Pu,Fu=class extends (Ou=cu,Du=[J],Eu=[J],Tu=[J],wu=[J],Cu=[J],Su=[zs],Ou){constructor(e,t){var n=e,{accept:r,collisionDetector:i,collisionPriority:a,type:o}=n,s=ll(n,[`accept`,`collisionDetector`,`collisionPriority`,`type`]);super(s,t),Y(ku,5,this),Z(this,Au,Y(ku,8,this)),Y(ku,11,this),Z(this,ju,Y(ku,12,this)),Y(ku,15,this),Z(this,Mu,Y(ku,16,this)),Y(ku,19,this),Z(this,Nu,Y(ku,20,this)),Y(ku,23,this),Z(this,Pu,Y(ku,24,this)),Y(ku,27,this),this.accept=r,this.collisionDetector=i,this.collisionPriority=a,this.type=o}accepts(e){let{accept:t}=this;return t?typeof t==`function`?t(e):e.type?Array.isArray(t)?t.includes(e.type):e.type===t:!1:!0}get isDropTarget(){return this.manager?.dragOperation.target?.id===this.id}};ku=ul(Ou),Au=new WeakMap,ju=new WeakMap,Mu=new WeakMap,Nu=new WeakMap,Pu=new WeakMap,X(ku,4,`accept`,Du,Fu,Au),X(ku,4,`type`,Eu,Fu,ju),X(ku,4,`collisionDetector`,Tu,Fu,Mu),X(ku,4,`collisionPriority`,wu,Fu,Nu),X(ku,4,`shape`,Cu,Fu,Pu),X(ku,2,`isDropTarget`,Su,Fu),ml(ku,Fu);var Iu=class extends Dl{constructor(e,t){super(e,t),this.manager=e,this.options=t}},Lu=class extends AbortController{constructor(e,t){super(),this.constraints=e,this.onActivate=t,this.activated=!1;for(let t of e??[])t.controller=this}onEvent(e){if(!this.activated)if(this.constraints?.length)for(let t of this.constraints)t.onEvent(e);else this.activate(e)}activate(e){this.activated||(this.activated=!0,this.onActivate(e))}abort(e){this.activated=!1,super.abort(e)}},Ru,zu=class{constructor(e){this.options=e,Z(this,Ru)}set controller(e){vl(this,Ru,e),e.signal.addEventListener(`abort`,()=>this.abort())}activate(e){var t;(t=_l(this,Ru))==null||t.activate(e)}};Ru=new WeakMap;var Bu=class extends Dl{constructor(e,t){super(e,t),this.manager=e,this.options=t}apply(e){return e.transform}},Vu=class{constructor(e){this.draggables=new lu,this.droppables=new lu,this.plugins=new Al(e),this.sensors=new Al(e),this.modifiers=new Al(e)}register(e,t){if(e instanceof xu)return this.draggables.register(e.id,e);if(e instanceof Fu)return this.droppables.register(e.id,e);if(e.prototype instanceof Bu)return this.modifiers.register(e,t);if(e.prototype instanceof Iu)return this.sensors.register(e,t);if(e.prototype instanceof Dl)return this.plugins.register(e,t);throw Error(`Invalid instance type`)}unregister(e){if(e instanceof cu)return e instanceof xu?this.draggables.unregister(e.id,e):e instanceof Fu?this.droppables.unregister(e.id,e):()=>{};if(e.prototype instanceof Bu)return this.modifiers.unregister(e);if(e.prototype instanceof Iu)return this.sensors.unregister(e);if(e.prototype instanceof Dl)return this.plugins.unregister(e);throw Error(`Invalid instance type`)}destroy(){this.draggables.destroy(),this.droppables.destroy(),this.plugins.destroy(),this.sensors.destroy(),this.modifiers.destroy()}},Hu,Uu,Wu,Gu,Ku,qu,Ju,Yu,Xu=[zs],Zu,Qu,$u,ed,td,nd,rd,id,ad,od;Yu=[J],Ju=[J],qu=[J],Ku=[J],Gu=[J],Wu=[zs],Uu=[zs],Hu=[zs];var sd=class{constructor(e){Y(ed,5,this),Z(this,Zu),Z(this,Qu),Z(this,$u,new cc(void 0,(e,t)=>e&&t?e.equals(t):e===t)),this.status=new Zl,Z(this,td,Y(ed,8,this,!1)),Y(ed,11,this),Z(this,nd,Y(ed,12,this,null)),Y(ed,15,this),Z(this,rd,Y(ed,16,this,null)),Y(ed,19,this),Z(this,id,Y(ed,20,this,null)),Y(ed,23,this),Z(this,ad,Y(ed,24,this,[])),Y(ed,27,this),this.position=new Gc({x:0,y:0}),Z(this,od,{x:0,y:0}),vl(this,Zu,e)}get shape(){let{current:e,initial:t,previous:n}=_l(this,$u);return!e||!t?null:{current:e,initial:t,previous:n}}set shape(e){e?_l(this,$u).current=e:_l(this,$u).reset()}get source(){let e=this.sourceIdentifier;if(e==null)return null;let t=_l(this,Zu).registry.draggables.get(e);return t&&vl(this,Qu,t),t??_l(this,Qu)??null}get target(){let e=this.targetIdentifier;return e==null?null:_l(this,Zu).registry.droppables.get(e)??null}get transform(){let{x:e,y:t}=this.position.delta,n={x:e,y:t};for(let e of this.modifiers)n=e.apply(sl(ol({},this.snapshot()),{transform:n}));return vl(this,od,n),n}snapshot(){return q(()=>({source:this.source,target:this.target,activatorEvent:this.activatorEvent,transform:_l(this,od),shape:this.shape?lc(this.shape):null,position:lc(this.position),status:lc(this.status),canceled:this.canceled}))}reset(){Ko(()=>{this.status.set(`idle`),this.sourceIdentifier=null,this.targetIdentifier=null,_l(this,$u).reset(),this.position.reset({x:0,y:0}),vl(this,od,{x:0,y:0}),this.modifiers=[]})}};ed=ul(null),Zu=new WeakMap,Qu=new WeakMap,$u=new WeakMap,td=new WeakMap,nd=new WeakMap,rd=new WeakMap,id=new WeakMap,ad=new WeakMap,od=new WeakMap,X(ed,2,`shape`,Xu,sd),X(ed,4,`canceled`,Yu,sd,td),X(ed,4,`activatorEvent`,Ju,sd,nd),X(ed,4,`sourceIdentifier`,qu,sd,rd),X(ed,4,`targetIdentifier`,Ku,sd,id),X(ed,4,`modifiers`,Gu,sd,ad),X(ed,2,`source`,Wu,sd),X(ed,2,`target`,Uu,sd),X(ed,2,`transform`,Hu,sd),ml(ed,sd);var cd={get rendering(){return Promise.resolve()}},ld=class{constructor(e){this.destroy=()=>{this.dragOperation.status.idle||this.actions.stop({canceled:!0}),this.dragOperation.modifiers.forEach(e=>e.destroy()),this.registry.destroy(),this.collisionObserver.destroy()};let{plugins:t=[],sensors:n=[],modifiers:r=[],renderer:i=cd}=e??{},a=new Ll(this);this.registry=new Vu(this),this.monitor=a,this.renderer=i,this.actions=new Ql(this),this.dragOperation=new sd(this),this.collisionObserver=new Fl(this),this.plugins=[zl,...t],this.modifiers=r,this.sensors=n;let{destroy:o}=this,s=Vs(()=>{let e=q(()=>this.dragOperation.modifiers),t=this.modifiers;e!==t&&e.forEach(e=>e.destroy()),this.dragOperation.modifiers=(this.dragOperation.source?.modifiers)?.map(e=>{let{plugin:t,options:n}=Sl(e);return new t(this,n)})??t});this.destroy=()=>{s(),o()}}get plugins(){return this.registry.plugins.values}set plugins(e){this.registry.plugins.values=e}get modifiers(){return this.registry.modifiers.values}set modifiers(e){this.registry.modifiers.values=e}get sensors(){return this.registry.sensors.values}set sensors(e){this.registry.sensors.values=e}},ud=e=>{throw TypeError(e)},dd=(e,t,n)=>t.has(e)||ud(`Cannot `+n),Q=(e,t,n)=>(dd(e,t,`read from private field`),t.get(e)),fd=(e,t,n)=>t.has(e)?ud(`Cannot add the same private member more than once`):t instanceof WeakSet?t.add(e):t.set(e,n),pd=(e,t,n,r)=>(dd(e,t,`write to private field`),t.set(e,n),n),md=(e,t,n)=>(dd(e,t,`access private method`),n);function hd(e){return e?e instanceof KeyframeEffect?!0:`getKeyframes`in e&&typeof e.getKeyframes==`function`:!1}function gd(e,t){let n=e.getAnimations();if(n.length>0)for(let e of n){if(e.playState!==`running`)continue;let{effect:n}=e,r=(hd(n)?n.getKeyframes():[]).filter(t);if(r.length>0)return[r[r.length-1],e]}return null}function _d(e){let{width:t,height:n,top:r,left:i,bottom:a,right:o}=e.getBoundingClientRect();return{width:t,height:n,top:r,left:i,bottom:a,right:o}}function vd(e){let t=Object.prototype.toString.call(e);return t===`[object Window]`||t===`[object global]`}function yd(e){return`nodeType`in e}function bd(e){return e?vd(e)?e:yd(e)?`defaultView`in e?e.defaultView??window:e.ownerDocument?.defaultView??window:window:window}function xd(e){let{Document:t}=bd(e);return e instanceof t||`nodeType`in e&&e.nodeType===Node.DOCUMENT_NODE}function Sd(e){return!e||vd(e)?!1:e instanceof bd(e).HTMLElement||`namespaceURI`in e&&typeof e.namespaceURI==`string`&&e.namespaceURI.endsWith(`html`)}function Cd(e){return e instanceof bd(e).SVGElement||`namespaceURI`in e&&typeof e.namespaceURI==`string`&&e.namespaceURI.endsWith(`svg`)}function wd(e){return e?vd(e)?e.document:yd(e)?xd(e)?e:Sd(e)||Cd(e)?e.ownerDocument:document:document:document}function Td(e){let{documentElement:t}=wd(e),n=t.clientWidth,r=t.clientHeight;return{top:0,left:0,right:n,bottom:r,width:n,height:r}}function Ed(e,t){if(Dd(e)&&e.open===!1)return!1;let{overflow:n,overflowX:r,overflowY:i}=getComputedStyle(e);return n===`visible`&&r===`visible`&&i===`visible`}function Dd(e){return e.tagName===`DETAILS`}function Od(e,t=e.getBoundingClientRect(),n=0){let r=t,{ownerDocument:i}=e,a=i.defaultView??window,o=e.parentElement;for(;o&&o!==i.documentElement;){if(!Ed(o)){let e=o.getBoundingClientRect(),t=n*(e.bottom-e.top),i=n*(e.right-e.left),a=n*(e.bottom-e.top),s=n*(e.right-e.left);r={top:Math.max(r.top,e.top-t),right:Math.min(r.right,e.right+i),bottom:Math.min(r.bottom,e.bottom+a),left:Math.max(r.left,e.left-s),width:0,height:0},r.width=r.right-r.left,r.height=r.bottom-r.top}o=o.parentElement}let s=a.innerWidth,c=a.innerHeight,l=n*c,u=n*s;return r={top:Math.max(r.top,0-l),right:Math.min(r.right,s+u),bottom:Math.min(r.bottom,c+l),left:Math.max(r.left,0-u),width:0,height:0},r.width=r.right-r.left,r.height=r.bottom-r.top,r.width<0&&(r.width=0),r.height<0&&(r.height=0),r}function kd(e){return{x:e.clientX,y:e.clientY}}var Ad=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function jd(e=document,t=new Set){if(t.has(e))return[];t.add(e);let n=[e];for(let r of Array.from(e.querySelectorAll(`iframe, frame`)))try{let e=r.contentDocument;e&&!t.has(e)&&n.push(...jd(e,t))}catch{}try{let r=e.defaultView;if(r&&r!==window.top){let i=r.parent;i&&i.document&&i.document!==e&&n.push(...jd(i.document,t))}}catch{}return n}function Md(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function Nd(e){let t=`input, textarea, select, canvas, [contenteditable]`,n=e.cloneNode(!0),r=Array.from(e.querySelectorAll(t));return Array.from(n.querySelectorAll(t)).forEach((e,t)=>{let n=r[t];Pd(e)&&Pd(n)&&(e.type!==`file`&&(e.value=n.value),e.type===`radio`&&e.name&&(e.name=`Cloned__${e.name}`)),Fd(e)&&Fd(n)&&n.width>0&&n.height>0&&e.getContext(`2d`)?.drawImage(n,0,0)}),n}function Pd(e){return`value`in e}function Fd(e){return e.tagName===`CANVAS`}function Id(e,{x:t,y:n}){let r=e.elementFromPoint(t,n);if(Ld(r)){let{contentDocument:e}=r;if(e){let{left:i,top:a}=r.getBoundingClientRect();return Id(e,{x:t-i,y:n-a})}}return r}function Ld(e){return e?.tagName===`IFRAME`}var Rd=new WeakMap;function zd(e){return!!e.closest(` input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), a[href], [contenteditable]:not([contenteditable="false"]) `)}var Bd=class{constructor(){this.entries=new Set,this.clear=()=>{for(let e of this.entries){let[t,{type:n,listener:r,options:i}]=e;t.removeEventListener(n,r,i)}this.entries.clear()}}bind(e,t){let n=Array.isArray(e)?e:[e],r=Array.isArray(t)?t:[t],i=[];for(let e of n)for(let t of r){let{type:n,listener:r,options:a}=t,o=[e,t];e.addEventListener(n,r,a),this.entries.add(o),i.push(o)}return function(){for(let[e,{type:t,listener:n,options:r}]of i)e.removeEventListener(t,n,r)}}};function Vd(e){let t=e?.ownerDocument.defaultView;if(t&&t.self!==t.parent)return t.frameElement}function Hd(e){let t=new Set,n=Vd(e);for(;n;)t.add(n),n=Vd(n);return t}function Ud(e,t){let n=setTimeout(e,t);return()=>clearTimeout(n)}function Wd(e,t){let n=()=>performance.now(),r,i;return function(...a){let o=this;i?(r?.(),r=Ud(()=>{e.apply(o,a),i=n()},t-(n()-i))):(e.apply(o,a),i=n())}}function Gd(e,t){return e===t?!0:!e||!t?!1:e.top==t.top&&e.left==t.left&&e.right==t.right&&e.bottom==t.bottom}function Kd(e,t=e.getBoundingClientRect()){let{width:n,height:r}=Od(e,t);return n>0&&r>0}var qd=Ad?ResizeObserver:class{observe(){}unobserve(){}disconnect(){}},Jd,Yd=class extends qd{constructor(e){super(t=>{if(!Q(this,Jd)){pd(this,Jd,!0);return}e(t,this)}),fd(this,Jd,!1)}};Jd=new WeakMap;var Xd=Array.from({length:100},(e,t)=>t/100),Zd=75,Qd,$d,ef,tf,nf,rf,af,of,sf,cf,lf,uf=class{constructor(e,t,n={debug:!1,skipInitial:!1}){this.element=e,this.callback=t,fd(this,sf),this.disconnect=()=>{var e,t,n;pd(this,af,!0),(e=Q(this,ef))==null||e.disconnect(),(t=Q(this,tf))==null||t.disconnect(),Q(this,nf).disconnect(),(n=Q(this,rf))==null||n.remove()},fd(this,Qd,!0),fd(this,$d),fd(this,ef),fd(this,tf),fd(this,nf),fd(this,rf),fd(this,af,!1),fd(this,of,Wd(()=>{var e;let{element:t}=this;if((e=Q(this,tf))==null||e.disconnect(),Q(this,af)||!Q(this,Qd)||!t.isConnected)return;let n=t.ownerDocument??document,{innerHeight:r,innerWidth:i}=n.defaultView??window,a=t.getBoundingClientRect(),{top:o,left:s,bottom:c,right:l}=Od(t,a),u=-Math.floor(o),d=-Math.floor(s),f=`${u}px ${-Math.floor(i-l)}px ${-Math.floor(r-c)}px ${d}px`;this.boundingClientRect=a,pd(this,tf,new IntersectionObserver(e=>{let[n]=e,{intersectionRect:r}=n;(n.intersectionRatio===1?Rc.intersectionRatio(r,Od(t)):n.intersectionRatio)!==1&&Q(this,of).call(this)},{threshold:Xd,rootMargin:f,root:n})),Q(this,tf).observe(t),md(this,sf,cf).call(this)},Zd)),this.boundingClientRect=e.getBoundingClientRect(),pd(this,Qd,Kd(e,this.boundingClientRect));let r=!0;this.callback=e=>{r&&(r=!1,n.skipInitial)||t(e)};let i=e.ownerDocument;n?.debug&&(pd(this,rf,document.createElement(`div`)),Q(this,rf).style.background=`rgba(0,0,0,0.15)`,Q(this,rf).style.position=`fixed`,Q(this,rf).style.pointerEvents=`none`,i.body.appendChild(Q(this,rf))),pd(this,nf,new IntersectionObserver(t=>{var n,r;let{boundingClientRect:i,isIntersecting:a}=t[t.length-1],{width:o,height:s}=i,c=Q(this,Qd);pd(this,Qd,a),!(!o&&!s)&&(c&&!a?((n=Q(this,tf))==null||n.disconnect(),this.callback(null),(r=Q(this,ef))==null||r.disconnect(),pd(this,ef,void 0),Q(this,rf)&&(Q(this,rf).style.visibility=`hidden`)):Q(this,of).call(this),a&&!Q(this,ef)&&(pd(this,ef,new Yd(Q(this,of))),Q(this,ef).observe(e)))},{threshold:Xd,root:i})),Q(this,Qd)&&!n.skipInitial&&this.callback(this.boundingClientRect),Q(this,nf).observe(e)}};Qd=new WeakMap,$d=new WeakMap,ef=new WeakMap,tf=new WeakMap,nf=new WeakMap,rf=new WeakMap,af=new WeakMap,of=new WeakMap,sf=new WeakSet,cf=function(){Q(this,af)||(md(this,sf,lf).call(this),!Gd(this.boundingClientRect,Q(this,$d))&&(this.callback(this.boundingClientRect),pd(this,$d,this.boundingClientRect)))},lf=function(){if(Q(this,rf)){let{top:e,left:t,width:n,height:r}=Od(this.element);Q(this,rf).style.overflow=`hidden`,Q(this,rf).style.visibility=`visible`,Q(this,rf).style.top=`${Math.floor(e)}px`,Q(this,rf).style.left=`${Math.floor(t)}px`,Q(this,rf).style.width=`${Math.floor(n)}px`,Q(this,rf).style.height=`${Math.floor(r)}px`}};var df=new WeakMap,ff=new WeakMap;function pf(e,t){let n=df.get(e);return n||={disconnect:new uf(e,t=>{let n=df.get(e);n&&n.callbacks.forEach(e=>e(t))},{skipInitial:!0}).disconnect,callbacks:new Set},n.callbacks.add(t),df.set(e,n),()=>{n.callbacks.delete(t),n.callbacks.size===0&&(df.delete(e),n.disconnect())}}function mf(e,t){let n=new Set;for(let r of e){let e=pf(r,t);n.add(e)}return()=>n.forEach(e=>e())}function hf(e,t){let n=e.ownerDocument;if(!ff.has(n)){let e=new AbortController,t=new Set;document.addEventListener(`scroll`,e=>t.forEach(t=>t(e)),{capture:!0,passive:!0,signal:e.signal}),ff.set(n,{disconnect:()=>e.abort(),listeners:t})}let{listeners:r,disconnect:i}=ff.get(n)??{};return!r||!i?()=>{}:(r.add(t),()=>{r.delete(t),r.size===0&&(i(),ff.delete(n))})}var gf,_f,vf,yf,bf=class{constructor(e,t,n){this.callback=t,fd(this,gf),fd(this,_f,!1),fd(this,vf),fd(this,yf,Wd(e=>{if(!Q(this,_f)&&e.target&&`contains`in e.target&&typeof e.target.contains==`function`){for(let t of Q(this,vf))if(e.target.contains(t)){this.callback(Q(this,gf).boundingClientRect);break}}},Zd));let r=Hd(e),i=mf(r,t),a=hf(e,Q(this,yf));pd(this,vf,r),pd(this,gf,new uf(e,t,n)),this.disconnect=()=>{Q(this,_f)||(pd(this,_f,!0),i(),a(),Q(this,gf).disconnect())}}};gf=new WeakMap,_f=new WeakMap,vf=new WeakMap,yf=new WeakMap;function xf(e){return`showPopover`in e&&`hidePopover`in e&&typeof e.showPopover==`function`&&typeof e.hidePopover==`function`}function Sf(e){try{xf(e)&&e.isConnected&&e.hasAttribute(`popover`)&&!e.matches(`:popover-open`)&&e.showPopover()}catch{}}function Cf(e){return!Ad||!e?!1:e===wd(e).scrollingElement}function wf(e){let t=bd(e),n=Cf(e)?Td(e):_d(e),r=Cf(e)?{height:t.innerHeight,width:t.innerWidth}:{height:e.clientHeight,width:e.clientWidth},i={current:{x:e.scrollLeft,y:e.scrollTop},max:{x:e.scrollWidth-r.width,y:e.scrollHeight-r.height}};return{rect:n,position:i,isTop:i.current.y<=0,isLeft:i.current.x<=0,isBottom:i.current.y>=i.max.y,isRight:i.current.x>=i.max.x}}function Tf(e,t){let{isTop:n,isBottom:r,isLeft:i,isRight:a,position:o}=wf(e),{x:s,y:c}=t??{x:0,y:0},l=!n&&o.current.y+c>0,u=!r&&o.current.y+c0,f=!a&&o.current.x+s{let{tasks:e,resolvers:t}=this;this.pending=!1,this.tasks=new Set,this.resolvers=new Set;for(let t of e)t();for(let e of t)e()}}schedule(e){return this.tasks.add(e),this.pending||(this.pending=!0,this.scheduler(this.flush)),new Promise(e=>this.resolvers.add(e))}},Df=new Ef(e=>{typeof requestAnimationFrame==`function`?requestAnimationFrame(e):e()}),Of=new Ef(e=>setTimeout(e,50)),kf=new Map,Af=kf.clear.bind(kf);function jf(e,t=!1){if(!t)return Mf(e);let n=kf.get(e);return n||(n=Mf(e),kf.set(e,n),Of.schedule(Af),n)}function Mf(e){return bd(e).getComputedStyle(e)}function Nf(e,t=jf(e,!0)){return t.position===`fixed`||t.position===`sticky`}function Pf(e,t=jf(e,!0)){let n=/(auto|scroll|overlay)/;return[`overflow`,`overflowX`,`overflowY`].some(e=>{let r=t[e];return typeof r==`string`?n.test(r):!1})}var Ff={excludeElement:!0};function If(e,t=Ff){let{limit:n,excludeElement:r}=t,i=new Set;function a(t){if(n!=null&&i.size>=n||!t)return i;if(xd(t)&&t.scrollingElement!=null&&!i.has(t.scrollingElement))return i.add(t.scrollingElement),i;if(!Sd(t))return Cd(t)?a(t.parentElement):i;if(i.has(t))return i;let o=jf(t,!0);if(r&&t===e||Pf(t,o)&&i.add(t),Nf(t,o)){let{scrollingElement:e}=t.ownerDocument;return e&&i.add(e),i}return a(t.parentNode)}return e?a(e):i}function Lf(e){let[t]=If(e,{limit:1});return t??null}function Rf(e,t=window.frameElement){let n={x:0,y:0,scaleX:1,scaleY:1};if(!e)return n;let r=Vd(e);for(;r;){if(r===t)return n;let e=_d(r),{x:i,y:a}=zf(r,e);n.x+=e.left,n.y+=e.top,n.scaleX*=i,n.scaleY*=a,r=Vd(r)}return n}function zf(e,t=_d(e)){let n=Math.round(t.width),r=Math.round(t.height);if(Sd(e))return{x:n/e.offsetWidth,y:r/e.offsetHeight};let i=jf(e,!0);return{x:(parseFloat(i.width)||n)/n,y:(parseFloat(i.height)||r)/r}}function Bf(e){if(e===`none`)return null;let t=e.split(` `),n=parseFloat(t[0]),r=parseFloat(t[1]);return isNaN(n)&&isNaN(r)?null:{x:isNaN(n)?r:n,y:isNaN(r)?n:r}}function Vf(e){if(e===`none`)return null;let[t,n,r=`0`]=e.split(` `),i={x:parseFloat(t),y:parseFloat(n),z:parseInt(r,10)};return isNaN(i.x)&&isNaN(i.y)?null:{x:isNaN(i.x)?0:i.x,y:isNaN(i.y)?0:i.y,z:isNaN(i.z)?0:i.z}}function Hf(e){let{scale:t,transform:n,translate:r}=e,i=Bf(t),a=Vf(r),o=Uf(n);if(!o&&!i&&!a)return null;let s={x:i?.x??1,y:i?.y??1},c={x:a?.x??0,y:a?.y??0},l={x:o?.x??0,y:o?.y??0,scaleX:o?.scaleX??1,scaleY:o?.scaleY??1};return{x:c.x+l.x,y:c.y+l.y,z:a?.z??0,scaleX:s.x*l.scaleX,scaleY:s.y*l.scaleY}}function Uf(e){if(e.startsWith(`matrix3d(`)){let t=e.slice(9,-1).split(/, /);return{x:+t[12],y:+t[13],scaleX:+t[0],scaleY:+t[5]}}else if(e.startsWith(`matrix(`)){let t=e.slice(7,-1).split(/, /);return{x:+t[4],y:+t[5],scaleX:+t[0],scaleY:+t[3]}}return null}var Wf=(e=>(e[e.Idle=0]=`Idle`,e[e.Forward=1]=`Forward`,e[e.Reverse=-1]=`Reverse`,e))(Wf||{}),Gf={x:.2,y:.2},Kf={x:10,y:10};function qf(e,t,n,r=25,i=Gf,a=Kf){let{x:o,y:s}=t,{rect:c,isTop:l,isBottom:u,isLeft:d,isRight:f}=wf(e),p=Rf(e),m=Hf(jf(e,!0)),h=m===null?!1:m?.scaleX<0,g=m===null?!1:m?.scaleY<0,_=new Rc(c.left*p.scaleX+p.x,c.top*p.scaleY+p.y,c.width*p.scaleX,c.height*p.scaleY),v={x:0,y:0},y={x:0,y:0},b={height:_.height*i.y,width:_.width*i.x};return(!l||g&&!u)&&s<=_.top+b.height&&n?.y!==1&&o>=_.left-a.x&&o<=_.right+a.x?(v.y=g?1:-1,y.y=r*Math.abs((_.top+b.height-s)/b.height)):(!u||g&&!l)&&s>=_.bottom-b.height&&n?.y!==-1&&o>=_.left-a.x&&o<=_.right+a.x&&(v.y=g?-1:1,y.y=r*Math.abs((_.bottom-b.height-s)/b.height)),(!f||h&&!d)&&o>=_.right-b.width&&n?.x!==-1&&s>=_.top-a.y&&s<=_.bottom+a.y?(v.x=h?-1:1,y.x=r*Math.abs((_.right-b.width-o)/b.width)):(!d||h&&!f)&&o<=_.left+b.width&&n?.x!==1&&s>=_.top-a.y&&s<=_.bottom+a.y&&(v.x=h?1:-1,y.x=r*Math.abs((_.left+b.width-o)/b.width)),{direction:v,speed:y}}function Jf(e){return`scrollIntoViewIfNeeded`in e&&typeof e.scrollIntoViewIfNeeded==`function`}function Yf(e,t=!1){if(Jf(e)){e.scrollIntoViewIfNeeded(t);return}if(!Sd(e))return e.scrollIntoView();var n=Lf(e);if(!Sd(n))return;let r=jf(n,!0),i=parseInt(r.getPropertyValue(`border-top-width`)),a=parseInt(r.getPropertyValue(`border-left-width`)),o=e.offsetTop-n.offsetTopn.scrollTop+n.clientHeight,c=e.offsetLeft-n.offsetLeftn.scrollLeft+n.clientWidth,u=o&&!s;(o||s)&&t&&(n.scrollTop=e.offsetTop-n.offsetTop-n.clientHeight/2-i+e.clientHeight/2),(c||l)&&t&&(n.scrollLeft=e.offsetLeft-n.offsetLeft-n.clientWidth/2-a+e.clientWidth/2),(o||s||c||l)&&!t&&e.scrollIntoView(u)}function Xf(e,t,n){let{scaleX:r,scaleY:i,x:a,y:o}=t,s=e.left+a+(1-r)*parseFloat(n),c=e.top+o+(1-i)*parseFloat(n.slice(n.indexOf(` `)+1)),l=r?e.width*r:e.width,u=i?e.height*i:e.height;return{width:l,height:u,top:c,right:s+l,bottom:c+u,left:s}}function Zf(e,t,n){let{scaleX:r,scaleY:i,x:a,y:o}=t,s=e.left-a-(1-r)*parseFloat(n),c=e.top-o-(1-i)*parseFloat(n.slice(n.indexOf(` `)+1)),l=r?e.width/r:e.width,u=i?e.height/i:e.height;return{width:l,height:u,top:c,right:s+l,bottom:c+u,left:s}}function Qf({element:e,keyframes:t,options:n}){return e.animate(t,n).finished}function $f(e,t=jf(e).translate,n=!0){if(n){let t=gd(e,e=>`translate`in e);if(t){let{translate:e=``}=t[0];if(typeof e==`string`){let t=Vf(e);if(t)return t}}}if(t){let e=Vf(t);if(e)return e}return{x:0,y:0,z:0}}var ep=new Ef(e=>setTimeout(e,0)),tp=new Map,np=tp.clear.bind(tp);function rp(e){let t=e.ownerDocument,n=tp.get(t);if(n)return n;n=t.getAnimations(),tp.set(t,n),ep.schedule(np);let r=n.filter(t=>hd(t.effect)&&t.effect.target===e);return tp.set(e,r),n}function ip(e,t){let n=rp(e).filter(e=>{if(hd(e.effect)){let{target:n}=e.effect;if((n&&t.isValidTarget?.call(t,n))??!0)return e.effect.getKeyframes().some(e=>{for(let n of t.properties)if(e[n])return!0})}}).map(e=>{let{effect:t,currentTime:n}=e,r=t?.getComputedTiming().duration;if(!(e.pending||e.playState===`finished`)&&typeof r==`number`&&typeof n==`number`&&n{e.currentTime=n}});if(n.length>0)return()=>n.forEach(e=>e?.())}var ap=class extends Rc{constructor(e,t={}){let{frameTransform:n=Rf(e),ignoreTransforms:r,getBoundingClientRect:i=_d}=t,a=ip(e,{properties:[`transform`,`translate`,`scale`,`width`,`height`],isValidTarget:t=>(t!==e||Md())&&t.contains(e)}),o=i(e),{top:s,left:c,width:l,height:u}=o,d,f=jf(e),p=Hf(f),m={x:p?.scaleX??1,y:p?.scaleY??1},h=op(e,f);a?.(),p&&(d=Zf(o,p,f.transformOrigin),(r||h)&&(s=d.top,c=d.left,l=d.width,u=d.height));let g={width:d?.width??l,height:d?.height??u};if(h&&!r&&d){let e=Xf(d,h,f.transformOrigin);s=e.top,c=e.left,l=e.width,u=e.height,m.x=h.scaleX,m.y=h.scaleY}n&&(r||(c*=n.scaleX,l*=n.scaleX,s*=n.scaleY,u*=n.scaleY),c+=n.x,s+=n.y),super(c,s,l,u),this.scale=m,this.intrinsicWidth=g.width,this.intrinsicHeight=g.height}};function op(e,t){let n=e.getAnimations(),r=null;if(!n.length)return null;for(let e of n){if(e.playState!==`running`)continue;let n=hd(e.effect)?e.effect.getKeyframes():[],i=n[n.length-1];if(!i)continue;let{transform:a,translate:o,scale:s}=i;if(a||o||s){let e=Hf({transform:typeof a==`string`&&a?a:t.transform,translate:typeof o==`string`&&o?o:t.translate,scale:typeof s==`string`&&s?s:t.scale});e&&(r=r?{x:r.x+e.x,y:r.y+e.y,z:r.z??e.z,scaleX:r.scaleX*e.scaleX,scaleY:r.scaleY*e.scaleY}:e)}}return r}function sp(e){return`style`in e&&typeof e.style==`object`&&e.style!==null&&`setProperty`in e.style&&`removeProperty`in e.style&&typeof e.style.setProperty==`function`&&typeof e.style.removeProperty==`function`}var cp=class{constructor(e){this.element=e,this.initial=new Map}set(e,t=``){let{element:n}=this;if(sp(n))for(let[r,i]of Object.entries(e)){let e=`${t}${r}`;this.initial.has(e)||this.initial.set(e,n.style.getPropertyValue(e)),n.style.setProperty(e,typeof i==`string`?i:`${i}px`)}}remove(e,t=``){let{element:n}=this;if(sp(n))for(let r of e){let e=`${t}${r}`;n.style.removeProperty(e)}}reset(){let{element:e}=this;if(sp(e)){for(let[t,n]of this.initial)e.style.setProperty(t,n);e.getAttribute(`style`)===``&&e.removeAttribute(`style`)}}};function lp(e){return e?e instanceof bd(e).Element||yd(e)&&e.nodeType===Node.ELEMENT_NODE:!1}function up(e){if(!e)return!1;let{KeyboardEvent:t}=bd(e.target);return e instanceof t}function dp(e){if(!e)return!1;let{PointerEvent:t}=bd(e.target);return e instanceof t}function fp(e){if(!lp(e))return!1;let{tagName:t}=e;return t===`INPUT`||t===`TEXTAREA`||pp(e)}function pp(e){return e.hasAttribute(`contenteditable`)&&e.getAttribute(`contenteditable`)!==`false`}var mp={};function hp(e){let t=mp[e]==null?0:mp[e]+1;return mp[e]=t,`${e}-${t}`}var gp=({dragOperation:e,droppable:t})=>{let n=e.position.current;if(!n)return null;let{id:r}=t;return t.shape&&t.shape.containsPoint(n)?{id:r,value:1/Lc.distance(t.shape.center,n),type:Vl.PointerIntersection,priority:Bl.High}:null},_p=({dragOperation:e,droppable:t})=>{let{shape:n}=e;if(!t.shape||!n?.current)return null;let r=n.current.intersectionArea(t.shape);if(r){let{position:i}=e,a=Lc.distance(t.shape.center,i.current),o=r/(n.current.area+t.shape.area-r)/a;return{id:t.id,value:o,type:Vl.ShapeIntersection,priority:Bl.Normal}}return null},vp=e=>gp(e)??_p(e),yp=e=>{let{dragOperation:t,droppable:n}=e,{shape:r,position:i}=t;if(!n.shape)return null;let a=r?Rc.from(r.current.boundingRectangle).corners:void 0,o=Rc.from(n.shape.boundingRectangle).corners.reduce((e,t,n)=>e+Lc.distance(Lc.from(t),a?.[n]??i.current),0)/4;return{id:n.id,value:1/o,type:Vl.Collision,priority:Bl.Normal}},bp=Object.create,xp=Object.defineProperty,Sp=Object.defineProperties,Cp=Object.getOwnPropertyDescriptor,wp=Object.getOwnPropertyDescriptors,Tp=Object.getOwnPropertySymbols,Ep=Object.prototype.hasOwnProperty,Dp=Object.prototype.propertyIsEnumerable,Op=(e,t)=>(t=Symbol[e])?t:Symbol.for(`Symbol.`+e),kp=e=>{throw TypeError(e)},Ap=(e,t,n)=>t in e?xp(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,jp=(e,t)=>{for(var n in t||={})Ep.call(t,n)&&Ap(e,n,t[n]);if(Tp)for(var n of Tp(t))Dp.call(t,n)&&Ap(e,n,t[n]);return e},Mp=(e,t)=>Sp(e,wp(t)),Np=(e,t)=>xp(e,`name`,{value:t,configurable:!0}),Pp=(e,t)=>{var n={};for(var r in e)Ep.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Tp)for(var r of Tp(e))t.indexOf(r)<0&&Dp.call(e,r)&&(n[r]=e[r]);return n},Fp=e=>[,,,bp(e?.[Op(`metadata`)]??null)],Ip=[`class`,`method`,`getter`,`setter`,`accessor`,`field`,`value`,`get`,`set`],Lp=e=>e!==void 0&&typeof e!=`function`?kp(`Function expected`):e,Rp=(e,t,n,r,i)=>({kind:Ip[e],name:t,metadata:r,addInitializer:e=>n._?kp(`Already initialized`):i.push(Lp(e||null))}),zp=(e,t)=>Ap(t,Op(`metadata`),e[3]),Bp=(e,t,n,r)=>{for(var i=0,a=e[t>>1],o=a&&a.length;i{var o,s,c,l,u,d=t&7,f=!!(t&8),p=!!(t&16),m=d>3?e.length+1:d?f?1:2:0,h=Ip[d+5],g=d>3&&(e[m-1]=[]),_=e[m]||(e[m]=[]),v=d&&(!p&&!f&&(i=i.prototype),d<5&&(d>3||!p)&&Cp(d<4?i:{get[n](){return $(this,a)},set[n](e){return Gp(this,a,e)}},n));d?p&&d<4&&Np(a,(d>2?`set `:d>1?`get `:``)+n):Np(i,n);for(var y=r.length-1;y>=0;y--)l=Rp(d,n,c={},e[3],_),d&&(l.static=f,l.private=p,u=l.access={has:p?e=>Up(i,e):e=>n in e},d^3&&(u.get=p?e=>(d^1?$:Kp)(e,i,d^4?a:v.get):e=>e[n]),d>2&&(u.set=p?(e,t)=>Gp(e,i,t,d^4?a:v.set):(e,t)=>e[n]=t)),s=(0,r[y])(d?d<4?p?a:v[h]:d>4?void 0:{get:v.get,set:v.set}:i,l),c._=1,d^4||s===void 0?Lp(s)&&(d>4?g.unshift(s):d?p?a=s:v[h]=s:i=s):typeof s!=`object`||!s?kp(`Object expected`):(Lp(o=s.get)&&(v.get=o),Lp(o=s.set)&&(v.set=o),Lp(o=s.init)&&g.unshift(o));return d||zp(e,i),v&&xp(i,n,v),p?d^4?a:v:i},Hp=(e,t,n)=>t.has(e)||kp(`Cannot `+n),Up=(e,t)=>Object(t)===t?e.has(t):kp(`Cannot use the "in" operator on this value`),$=(e,t,n)=>(Hp(e,t,`read from private field`),n?n.call(e):t.get(e)),Wp=(e,t,n)=>t.has(e)?kp(`Cannot add the same private member more than once`):t instanceof WeakSet?t.add(e):t.set(e,n),Gp=(e,t,n,r)=>(Hp(e,t,`write to private field`),r?r.call(e,n):t.set(e,n),n),Kp=(e,t,n)=>(Hp(e,t,`access private method`),n),qp={role:`button`,roleDescription:`draggable`},Jp=`dnd-kit-description`,Yp=`dnd-kit-announcement`,Xp={draggable:`To pick up a draggable item, press the space bar. While dragging, use the arrow keys to move the item in a given direction. Press space again to drop the item in its new position, or press escape to cancel.`},Zp={dragstart({operation:{source:e}}){if(e)return`Picked up draggable item ${e.id}.`},dragover({operation:{source:e,target:t}}){if(!(!e||e.id===t?.id))return t?`Draggable item ${e.id} was moved over droppable target ${t.id}.`:`Draggable item ${e.id} is no longer over a droppable target.`},dragend({operation:{source:e,target:t},canceled:n}){if(e)return n?`Dragging was cancelled. Draggable item ${e.id} was dropped.`:t?`Draggable item ${e.id} was dropped over droppable target ${t.id}`:`Draggable item ${e.id} was dropped.`}};function Qp(e){let t=e.tagName.toLowerCase();return[`input`,`select`,`textarea`,`a`,`button`].includes(t)}function $p(e,t){let n=document.createElement(`div`);return n.id=e,n.style.setProperty(`display`,`none`),n.textContent=t,n}function em(e){let t=document.createElement(`div`);return t.id=e,t.setAttribute(`role`,`status`),t.setAttribute(`aria-live`,`polite`),t.setAttribute(`aria-atomic`,`true`),t.style.setProperty(`position`,`fixed`),t.style.setProperty(`width`,`1px`),t.style.setProperty(`height`,`1px`),t.style.setProperty(`margin`,`-1px`),t.style.setProperty(`border`,`0`),t.style.setProperty(`padding`,`0`),t.style.setProperty(`overflow`,`hidden`),t.style.setProperty(`clip`,`rect(0 0 0 0)`),t.style.setProperty(`clip-path`,`inset(100%)`),t.style.setProperty(`white-space`,`nowrap`),t}var tm=[`dragover`,`dragmove`],nm=class extends Dl{constructor(e,t){super(e);let{id:n,idPrefix:{description:r=Jp,announcement:i=Yp}={},announcements:a=Zp,screenReaderInstructions:o=Xp,debounce:s=500}=t??{},c=n?`${r}-${n}`:hp(r),l=n?`${i}-${n}`:hp(i),u,d,f,p,m=(e=p)=>{!f||!e||f?.nodeValue!==e&&(f.nodeValue=e)},h=()=>Df.schedule(m),g=rm(h,s),_=Object.entries(a).map(([e,t])=>this.manager.monitor.addEventListener(e,(n,r)=>{let i=f;if(!i)return;let a=t?.(n,r);a&&i.nodeValue!==a&&(p=a,tm.includes(e)?g():(h(),g.cancel()))})),v=()=>{let e=[];u?.isConnected||(u=$p(c,o.draggable),e.push(u)),d?.isConnected||(d=em(l),f=document.createTextNode(``),d.appendChild(f),e.push(d)),e.length>0&&document.body.append(...e)},y=new Set;function b(){for(let e of y)e()}this.registerEffect(()=>{y.clear();for(let e of this.manager.registry.draggables.value){let t=e.handle??e.element;if(t){(!u||!d)&&y.add(v),(!Qp(t)||Md())&&!t.hasAttribute(`tabindex`)&&y.add(()=>t.setAttribute(`tabindex`,`0`)),!t.hasAttribute(`role`)&&t.tagName.toLowerCase()!==`button`&&y.add(()=>t.setAttribute(`role`,qp.role)),t.hasAttribute(`aria-roledescription`)||y.add(()=>t.setAttribute(`aria-roledescription`,qp.roleDescription)),t.hasAttribute(`aria-describedby`)||y.add(()=>t.setAttribute(`aria-describedby`,c));for(let n of[`aria-pressed`,`aria-grabbed`]){let r=String(e.isDragging);t.getAttribute(n)!==r&&y.add(()=>t.setAttribute(n,r))}let n=String(e.disabled);t.getAttribute(`aria-disabled`)!==n&&y.add(()=>t.setAttribute(`aria-disabled`,n))}}y.size>0&&Df.schedule(b)}),this.destroy=()=>{super.destroy(),u?.remove(),d?.remove(),_.forEach(e=>e())}}};function rm(e,t){let n,r=()=>{clearTimeout(n),n=setTimeout(e,t)};return r.cancel=()=>clearTimeout(n),r}var im=class extends Dl{constructor(e,t){super(e,t),this.manager=e;let n=Ls(()=>wd(this.manager.dragOperation.source?.element));this.destroy=ls(()=>{let{dragOperation:e}=this.manager,{cursor:t=`grabbing`,nonce:r}=this.options??{};if(e.status.initialized){let e=n.value,i=e.createElement(`style`);return r&&i.setAttribute(`nonce`,r),i.textContent=`* { cursor: ${t} !important; }`,e.head.appendChild(i),()=>i.remove()}})}},am=`data-dnd-`,om=`${am}dropping`,sm=`--dnd-`,cm=`${am}dragging`,lm=`${am}placeholder`,um=[cm,lm,`popover`,`aria-pressed`,`aria-grabbing`],dm=[`view-transition-name`],fm=` :root [${cm}] { position: fixed !important; pointer-events: none !important; touch-action: none; z-index: calc(infinity); will-change: translate; top: var(${sm}top, 0px) !important; left: var(${sm}left, 0px) !important; right: unset !important; bottom: unset !important; width: var(${sm}width, auto); max-width: var(${sm}width, auto); height: var(${sm}height, auto); max-height: var(${sm}height, auto); transition: var(${sm}transition) !important; } :root [${lm}] { transition: none; } :root [${lm}='hidden'] { visibility: hidden; } [${cm}] * { pointer-events: none !important; } [${cm}]:not([${om}]) { translate: var(${sm}translate) !important; } [${cm}][style*='${sm}scale'] { scale: var(${sm}scale) !important; transform-origin: var(${sm}transform-origin) !important; } @layer { :where([${cm}][popover]) { overflow: visible; background: unset; border: unset; margin: unset; padding: unset; color: inherit; &:is(input, button) { border: revert; background: revert; } } } [${cm}]::backdrop, [${am}overlay]:not([${cm}]) { display: none; visibility: hidden; } `.replace(/\n+/g,` `).replace(/\s+/g,` `).trim();function pm(e,t=`hidden`){return q(()=>{let{element:n,manager:r}=e;if(!n||!r)return;let i=mm(n,r.registry.droppables),a=[],o=Nd(n),{remove:s}=o;return hm(i,o,a),gm(o,t),o.remove=()=>{a.forEach(e=>e()),s.call(o)},o})}function mm(e,t){let n=new Map;for(let r of t)if(r.element&&(e===r.element||e.contains(r.element))){let e=`${am}${hp(`dom-id`)}`;r.element.setAttribute(e,``),n.set(r,e)}return n}function hm(e,t,n){for(let[r,i]of e){if(!r.element)continue;let e=`[${i}]`,a=t.matches(e)?t:t.querySelector(e);if(r.element.removeAttribute(i),!a)continue;let o=r.element;r.proxy=a,a.removeAttribute(i),Rd.set(o,a),n.push(()=>{Rd.delete(o),r.proxy=void 0})}}function gm(e,t=`hidden`){e.setAttribute(`inert`,`true`),e.setAttribute(`tab-index`,`-1`),e.setAttribute(`aria-hidden`,`true`),e.setAttribute(lm,t)}function _m(e,t){return e===t?!0:Vd(e)===Vd(t)}function vm(e){let{target:t}=e;`newState`in e&&e.newState===`closed`&&lp(t)&&t.hasAttribute(`popover`)&&requestAnimationFrame(()=>Sf(t))}function ym(e){return e.tagName===`TR`}var bm=new Map,xm,Sm,Cm,wm,Tm,Em,Dm,Om=class extends (Sm=Dl,xm=[J],Sm){constructor(e,t){super(e,t),Wp(this,Tm),Wp(this,wm,Bp(Cm,8,this)),Bp(Cm,11,this),this.state={initial:{},current:{}},this.registerEffect(Kp(this,Tm,Dm)),this.registerEffect(Kp(this,Tm,Em))}destroy(){super.destroy();for(let[e,t]of bm.entries())t.instances.has(this)&&(t.instances.delete(this),t.instances.size===0&&(t.cleanup(),bm.delete(e)))}};Cm=Fp(Sm),wm=new WeakMap,Tm=new WeakSet,Em=function(){let{state:e,manager:t,options:n}=this,{dragOperation:r}=t,{position:i,source:a,status:o}=r;if(o.idle){e.current={},e.initial={};return}if(!a)return;let{element:s,feedback:c}=a;if(!s||c===`none`||!o.initialized||o.initializing)return;let{initial:l}=e,u=this.overlay??s,d=Rf(u),f=Rf(s),p=!_m(s,u),m=new ap(s,{frameTransform:p?f:null,ignoreTransforms:!p}),h={x:f.scaleX/d.scaleX,y:f.scaleY/d.scaleY},{width:g,height:_,top:v,left:y}=m;p&&(g/=h.x,_/=h.y);let b,x,S=new cp(u),{transition:C,translate:w,boxSizing:T,paddingBlockStart:E,paddingBlockEnd:D,paddingInlineStart:O,paddingInlineEnd:ee,borderInlineStartWidth:te,borderInlineEndWidth:k,borderBlockStartWidth:ne,borderBlockEndWidth:re}=jf(s),ie=c===`clone`,ae=T===`content-box`,oe=ae?parseInt(O)+parseInt(ee)+parseInt(te)+parseInt(k):0,se=ae?parseInt(E)+parseInt(D)+parseInt(ne)+parseInt(re):0,A=c!==`move`&&!this.overlay?pm(a,ie?`clone`:`hidden`):null,j=q(()=>up(t.dragOperation.activatorEvent));if(w!==`none`){let e=Vf(w);e&&!l.translate&&(l.translate=e)}if(!l.transformOrigin){let e=q(()=>i.current);l.transformOrigin={x:(e.x-y*d.scaleX-d.x)/(g*d.scaleX),y:(e.y-v*d.scaleY-d.y)/(_*d.scaleY)}}let{transformOrigin:M}=l,ce=v*d.scaleY+d.y,N=y*d.scaleX+d.x;if(!l.coordinates&&(l.coordinates={x:N,y:ce},h.x!==1||h.y!==1)){let{scaleX:e,scaleY:t}=f,{x:n,y:r}=M;l.coordinates.x+=(g*e-g)*n,l.coordinates.y+=(_*t-_)*r}l.dimensions||={width:g,height:_},l.frameTransform||=d;let P={x:l.coordinates.x-N,y:l.coordinates.y-ce},le={width:(l.dimensions.width*l.frameTransform.scaleX-g*d.scaleX)*M.x,height:(l.dimensions.height*l.frameTransform.scaleY-_*d.scaleY)*M.y},ue={x:P.x/d.scaleX+le.width,y:P.y/d.scaleY+le.height},de={left:y+ue.x,top:v+ue.y};u.setAttribute(cm,`true`);let fe=q(()=>r.transform),pe=l.translate??{x:0,y:0},me=`${fe.x*d.scaleX+pe.x}px ${fe.y*d.scaleY+pe.y}px 0`,he=C?`${C}, translate 0ms linear`:``;S.set({width:g-oe,height:_-se,top:de.top,left:de.left,translate:me,transition:he,scale:p?`${h.x} ${h.y}`:``,"transform-origin":`${M.x*100}% ${M.y*100}%`},sm),A&&(s.insertAdjacentElement(`afterend`,A),n?.rootElement&&(typeof n.rootElement==`function`?n.rootElement(a):n.rootElement).appendChild(s)),xf(u)&&(u.hasAttribute(`popover`)||u.setAttribute(`popover`,`manual`),Sf(u),u.addEventListener(`beforetoggle`,vm));let ge=new ResizeObserver(()=>{if(!A)return;let e=new ap(A,{frameTransform:d,ignoreTransforms:!0}),t=M??{x:1,y:1},n=(g-e.width)*t.x+ue.x,i=(_-e.height)*t.y+ue.y;if(S.set({width:e.width-oe,height:e.height-se,top:v+i,left:y+n},sm),b?.takeRecords(),ym(s)&&ym(A)){let e=Array.from(s.cells),t=Array.from(A.cells);for(let[n,r]of e.entries()){let e=t[n];r.style.width=`${e.offsetWidth}px`}}r.shape=new ap(u)}),_e=new ap(u);q(()=>r.shape=_e);let ve=bd(u),ye=e=>{this.manager.actions.stop({event:e})};j&&ve.addEventListener(`resize`,ye),q(()=>a.status)===`idle`&&requestAnimationFrame(()=>a.status=`dragging`),A&&(ge.observe(A),b=new MutationObserver(e=>{let t=!1;for(let n of e){if(n.target!==s){t=!0;continue}if(n.type!==`attributes`)continue;let e=n.attributeName;if(e.startsWith(`aria-`)||um.includes(e))continue;let r=s.getAttribute(e);if(e===`style`){if(sp(s)&&sp(A)){let e=s.style;for(let t of Array.from(A.style))e.getPropertyValue(t)===``&&A.style.removeProperty(t);for(let t of Array.from(e)){if(dm.includes(t)||t.startsWith(sm))continue;let n=e.getPropertyValue(t);A.style.setProperty(t,n)}}}else r===null?A.removeAttribute(e):A.setAttribute(e,r)}t&&ie&&(A.innerHTML=s.innerHTML)}),b.observe(s,{attributes:!0,subtree:!0,childList:!0}),x=new MutationObserver(e=>{for(let t of e)if(t.addedNodes.length!==0)for(let e of Array.from(t.addedNodes)){if(e.contains(s)&&s.nextElementSibling!==A){s.insertAdjacentElement(`afterend`,A),Sf(u);return}if(e.contains(A)&&A.previousElementSibling!==s){A.insertAdjacentElement(`beforebegin`,s),Sf(u);return}}}),x.observe(s.ownerDocument.body,{childList:!0,subtree:!0}));let be=t.dragOperation.source?.id,xe=()=>{if(!j||be==null)return;let e=t.registry.draggables.get(be),n=e?.handle??e?.element;Sd(n)&&n.focus()},Se=()=>{b?.disconnect(),x?.disconnect(),ge.disconnect(),ve.removeEventListener(`resize`,ye),xf(u)&&(u.removeEventListener(`beforetoggle`,vm),u.removeAttribute(`popover`)),u.removeAttribute(cm),S.reset(),a.status=`idle`;let t=e.current.translate!=null;A&&(t||A.parentElement!==u.parentElement)&&u.isConnected&&A.replaceWith(u),A?.remove()},Ce=Vs(()=>{let{transform:t,status:n}=r;if(!(!t.x&&!t.y&&!e.current.translate)&&n.dragging){let n=l.translate??{x:0,y:0},i={x:t.x/d.scaleX+n.x,y:t.y/d.scaleY+n.y},a=e.current.translate,o=q(()=>r.modifiers),s=q(()=>r.shape?.current),c=j?`250ms cubic-bezier(0.25, 1, 0.5, 1)`:`0ms linear`;if(S.set({transition:`${C}, translate ${c}`,translate:`${i.x}px ${i.y}px 0`},sm),b?.takeRecords(),s&&s!==_e&&a&&!o.length){let e=Lc.delta(i,a);r.shape=Rc.from(s.boundingRectangle).translate(e.x*d.scaleX,e.y*d.scaleY)}else r.shape=new ap(u);e.current.translate=i}},function(){if(r.status.dropped){this.dispose(),a.status=`dropping`;let n=e.current.translate,r=n!=null;if(!n&&s!==u&&(n={x:0,y:0}),!n){Se();return}t.renderer.rendering.then(()=>{{Sf(u);let[,e]=gd(u,e=>`translate`in e)??[];e?.pause();let t=A??s,i={frameTransform:_m(u,t)?null:void 0},o=new ap(u,i),c=Vf(jf(u).translate)??n,l=new ap(t,i),d=Rc.delta(o,l,a.alignment),f={x:c.x-d.x,y:c.y-d.y},p=Math.round(o.intrinsicHeight)===Math.round(l.intrinsicHeight)?{}:{minHeight:[`${o.intrinsicHeight}px`,`${l.intrinsicHeight}px`],maxHeight:[`${o.intrinsicHeight}px`,`${l.intrinsicHeight}px`]},m=Math.round(o.intrinsicWidth)===Math.round(l.intrinsicWidth)?{}:{minWidth:[`${o.intrinsicWidth}px`,`${l.intrinsicWidth}px`],maxWidth:[`${o.intrinsicWidth}px`,`${l.intrinsicWidth}px`]};S.set({transition:C},sm),u.setAttribute(om,``),b?.takeRecords(),Qf({element:u,keyframes:Mp(jp(jp({},p),m),{translate:[`${c.x}px ${c.y}px 0`,`${f.x}px ${f.y}px 0`]}),options:{duration:r||u!==s?250:0,easing:`ease`}}).then(()=>{u.removeAttribute(om),e?.finish(),Se(),requestAnimationFrame(xe)})}})}});return()=>{Se(),Ce()}},Dm=function(){let{status:e,source:t,target:n}=this.manager.dragOperation,{nonce:r}=this.options??{};if(e.initializing){let e=wd(t?.element??null),i=wd(n?.element??null),a=new Set([e,i]);for(let e of a){let t=bm.get(e);if(!t){let n=document.createElement(`style`);n.textContent=fm,r&&n.setAttribute(`nonce`,r),e.head.prepend(n);let i=new MutationObserver(t=>{for(let r of t)if(r.type===`childList`){let t=Array.from(r.removedNodes);t.length>0&&t.includes(n)&&e.head.prepend(n)}});i.observe(e.head,{childList:!0}),t={cleanup:()=>{i.disconnect(),n.remove()},instances:new Set},bm.set(e,t)}t.instances.add(this)}}},Vp(Cm,4,`overlay`,xm,Om,wm),zp(Cm,Om),Om.configure=xl(Om);var km=Om,Am=!0,jm=!1,Mm,Nm,Pm,Fm=(Pm=[J],Wf.Forward),Im,Lm,Rm;Nm=(Mm=[J],Wf.Reverse);var zm=class{constructor(){Wp(this,Lm,Bp(Im,8,this,Am)),Bp(Im,11,this),Wp(this,Rm,Bp(Im,12,this,Am)),Bp(Im,15,this)}isLocked(e){return e===Wf.Idle?!1:e==null?this[Wf.Forward]===Am&&this[Wf.Reverse]===Am:this[e]===Am}unlock(e){e!==Wf.Idle&&(this[e]=jm)}};Im=Fp(null),Lm=new WeakMap,Rm=new WeakMap,Vp(Im,4,Fm,Pm,zm,Lm),Vp(Im,4,Nm,Mm,zm,Rm),zp(Im,zm);var Bm=[Wf.Forward,Wf.Reverse],Vm=class{constructor(){this.x=new zm,this.y=new zm}isLocked(){return this.x.isLocked()&&this.y.isLocked()}},Hm=class extends Dl{constructor(e){super(e);let t=$o(new Vm),n=null;this.signal=t,ls(()=>{let{status:r}=e.dragOperation;if(!r.initialized){n=null,t.value=new Vm;return}let{delta:i}=e.dragOperation.position;if(n){let e={x:Um(i.x,n.x),y:Um(i.y,n.y)},r=t.peek();Ko(()=>{for(let t of Jc)for(let n of Bm)e[t]===n&&r[t].unlock(n);t.value=r})}n=i})}get current(){return this.signal.peek()}};function Um(e,t){return Math.sign(e-t)}var Wm,Gm,Km,qm,Jm,Ym,Xm=class extends (Gm=Ol,Wm=[J],Gm){constructor(e){super(e),Wp(this,qm,Bp(Km,8,this,!1)),Bp(Km,11,this),Wp(this,Jm),Wp(this,Ym,()=>{if(!$(this,Jm))return;let{element:e,by:t}=$(this,Jm);t.y&&(e.scrollTop+=t.y),t.x&&(e.scrollLeft+=t.x)}),this.scroll=e=>{if(this.disabled)return!1;let t=this.getScrollableElements();if(!t)return Gp(this,Jm,void 0),!1;let{position:n}=this.manager.dragOperation,r=n?.current;if(r){let{by:n}=e??{},i=n?{x:Zm(n.x),y:Zm(n.y)}:void 0,a=i?void 0:this.scrollIntentTracker.current;if(a?.isLocked())return!1;for(let e of t){let t=Tf(e,n);if(t.x||t.y){let{speed:t,direction:o}=qf(e,r,i);if(a)for(let e of Jc)a[e].isLocked(o[e])&&(t[e]=0,o[e]=0);if(o.x||o.y){let{x:r,y:i}=n??o,a=r*t.x,s=i*t.y;if(a||s){let t=$(this,Jm)?.by;if(this.autoScrolling&&t&&(t.x&&!a||t.y&&!s))continue;return Gp(this,Jm,{element:e,by:{x:a,y:s}}),Df.schedule($(this,Ym)),!0}}}}}return Gp(this,Jm,void 0),!1};let t=null,n=null,r=Ls(()=>{let{position:n,source:r}=e.dragOperation;if(!n)return null;let i=Id(wd(r?.element),n.current);return i&&(t=i),i??t}),i=Ls(()=>{let t=r.value,{documentElement:i}=wd(t);if(!t||t===i){let{target:t}=e.dragOperation,r=t?.element;if(r){let e=If(r,{excludeElement:!1});return n=e,e}}if(t){let e=If(t,{excludeElement:!1});return this.autoScrolling&&n&&e.sizei.value,this.scrollIntentTracker=new Hm(e),this.destroy=e.monitor.addEventListener(`dragmove`,t=>{this.disabled||t.defaultPrevented||!up(e.dragOperation.activatorEvent)||!t.by||this.scroll({by:t.by})&&t.preventDefault()})}};Km=Fp(Gm),qm=new WeakMap,Jm=new WeakMap,Ym=new WeakMap,Vp(Km,4,`autoScrolling`,Wm,Xm,qm),zp(Km,Xm);function Zm(e){return e>0?Wf.Forward:e<0?Wf.Reverse:Wf.Idle}var Qm=new class{constructor(e){this.scheduler=e,this.pending=!1,this.tasks=new Set,this.resolvers=new Set,this.flush=()=>{let{tasks:e,resolvers:t}=this;this.pending=!1,this.tasks=new Set,this.resolvers=new Set;for(let t of e)t();for(let e of t)e()}}schedule(e){return this.tasks.add(e),this.pending||(this.pending=!0,this.scheduler(this.flush)),new Promise(e=>this.resolvers.add(e))}}(e=>{typeof requestAnimationFrame==`function`?requestAnimationFrame(e):e()}),$m=10,eh=class extends Dl{constructor(e,t){super(e);let n=e.registry.plugins.get(Xm);if(!n)throw Error(`AutoScroller plugin depends on Scroller plugin`);this.destroy=ls(()=>{if(this.disabled)return;let{position:t,status:r}=e.dragOperation;if(r.dragging)if(n.scroll()){n.autoScrolling=!0;let e=setInterval(()=>Qm.schedule(n.scroll),$m);return()=>{clearInterval(e)}}else n.autoScrolling=!1})}},th={capture:!0,passive:!0},nh,rh=class extends Ol{constructor(e){super(e),Wp(this,nh),this.handleScroll=()=>{$(this,nh)??Gp(this,nh,setTimeout(()=>{this.manager.collisionObserver.forceUpdate(!1),Gp(this,nh,void 0)},50))};let{dragOperation:t}=this.manager;this.destroy=ls(()=>{if(t.status.dragging){let e=t.source?.element?.ownerDocument??document;return e.addEventListener(`scroll`,this.handleScroll,th),()=>{e.removeEventListener(`scroll`,this.handleScroll,th)}}})}};nh=new WeakMap;var ih=class extends Dl{constructor(e,t){super(e,t),this.manager=e,this.destroy=ls(()=>{let{dragOperation:e}=this.manager,{nonce:t}=this.options??{};if(e.status.initialized){let e=document.createElement(`style`);return t&&e.setAttribute(`nonce`,t),e.textContent=`* { user-select: none !important; -webkit-user-select: none !important; }`,document.head.appendChild(e),ah(),document.addEventListener(`selectionchange`,ah,{capture:!0}),()=>{document.removeEventListener(`selectionchange`,ah,{capture:!0}),e.remove()}}})}};function ah(){var e;(e=document.getSelection())==null||e.removeAllRanges()}var oh=Object.freeze({offset:10,keyboardCodes:{start:[`Space`,`Enter`],cancel:[`Escape`],end:[`Space`,`Enter`,`Tab`],up:[`ArrowUp`],down:[`ArrowDown`],left:[`ArrowLeft`],right:[`ArrowRight`]},preventActivation(e,t){let n=t.handle??t.element;return e.target!==n}}),sh,ch=class extends Iu{constructor(e,t){super(e),this.manager=e,this.options=t,Wp(this,sh,[]),this.listeners=new Bd,this.handleSourceKeyDown=(e,t,n)=>{if(this.disabled||e.defaultPrevented||!lp(e.target)||t.disabled)return;let{keyboardCodes:r=oh.keyboardCodes,preventActivation:i=oh.preventActivation}=n??{};r.start.includes(e.code)&&this.manager.dragOperation.status.idle&&(i?.(e,t)||this.handleStart(e,t,n))}}bind(e,t=this.options){return ls(()=>{let n=e.handle??e.element,r=n=>{up(n)&&this.handleSourceKeyDown(n,e,t)};if(n)return n.addEventListener(`keydown`,r),()=>{n.removeEventListener(`keydown`,r)}})}handleStart(e,t,n){let{element:r}=t;if(!r)throw Error(`Source draggable does not have an associated element`);e.preventDefault(),e.stopImmediatePropagation(),Yf(r);let{center:i}=new ap(r);if(this.manager.actions.start({event:e,coordinates:{x:i.x,y:i.y},source:t}).signal.aborted)return this.cleanup();this.sideEffects();let a=wd(r),o=[this.listeners.bind(a,[{type:`keydown`,listener:e=>this.handleKeyDown(e,t,n),options:{capture:!0}}])];$(this,sh).push(...o)}handleKeyDown(e,t,n){let{keyboardCodes:r=oh.keyboardCodes}=n??{};if(uh(e,[...r.end,...r.cancel])){e.preventDefault();let t=uh(e,r.cancel);this.handleEnd(e,t);return}uh(e,r.up)?this.handleMove(`up`,e):uh(e,r.down)&&this.handleMove(`down`,e),uh(e,r.left)?this.handleMove(`left`,e):uh(e,r.right)&&this.handleMove(`right`,e)}handleEnd(e,t){this.manager.actions.stop({event:e,canceled:t}),this.cleanup()}handleMove(e,t){let{shape:n}=this.manager.dragOperation,r=t.shiftKey?5:1,i={x:0,y:0},a=this.options?.offset??oh.offset;if(typeof a==`number`&&(a={x:a,y:a}),n){switch(e){case`up`:i={x:0,y:-a.y*r};break;case`down`:i={x:0,y:a.y*r};break;case`left`:i={x:-a.x*r,y:0};break;case`right`:i={x:a.x*r,y:0};break}(i.x||i.y)&&(t.preventDefault(),this.manager.actions.move({event:t,by:i}))}}sideEffects(){let e=this.manager.registry.plugins.get(eh);e?.disabled===!1&&(e.disable(),$(this,sh).push(()=>{e.enable()}))}cleanup(){$(this,sh).forEach(e=>e()),Gp(this,sh,[])}destroy(){this.cleanup(),this.listeners.clear()}};sh=new WeakMap,ch.configure=xl(ch),ch.defaults=oh;var lh=ch;function uh(e,t){return t.includes(e.code)}var dh,fh=class extends zu{constructor(){super(...arguments),Wp(this,dh)}onEvent(e){switch(e.type){case`pointerdown`:Gp(this,dh,kd(e));break;case`pointermove`:if(!$(this,dh))return;let{x:t,y:n}=kd(e),r={x:t-$(this,dh).x,y:n-$(this,dh).y},{tolerance:i}=this.options;if(i&&Kc(r,i)){this.abort();return}Kc(r,this.options.value)&&this.activate(e);break;case`pointerup`:this.abort();break}}abort(){Gp(this,dh,void 0)}};dh=new WeakMap;var ph,mh,hh=class extends zu{constructor(){super(...arguments),Wp(this,ph),Wp(this,mh)}onEvent(e){switch(e.type){case`pointerdown`:Gp(this,mh,kd(e)),Gp(this,ph,setTimeout(()=>this.activate(e),this.options.value));break;case`pointermove`:if(!$(this,mh))return;let{x:t,y:n}=kd(e);Kc({x:t-$(this,mh).x,y:n-$(this,mh).y},this.options.tolerance)&&this.abort();break;case`pointerup`:this.abort();break}}abort(){$(this,ph)&&(clearTimeout($(this,ph)),Gp(this,mh,void 0),Gp(this,ph,void 0))}};ph=new WeakMap,mh=new WeakMap;var gh=class{};gh.Delay=hh,gh.Distance=fh;var _h=Object.freeze({activationConstraints(e,t){let{pointerType:n,target:r}=e;if(!(n===`mouse`&&lp(r)&&(t.handle===r||t.handle?.contains(r))))return n===`touch`?[new gh.Delay({value:250,tolerance:5})]:fp(r)&&!e.defaultPrevented?[new gh.Delay({value:200,tolerance:0})]:[new gh.Delay({value:200,tolerance:10}),new gh.Distance({value:5})]},preventActivation(e,t){let{target:n}=e;return n===t.element||n===t.handle||!lp(n)||t.handle?.contains(n)?!1:zd(n)}}),vh,yh=class extends Iu{constructor(e,t){super(e),this.manager=e,this.options=t,Wp(this,vh,new Set),this.listeners=new Bd,this.latest={event:void 0,coordinates:void 0},this.handleMove=()=>{let{event:e,coordinates:t}=this.latest;!e||!t||this.manager.actions.move({event:e,to:t})},this.handleCancel=this.handleCancel.bind(this),this.handlePointerUp=this.handlePointerUp.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}activationConstraints(e,t,n=this.options){let{activationConstraints:r=_h.activationConstraints}=n??{};return typeof r==`function`?r(e,t):r}bind(e,t=this.options){return ls(()=>{let n=new AbortController,{signal:r}=n,i=n=>{dp(n)&&this.handlePointerDown(n,e,t)},a=[e.handle??e.element];t?.activatorElements&&(a=Array.isArray(t.activatorElements)?t.activatorElements:t.activatorElements(e));for(let e of a)e&&(Th(e.ownerDocument.defaultView),e.addEventListener(`pointerdown`,i,{signal:r}));return()=>n.abort()})}handlePointerDown(e,t,n){if(this.disabled||!e.isPrimary||e.button!==0||!lp(e.target)||t.disabled||xh(e)||!this.manager.dragOperation.status.idle)return;let{preventActivation:r=_h.preventActivation}=n??{};if(r?.(e,t))return;let{target:i}=e,a=Sd(i)&&i.draggable&&i.getAttribute(`draggable`)===`true`,o=Rf(t.element),{x:s,y:c}=kd(e);this.initialCoordinates={x:s*o.scaleX+o.x,y:c*o.scaleY+o.y};let l=this.activationConstraints(e,t,n);e.sensor=this;let u=new Lu(l,e=>this.handleStart(t,e));u.signal.onabort=()=>this.handleCancel(e),u.onEvent(e),this.controller=u;let d=jd(),f=this.listeners.bind(d,[{type:`pointermove`,listener:e=>this.handlePointerMove(e,t)},{type:`pointerup`,listener:this.handlePointerUp,options:{capture:!0}},{type:`dragstart`,listener:a?this.handleCancel:Sh,options:{capture:!0}}]);$(this,vh).add(()=>{f(),this.initialCoordinates=void 0})}handlePointerMove(e,t){var n;if(this.controller?.activated===!1){(n=this.controller)==null||n.onEvent(e);return}if(this.manager.dragOperation.status.dragging){let n=kd(e),r=Rf(t.element);n.x=n.x*r.scaleX+r.x,n.y=n.y*r.scaleY+r.y,e.preventDefault(),e.stopPropagation(),this.latest.event=e,this.latest.coordinates=n,Df.schedule(this.handleMove)}}handlePointerUp(e){let{status:t}=this.manager.dragOperation;if(!t.idle){e.preventDefault(),e.stopPropagation();let n=!t.initialized;this.manager.actions.stop({event:e,canceled:n})}this.cleanup()}handleKeyDown(e){e.key===`Escape`&&(e.preventDefault(),this.handleCancel(e))}handleStart(e,t){let{manager:n,initialCoordinates:r}=this;if(!r||!n.dragOperation.status.idle||t.defaultPrevented)return;if(n.actions.start({coordinates:r,event:t,source:e}).signal.aborted)return this.cleanup();t.preventDefault();let i=wd(t.target);i.body.setPointerCapture(t.pointerId);let a=lp(t.target)?[t.target,i.body]:i.body,o=this.listeners.bind(a,[{type:`touchmove`,listener:Sh,options:{passive:!1}},{type:`click`,listener:Sh},{type:`contextmenu`,listener:Sh},{type:`keydown`,listener:this.handleKeyDown}]);$(this,vh).add(o)}handleCancel(e){let{dragOperation:t}=this.manager;t.status.initialized&&this.manager.actions.stop({event:e,canceled:!0}),this.cleanup()}cleanup(){this.latest={event:void 0,coordinates:void 0},$(this,vh).forEach(e=>e()),$(this,vh).clear()}destroy(){this.cleanup(),this.listeners.clear()}};vh=new WeakMap,yh.configure=xl(yh),yh.defaults=_h;var bh=yh;function xh(e){return`sensor`in e}function Sh(e){e.preventDefault()}function Ch(){}var wh=new WeakSet;function Th(e){!e||wh.has(e)||(e.addEventListener(`touchmove`,Ch,{capture:!1,passive:!1}),wh.add(e))}var Eh={modifiers:[],plugins:[nm,eh,im,km,ih],sensors:[bh,lh]},Dh=class extends ld{constructor(e={}){let{plugins:t=Eh.plugins,sensors:n=Eh.sensors,modifiers:r=[]}=e;super(Mp(jp({},e),{plugins:[rh,Xm,...t],sensors:n,modifiers:r}))}},Oh,kh,Ah,jh,Mh,Nh,Ph,Fh,Ih=class extends (jh=xu,Ah=[J],kh=[J],Oh=[J],jh){constructor(e,t){var n=e,{element:r,effects:i=()=>[],handle:a,feedback:o=`default`}=n,s=Pp(n,[`element`,`effects`,`handle`,`feedback`]);super(jp({effects:()=>[...i(),()=>{let{manager:e}=this;if(!e)return;let t=(this.sensors?.map(Sl)??[...e.sensors]).map(t=>{let n=t instanceof Iu?t:e.registry.register(t.plugin),r=t instanceof Iu?void 0:t.options;return n.bind(this,r)});return function(){t.forEach(e=>e())}}]},s),t),Wp(this,Nh,Bp(Mh,8,this)),Bp(Mh,11,this),Wp(this,Ph,Bp(Mh,12,this)),Bp(Mh,15,this),Wp(this,Fh,Bp(Mh,16,this)),Bp(Mh,19,this),this.element=r,this.handle=a,this.feedback=o}};Mh=Fp(jh),Nh=new WeakMap,Ph=new WeakMap,Fh=new WeakMap,Vp(Mh,4,`handle`,Ah,Ih,Nh),Vp(Mh,4,`element`,kh,Ih,Ph),Vp(Mh,4,`feedback`,Oh,Ih,Fh),zp(Mh,Ih);var Lh,Rh,zh,Bh,Vh,Hh,Uh,Wh,Gh,Kh,qh=class extends (zh=Fu,Rh=[J],Lh=[J],zh){constructor(e,t){var n=e,{element:r,effects:i=()=>[]}=n,a=Pp(n,[`element`,`effects`]);let{collisionDetector:o=vp}=a,s=e=>{let{manager:t,element:n}=this;if(!n||e===null){this.shape=void 0;return}if(!t)return;let r=new ap(n),i=q(()=>this.shape);return r&&i?.equals(r)?i:(this.shape=r,r)},c=$o(!1);super(Mp(jp({},a),{collisionDetector:o,effects:()=>[...i(),()=>{let{element:e,manager:t}=this;if(!t)return;let{dragOperation:n}=t,{source:r}=n;c.value=!!(r&&n.status.initialized&&e&&!this.disabled&&this.accepts(r))},()=>{let{element:e}=this;if(c.value&&e){let t=new bf(e,s);return()=>{t.disconnect(),this.shape=void 0}}},()=>{if(this.manager?.dragOperation.status.initialized)return()=>{this.shape=void 0}}]}),t),Wp(this,Gh),Wp(this,Vh,Bp(Bh,8,this)),Bp(Bh,11,this),Wp(this,Kh,Bp(Bh,12,this)),Bp(Bh,15,this),this.element=r,this.refreshShape=()=>s()}set element(e){Gp(this,Gh,e,Wh)}get element(){return this.proxy??$(this,Gh,Uh)}};Bh=Fp(zh),Vh=new WeakMap,Gh=new WeakSet,Kh=new WeakMap,Hh=Vp(Bh,20,`#element`,Rh,Gh,Vh),Uh=Hh.get,Wh=Hh.set,Vp(Bh,4,`proxy`,Lh,qh,Kh),zp(Bh,qh);var Jh=Object.create,Yh=Object.defineProperty,Xh=Object.defineProperties,Zh=Object.getOwnPropertyDescriptor,Qh=Object.getOwnPropertyDescriptors,$h=Object.getOwnPropertySymbols,eg=Object.prototype.hasOwnProperty,tg=Object.prototype.propertyIsEnumerable,ng=(e,t)=>(t=Symbol[e])?t:Symbol.for(`Symbol.`+e),rg=e=>{throw TypeError(e)},ig=(e,t,n)=>t in e?Yh(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,ag=(e,t)=>{for(var n in t||={})eg.call(t,n)&&ig(e,n,t[n]);if($h)for(var n of $h(t))tg.call(t,n)&&ig(e,n,t[n]);return e},og=(e,t)=>Xh(e,Qh(t)),sg=(e,t)=>{var n={};for(var r in e)eg.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&$h)for(var r of $h(e))t.indexOf(r)<0&&tg.call(e,r)&&(n[r]=e[r]);return n},cg=e=>[,,,Jh(null)],lg=[`class`,`method`,`getter`,`setter`,`accessor`,`field`,`value`,`get`,`set`],ug=e=>e!==void 0&&typeof e!=`function`?rg(`Function expected`):e,dg=(e,t,n,r,i)=>({kind:lg[e],name:t,metadata:r,addInitializer:e=>n._?rg(`Already initialized`):i.push(ug(e||null))}),fg=(e,t)=>ig(t,ng(`metadata`),e[3]),pg=(e,t,n,r)=>{for(var i=0,a=e[t>>1],o=a&&a.length;i{for(var o,s,c,l,u,d=t&7,f=!1,p=!1,m=e.length+1,h=lg[d+5],g=e[m-1]=[],_=e[m]||(e[m]=[]),v=(i=i.prototype,Zh({get[n](){return gg(this,a)},set[n](e){return vg(this,a,e)}},n)),y=r.length-1;y>=0;y--)l=dg(d,n,c={},e[3],_),l.static=f,l.private=p,u=l.access={has:e=>n in e},u.get=e=>e[n],u.set=(e,t)=>e[n]=t,s=(0,r[y])({get:v.get,set:v.set},l),c._=1,s===void 0?ug(s)&&(v[h]=s):typeof s!=`object`||!s?rg(`Object expected`):(ug(o=s.get)&&(v.get=o),ug(o=s.set)&&(v.set=o),ug(o=s.init)&&g.unshift(o));return v&&Yh(i,n,v),i},hg=(e,t,n)=>t.has(e)||rg(`Cannot `+n),gg=(e,t,n)=>(hg(e,t,`read from private field`),t.get(e)),_g=(e,t,n)=>t.has(e)?rg(`Cannot add the same private member more than once`):t instanceof WeakSet?t.add(e):t.set(e,n),vg=(e,t,n,r)=>(hg(e,t,`write to private field`),t.set(e,n),n);function yg(e){return e instanceof $g||e instanceof Qg}var bg=10,xg=class extends Dl{constructor(e){super(e);let t=ls(()=>{let{dragOperation:t}=e;if(up(t.activatorEvent)&&yg(t.source)&&t.status.initialized){let t=e.registry.plugins.get(Xm);if(t)return t.disable(),()=>t.enable()}}),n=e.monitor.addEventListener(`dragmove`,(e,t)=>{queueMicrotask(()=>{if(this.disabled||e.defaultPrevented||!e.nativeEvent)return;let{dragOperation:n}=t;if(!up(e.nativeEvent)||!yg(n.source)||!n.shape)return;let{actions:r,collisionObserver:i,registry:a}=t,{by:o}=e;if(!o)return;let s=Sg(o),{source:c,target:l}=n,{center:u}=n.shape.current,d=[],f=[];Ko(()=>{for(let e of a.droppables){let{id:t}=e;if(!e.accepts(c)||t===l?.id&&yg(e)||!e.element)continue;let n=e.shape,r=new ap(e.element,{getBoundingClientRect:e=>Od(e,void 0,.2)});!r.height||!r.width||(s==`down`&&u.y+bgr.center.y||s==`left`&&u.x-bg>r.center.x||s==`right`&&u.x+bge.shape=n))}}),e.preventDefault(),i.disable();let p=i.computeCollisions(d,yp);Ko(()=>f.forEach(e=>e()));let[m]=p;if(!m)return;let{id:h}=m,{index:g,group:_}=c.sortable;r.setDropTarget(h).then(()=>{let{source:e,target:t,shape:a}=n;if(!e||!yg(e)||!a)return;let{index:o,group:s,target:c}=e.sortable,l=g!==o||_!==s,u=l?c:t?.element;if(!u)return;Yf(u);let d=new ap(u);if(!d)return;let f=Rc.delta(d,Rc.from(a.current.boundingRectangle),e.alignment);r.move({by:f}),l?r.setDropTarget(e.id).then(()=>i.enable()):i.enable()})})});this.destroy=()=>{n(),t()}}};function Sg(e){let{x:t,y:n}=e;if(t>0)return`right`;if(t<0)return`left`;if(n>0)return`down`;if(n<0)return`up`}var Cg=Object.defineProperty,wg=Object.defineProperties,Tg=Object.getOwnPropertyDescriptors,Eg=Object.getOwnPropertySymbols,Dg=Object.prototype.hasOwnProperty,Og=Object.prototype.propertyIsEnumerable,kg=(e,t,n)=>t in e?Cg(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ag=(e,t)=>{for(var n in t||={})Dg.call(t,n)&&kg(e,n,t[n]);if(Eg)for(var n of Eg(t))Og.call(t,n)&&kg(e,n,t[n]);return e},jg=(e,t)=>wg(e,Tg(t));function Mg(e,t,n){if(t===n)return e;let r=e.slice();return r.splice(n,0,r.splice(t,1)[0]),r}function Ng(e,t,n){let{source:r,target:i,canceled:a}=t.operation;if(!r||!i||a)return`preventDefault`in t&&t.preventDefault(),e;let o=(e,t)=>e===t||typeof e==`object`&&`id`in e&&e.id===t;if(Array.isArray(e)){let t=e.findIndex(e=>o(e,r.id)),s=e.findIndex(e=>o(e,i.id));if(t===-1||s===-1)return e;if(!a&&`index`in r&&typeof r.index==`number`){let i=r.index;if(i!==t)return n(e,t,i)}return n(e,t,s)}let s=Object.entries(e),c=-1,l,u=-1,d;for(let[e,t]of s)if(c===-1&&(c=t.findIndex(e=>o(e,r.id)),c!==-1&&(l=e)),u===-1&&(u=t.findIndex(e=>o(e,i.id)),u!==-1&&(d=e)),c!==-1&&u!==-1)break;if(!r.manager)return e;let{dragOperation:f}=r.manager,p=f.shape?.current.center??f.position.current;if(d==null&&i.id in e){let t=i.shape&&p.y>i.shape.center.y?e[i.id].length:0;d=i.id,u=t}if(l==null||d==null||l===d&&c===u)return`preventDefault`in t&&t.preventDefault(),e;if(l===d)return jg(Ag({},e),{[l]:n(e[l],c,u)});let m=i.shape&&Math.round(p.y)>Math.round(i.shape.center.y)?1:0,h=e[l][c];return jg(Ag({},e),{[l]:[...e[l].slice(0,c),...e[l].slice(c+1)],[d]:[...e[d].slice(0,u+m),h,...e[d].slice(u+m)]})}function Pg(e,t){return Ng(e,t,Mg)}var Fg=`__default__`,Ig=class extends Dl{constructor(e){super(e);let t=()=>{let t=new Map;for(let n of e.registry.droppables)if(n instanceof $g){let{sortable:e}=n,{group:r}=e,i=t.get(r);i||(i=new Set,t.set(r,i)),i.add(e)}for(let[e,n]of t)t.set(e,new Set(zg(n)));return t},n=[e.monitor.addEventListener(`dragover`,(e,n)=>{if(this.disabled)return;let{dragOperation:r}=n,{source:i,target:a}=r;if(!yg(i)||!yg(a)||i.sortable===a.sortable)return;let o=t(),s=i.sortable.group===a.sortable.group,c=o.get(i.sortable.group),l=s?c:o.get(a.sortable.group);!c||!l||queueMicrotask(()=>{e.defaultPrevented||n.renderer.rendering.then(()=>{let r=t();for(let[e,t]of o.entries()){let n=Array.from(t).entries();for(let[t,i]of n)if(i.index!==t||i.group!==e||!r.get(e)?.has(i))return}let u=i.sortable.element,d=a.sortable.element;if(!d||!u||!s&&a.id===i.sortable.group)return;let f=zg(c),p=s?f:zg(l),m=i.sortable.group??Fg,h=a.sortable.group??Fg,g={[m]:f,[h]:p},_=Pg(g,e);if(g===_)return;let v=_[h].indexOf(i.sortable),y=_[h].indexOf(a.sortable);n.collisionObserver.disable(),Lg(u,v,d,y),Ko(()=>{for(let[e,t]of _[m].entries())t.index=e;if(!s)for(let[e,t]of _[h].entries())t.group=a.sortable.group,t.index=e}),n.actions.setDropTarget(i.id).then(()=>n.collisionObserver.enable())})})}),e.monitor.addEventListener(`dragend`,(e,n)=>{if(!e.canceled)return;let{dragOperation:r}=n,{source:i}=r;yg(i)&&(i.sortable.initialIndex===i.sortable.index&&i.sortable.initialGroup===i.sortable.group||queueMicrotask(()=>{let e=t(),r=e.get(i.sortable.initialGroup);r&&n.renderer.rendering.then(()=>{for(let[t,n]of e.entries()){let e=Array.from(n).entries();for(let[n,r]of e)if(r.index!==n||r.group!==t)return}let t=zg(r),n=i.sortable.element,a=t[i.sortable.initialIndex],o=a?.element;!a||!o||!n||(Lg(n,a.index,o,i.index),Ko(()=>{for(let[t,n]of e.entries()){let e=Array.from(n).values();for(let t of e)t.index=t.initialIndex,t.group=t.initialGroup}}))})}))})];this.destroy=()=>{for(let e of n)e()}}};function Lg(e,t,n,r){let i=r(Ko(()=>{var e,t;(e=this.manager)==null||e.registry.register(this.droppable),(t=this.manager)==null||t.registry.register(this.draggable)}),()=>this.unregister()),this.unregister=()=>{Ko(()=>{var e,t;(e=this.manager)==null||e.registry.unregister(this.droppable),(t=this.manager)==null||t.registry.unregister(this.draggable)})},this.destroy=()=>{Ko(()=>{this.droppable.destroy(),this.draggable.destroy()})};var n=e,{effects:r=()=>[],group:i,index:a,sensors:o,type:s,transition:c=Vg,plugins:l=Bg}=n,u=sg(n,[`effects`,`group`,`index`,`sensors`,`type`,`transition`,`plugins`]);this.droppable=new $g(u,t,this),this.draggable=new Qg(og(ag({},u),{effects:()=>[()=>{let e=this.manager?.dragOperation.status;e?.initializing&&this.id===this.manager?.dragOperation.source?.id&&Hg.clear(this.manager),e?.dragging&&Hg.set(this.manager,this.id,q(()=>({initialIndex:this.index,initialGroup:this.group})))},()=>{let{index:e,group:t,manager:n}=this,r=gg(this,Jg),i=gg(this,qg);(e!==r||t!==i)&&(vg(this,Jg,e),vg(this,qg,t),this.animate())},()=>{let{target:e}=this,{feedback:t,isDragSource:n}=this.draggable;t==`move`&&n&&(this.droppable.disabled=!e)},()=>{let{manager:e}=this;for(let t of l)e?.registry.register(t)},...r()],type:s,sensors:o}),t,this),vg(this,Xg,u.element),this.manager=t,this.index=a,vg(this,Jg,a),this.group=i,vg(this,qg,i),this.type=s,this.transition=c}get initialIndex(){return Hg.get(this.manager,this.id)?.initialIndex??this.index}get initialGroup(){return Hg.get(this.manager,this.id)?.initialGroup??this.group}animate(){q(()=>{let{manager:e,transition:t}=this,{shape:n}=this.droppable;if(!e)return;let{idle:r}=e.dragOperation.status;!n||!t||r&&!t.idle||e.renderer.rendering.then(()=>{let{element:r}=this;if(!r)return;let i=this.refreshShape();if(!i)return;let a={x:n.boundingRectangle.left-i.boundingRectangle.left,y:n.boundingRectangle.top-i.boundingRectangle.top},{translate:o}=jf(r),s=$f(r,o,!1),c=$f(r,o);(a.x||a.y)&&Qf({element:r,keyframes:{translate:[`${s.x+a.x}px ${s.y+a.y}px ${s.z}`,`${c.x}px ${c.y}px ${c.z}`]},options:t}).then(()=>{e.dragOperation.status.dragging||(this.droppable.shape=void 0)})})})}get manager(){return this.draggable.manager}set manager(e){Ko(()=>{this.draggable.manager=e,this.droppable.manager=e})}set element(e){Ko(()=>{let t=gg(this,Xg),n=this.droppable.element,r=this.draggable.element;(!n||n===t)&&(this.droppable.element=e),(!r||r===t)&&(this.draggable.element=e),vg(this,Xg,e)})}get element(){let e=gg(this,Xg);if(e)return Rd.get(e)??e??this.droppable.element}set target(e){this.droppable.element=e}get target(){return this.droppable.element}set source(e){this.draggable.element=e}get source(){return this.draggable.element}get disabled(){return this.draggable.disabled&&this.droppable.disabled}set feedback(e){this.draggable.feedback=e}set disabled(e){Ko(()=>{this.droppable.disabled=e,this.draggable.disabled=e})}set data(e){Ko(()=>{this.droppable.data=e,this.draggable.data=e})}set handle(e){this.draggable.handle=e}set id(e){Ko(()=>{this.droppable.id=e,this.draggable.id=e})}get id(){return this.droppable.id}set sensors(e){this.draggable.sensors=e}set modifiers(e){this.draggable.modifiers=e}set collisionPriority(e){this.droppable.collisionPriority=e}set collisionDetector(e){this.droppable.collisionDetector=e??vp}set alignment(e){this.draggable.alignment=e}get alignment(){return this.draggable.alignment}set type(e){Ko(()=>{this.droppable.type=e,this.draggable.type=e})}get type(){return this.draggable.type}set accept(e){this.droppable.accept=e}get accept(){return this.droppable.accept}get isDropTarget(){return this.droppable.isDropTarget}get isDragSource(){return this.draggable.isDragSource}get isDragging(){return this.draggable.isDragging}get isDropping(){return this.draggable.isDropping}get status(){return this.draggable.status}refreshShape(){return this.droppable.refreshShape()}accepts(e){return this.droppable.accepts(e)}};Gg=cg(),Kg=new WeakMap,qg=new WeakMap,Jg=new WeakMap,Yg=new WeakMap,Xg=new WeakMap,mg(Gg,4,`index`,Wg,Zg,Kg),mg(Gg,4,`group`,Ug,Zg,Yg),fg(Gg,Zg);var Qg=class extends Ih{constructor(e,t,n){super(e,t),this.sortable=n}get index(){return this.sortable.index}},$g=class extends qh{constructor(e,t,n){super(e,t),this.sortable=n}},e_=Object.defineProperty,t_=Object.defineProperties,n_=Object.getOwnPropertyDescriptors,r_=Object.getOwnPropertySymbols,i_=Object.prototype.hasOwnProperty,a_=Object.prototype.propertyIsEnumerable,o_=(e,t,n)=>t in e?e_(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,s_=(e,t)=>{for(var n in t||={})i_.call(t,n)&&o_(e,n,t[n]);if(r_)for(var n of r_(t))a_.call(t,n)&&o_(e,n,t[n]);return e},c_=(e,t)=>t_(e,n_(t)),l_=class extends Bu{apply({transform:e}){if(!this.options)return e;let{axis:t,value:n}=this.options;return c_(s_({},e),{[t]:n})}};l_.configure=xl(l_);var u_=l_,d_=u_.configure({axis:`x`,value:0});u_.configure({axis:`y`,value:0});var f_=class extends Bu{apply({transform:e}){let{size:t=20}=this.options??{},n=typeof t==`number`?t:t.x,r=typeof t==`number`?t:t.y;return c_(s_({},e),{x:Math.ceil(e.x/n)*n,y:Math.ceil(e.y/r)*r})}};f_.configure=xl(f_);var p_=t({default:()=>m_}),m_=class extends nt{constructor(...e){super(...e),this.sortables=[],this.onDragEnd=()=>this.updateOrder()}static{this.targets=[`container`,`orderInput`]}connect(){this.manager=new Dh({modifiers:[d_]}),this.manager.monitor.addEventListener(`dragend`,this.onDragEnd),this.refreshSortables()}disconnect(){this.teardownSortables(),this.manager?.monitor.removeEventListener(`dragend`,this.onDragEnd),this.manager?.destroy?.(),this.manager=void 0}containerTargetConnected(){this.refreshSortables()}containerTargetDisconnected(){this.refreshSortables()}refreshSortables(){this.teardownSortables(),this.manager&&this.containerTargets.forEach((e,t)=>{Array.from(e.querySelectorAll(`[data-id]`)).forEach((e,n)=>{let r=new Zg({id:e.dataset.id||hp(`item`),index:n,group:t,element:e,handle:e.querySelector(`[data-handle]`)||void 0},this.manager);this.sortables.push(r)})})}teardownSortables(){this.sortables.forEach(e=>e.destroy()),this.sortables=[]}updateOrder(){if(!this.hasOrderInputTarget){this.dispatch(`update`);return}let e=this.containerTargets.flatMap((e,t)=>Array.from(e.querySelectorAll(`[data-id]`)).map(e=>({id:e.dataset.id,listIndex:t})));e&&(this.orderInputTarget.value=JSON.stringify(e),this.dispatch(`update`))}};window.Stimulus.load(Ce({"./controllers/color-picker-controller.ts":rt,"./controllers/filter-input-controller.ts":yt,"./controllers/form-controller.ts":St,"./controllers/icon-picker-controller.ts":wt,"./controllers/incremental-search-controller.ts":hn,"./controllers/line-chart-controller.ts":Ro,"./controllers/permission-grid-controller.ts":Bo,"./controllers/slugger-controller.ts":Ho,"./controllers/sortable-controller.ts":p_}))})(); ================================================ FILE: resources/dist/emoji.js ================================================ (function(){function e(e){return e.replace(/(?:[_-])([a-z0-9])/g,(e,t)=>t.toUpperCase())}function t(t){return e(t.replace(/--/g,`-`).replace(/__/g,`_`))}function n(e){return e.charAt(0).toUpperCase()+e.slice(1)}function r(e){return e.replace(/([A-Z])/g,(e,t)=>`-${t.toLowerCase()}`)}function i(e){return e!=null}function a(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function o(e,t){let n=c(e);return Array.from(n.reduce((e,n)=>(l(n,t).forEach(t=>e.add(t)),e),new Set))}function s(e,t){return c(e).reduce((e,n)=>(e.push(...u(n,t)),e),[])}function c(e){let t=[];for(;e;)t.push(e),e=Object.getPrototypeOf(e);return t.reverse()}function l(e,t){let n=e[t];return Array.isArray(n)?n:[]}function u(e,t){let n=e[t];return n?Object.keys(n).map(e=>[e,n[e]]):[]}typeof Object.getOwnPropertySymbols==`function`||Object.getOwnPropertyNames,(()=>{function e(e){function t(){return Reflect.construct(e,arguments,new.target)}return t.prototype=Object.create(e.prototype,{constructor:{value:t}}),Reflect.setPrototypeOf(t,e),t}function t(){let t=e(function(){this.a.call(this)});return t.prototype.a=function(){},new t}try{return t(),e}catch{return e=>class extends e{}}})(),Object.assign(Object.assign({enter:`Enter`,tab:`Tab`,esc:`Escape`,space:` `,up:`ArrowUp`,down:`ArrowDown`,left:`ArrowLeft`,right:`ArrowRight`,home:`Home`,end:`End`,page_up:`PageUp`,page_down:`PageDown`},d(`abcdefghijklmnopqrstuvwxyz`.split(``).map(e=>[e,e]))),d(`0123456789`.split(``).map(e=>[e,e])));function d(e){return e.reduce((e,[t,n])=>Object.assign(Object.assign({},e),{[t]:n}),{})}function f(e){return o(e,`classes`).reduce((e,t)=>Object.assign(e,p(t)),{})}function p(e){return{[`${e}Class`]:{get(){let{classes:t}=this;if(t.has(e))return t.get(e);{let n=t.getAttributeName(e);throw Error(`Missing attribute "${n}"`)}}},[`${e}Classes`]:{get(){return this.classes.getAll(e)}},[`has${n(e)}Class`]:{get(){return this.classes.has(e)}}}}function m(e){return o(e,`outlets`).reduce((e,t)=>Object.assign(e,ee(t)),{})}function h(e,t,n){return e.application.getControllerForElementAndIdentifier(t,n)}function g(e,t,n){let r=h(e,t,n);if(r||(e.application.router.proposeToConnectScopeForElementAndIdentifier(t,n),r=h(e,t,n),r))return r}function ee(e){let r=t(e);return{[`${r}Outlet`]:{get(){let t=this.outlets.find(e),n=this.outlets.getSelectorForOutletName(e);if(t){let n=g(this,t,e);if(n)return n;throw Error(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`)}throw Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${n}".`)}},[`${r}Outlets`]:{get(){let t=this.outlets.findAll(e);return t.length>0?t.map(t=>{let n=g(this,t,e);if(n)return n;console.warn(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`,t)}).filter(e=>e):[]}},[`${r}OutletElement`]:{get(){let t=this.outlets.find(e),n=this.outlets.getSelectorForOutletName(e);if(t)return t;throw Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${n}".`)}},[`${r}OutletElements`]:{get(){return this.outlets.findAll(e)}},[`has${n(r)}Outlet`]:{get(){return this.outlets.has(e)}}}}function te(e){return o(e,`targets`).reduce((e,t)=>Object.assign(e,ne(t)),{})}function ne(e){return{[`${e}Target`]:{get(){let t=this.targets.find(e);if(t)return t;throw Error(`Missing target element "${e}" for "${this.identifier}" controller`)}},[`${e}Targets`]:{get(){return this.targets.findAll(e)}},[`has${n(e)}Target`]:{get(){return this.targets.has(e)}}}}function _(e){let t=s(e,`values`);return t.reduce((e,t)=>Object.assign(e,re(t)),{valueDescriptorMap:{get(){return t.reduce((e,t)=>{let n=ie(t,this.identifier),r=this.data.getAttributeNameForKey(n.key);return Object.assign(e,{[r]:n})},{})}}})}function re(e,t){let r=ie(e,t),{key:i,name:a,reader:o,writer:s}=r;return{[a]:{get(){let e=this.data.get(i);return e===null?r.defaultValue:o(e)},set(e){e===void 0?this.data.delete(i):this.data.set(i,s(e))}},[`has${n(a)}`]:{get(){return this.data.has(i)||r.hasCustomDefaultValue}}}}function ie([e,t],n){return x({controller:n,token:e,typeDefinition:t})}function v(e){switch(e){case Array:return`array`;case Boolean:return`boolean`;case Number:return`number`;case Object:return`object`;case String:return`string`}}function y(e){switch(typeof e){case`boolean`:return`boolean`;case`number`:return`number`;case`string`:return`string`}if(Array.isArray(e))return`array`;if(Object.prototype.toString.call(e)===`[object Object]`)return`object`}function ae(e){let{controller:t,token:n,typeObject:r}=e,a=i(r.type),o=i(r.default),s=a&&o,c=a&&!o,l=!a&&o,u=v(r.type),d=y(e.typeObject.default);if(c)return u;if(l)return d;if(u!==d){let e=t?`${t}.${n}`:n;throw Error(`The specified default value for the Stimulus Value "${e}" must match the defined type "${u}". The provided default value of "${r.default}" is of type "${d}".`)}if(s)return u}function oe(e){let{controller:t,token:n,typeDefinition:r}=e,i=ae({controller:t,token:n,typeObject:r}),a=y(r),o=v(r),s=i||a||o;if(s)return s;let c=t?`${t}.${r}`:n;throw Error(`Unknown value type "${c}" for "${n}" value`)}function b(e){let t=v(e);if(t)return S[t];let n=a(e,`default`),r=a(e,`type`),i=e;if(n)return i.default;if(r){let{type:e}=i,t=v(e);if(t)return S[t]}return e}function x(t){let{token:n,typeDefinition:i}=t,a=`${r(n)}-value`,o=oe(t);return{type:o,key:a,name:e(a),get defaultValue(){return b(i)},get hasCustomDefaultValue(){return y(i)!==void 0},reader:se[o],writer:C[o]||C.default}}let S={get array(){return[]},boolean:!1,number:0,get object(){return{}},string:``},se={array(e){let t=JSON.parse(e);if(!Array.isArray(t))throw TypeError(`expected value of type "array" but instead got value "${e}" of type "${y(t)}"`);return t},boolean(e){return!(e==`0`||String(e).toLowerCase()==`false`)},number(e){return Number(e.replace(/_/g,``))},object(e){let t=JSON.parse(e);if(typeof t!=`object`||!t||Array.isArray(t))throw TypeError(`expected value of type "object" but instead got value "${e}" of type "${y(t)}"`);return t},string(e){return e}},C={default:ce,array:w,object:w};function w(e){return JSON.stringify(e)}function ce(e){return`${e}`}var T=class{constructor(e){this.context=e}static get shouldLoad(){return!0}static afterLoad(e,t){}get application(){return this.context.application}get scope(){return this.context.scope}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get targets(){return this.scope.targets}get outlets(){return this.scope.outlets}get classes(){return this.scope.classes}get data(){return this.scope.data}initialize(){}connect(){}disconnect(){}dispatch(e,{target:t=this.element,detail:n={},prefix:r=this.identifier,bubbles:i=!0,cancelable:a=!0}={}){let o=r?`${r}:${e}`:e,s=new CustomEvent(o,{detail:n,bubbles:i,cancelable:a});return t.dispatchEvent(s),s}};T.blessings=[f,te,_,m],T.targets=[],T.outlets=[],T.values={};function E(e){if(typeof e!=`string`||!e)throw Error(`expected a non-empty string, got: `+e)}function D(e){if(typeof e!=`number`)throw Error(`expected a number, got: `+e)}let O=`emoji`,k=`keyvalue`,A=`favorites`,j=`tokens`,M=`count`,N=`group-order`,P=`eTag`,le=`skinTone`,F=`readonly`,I=`readwrite`,ue=`skinUnicodes`;function de(e,t){let n=new Set,r=[];for(let i of e){let e=t(i);n.has(e)||(n.add(e),r.push(i))}return r}function fe(e){return de(e,e=>e.unicode)}function pe(e){function t(t,n,r){let i=n?e.createObjectStore(t,{keyPath:n}):e.createObjectStore(t);if(r)for(let[e,[t,n]]of Object.entries(r))i.createIndex(e,t,{multiEntry:n});return i}t(k),t(O,`unicode`,{[j]:[`tokens`,!0],[N]:[[`group`,`order`]],[ue]:[`skinUnicodes`,!0]}),t(A,void 0,{[M]:[``]})}let L={},R={},z={};function me(e,t,n){n.onerror=()=>t(n.error),n.onblocked=()=>t(Error(`IDB blocked`)),n.onsuccess=()=>e(n.result)}async function he(e){let t=await new Promise((t,n)=>{let r=indexedDB.open(e,1);L[e]=r,r.onupgradeneeded=e=>{e.oldVersion<1&&pe(r.result)},me(t,n,r)});return t.onclose=()=>V(e),t}function ge(e){return R[e]||(R[e]=he(e)),R[e]}function B(e,t,n,r){return new Promise((i,a)=>{let o=e.transaction(t,n,{durability:`relaxed`}),s=typeof t==`string`?o.objectStore(t):t.map(e=>o.objectStore(e)),c;r(s,o,e=>{c=e}),o.oncomplete=()=>i(c),o.onerror=()=>a(o.error)})}function V(e){let t=L[e],n=t&&t.result;if(n){n.close();let t=z[e];if(t)for(let e of t)e()}delete L[e],delete R[e],delete z[e]}function _e(e){return new Promise((t,n)=>{V(e),me(t,n,indexedDB.deleteDatabase(e))})}function ve(e,t){let n=z[e];n||=z[e]=[],n.push(t)}let ye=new Set(`:D.XD.:'D.O:).:X.:P.;P.XP.:L.:Z.:j.8D.XO.8).:B.:O.:S.:'o.Dx.X(.D:.:C.>0).:3.!e.match(/\w/)||ye.has(e)?e.toLowerCase():e.replace(/[)(:,]/g,``).replace(/’/g,`'`).toLowerCase()).filter(Boolean)}function be(e){return e.filter(Boolean).map(e=>e.toLowerCase()).filter(e=>e.length>=2)}function xe(e){return e.map(({annotation:e,emoticon:t,group:n,order:r,shortcodes:i,skins:a,tags:o,emoji:s,version:c})=>{let l={annotation:e,group:n,order:r,tags:o,tokens:[...new Set(be([...(i||[]).map(H).flat(),...(o||[]).map(H).flat(),...H(e),t]))].sort(),unicode:s,version:c};if(t&&(l.emoticon=t),i&&(l.shortcodes=i),a){l.skinTones=[],l.skinUnicodes=[],l.skinVersions=[];for(let{tone:e,emoji:t,version:n}of a)l.skinTones.push(e),l.skinUnicodes.push(t),l.skinVersions.push(n)}return l})}function Se(e,t,n,r){e[t](n).onsuccess=e=>r&&r(e.target.result)}function U(e,t,n){Se(e,`get`,t,n)}function Ce(e,t,n){Se(e,`getAll`,t,n)}function W(e){e.commit&&e.commit()}function we(e,t){let n=e[0];for(let r=1;rt(i)&&(n=i)}return n}function Te(e,t){let n=we(e,e=>e.length),r=[];for(let i of n)e.some(e=>e.findIndex(e=>t(e)===t(i))===-1)||r.push(i);return r}async function Ee(e){return!await G(e,k,`url`)}async function De(e,t,n){let[r,i]=await Promise.all([P,`url`].map(t=>G(e,k,t)));return r===n&&i===t}async function Oe(e,t){return B(e,O,F,(e,n,r)=>{let i,a=()=>{e.getAll(i&&IDBKeyRange.lowerBound(i,!0),50).onsuccess=e=>{let n=e.target.result;for(let e of n)if(i=e.unicode,t(e))return r(e);if(n.length<50)return r();a()}};a()})}async function ke(e,t,n,r){try{let i=xe(t);await B(e,[O,k],I,([e,t],a)=>{let o,s,c=0;function l(){++c===2&&u()}function u(){if(!(o===r&&s===n)){e.clear();for(let t of i)e.put(t);t.put(r,P),t.put(n,`url`),W(a)}}U(t,P,e=>{o=e,l()}),U(t,`url`,e=>{s=e,l()})})}finally{}}async function Ae(e,t){return B(e,O,F,(e,n,r)=>{let i=IDBKeyRange.bound([t,0],[t+1,0],!1,!0);Ce(e.index(N),i,r)})}async function je(e,t){let n=be(H(t));return n.length?B(e,O,F,(e,t,r)=>{let i=[],a=()=>{i.length===n.length&&o()},o=()=>{r(Te(i,e=>e.unicode).sort((e,t)=>e.order{i.push(e),a()})}}):[]}async function Me(e,t){let n=await je(e,t);return n.length?n.filter(e=>(e.shortcodes||[]).map(e=>e.toLowerCase()).includes(t.toLowerCase()))[0]||null:await Oe(e,e=>(e.shortcodes||[]).includes(t.toLowerCase()))||null}async function Ne(e,t){return B(e,O,F,(e,n,r)=>U(e,t,n=>{if(n)return r(n);U(e.index(ue),t,e=>r(e||null))}))}function G(e,t,n){return B(e,t,F,(e,t,r)=>U(e,n,r))}function Pe(e,t,n,r){return B(e,t,I,(e,t)=>{e.put(r,n),W(t)})}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(e,t,n){return n===0?[]:B(e,[A,O],F,([e,r],i,a)=>{let o=[];e.index(M).openCursor(void 0,`prev`).onsuccess=e=>{let i=e.target.result;if(!i)return a(o);function s(e){if(o.push(e),o.length===n)return a(o);i.continue()}let c=i.primaryKey,l=t.byName(c);if(l)return s(l);U(r,c,e=>{if(e)return s(e);i.continue()})}})}function Le(e,t){let n=new Map;for(let r of e){let e=t(r);for(let t of e){let e=n;for(let n=0;n{let r=n;for(let t=0;te[0]!(t in e[0])));if(!t||n)throw Error(`Custom emojis are in the wrong format`)}function Be(e){ze(e);let t=(e,t)=>e.name.toLowerCase(){let t=new Set;if(e.shortcodes)for(let n of e.shortcodes)for(let e of H(n))t.add(e);return t}),i=e=>r(e,!0),a=e=>r(e,!1),o=e=>{let n=H(e);return Te(n.map((e,t)=>(te.name).sort(t)},s=new Map,c=new Map;for(let t of e){c.set(t.name.toLowerCase(),t);for(let e of t.shortcodes||[])s.set(e.toLowerCase(),t)}return{all:n,search:o,byShortcode:e=>s.get(e.toLowerCase()),byName:e=>c.get(e.toLowerCase())}}let Ve=typeof wrappedJSObject<`u`;function K(e){if(!e)return e;if(Ve&&(e=structuredClone(e)),delete e.tokens,e.skinTones){let t=e.skinTones.length;e.skins=Array(t);for(let n=0;n!(t in e[0])))throw Error(`Emoji data is in the wrong format`)}function Ge(e,t){if(Math.floor(e.status/100)!==2)throw Error(`Failed to fetch: `+t+`: `+e.status)}async function Ke(e){let t=await fetch(e,{method:`HEAD`});Ge(t,e);let n=t.headers.get(`etag`);return He(n),n}async function q(e){let t=await fetch(e);Ge(t,e);let n=t.headers.get(`etag`);He(n);let r=await t.json();return We(r),[n,r]}function qe(e){for(var t=``,n=new Uint8Array(e),r=n.byteLength,i=-1;++i(this._ready||=this._init(),this._ready);await e(),this._db||await e()}async getEmojiByGroup(e){return D(e),await this.ready(),fe(await Ae(this._db,e)).map(K)}async getEmojiBySearchQuery(e){E(e),await this.ready();let t=this._custom.search(e),n=fe(await je(this._db,e)).map(K);return[...t,...n]}async getEmojiByShortcode(e){return E(e),await this.ready(),this._custom.byShortcode(e)||K(await Me(this._db,e))}async getEmojiByUnicodeOrName(e){return E(e),await this.ready(),this._custom.byName(e)||K(await Ne(this._db,e))}async getPreferredSkinTone(){return await this.ready(),await G(this._db,k,le)||0}async setPreferredSkinTone(e){return D(e),await this.ready(),Pe(this._db,k,le,e)}async incrementFavoriteEmojiCount(e){return E(e),await this.ready(),Fe(this._db,e)}async getTopFavoriteEmoji(e){return D(e),await this.ready(),(await Ie(this._db,this._custom,e)).map(K)}set customEmoji(e){this._custom=Be(e)}get customEmoji(){return this._custom.all}async _shutdown(){await this.ready();try{await this._lazyUpdate}catch{}}_clear(){this._db=this._ready=this._lazyUpdate=void 0}async close(){await this._shutdown(),await V(this._dbName)}async delete(){await this._shutdown(),await _e(this._dbName)}};let J=[[-1,`✨`,`custom`],[0,`😀`,`smileys-emotion`],[1,`👋`,`people-body`],[3,`🐱`,`animals-nature`],[4,`🍎`,`food-drink`],[5,`🏠️`,`travel-places`],[6,`⚽`,`activities`],[7,`📝`,`objects`],[8,`⛔️`,`symbols`],[9,`🏁`,`flags`]].map(([e,t,n])=>({id:e,emoji:t,name:n})),et=J.slice(1),tt=typeof requestIdleCallback==`function`?requestIdleCallback:setTimeout;function nt(e){return e.unicode.includes(`‍`)}let rt={"🫪":17,"🫩":16,"🫨":15.1,"🫠":14,"🥲":13.1,"🥻":12.1,"🥰":11,"🤩":5,"👱‍♀️":4,"🤣":3,"👁️‍🗨️":2,"😀":1,"😐️":.7,"😃":.6},it=[`😊`,`😒`,`❤️`,`👍️`,`😍`,`😂`,`😭`,`☺️`,`😔`,`😩`,`😏`,`💕`,`🙌`,`😘`],at=`"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif`,ot=(e,t)=>et?1:0,st=(e,t)=>{let n=document.createElement(`canvas`);n.width=n.height=1;let r=n.getContext(`2d`,{willReadFrequently:!0});return r.textBaseline=`top`,r.font=`100px ${at}`,r.fillStyle=t,r.scale(.01,.01),r.fillText(e,0,0),r.getImageData(0,0,1,1).data},ct=(e,t)=>{let n=[...e].join(`,`);return n===[...t].join(`,`)&&!n.startsWith(`0,0,0,`)};function lt(e){let t=st(e,`#000`),n=st(e,`#fff`);return t&&n&&ct(t,n)}function ut(){let e=Object.entries(rt);try{for(let[t,n]of e)if(lt(t))return n}catch{}return e[0][1]}let dt,ft=()=>(dt||=new Promise(e=>tt(()=>e(ut()))),dt),pt=new Map;function mt(e,t){if(t===0)return e;let n=e.indexOf(`‍`);return n===-1?(e.endsWith(`️`)&&(e=e.substring(0,e.length-1)),e+`�d83c`+String.fromCodePoint(57339+t-1)):e.substring(0,n)+String.fromCodePoint(127995+t-1)+e.substring(n)}function Y(e){e.preventDefault(),e.stopPropagation()}function ht(e,t,n){return t+=e?-1:1,t<0?t=n.length-1:t>=n.length&&(t=0),t}function gt(e,t){let n=new Set,r=[];for(let i of e){let e=t(i);n.has(e)||(n.add(e),r.push(i))}return r}function _t(e,t){let n=e=>{let n={};for(let r of e)typeof r.tone==`number`&&r.version<=t&&(n[r.tone]=r.unicode);return n};return e.map(({unicode:e,skins:t,shortcodes:r,url:i,name:a,category:o,annotation:s})=>({unicode:e,name:a,shortcodes:r,url:i,category:o,annotation:s,id:e||a,skins:t&&n(t)}))}let X=requestAnimationFrame,vt=typeof ResizeObserver==`function`;function yt(e,t,n){let r;vt?(r=new ResizeObserver(n),r.observe(e)):X(n),t.addEventListener(`abort`,()=>{r&&r.disconnect()})}function bt(e){{let t=document.createRange();return t.selectNode(e.firstChild),t.getBoundingClientRect().width}}let xt;function St(e,t,n){let r=!0;for(let i of e){let e=n(i);if(!e)continue;let a=bt(e);xt===void 0&&(xt=bt(t));let o=a/1.8e)}function wt(e){e&&(e.scrollTop=0)}function Z(e,t,n){let r=e.get(t);return r||(r=n(),e.set(t,r)),r}function Tt(e){return``+e}function Et(e){let t=document.createElement(`template`);return t.innerHTML=e,t}let Dt=new WeakMap,Ot=new WeakMap,kt=Symbol(`un-keyed`),At=`replaceChildren`in Element.prototype;function jt(e,t){At?e.replaceChildren(...t):(e.innerHTML=``,e.append(...t))}function Mt(e,t){let n=e.firstChild,r=0;for(;n;){if(t[r]!==n)return!0;n=n.nextSibling,r++}return r!==t.length}function Nt(e,t){let{targetNode:n}=t,{targetParentNode:r}=t,i=!1;r?i=Mt(r,e):(i=!0,t.targetNode=void 0,t.targetParentNode=r=n.parentNode),i&&jt(r,e)}function Pt(e,t){for(let n of t){let{targetNode:t,currentExpression:r,binding:{expressionIndex:i,attributeName:a,attributeValuePre:o,attributeValuePost:s}}=n,c=e[i];if(r!==c)if(n.currentExpression=c,a)if(c===null)t.removeAttribute(a);else{let e=o+Tt(c)+s;t.setAttribute(a,e)}else{let e;Array.isArray(c)?Nt(c,n):c instanceof Element?(e=c,t.replaceWith(e)):t.nodeValue=Tt(c),e&&(n.targetNode=e)}}}function Ft(e){let t=``,n=!1,r=!1,i=-1,a=new Map,o=[],s=0;for(let c=0,l=e.length;c`:n=!1,r=!1;break;case`=`:r=!0;break}let d=o[o.length-1],f=Z(a,d,()=>[]),p,m,h;if(r){let n=/(\S+)="?([^"=]*)$/.exec(u);p=n[1],m=n[2];let r=/^([^">]*)("?)/.exec(e[c+1]);h=r[1],t=t.slice(0,-1*n[0].length),s=r[0].length}else s=0;let g={attributeName:p,attributeValuePre:m,attributeValuePost:h,expressionIndex:c};f.push(g),!n&&!r&&(t+=` `)}return{template:Et(t),elementsToBindings:a}}function It(e,t,n){for(let r=0;rFt(e)),r=t.cloneNode(!0).content.firstElementChild,i=Lt(r,n);return function(e){return Pt(e,i),r}}function zt(e){let t=Z(Ot,e,()=>new Map),n=kt;function r(e,...r){return Z(Z(t,e,()=>new Map),n,()=>Rt(e))(r)}function i(e,t,r){return e.map((e,i)=>{let a=n;n=r(e);try{return t(e,i)}finally{n=a}})}return{map:i,html:r}}function Bt(e,t,n,r,i,a,o,s,c){let{labelWithSkin:l,titleForEmoji:u,unicodeWithSkin:d}=n,{html:f,map:p}=zt(t);function m(e,n,r){return p(e,(e,i)=>f``,e=>`${r}-${e.id}`)}let h=f`
${t.i18n.searchDescription}
${t.i18n.skinToneDescription}
${p(t.skinTones,(e,n)=>f`
${e}
`,e=>e)}
${p(t.currentEmojisWithCategories,(e,n)=>f`
${m(e.emojis,t.searchMode,`emo`)}
`,e=>e.category)}
`,g=(t,n)=>{for(let r of e.querySelectorAll(`[${t}]`))n(r,r.getAttribute(t))};if(c){e.appendChild(h);for(let e of[`click`,`focusout`,`input`,`keydown`,`keyup`])g(`data-on-${e}`,(t,n)=>{t.addEventListener(e,r[n])});g(`data-ref`,(e,t)=>{a[t]=e}),o.addEventListener(`abort`,()=>{e.removeChild(h)})}g(`data-action`,(e,t)=>{let n=s.get(t);n||s.set(t,n=new WeakSet),n.has(e)||(n.add(e),i[t](e))})}let Q=typeof queueMicrotask==`function`?queueMicrotask:e=>Promise.resolve().then(e);function Vt(e){let t=!1,n,r=new Map,i=new Set,a,o=()=>{if(t)return;let e=[...i];i.clear();try{for(let t of e)t()}finally{a=!1,i.size&&(a=!0,Q(o))}},s=new Proxy({},{get(e,t){if(n){let e=r.get(t);e||(e=new Set,r.set(t,e)),e.add(n)}return e[t]},set(e,t,n){if(e[t]!==n){e[t]=n;let s=r.get(t);if(s){for(let e of s)i.add(e);a||(a=!0,Q(o))}}return!0}});return e.addEventListener(`abort`,()=>{t=!0}),{state:s,createEffect:e=>{let t=()=>{let r=n;n=t;try{return e()}finally{n=r}};return t()}}}function Ht(e,t,n){if(e.length!==t.length)return!1;for(let r=0;r{i.disconnect()})),i.observe(e)}}let Gt=[],{assign:$}=Object;function Kt(e,t){let n={},r=new AbortController,i=r.signal,{state:a,createEffect:o}=Vt(i),s=new Map;$(a,{skinToneEmoji:void 0,i18n:void 0,database:void 0,customEmoji:void 0,customCategorySorting:void 0,emojiVersion:void 0}),$(a,t),$(a,{initialLoad:!0,currentEmojis:[],currentEmojisWithCategories:[],rawSearchText:``,searchText:``,searchMode:!1,activeSearchItem:-1,message:void 0,skinTonePickerExpanded:!1,skinTonePickerExpandedAfterAnimation:!1,currentSkinTone:0,activeSkinTone:0,skinToneButtonText:void 0,pickerStyle:void 0,skinToneButtonLabel:``,skinTones:[],currentFavorites:[],defaultFavoriteEmojis:void 0,numColumns:8,isRtl:!1,currentGroupIndex:0,groups:et,databaseLoaded:!1,activeSearchItemId:void 0}),o(()=>{a.currentGroup!==a.groups[a.currentGroupIndex]&&(a.currentGroup=a.groups[a.currentGroupIndex])});let c=t=>{e.getElementById(t).focus()},l=t=>e.getElementById(`emo-${t.id}`),u=(e,t)=>{n.rootElement.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))},d=(e,t)=>e.id===t.id,f=(e,t)=>{let{category:n,emojis:r}=e,{category:i,emojis:a}=t;return n===i?Ht(r,a,d):!1},p=e=>{Ht(a.currentEmojis,e,d)||(a.currentEmojis=e)},m=e=>{a.searchMode!==e&&(a.searchMode=e)},h=e=>{Ht(a.currentEmojisWithCategories,e,f)||(a.currentEmojisWithCategories=e)},g=(e,t)=>t&&e.skins&&e.skins[t]||e.unicode,ee={labelWithSkin:(e,t)=>Ct([e.name||g(e,t),e.annotation,...e.shortcodes||Gt].filter(Boolean)).join(`, `),titleForEmoji:e=>e.annotation||(e.shortcodes||Gt).join(`, `),unicodeWithSkin:g},te={onClickSkinToneButton:A,onEmojiClick:D,onNavClick:w,onNavKeydown:ce,onSearchKeydown:C,onSkinToneOptionsClick:k,onSkinToneOptionsFocusOut:N,onSkinToneOptionsKeydown:j,onSkinToneOptionsKeyup:M,onSearchInput:P},ne={calculateEmojiGridStyle:ie,updateOnIntersection:v},_=!0;o(()=>{Bt(e,a,ee,te,ne,n,i,s,_),_=!1}),a.emojiVersion||ft().then(e=>{e||(a.message=a.i18n.emojiUnsupportedMessage)}),o(()=>{async function e(){let e=!1,t=setTimeout(()=>{e=!0,a.message=a.i18n.loadingMessage},1e3);try{await a.database.ready(),a.databaseLoaded=!0}catch(e){console.error(e),a.message=a.i18n.networkErrorMessage}finally{clearTimeout(t),e&&(e=!1,a.message=``)}}a.database&&e()}),o(()=>{a.pickerStyle=` --num-groups: ${a.groups.length}; --indicator-opacity: ${a.searchMode?0:1}; --num-skintones: 6;`}),o(()=>{a.customEmoji&&a.database&&re()}),o(()=>{a.customEmoji&&a.customEmoji.length?a.groups!==J&&(a.groups=J):a.groups!==et&&(a.currentGroupIndex&&a.currentGroupIndex--,a.groups=et)}),o(()=>{async function e(){a.databaseLoaded&&(a.currentSkinTone=await a.database.getPreferredSkinTone())}e()}),o(()=>{a.skinTones=[,,,,,,].fill().map((e,t)=>mt(a.skinToneEmoji,t))}),o(()=>{a.skinToneButtonText=a.skinTones[a.currentSkinTone]}),o(()=>{a.skinToneButtonLabel=a.i18n.skinToneLabel.replace(`{skinTone}`,a.i18n.skinTones[a.currentSkinTone])}),o(()=>{async function e(){let{database:e}=a;a.defaultFavoriteEmojis=(await Promise.all(it.map(t=>e.getEmojiByUnicodeOrName(t)))).filter(Boolean)}a.databaseLoaded&&e()});function re(){let{customEmoji:e,database:t}=a,n=e||Gt;t.customEmoji!==n&&(t.customEmoji=n)}o(()=>{async function e(){re();let{database:e,defaultFavoriteEmojis:t,numColumns:n}=a;a.currentFavorites=await x(gt([...await e.getTopFavoriteEmoji(n),...t],e=>e.unicode||e.name).slice(0,n))}a.databaseLoaded&&a.defaultFavoriteEmojis&&e()});function ie(e){yt(e,i,()=>{{let e=getComputedStyle(n.rootElement),t=parseInt(e.getPropertyValue(`--num-columns`),10),r=e.getPropertyValue(`direction`)===`rtl`;a.numColumns=t,a.isRtl=r}})}function v(e){Wt(e,i,e=>{for(let{target:t,isIntersecting:n}of e)t.classList.toggle(`onscreen`,n)})}o(()=>{async function e(){let{searchText:e,currentGroup:t,databaseLoaded:n,customEmoji:r}=a;if(!n)a.currentEmojis=[],a.searchMode=!1;else if(e.length>=2){let t=await se(e);a.searchText===e&&(p(t),m(!0))}else{let{id:e}=t;if(e!==-1||r&&r.length){let t=await S(e);a.currentGroup.id===e&&(p(t),m(!1))}}}e()});let y=()=>{X(()=>wt(n.tabpanelElement))};o(()=>{let{currentEmojis:e,emojiVersion:t}=a,n=e.filter(e=>e.unicode).filter(e=>nt(e)&&!pt.has(e.unicode));!t&&n.length?(p(e),X(()=>ae(n))):(p(t?e:e.filter(oe)),y())});function ae(e){St(e,n.baselineEmoji,l)?y():a.currentEmojis=[...a.currentEmojis]}function oe(e){return!e.unicode||!nt(e)||pt.get(e.unicode)}async function b(e){let t=a.emojiVersion||await ft();return e.filter(({version:e})=>!e||e<=t)}async function x(e){return _t(e,a.emojiVersion||await ft())}async function S(e){return x(await b(e===-1?a.customEmoji:await a.database.getEmojiByGroup(e)))}async function se(e){return x(await b(await a.database.getEmojiBySearchQuery(e)))}o(()=>{}),o(()=>{function e(){let{searchMode:e,currentEmojis:t}=a;if(e)return[{category:``,emojis:t}];let n=new Map;for(let e of t){let t=e.category||``,r=n.get(t);r||(r=[],n.set(t,r)),r.push(e)}return[...n.entries()].map(([e,t])=>({category:e,emojis:t})).sort((e,t)=>a.customCategorySorting(e.category,t.category))}h(e())}),o(()=>{a.activeSearchItemId=a.activeSearchItem!==-1&&a.currentEmojis[a.activeSearchItem].id}),o(()=>{let{rawSearchText:e}=a;tt(()=>{a.searchText=(e||``).trim(),a.activeSearchItem=-1})});function C(e){if(!a.searchMode||!a.currentEmojis.length)return;let t=t=>{Y(e),a.activeSearchItem=ht(t,a.activeSearchItem,a.currentEmojis)};switch(e.key){case`ArrowDown`:return t(!1);case`ArrowUp`:return t(!0);case`Enter`:if(a.activeSearchItem===-1)a.activeSearchItem=0;else return Y(e),E(a.currentEmojis[a.activeSearchItem].id)}}function w(e){let{target:t}=e,r=t.closest(`.nav-button`);if(!r)return;let i=parseInt(r.dataset.groupId,10);n.searchElement.value=``,a.rawSearchText=``,a.searchText=``,a.activeSearchItem=-1,a.currentGroupIndex=a.groups.findIndex(e=>e.id===i)}function ce(e){let{target:t,key:n}=e,r=t=>{t&&(Y(e),t.focus())};switch(n){case`ArrowLeft`:return r(t.previousElementSibling);case`ArrowRight`:return r(t.nextElementSibling);case`Home`:return r(t.parentElement.firstElementChild);case`End`:return r(t.parentElement.lastElementChild)}}async function T(e){let t=await a.database.getEmojiByUnicodeOrName(e),n=[...a.currentEmojis,...a.currentFavorites].find(t=>t.id===e),r=n.unicode&&g(n,a.currentSkinTone);return await a.database.incrementFavoriteEmojiCount(e),{emoji:t,skinTone:a.currentSkinTone,...r&&{unicode:r},...n.name&&{name:n.name}}}async function E(e){let t=T(e);u(`emoji-click-sync`,t),u(`emoji-click`,await t)}function D(e){let{target:t}=e;t.classList.contains(`emoji`)&&(Y(e),E(t.id.substring(4)))}function O(e){a.currentSkinTone=e,a.skinTonePickerExpanded=!1,c(`skintone-button`),u(`skin-tone-change`,{skinTone:e}),a.database.setPreferredSkinTone(e)}function k(e){let{target:{id:t}}=e,n=t&&t.match(/^skintone-(\d)/);n&&(Y(e),O(parseInt(n[1],10)))}function A(e){a.skinTonePickerExpanded=!a.skinTonePickerExpanded,a.activeSkinTone=a.currentSkinTone,a.skinTonePickerExpanded&&(Y(e),X(()=>c(`skintone-list`)))}o(()=>{a.skinTonePickerExpanded?n.skinToneDropdown.addEventListener(`transitionend`,()=>{a.skinTonePickerExpandedAfterAnimation=!0},{once:!0}):a.skinTonePickerExpandedAfterAnimation=!1});function j(e){if(!a.skinTonePickerExpanded)return;let t=async t=>{Y(e),a.activeSkinTone=t};switch(e.key){case`ArrowUp`:return t(ht(!0,a.activeSkinTone,a.skinTones));case`ArrowDown`:return t(ht(!1,a.activeSkinTone,a.skinTones));case`Home`:return t(0);case`End`:return t(a.skinTones.length-1);case`Enter`:return Y(e),O(a.activeSkinTone);case`Escape`:return Y(e),a.skinTonePickerExpanded=!1,c(`skintone-button`)}}function M(e){if(a.skinTonePickerExpanded)switch(e.key){case` `:return Y(e),O(a.activeSkinTone)}}async function N(e){let{relatedTarget:t}=e;(!t||t.id!==`skintone-list`)&&(a.skinTonePickerExpanded=!1)}function P(e){a.rawSearchText=e.target.value}return{$set(e){$(a,e)},$destroy(){r.abort()}}}var qt={categoriesLabel:`Categories`,emojiUnsupportedMessage:`Your browser does not support color emoji.`,favoritesLabel:`Favorites`,loadingMessage:`Loading…`,networkErrorMessage:`Could not load emoji.`,regionLabel:`Emoji picker`,searchDescription:`When search results are available, press up or down to select and enter to choose.`,searchLabel:`Search`,searchResultsLabel:`Search results`,skinToneDescription:`When expanded, press up or down to select and enter to choose.`,skinToneLabel:`Choose a skin tone (currently {skinTone})`,skinTonesLabel:`Skin tones`,skinTones:[`Default`,`Light`,`Medium-Light`,`Medium`,`Medium-Dark`,`Dark`],categories:{custom:`Custom`,"smileys-emotion":`Smileys and emoticons`,"people-body":`People and body`,"animals-nature":`Animals and nature`,"food-drink":`Food and drink`,"travel-places":`Travel and places`,activities:`Activities`,objects:`Objects`,symbols:`Symbols`,flags:`Flags`}},Jt=`:host{--emoji-size:1.375rem;--emoji-padding:0.5rem;--category-emoji-size:var(--emoji-size);--category-emoji-padding:var(--emoji-padding);--indicator-height:3px;--input-border-radius:0.5rem;--input-border-size:1px;--input-font-size:1rem;--input-line-height:1.5;--input-padding:0.25rem;--num-columns:8;--outline-size:2px;--border-size:1px;--border-radius:0;--skintone-border-radius:1rem;--category-font-size:1rem;display:flex;width:min-content;height:400px}:host,:host(.light){color-scheme:light;--background:#fff;--border-color:#e0e0e0;--indicator-color:#385ac1;--input-border-color:#999;--input-font-color:#111;--input-placeholder-color:#999;--outline-color:#999;--category-font-color:#111;--button-active-background:#e6e6e6;--button-hover-background:#d9d9d9}:host(.dark){color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}@media (prefers-color-scheme:dark){:host{color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}}:host([hidden]){display:none}button{margin:0;padding:0;border:0;background:0 0;box-shadow:none;-webkit-tap-highlight-color:transparent}button::-moz-focus-inner{border:0}input{padding:0;margin:0;line-height:1.15;font-family:inherit}input[type=search]{-webkit-appearance:none}:focus{outline:var(--outline-color) solid var(--outline-size);outline-offset:calc(-1*var(--outline-size))}:host([data-js-focus-visible]) :focus:not([data-focus-visible-added]){outline:0}:focus:not(:focus-visible){outline:0}.hide-focus{outline:0}*{box-sizing:border-box}.picker{contain:content;display:flex;flex-direction:column;background:var(--background);border:var(--border-size) solid var(--border-color);border-radius:var(--border-radius);width:100%;height:100%;overflow:hidden;--total-emoji-size:calc(var(--emoji-size) + (2 * var(--emoji-padding)));--total-category-emoji-size:calc(var(--category-emoji-size) + (2 * var(--category-emoji-padding)))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.hidden{opacity:0;pointer-events:none}.abs-pos{position:absolute;left:0;top:0}.gone{display:none!important}.skintone-button-wrapper,.skintone-list{background:var(--background);z-index:3}.skintone-button-wrapper.expanded{z-index:1}.skintone-list{position:absolute;inset-inline-end:0;top:0;z-index:2;overflow:visible;border-bottom:var(--border-size) solid var(--border-color);border-radius:0 0 var(--skintone-border-radius) var(--skintone-border-radius);will-change:transform;transition:transform .2s ease-in-out;transform-origin:center 0}@media (prefers-reduced-motion:reduce){.skintone-list{transition-duration:.001s}}@supports not (inset-inline-end:0){.skintone-list{right:0}}.skintone-list.no-animate{transition:none}.tabpanel{overflow-y:auto;scrollbar-gutter:stable;-webkit-overflow-scrolling:touch;will-change:transform;min-height:0;flex:1;contain:content}.emoji-menu{display:grid;grid-template-columns:repeat(var(--num-columns),var(--total-emoji-size));justify-content:space-around;align-items:flex-start;width:100%}.emoji-menu.visibility-auto{content-visibility:auto;contain-intrinsic-size:calc(var(--num-columns)*var(--total-emoji-size)) calc(var(--num-rows)*var(--total-emoji-size))}.category{padding:var(--emoji-padding);font-size:var(--category-font-size);color:var(--category-font-color)}.emoji,button.emoji{font-size:var(--emoji-size);display:flex;align-items:center;justify-content:center;border-radius:100%;height:var(--total-emoji-size);width:var(--total-emoji-size);line-height:1;overflow:hidden;font-family:var(--emoji-font-family);cursor:pointer}@media (hover:hover) and (pointer:fine){.emoji:hover,button.emoji:hover{background:var(--button-hover-background)}}.emoji.active,.emoji:active,button.emoji.active,button.emoji:active{background:var(--button-active-background)}.onscreen .custom-emoji::after{content:"";width:var(--emoji-size);height:var(--emoji-size);background-repeat:no-repeat;background-position:center center;background-size:contain;background-image:var(--custom-emoji-background)}.nav,.nav-button{align-items:center}.nav{display:grid;justify-content:space-between;contain:content}.nav-button{display:flex;justify-content:center}.nav-emoji{font-size:var(--category-emoji-size);width:var(--total-category-emoji-size);height:var(--total-category-emoji-size)}.indicator-wrapper{display:flex;border-bottom:1px solid var(--border-color)}.indicator{width:calc(100%/var(--num-groups));height:var(--indicator-height);opacity:var(--indicator-opacity);background-color:var(--indicator-color);will-change:transform,opacity;transition:opacity .1s linear,transform .25s ease-in-out}@media (prefers-reduced-motion:reduce){.indicator{will-change:opacity;transition:opacity .1s linear}}.pad-top,input.search{background:var(--background);width:100%}.pad-top{height:var(--emoji-padding);z-index:3}.search-row{display:flex;align-items:center;position:relative;padding-inline-start:var(--emoji-padding);padding-bottom:var(--emoji-padding)}.search-wrapper{flex:1;min-width:0}input.search{padding:var(--input-padding);border-radius:var(--input-border-radius);border:var(--input-border-size) solid var(--input-border-color);color:var(--input-font-color);font-size:var(--input-font-size);line-height:var(--input-line-height)}input.search::placeholder{color:var(--input-placeholder-color)}.favorites{overflow-y:auto;scrollbar-gutter:stable;display:flex;flex-direction:row;border-top:var(--border-size) solid var(--border-color);contain:content}.message{padding:var(--emoji-padding)}`;let Yt=[`customEmoji`,`customCategorySorting`,`database`,`dataSource`,`i18n`,`locale`,`skinToneEmoji`,`emojiVersion`],Xt=`:host{--emoji-font-family:${at}}`;var Zt=class extends HTMLElement{constructor(e){super(),this.attachShadow({mode:`open`});let t=document.createElement(`style`);t.textContent=Jt+Xt,this.shadowRoot.appendChild(t),this._ctx={locale:`en`,dataSource:`https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json`,skinToneEmoji:`🖐️`,customCategorySorting:ot,customEmoji:null,i18n:qt,emojiVersion:null,...e};for(let e of Yt)e!==`database`&&Object.prototype.hasOwnProperty.call(this,e)&&(this._ctx[e]=this[e],delete this[e]);this._dbFlush()}connectedCallback(){$t(this),this._cmp||=Kt(this.shadowRoot,this._ctx)}disconnectedCallback(){$t(this),Q(()=>{if(!this.isConnected&&this._cmp){this._cmp.$destroy(),this._cmp=void 0;let{database:e}=this._ctx;e.close().catch(e=>console.error(e))}})}static get observedAttributes(){return[`locale`,`data-source`,`skin-tone-emoji`,`emoji-version`]}attributeChangedCallback(e,t,n){this._set(e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase()),e===`emoji-version`?parseFloat(n):n)}_set(e,t){this._ctx[e]=t,this._cmp&&this._cmp.$set({[e]:t}),[`locale`,`dataSource`].includes(e)&&this._dbFlush()}_dbCreate(){let{locale:e,dataSource:t,database:n}=this._ctx;(!n||n.locale!==e||n.dataSource!==t)&&this._set(`database`,new $e({locale:e,dataSource:t}))}_dbFlush(){Q(()=>this._dbCreate())}};let Qt={};for(let e of Yt)Qt[e]={get(){return e===`database`&&this._dbCreate(),this._ctx[e]},set(t){if(e===`database`)throw Error(`database is read-only`);this._set(e,t)}};Object.defineProperties(Zt.prototype,Qt);function $t(e){e instanceof Zt||Object.setPrototypeOf(e,customElements.get(e.tagName.toLowerCase()).prototype)}customElements.get(`emoji-picker`)||customElements.define(`emoji-picker`,Zt);var en=class extends T{connect(){let e=this.element.querySelector(`emoji-picker`),t=e.shadowRoot;e.addEventListener(`focusout`,e=>e.stopPropagation()),this.element.addEventListener(`open`,()=>{t.querySelector(`input`)?.focus()})}};window.Stimulus.register(`emoji-picker`,en)})(); ================================================ FILE: resources/dist/global.css ================================================ :root,[data-theme=light]{--csstools-color-scheme--light:initial;--palette-bg-hsl:250 38% 98%;--palette-bg:hsl(var(--palette-bg-hsl));--palette-surface-hsl:255 100% 100%;--palette-surface:hsl(var(--palette-surface-hsl));--palette-text-hsl:0 0% 0%;--palette-text:hsl(var(--palette-text-hsl));--palette-muted-hsl:250 20% 50%;--palette-muted:hsl(var(--palette-muted-hsl));--palette-fill:hsl(var(--palette-muted-hsl)/0.1);--palette-fill-soft:hsl(var(--palette-muted-hsl)/0.05);--palette-stroke:hsl(var(--palette-muted-hsl)/0.25);--palette-emphasis:#2f3641;--palette-emphasis-contrast:#fff;--palette-accent-h:252;--palette-accent-s:93%;--palette-accent-l:58%;--palette-accent:hsl(var(--palette-accent-h) var(--palette-accent-s) var(--palette-accent-l));--palette-accent-contrast:#fff;--palette-accent-soft:hsl(var(--palette-accent-h) var(--palette-accent-s) 92%);--palette-accent-text:hsl(var(--palette-accent-h) var(--palette-accent-s) calc(var(--palette-accent-l)*0.9));--palette-danger-h:0;--palette-danger-s:100%;--palette-danger-l:38%;--palette-danger:hsl(var(--palette-danger-h) var(--palette-danger-s) var(--palette-danger-l));--palette-danger-contrast:#fff;--palette-danger-soft:hsl(var(--palette-danger-h) var(--palette-danger-s) 92%);--palette-danger-text:hsl(var(--palette-danger-h) var(--palette-danger-s) calc(var(--palette-danger-l)*0.9));--palette-warning-h:60;--palette-warning-s:100%;--palette-warning-l:45%;--palette-warning:hsl(var(--palette-warning-h) var(--palette-warning-s) var(--palette-warning-l));--palette-warning-contrast:hsl(var(--palette-warning-h) var(--palette-warning-s) 15%);--palette-warning-soft:hsl(var(--palette-warning-h) var(--palette-warning-s) 92%);--palette-warning-text:hsl(var(--palette-warning-h) var(--palette-warning-s) 24%);--palette-success-h:127;--palette-success-s:100%;--palette-success-l:27%;--palette-success:hsl(var(--palette-success-h) var(--palette-success-s) var(--palette-success-l));--palette-success-contrast:#fff;--palette-success-soft:hsl(var(--palette-success-h) var(--palette-success-s) 92%);--palette-success-text:hsl(var(--palette-success-h) var(--palette-success-s) calc(var(--palette-success-l)*0.9));--palette-activity-h:23;--palette-activity-s:100%;--palette-activity-l:45%;--palette-activity:hsl(var(--palette-activity-h) var(--palette-activity-s) var(--palette-activity-l));--palette-activity-contrast:#fff;--palette-activity-soft:hsl(var(--palette-activity-h) var(--palette-activity-s) 92%);--palette-activity-text:hsl(var(--palette-activity-h) var(--palette-activity-s) calc(var(--palette-activity-l)*0.9));color-scheme:light}[data-theme=dark]{--csstools-color-scheme--light: ;--palette-bg-hsl:250 20% 8%;--palette-surface-hsl:250 20% 12%;--palette-text-hsl:250 20% 93%;--palette-muted-hsl:250 20% 60%;--palette-accent-soft:hsl(var(--palette-accent-h) var(--palette-accent-s) 20%);--palette-accent-text:hsl(var(--palette-accent-h) var(--palette-accent-s) calc(var(--palette-accent-l)*1.3));--palette-danger-soft:hsl(var(--palette-danger-h) var(--palette-danger-s) 10%);--palette-danger-text:hsl(var(--palette-danger-h) var(--palette-danger-s) calc(var(--palette-danger-l)*1.3));--palette-warning-soft:hsl(var(--palette-warning-h) var(--palette-warning-s) 10%);--palette-warning-text:hsl(var(--palette-warning-h) var(--palette-warning-s) 40%);--palette-success-soft:hsl(var(--palette-success-h) var(--palette-success-s) 10%);--palette-success-text:hsl(var(--palette-success-h) var(--palette-success-s) calc(var(--palette-success-l)*1.3));--palette-activity-soft:hsl(var(--palette-activity-h) var(--palette-activity-s) 10%);--palette-activity-text:hsl(var(--palette-activity-h) var(--palette-activity-s) calc(var(--palette-activity-l)*1.3));color-scheme:dark}:root{--shadow-sm:0 1px 4px var(--palette-fill);--shadow-md:0 0 0 1px var(--palette-fill),0 5px 15px var(--palette-stroke);--color-overlay:rgba(0,0,0,.5);--filter-hover:brightness(0.95);--filter-active:brightness(0.9);--ratio:1.5;--space-px:1px;--space-xxs:calc(var(--space-xs)/var(--ratio));--space-xs:calc(var(--space-sm)/var(--ratio));--space-sm:calc(var(--space-md)/var(--ratio));--space-md:1rem;--space-lg:calc(var(--space-md)*var(--ratio));--space-xl:calc(var(--space-lg)*var(--ratio));--space-xxl:calc(var(--space-xl)*var(--ratio));--space-xxxl:calc(var(--space-xxl)*var(--ratio));--space-gutter:max(var(--space-lg),min(3vw,var(--space-xl)));--font-system:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;--font-text:var(--font-system);--font-display:var(--font-text);--font-mono:SFMono-Regular,Menlo,Monaco,Consolas,"Courier New",monospace;--weight-normal:400;--weight-medium:500;--weight-bold:600;--line-height-default:1.3;--line-height-condensed:1.2;--line-height-expanded:1.5;--measure:92ch;--z-index-header:100;--z-index-overlay:200;--z-index-alerts:300;--text-xxs:0.8rem;--text-xs:0.875rem;--text-sm:1rem;--text-md:1.125rem;--text-lg:1.5rem;--text-xl:2rem;--text-xxl:2.5rem;--radius:10px;--control-height:2.5em;--control-height-small:2.3em;--control-radius:var(--radius);--header-height:4rem}.menu,:root{--color-bg:var(--palette-bg);--color-surface:var(--palette-surface);--color-text:var(--palette-text);--color-muted:var(--palette-muted);--color-fill:var(--palette-fill);--color-fill-soft:var(--palette-fill-soft);--color-stroke:var(--palette-stroke);--color-emphasis:var(--palette-emphasis);--color-emphasis-contrast:var(--palette-emphasis-contrast);--color-accent:var(--palette-accent);--color-accent-contrast:var(--palette-accent-contrast);--color-accent-soft:var(--palette-accent-soft);--color-accent-text:var(--palette-accent-text);--color-danger:var(--palette-danger);--color-danger-contrast:var(--palette-danger-contrast);--color-danger-soft:var(--palette-danger-soft);--color-danger-text:var(--palette-danger-text);--color-warning:var(--palette-warning);--color-warning-contrast:var(--palette-warning-contrast);--color-warning-soft:var(--palette-warning-soft);--color-warning-text:var(--palette-warning-text);--color-success:var(--palette-success);--color-success-contrast:var(--palette-success-contrast);--color-success-soft:var(--palette-success-soft);--color-success-text:var(--palette-success-text);--color-activity:var(--palette-activity);--color-activity-contrast:var(--palette-activity-contrast);--color-activity-soft:var(--palette-activity-soft);--color-activity-text:var(--palette-activity-text)}*,:after,:before{box-sizing:border-box;margin:0}button,input,select,textarea{font:inherit}[hidden]{display:none!important}[role=list]{list-style:none;padding:0}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:inherit;cursor:pointer;margin:0;padding:0}@media (prefers-reduced-motion:reduce){*,:after,:before{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}:root{scroll-behavior:auto}html{background:#f9f8fc;background:var(--color-bg);color:#000;color:var(--color-text);font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--font-text);font-size:1rem;font-size:var(--text-sm);line-height:1.3;line-height:var(--line-height-default)}@media (max-width:40rem){html{font-size:95%}}input,select,textarea{color:#000;color:var(--color-text)}*{word-wrap:anywhere;-webkit-tap-highlight-color:transparent}.link,a{color:#4013f6;color:var(--color-accent-text);cursor:pointer;-webkit-text-decoration:none;text-decoration:none}.link:hover,a:not(.does-not-exist):hover{-webkit-text-decoration:underline;text-decoration:underline}hr{border:0;border-top:1px solid rgba(110,102,153,.25);border-top:1px solid var(--color-stroke);margin:2.25rem 0;margin:var(--space-xl) 0}mark,strong{font-weight:600;font-weight:var(--weight-bold)}mark{background:transparent;color:#4013f6;color:var(--color-accent-text)}code,pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--font-mono)}:focus{outline:2px solid #5830f8;outline:2px solid var(--color-accent);outline-offset:2px}[tabindex="-1"]:focus{outline:none}:focus:not(:focus-visible){outline:none}.waterhole{align-items:stretch;min-height:100vh;min-height:100svh}.waterhole,.waterhole__main{display:flex;flex-direction:column}.waterhole__main{flex-grow:1}.waterhole__main :not(textarea){scroll-margin-top:4rem;scroll-margin-top:var(--header-height)}@media (prefers-reduced-motion:no-preference){ui-popup>.enter-active,ui-popup>.leave-active{transition:transform .15s,opacity .15s}ui-popup>.enter-from,ui-popup>.leave-to{opacity:0;transform:scale(0)}ui-popup::part(backdrop),ui-popup>:nth-child(2){z-index:200;z-index:var(--z-index-overlay)}}[data-placement=bottom]{transform-origin:top center}[data-placement=bottom-start]{transform-origin:top left}[data-placement=bottom-end]{transform-origin:top right}[data-placement=top]{transform-origin:bottom center}[data-placement=top-start]{transform-origin:bottom left}[data-placement=top-end]{transform-origin:bottom right}[data-placement=left]{transform-origin:right center}[data-placement=left-start]{transform-origin:right top}[data-placement=left-end]{transform-origin:right bottom}[data-placement=right]{transform-origin:left center}[data-placement=right-start]{transform-origin:left top}[data-placement=right-end]{transform-origin:left bottom}[data-placement^=top]{margin-top:-.44444rem;margin-top:calc(var(--space-xs)*-1)}[data-placement^=bottom]{margin-top:.44444rem;margin-top:var(--space-xs)}[data-placement^=left]{margin-left:-.44444rem;margin-left:calc(var(--space-xs)*-1)}[data-placement^=right]{margin-left:.44444rem;margin-left:var(--space-xs)}.h1,.h2,.h3,h1,h2,h3{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--font-display)}.h4,.h5,.h6,h4,h5,h6{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--font-text)}.h1,h1{font-size:2.5rem;font-size:var(--text-xxl)}.h1,.h2,h1,h2{font-weight:600;font-weight:var(--weight-bold);line-height:1.2;line-height:var(--line-height-condensed)}.h2,h2{font-size:2rem;font-size:var(--text-xl)}.h3,h3{font-size:1.5rem;font-size:var(--text-lg)}.h3,.h4,h3,h4{font-weight:600;font-weight:var(--weight-bold)}.h4,h4{font-size:1.125rem;font-size:var(--text-md)}.h5,h5{font-size:1rem;font-size:var(--text-sm)}.h5,.h6,h5,h6{font-weight:600;font-weight:var(--weight-bold)}.h6,h6{font-size:.875rem;font-size:var(--text-xs)}.subtitle{color:#6e6699;color:var(--color-muted);font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--font-text);font-size:.8rem;font-size:var(--text-xxs);font-weight:500;font-weight:var(--weight-medium);text-transform:uppercase}.lead{font-size:1.125rem;font-size:var(--text-md)}.content,.lead{line-height:1.5;line-height:var(--line-height-expanded)}.content{word-wrap:break-word}:where(.content) li p,:where(.content)>*+*{margin-top:1em}:where(.content)>*+h1{margin-top:1.8em}:where(.content)>*+h2{margin-top:1.8em}:where(.content)>*+h3{margin-top:1.8em}:where(.content)>*+h4{margin-top:1.8em}:where(.content)>*+h5{margin-top:1.8em}:where(.content)>*+h6{margin-top:1.8em}:where(.content) a{-webkit-text-decoration:underline;text-decoration:underline}:where(.content) ol{list-style-position:outside;padding-left:2em}:where(.content) ul{list-style:disc outside;padding-left:2em}:where(.content) ul ul{list-style-type:circle}:where(.content) ul ul ul{list-style-type:square}:where(.content) blockquote{border-left:5px solid rgba(110,102,153,.1);border-left:5px solid var(--color-fill);color:#6e6699;color:var(--color-muted);padding-left:1rem;padding-left:var(--space-md)}:where(.content) blockquote>*+*{margin-top:1em}:where(.content) figcaption{color:#6e6699;color:var(--color-muted);font-size:90%}:where(.content) code{background:rgba(110,102,153,.05);background:var(--color-fill-soft);border-radius:4px;color:#4013f6;color:var(--color-accent-text);font-family:SFMono-Regular,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--font-mono);font-size:80%;padding:3px}:where(.content) pre code{background:rgba(110,102,153,.1);background:var(--color-fill);border-radius:10px;border-radius:var(--radius);color:inherit;display:block;overflow:auto;padding:1rem!important;padding:var(--space-md)!important}:where(.content) img:not([class]){height:auto;max-width:100%}:where(.content) video:not([class]){height:auto;max-width:100%}:where(.content) hr:not([class]){border:0;border-top:3px solid rgba(110,102,153,.25);border-top:3px solid var(--color-stroke);margin:2em 0}:where(.content--compact)>*+*{margin-top:1em}:where(.content--compact) h1,:where(.content--compact) h2,:where(.content--compact) h3,:where(.content--compact) h4,:where(.content--compact) h5,:where(.content--compact) h6{font-size:100%}.alert{align-items:flex-start;background:rgba(110,102,153,.1);background:var(--color-fill);border-radius:10px;border-radius:var(--radius);display:flex;font-size:.875rem;font-size:var(--text-xs);gap:.66667rem;gap:var(--space-sm);line-height:1.5;line-height:var(--line-height-expanded);padding:.66667rem 1rem;padding:var(--space-sm) var(--space-md)}.alert__icon{display:flex;font-size:1.125rem;font-size:var(--text-md);line-height:1.3;line-height:var(--line-height-default)}.alert__message{flex-grow:1;min-width:0}.alert__actions{margin-bottom:-.44444rem;margin-bottom:calc(var(--space-xs)*-1);margin-left:auto;margin-right:-.66667rem;margin-right:calc(var(--space-sm)*-1);margin-top:-.44444rem;margin-top:calc(var(--space-xs)*-1)}.alert__actions,.alerts{align-items:center;display:flex;gap:.66667rem;gap:var(--space-sm)}.alerts{flex-direction:column;left:0;padding:.66667rem;padding:var(--space-sm);pointer-events:none;position:fixed;right:0;top:0;z-index:300;z-index:var(--z-index-alerts)}.alerts>*{box-shadow:0 0 0 1px rgba(110,102,153,.1),0 5px 15px rgba(110,102,153,.25);box-shadow:var(--shadow-md);pointer-events:auto}@media (max-width:40rem){.alerts{align-items:stretch;bottom:0;top:auto}}@media (min-width:40.001rem){.alerts>*{max-width:50ch}}:root{--attribution-avatar-size:2.5em}.attribution{padding-left:calc(2.5em + 1rem);padding-left:calc(var(--attribution-avatar-size) + var(--space-md))}.attribution .avatar{height:2.5em;height:var(--attribution-avatar-size);margin-left:calc(-2.5em + -1rem);margin-left:calc((var(--attribution-avatar-size) + var(--space-md))*-1);position:absolute;width:2.5em;width:var(--attribution-avatar-size)}.attribution__link{color:inherit;font-weight:500;font-weight:var(--weight-medium);margin-right:.2963rem;margin-right:var(--space-xxs);-webkit-text-decoration:none!important;text-decoration:none!important}.attribution__link:hover .attribution__name{-webkit-text-decoration:underline;text-decoration:underline}.attribution__info{color:#6e6699;color:var(--color-muted);display:block;font-size:.875rem;font-size:var(--text-xs);margin-top:.2963rem;margin-top:var(--space-xxs)}.attribution__info>*+:before{content:" \00B7 "}.avatar{aspect-ratio:1;background:rgba(110,102,153,.25);background:var(--color-stroke);border-radius:100%;height:100%;width:100%}.avatar text{fill:#f9f8fc;fill:var(--color-bg);font-size:50px}.badge,.tag{align-items:center;background:rgba(110,102,153,.1);background:var(--color-fill);border:0;border-radius:999px;color:#6e6699;color:var(--color-muted);display:inline-flex;flex-shrink:0;font-size:.8rem;font-size:var(--text-xxs);font-weight:500;font-weight:var(--weight-medium);justify-content:center;line-height:1.2;margin:0;min-height:1.7em;min-width:2.5ch;overflow:hidden;padding:0 .6em;text-align:center;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.badge>.icon:first-child,.tag>.icon:first-child{margin-left:-.2em;margin-right:.2em}.badge .icon,.tag .icon{stroke-width:2}.group-badge{background-color:rgba(110,102,153,.1);background-color:var(--group-color,var(--color-fill));color:#6e6699;color:var(--group-color-constrast,var(--color-muted))}.badge--hidden{background-color:transparent;border:1px dashed rgba(110,102,153,.25);border:1px dashed var(--color-stroke)}.suspended-badge{background:#6e6699;background:var(--color-muted);color:#f9f8fc;color:var(--color-bg)}.tag{border-radius:4px;font-size:.875rem;font-size:var(--text-xs);font-weight:400;padding:0 .5em}.block-link{border-radius:10px;border-radius:var(--radius);color:inherit;display:block;padding:1rem;padding:var(--space-md);-webkit-text-decoration:none!important;text-decoration:none!important}.block-link:hover{background:rgba(110,102,153,.1);background:var(--color-fill)}.block-link:active{filter:brightness(.9);filter:var(--filter-active)}.breadcrumb{color:#6e6699;color:var(--color-muted);list-style:none;padding:0}.breadcrumb>*{display:inline}.breadcrumb>*+:before{color:#6e6699;color:var(--color-muted);content:"\203A";margin:0 .2963rem;margin:0 var(--space-xxs)}.breadcrumb [aria-current=page],.btn{color:#000;color:var(--color-text)}.btn{--btn-height:var(--control-height);--btn-padding:calc(var(--btn-height)*0.4);align-items:center;background:rgba(110,102,153,.1);background:var(--color-fill);border:0;border-radius:10px;border-radius:var(--control-radius);display:inline-flex;flex-shrink:0;font-weight:500;font-weight:var(--weight-medium);gap:.2963rem;gap:var(--space-xxs);height:2.5em;height:var(--btn-height);justify-content:center;margin:0;padding:0 1em;padding:0 var(--btn-padding);-webkit-text-decoration:none!important;text-decoration:none!important;vertical-align:middle;white-space:nowrap}.btn.is-disabled,.btn:disabled{cursor:default;opacity:.5}.btn.is-inert{cursor:default}.btn:not(:disabled):not(.is-disabled):not(.is-inert){cursor:pointer}.btn.is-focused:not(:disabled):not(.is-disabled):not(.is-inert),.btn.is-hovered:not(:disabled):not(.is-disabled):not(.is-inert),.btn:not(:disabled):not(.is-disabled):not(.is-inert):focus,.btn:not(:disabled):not(.is-disabled):not(.is-inert):hover,.btn[aria-selected=true]:not(:disabled):not(.is-disabled):not(.is-inert){filter:brightness(.95);filter:var(--filter-hover)}.btn:not(:disabled):not(.is-disabled):not(.is-inert):active{filter:brightness(.9);filter:var(--filter-active);transform:scale(.97)}.btn--outline{background:transparent;border:1px solid rgba(110,102,153,.25);border:1px solid var(--color-stroke);color:#6e6699;color:var(--color-muted)}.btn--outline:hover:not(:disabled):not(.is-disabled):not(.is-inert){background:#f9f8fc;background:var(--color-bg)}.btn--transparent:disabled{background:transparent;color:#6e6699;color:var(--color-muted)}.btn--transparent.is-disabled,.btn--transparent:not(button):not(a):not([role=button]):not([role=link]),:where(:not([open]))>.btn--transparent:where(:not(:hover):not(.is-hovered):not(:focus):not(.is-focused)){background:transparent;color:#6e6699;color:var(--color-muted)}.btn--sm{--btn-height:var(--control-height-small);font-size:87.5%}.btn--narrow,.btn--sm{--btn-padding:calc(var(--btn-height)*0.3)}.btn--wide{--btn-padding:calc(var(--btn-height)*0.5)}.btn--start{margin-left:calc(var(--btn-padding)*-1)}.btn--end{margin-right:calc(var(--btn-padding)*-1)}.btn--icon{border-radius:100px;padding:0;position:relative;width:var(--btn-height)}.btn--icon .avatar{height:100%;width:100%}.btn--icon .icon{font-size:120%}.btn--icon .badge{position:absolute;right:0;top:0}.btn--icon .label{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}.btn.is-active,.btn[aria-pressed=true],:checked+.btn{background:#dfd8fe!important;background:var(--color-accent-soft)!important;border-color:transparent;color:#4013f6!important;color:var(--color-accent-text)!important}.btn-group{align-items:stretch;display:flex;gap:1px}.btn-group>:first-child:not(:only-child),.btn-group>:first-child:not(:only-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>:not(:first-child):not(:last-child),.btn-group>:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>:last-child:not(:only-child),.btn-group>:last-child:not(:only-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.card{--color-bg:var(--palette-surface);background:#fff;background:var(--color-bg);border-radius:10px;border-radius:var(--radius);box-shadow:0 1px 4px rgba(110,102,153,.1);box-shadow:var(--shadow-sm);overflow:clip}.card .card,.dialog .card{border:1px solid rgba(110,102,153,.1);border:1px solid var(--color-fill)}.card__header{background:#f9f8fc;background:var(--color-bg);border-radius:10px 10px 0 0;border-radius:var(--radius) var(--radius) 0 0;padding:.66667rem 1rem;padding:var(--space-sm) var(--space-md)}summary.card__header.is-disabled,summary.card__header:disabled{cursor:default;opacity:.5}summary.card__header.is-inert{cursor:default}summary.card__header:not(:disabled):not(.is-disabled):not(.is-inert){cursor:pointer}summary.card__header.is-focused:not(:disabled):not(.is-disabled):not(.is-inert),summary.card__header.is-hovered:not(:disabled):not(.is-disabled):not(.is-inert),summary.card__header:not(:disabled):not(.is-disabled):not(.is-inert):focus,summary.card__header:not(:disabled):not(.is-disabled):not(.is-inert):hover,summary.card__header[aria-selected=true]:not(:disabled):not(.is-disabled):not(.is-inert){filter:brightness(.95);filter:var(--filter-hover)}summary.card__header:not(:disabled):not(.is-disabled):not(.is-inert):active{filter:brightness(.9);filter:var(--filter-active);transform:scale(.97)}summary.card__header{outline:none!important;transform:none!important}summary.card__header::-webkit-details-marker,summary.card__header::marker{color:rgba(110,102,153,.25);color:var(--color-stroke);margin-right:.66667rem;margin-right:var(--space-sm)}summary.card__header:focus-visible{background:#dfd8fe;background:var(--color-accent-soft)}details.card:not([open]) .card__header{border-radius:10px;border-radius:var(--radius)}.card__body{padding:min(max(1.5rem,min(3vw,2.25rem)),1.5rem);padding:min(var(--space-gutter),var(--space-lg))}.card__row{padding:.66667rem 1rem;padding:var(--space-sm) var(--space-md)}:not(.divider)+.card__row{border-top:1px solid rgba(110,102,153,.1);border-top:1px solid var(--color-fill)}.card-list>*{margin-bottom:1.5rem;margin-bottom:var(--space-lg)}@media (max-width:40rem){.container .card:not(.card .card){border-radius:0;margin-left:calc(-1 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))))!important;margin-left:calc(var(--space-gutter)*-1)!important;margin-right:calc(-1 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))))!important;margin-right:calc(var(--space-gutter)*-1)!important}.container .card:not(.card .card)>.card__header{border-radius:0}}.card:target,.card__row:target{background:#ffffd6;background:var(--color-warning-soft)}.channel-label{align-items:center;color:inherit;display:inline-flex;gap:.2963rem;gap:var(--space-xxs);-webkit-text-decoration:none;text-decoration:none;vertical-align:bottom}a.channel-label:hover>:last-child{-webkit-text-decoration:underline;text-decoration:underline}.channel-picker .menu-item{gap:1rem;gap:var(--space-md);padding:.66667rem 1rem;padding:var(--space-sm) var(--space-md)}.channel-picker .menu-item>.icon:first-child{font-size:1.5rem;font-size:var(--text-lg)}.channel-picker .menu-heading{padding-left:1rem;padding-left:var(--space-md);padding-right:1rem;padding-right:var(--space-md)}.channel-picker .menu-heading:not(:first-child){padding-top:1rem;padding-top:var(--space-md)}.choice{align-items:flex-start;cursor:pointer;display:flex;gap:.66667rem;gap:var(--space-sm)}.choice>:disabled+*{color:#6e6699;color:var(--color-muted)}.choice-indent{margin-left:calc(.66667rem + 1.2em);margin-left:calc(var(--space-sm) + 1.2em)}input[type=checkbox],input[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#f9f8fc;background-color:var(--color-bg);border:2px solid rgba(110,102,153,.25);border:2px solid var(--color-stroke);color:currentColor;cursor:pointer;flex-shrink:0;font:inherit;height:1.2em;margin:0;position:relative;vertical-align:-.2em;width:1.2em}input[type=checkbox]:checked,input[type=radio]:checked{border:0}input[type=checkbox]:checked:before,input[type=radio]:checked:before{background:#fff;background:var(--color-accent-contrast);content:"";left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}input[type=checkbox]:not(:disabled):not([aria-disabled=true]):active,input[type=radio]:not(:disabled):not([aria-disabled=true]):active{filter:brightness(.9);filter:var(--filter-active)}input[type=checkbox]:not(:disabled):not([aria-disabled=true]):checked,input[type=radio]:not(:disabled):not([aria-disabled=true]):checked{background:#5830f8;background:var(--color-accent)}input[aria-disabled=true][type=checkbox],input[aria-disabled=true][type=radio],input[type=checkbox]:disabled,input[type=radio]:disabled{background:rgba(110,102,153,.25);background:var(--color-stroke);border:0}input[aria-disabled=true][type=checkbox]:checked:before,input[aria-disabled=true][type=radio]:checked:before,input[type=checkbox]:disabled:checked:before,input[type=radio]:disabled:checked:before{background:#6e6699;background:var(--color-muted)}input[type=checkbox]{border-radius:.3em}input[type=checkbox]:checked:before{clip-path:polygon(14% 44%,0 65%,50% 100%,100% 16%,80% 0,43% 62%);height:60%;width:60%}input[type=radio]{border-radius:100%}input[type=radio]:checked:before{border-radius:100%;height:40%;width:40%}.color-picker__picker{border-radius:10px;border-radius:var(--radius);box-shadow:0 0 0 1px rgba(110,102,153,.1),0 5px 15px rgba(110,102,153,.25);box-shadow:var(--shadow-md);margin-top:6px;position:absolute;z-index:200;z-index:var(--z-index-overlay)}.color-picker__swatch,.swatch{border:1px solid rgba(0,0,0,.1);border:1px solid hsl(var(--palette-text-hsl)/.1);border-radius:4px;display:inline-block;height:1.5em;vertical-align:middle;width:1.5em}.combobox{position:relative}.combobox__list{left:0;max-width:none!important;position:absolute;top:100%;width:100%!important}.dialog{--color-bg:var(--palette-surface);background:#fff;background:var(--color-bg);border-radius:10px;border-radius:var(--radius);box-shadow:0 1px 4px rgba(110,102,153,.1);box-shadow:var(--shadow-sm);color:#000;color:var(--color-text);margin-left:auto;margin-right:auto;max-width:100%}.dialog__header{align-items:center;display:flex;gap:1rem;gap:var(--space-md);padding:2.25rem;padding:var(--space-xl);padding-bottom:0}.dialog__body{padding:2.25rem;padding:var(--space-xl)}.dialog--sm{width:45ch}@media (max-width:40rem){.dialog__body,.dialog__header{padding:max(1.5rem,min(3vw,2.25rem));padding:var(--space-gutter)}.dialog__header{padding-bottom:0}.container .dialog{border-radius:0;margin-left:calc(-1 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))))!important;margin-left:calc(var(--space-gutter)*-1)!important;margin-right:calc(-1 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))))!important;margin-right:calc(var(--space-gutter)*-1)!important;max-width:none;width:calc(100% + 2 * max(calc(1rem * 1.5), min(3vw, calc((1rem * 1.5) * 1.5))));width:calc(100% + 2 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))));width:calc(100% + var(--space-gutter)*2)}}.divider{align-items:center;color:#6e6699;color:var(--color-muted);display:flex;font-size:.8rem;font-size:var(--text-xxs);font-weight:600;font-weight:var(--weight-bold);padding:.44444rem 0;padding:var(--space-xs) 0;text-transform:uppercase}.divider:after,.divider:before{border-bottom:2px solid;content:"";flex-grow:1}.divider:not(:empty):before{margin-right:5px}.divider:not(:empty):after{margin-left:5px}.field{align-items:flex-start;-moz-column-gap:1rem;column-gap:1rem;-moz-column-gap:var(--space-md);column-gap:var(--space-md);display:flex;flex-wrap:wrap;row-gap:.44444rem;row-gap:var(--space-xs)}.field>:first-child:not(:only-child){flex-basis:20%;flex-grow:1;flex-shrink:0;min-width:15ch}.field>:nth-child(2){flex-basis:calc(80% - 1rem);flex-basis:calc(80% - var(--space-md));flex-grow:999;margin:0;min-width:0}.stacked-fields .field>:first-child{flex-basis:100%}.field__label{font-size:.875rem;font-size:var(--text-xs);font-weight:500;font-weight:var(--weight-medium)}.field__description,.field__status{color:#6e6699;color:var(--color-muted);font-size:.875rem;font-size:var(--text-xs)}.field__status{font-weight:500;font-weight:var(--weight-medium)}.has-error .field__status{color:#ad0000;color:var(--color-danger-text)} /*! Theme: GitHub Description: Light theme as seen on github.com Author: github.com Maintainer: @Hirse Updated: 2021-05-15 Outdated base version: https://github.com/primer/github-syntax-light Current colors taken from GitHub's CSS */:root .hljs,[data-theme=light] .hljs{color:#24292e}:root .hljs-doctag,:root .hljs-keyword,:root .hljs-meta .hljs-keyword,:root .hljs-template-tag,:root .hljs-template-variable,:root .hljs-type,:root .hljs-variable.language_,[data-theme=light] .hljs-doctag,[data-theme=light] .hljs-keyword,[data-theme=light] .hljs-meta .hljs-keyword,[data-theme=light] .hljs-template-tag,[data-theme=light] .hljs-template-variable,[data-theme=light] .hljs-type,[data-theme=light] .hljs-variable.language_{color:#d73a49}:root .hljs-title,:root .hljs-title.class_,:root .hljs-title.class_.inherited__,:root .hljs-title.function_,[data-theme=light] .hljs-title,[data-theme=light] .hljs-title.class_,[data-theme=light] .hljs-title.class_.inherited__,[data-theme=light] .hljs-title.function_{color:#6f42c1}:root .hljs-attr,:root .hljs-attribute,:root .hljs-literal,:root .hljs-meta,:root .hljs-number,:root .hljs-operator,:root .hljs-selector-attr,:root .hljs-selector-class,:root .hljs-selector-id,:root .hljs-variable,[data-theme=light] .hljs-attr,[data-theme=light] .hljs-attribute,[data-theme=light] .hljs-literal,[data-theme=light] .hljs-meta,[data-theme=light] .hljs-number,[data-theme=light] .hljs-operator,[data-theme=light] .hljs-selector-attr,[data-theme=light] .hljs-selector-class,[data-theme=light] .hljs-selector-id,[data-theme=light] .hljs-variable{color:#005cc5}:root .hljs-meta .hljs-string,:root .hljs-regexp,:root .hljs-string,[data-theme=light] .hljs-meta .hljs-string,[data-theme=light] .hljs-regexp,[data-theme=light] .hljs-string{color:#032f62}:root .hljs-built_in,:root .hljs-symbol,[data-theme=light] .hljs-built_in,[data-theme=light] .hljs-symbol{color:#e36209}:root .hljs-code,:root .hljs-comment,:root .hljs-formula,[data-theme=light] .hljs-code,[data-theme=light] .hljs-comment,[data-theme=light] .hljs-formula{color:#6a737d}:root .hljs-name,:root .hljs-quote,:root .hljs-selector-pseudo,:root .hljs-selector-tag,[data-theme=light] .hljs-name,[data-theme=light] .hljs-quote,[data-theme=light] .hljs-selector-pseudo,[data-theme=light] .hljs-selector-tag{color:#22863a}:root .hljs-subst,[data-theme=light] .hljs-subst{color:#24292e}:root .hljs-section,[data-theme=light] .hljs-section{color:#005cc5;font-weight:700}:root .hljs-bullet,[data-theme=light] .hljs-bullet{color:#735c0f}:root .hljs-emphasis,[data-theme=light] .hljs-emphasis{color:#24292e;font-style:italic}:root .hljs-strong,[data-theme=light] .hljs-strong{color:#24292e;font-weight:700}:root .hljs-addition,[data-theme=light] .hljs-addition{background-color:#f0fff4;color:#22863a}:root .hljs-deletion,[data-theme=light] .hljs-deletion{background-color:#ffeef0;color:#b31d28} /*! Theme: GitHub Dark Description: Dark theme as seen on github.com Author: github.com Maintainer: @Hirse Updated: 2021-05-15 Outdated base version: https://github.com/primer/github-syntax-dark Current colors taken from GitHub's CSS */[data-theme=dark] .hljs{color:#c9d1d9}[data-theme=dark] .hljs-doctag,[data-theme=dark] .hljs-keyword,[data-theme=dark] .hljs-meta .hljs-keyword,[data-theme=dark] .hljs-template-tag,[data-theme=dark] .hljs-template-variable,[data-theme=dark] .hljs-type,[data-theme=dark] .hljs-variable.language_{color:#ff7b72}[data-theme=dark] .hljs-title,[data-theme=dark] .hljs-title.class_,[data-theme=dark] .hljs-title.class_.inherited__,[data-theme=dark] .hljs-title.function_{color:#d2a8ff}[data-theme=dark] .hljs-attr,[data-theme=dark] .hljs-attribute,[data-theme=dark] .hljs-literal,[data-theme=dark] .hljs-meta,[data-theme=dark] .hljs-number,[data-theme=dark] .hljs-operator,[data-theme=dark] .hljs-selector-attr,[data-theme=dark] .hljs-selector-class,[data-theme=dark] .hljs-selector-id,[data-theme=dark] .hljs-variable{color:#79c0ff}[data-theme=dark] .hljs-meta .hljs-string,[data-theme=dark] .hljs-regexp,[data-theme=dark] .hljs-string{color:#a5d6ff}[data-theme=dark] .hljs-built_in,[data-theme=dark] .hljs-symbol{color:#ffa657}[data-theme=dark] .hljs-code,[data-theme=dark] .hljs-comment,[data-theme=dark] .hljs-formula{color:#8b949e}[data-theme=dark] .hljs-name,[data-theme=dark] .hljs-quote,[data-theme=dark] .hljs-selector-pseudo,[data-theme=dark] .hljs-selector-tag{color:#7ee787}[data-theme=dark] .hljs-subst{color:#c9d1d9}[data-theme=dark] .hljs-section{color:#1f6feb;font-weight:700}[data-theme=dark] .hljs-bullet{color:#f2cc60}[data-theme=dark] .hljs-emphasis{color:#c9d1d9;font-style:italic}[data-theme=dark] .hljs-strong{color:#c9d1d9;font-weight:700}[data-theme=dark] .hljs-addition{background-color:#033a16;color:#aff5b4}[data-theme=dark] .hljs-deletion{background-color:#67060c;color:#ffdcd7}.icon{stroke-width:1.5;display:inline-block;flex-shrink:0;height:1.2em;-o-object-fit:contain;object-fit:contain;vertical-align:-.2em;width:1.2em}.icon--thin{stroke-width:1}.icon--thick{stroke-width:2}.icon--narrow{margin-left:-.2em;margin-right:-.2em}.with-icon{align-items:baseline;display:inline-flex;vertical-align:baseline}.with-icon>.icon{align-self:center;margin-right:.2em}.with-icon>.icon:not(:first-child){margin-left:.2em}.icon-tabler-lock circle{display:none}.dot{background:currentColor;border-radius:100%;display:inline-block;height:10px;margin:.3em .1em;vertical-align:-5px;width:10px}.input,input:where([type=date],[type=datetime-local],[type=email],[type=file],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week]),select,textarea{-webkit-appearance:none;background:#f9f8fc;background:var(--color-bg);border:1px solid rgba(110,102,153,.25);border:1px solid var(--color-stroke);border-radius:10px;border-radius:var(--control-radius);box-sizing:border-box;color:#000;color:var(--color-text);display:block;height:2.5em;height:var(--control-height);padding:.55em .7em;width:100%}input:where([type=date],[type=datetime-local],[type=email],[type=file],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week]):not(.does-not-exist):focus{border-color:#5830f8;border-color:var(--color-accent);box-shadow:inset 0 0 0 1px #5830f8;box-shadow:inset 0 0 0 1px var(--color-accent);outline:none}input:where([type=date],[type=datetime-local],[type=email],[type=file],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week]):not(.does-not-exist):focus-within{border-color:#5830f8;border-color:var(--color-accent);box-shadow:inset 0 0 0 1px #5830f8;box-shadow:inset 0 0 0 1px var(--color-accent);outline:none}textarea:not(.does-not-exist):focus-within{border-color:#5830f8;border-color:var(--color-accent);box-shadow:inset 0 0 0 1px #5830f8;box-shadow:inset 0 0 0 1px var(--color-accent);outline:none}select:not(.does-not-exist):focus-within{border-color:#5830f8;border-color:var(--color-accent);box-shadow:inset 0 0 0 1px #5830f8;box-shadow:inset 0 0 0 1px var(--color-accent);outline:none}.input:focus-within{border-color:#5830f8;border-color:var(--color-accent);box-shadow:inset 0 0 0 1px #5830f8;box-shadow:inset 0 0 0 1px var(--color-accent);outline:none}.input:focus,select:not(.does-not-exist):focus,textarea:not(.does-not-exist):focus{border-color:#5830f8;border-color:var(--color-accent);box-shadow:inset 0 0 0 1px #5830f8;box-shadow:inset 0 0 0 1px var(--color-accent);outline:none}input:where([type=date],[type=datetime-local],[type=email],[type=file],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week]):not(.does-not-exist):disabled{background:rgba(110,102,153,.1);background:var(--color-fill)}.input:disabled,select:not(.does-not-exist):disabled,textarea:not(.does-not-exist):disabled{background:rgba(110,102,153,.1);background:var(--color-fill)}.has-error input:where([type=date],[type=datetime-local],[type=email],[type=file],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week]):not(.does-not-exist){border-color:#c20000;border-color:var(--color-danger)}.has-error .input,.has-error select:not(.does-not-exist),.has-error textarea:not(.does-not-exist){border-color:#c20000;border-color:var(--color-danger)}input[type=file]{overflow:hidden}input[type=file]:not(:disabled):not([readonly]){cursor:pointer}input[type=file]::file-selector-button{background:none;border:0;color:#4013f6;color:var(--color-accent-text);font-weight:600;font-weight:var(--weight-bold);margin:0;padding:0 1rem 0 0;padding:0 var(--space-md) 0 0;pointer-events:none;width:auto}::-moz-placeholder{color:#6e6699;color:var(--color-muted)}::placeholder{color:#6e6699;color:var(--color-muted)}.textarea,select[multiple],textarea{border-radius:10px;border-radius:var(--radius);height:auto;padding:.7rem}.select,select:not([multiple]){background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='%23888'%3E%3Cpath fill-rule='evenodd' d='M10 3a1 1 0 0 1 .707.293l3 3a1 1 0 0 1-1.414 1.414L10 5.414 7.707 7.707a1 1 0 0 1-1.414-1.414l3-3A1 1 0 0 1 10 3zm-3.707 9.293a1 1 0 0 1 1.414 0L10 14.586l2.293-2.293a1 1 0 0 1 1.414 1.414l-3 3a1 1 0 0 1-1.414 0l-3-3a1 1 0 0 1 0-1.414z' clip-rule='evenodd'/%3E%3C/svg%3E");background-position:center right .5em;background-repeat:no-repeat;background-size:1.25em;cursor:default;padding-right:2em}:invalid+.hide-if-invalid{visibility:hidden}.input-container{--input-container-padding-start:2.6em;--input-container-padding-end:2.6em;align-items:center;display:flex}.input-container>:not(input):not(.input):not(select):not(script){align-items:center;display:flex;justify-content:center;position:relative}.input-container>:not(input):not(.input):not(select):not(script):first-child{margin-right:calc(var(--input-container-padding-start)*-1);width:var(--input-container-padding-start)}.input-container>:not(input):not(.input):not(select):not(script):last-child{margin-left:calc(var(--input-container-padding-end)*-1);width:var(--input-container-padding-end)}.input-container>.input:nth-child(2),.input-container>input:not(.does-not-exist):nth-child(2),.input-container>select:not(.does-not-exist):nth-child(2){padding-left:var(--input-container-padding-start)}.input-container>.input:nth-last-child(2),.input-container>input:not(.does-not-exist):nth-last-child(2),.input-container>select:not(.does-not-exist):nth-last-child(2){padding-right:var(--input-container-padding-end)}.mention{border-radius:10px;border-radius:var(--radius);color:inherit;font-weight:600;font-weight:var(--weight-bold)}.mention--self{background:#ffffd6;background:var(--color-warning-soft);border-radius:4px;color:#7a7a00;color:var(--color-warning-text);margin:-2px;padding:2px}.menu{--color-bg:var(--palette-surface);--color-text:var(--palette-text);background:#fff;background:var(--color-bg);border-radius:10px;border-radius:var(--radius);box-shadow:0 0 0 1px rgba(110,102,153,.1),0 5px 15px rgba(110,102,153,.25);box-shadow:var(--shadow-md);color:#000;color:var(--color-text);display:block;font-size:.875rem;font-size:var(--text-xs);max-width:30ch;min-width:15ch;overflow:auto;padding:.44444rem;padding:var(--space-xs);width:-moz-max-content;width:max-content;z-index:200;z-index:var(--z-index-overlay)}.menu--lg{max-width:50ch}.menu-item{align-items:flex-start;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;border-radius:6.66667px;border-radius:calc(var(--radius)*2/3);color:#000;color:var(--color-text);display:flex;gap:.44444rem;gap:var(--space-xs);margin:0;padding:.44444rem;padding:var(--space-xs);text-align:left;-webkit-text-decoration:none!important;text-decoration:none!important;transform:none!important;width:100%}.menu-item.is-disabled,.menu-item:disabled{cursor:default;opacity:.5}.menu-item.is-inert{cursor:default}.menu-item:not(:disabled):not(.is-disabled):not(.is-inert){cursor:pointer}.menu-item.is-focused:not(:disabled):not(.is-disabled):not(.is-inert),.menu-item.is-hovered:not(:disabled):not(.is-disabled):not(.is-inert),.menu-item:not(:disabled):not(.is-disabled):not(.is-inert):focus,.menu-item:not(:disabled):not(.is-disabled):not(.is-inert):hover,.menu-item[aria-selected=true]:not(:disabled):not(.is-disabled):not(.is-inert){filter:brightness(.95);filter:var(--filter-hover)}.menu-item:not(:disabled):not(.is-disabled):not(.is-inert):active{filter:brightness(.9);filter:var(--filter-active);transform:scale(.97)}.menu-item.is-focused:not(.is-inert),.menu-item.is-hovered:not(.is-inert),.menu-item:not(.is-inert):focus,.menu-item:not(.is-inert):hover,.menu-item[aria-selected=true]:not(.is-inert){background:rgba(110,102,153,.1);background:var(--color-fill);outline:none}.menu-item.color-danger.is-hovered:not(.is-inert),.menu-item.color-danger:not(.is-inert):hover{background:#c20000;background:var(--color-danger);color:#fff;color:var(--color-danger-contrast)}.menu-item.is-active,.menu-item[aria-checked=true],.menu-item[aria-current=page]{background:#dfd8fe;background:var(--color-accent-soft);color:#4013f6;color:var(--color-accent-text)}.menu-item__title{display:block;font-weight:500;font-weight:var(--weight-medium)}.menu-item__description{color:#6e6699;color:var(--color-muted);display:block;font-size:90%;margin-top:.2963rem;margin-top:var(--space-xxs)}.menu-item__check{margin-left:auto}.menu-item:not(.is-active):not([aria-current=page]):not([aria-checked=true]) .menu-item__check{visibility:hidden}.menu-divider{margin:.44444rem;margin:var(--space-xs)}.menu-divider+.menu-divider,.menu>.menu-divider:first-child,.menu>.menu-divider:last-child{display:none}.menu-heading{color:#6e6699;color:var(--color-muted);font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--font-text);font-size:.8rem;font-size:var(--text-xxs);font-weight:500;font-weight:var(--weight-medium);padding:.44444rem;padding:var(--space-xs);text-transform:uppercase}.menu-sticky{background:#f9f8fc;background:var(--color-bg);margin-top:-.66667rem;margin-top:calc(var(--space-sm)*-1);padding-top:.44444rem;padding-top:var(--space-xs);position:sticky;top:-.66667rem;top:calc(var(--space-sm)*-1);z-index:1}ui-popup:has(>.drawer)::part(backdrop){background:rgba(0,0,0,.5);background:var(--color-overlay)}.drawer{background:#f9f8fc;background:var(--color-bg);box-shadow:0 0 0 1px rgba(110,102,153,.1),0 5px 15px rgba(110,102,153,.25);box-shadow:var(--shadow-md);height:100vh;left:0!important;margin:0;max-height:none!important;overflow:auto;padding:1.5rem;padding:var(--space-lg);position:fixed!important;top:0!important;width:min(70vw,30ch);z-index:200;z-index:var(--z-index-overlay)}.drawer.enter-from,.drawer.leave-to{opacity:1;transform:translateX(-100%)}.drawer--right{left:auto!important;right:0!important}.drawer--right.enter-from,.drawer--right.leave-to{transform:translateX(100%)}ui-modal{align-items:flex-start;bottom:0;justify-content:center;left:0;overflow:auto;padding:5.0625rem max(1.5rem,min(3vw,2.25rem));padding:var(--space-xxxl) var(--space-gutter);position:fixed;right:0;top:0;z-index:200;z-index:var(--z-index-overlay)}ui-modal:not([hidden]){display:flex}ui-modal .dialog{border:0;box-shadow:0 0 0 1px rgba(110,102,153,.1),0 5px 15px rgba(110,102,153,.25);box-shadow:var(--shadow-md)}ui-modal::part(backdrop){background:rgba(0,0,0,.5);background:var(--color-overlay)}ui-modal::part(content){max-width:100%}@media (prefers-reduced-motion:no-preference){ui-modal.enter-active,ui-modal.leave-active{transition:opacity .3s}ui-modal.enter-from,ui-modal.leave-to{opacity:0}ui-modal.enter-active::part(content),ui-modal.leave-active::part(content){transition:transform .3s cubic-bezier(.54,1.12,.38,1.11),opacity .3s}ui-modal.enter-from::part(content),ui-modal.leave-to::part(content){opacity:0;transform:scale(.7)}}.nav{list-style:none;margin-left:0;margin-right:0;padding-left:0;padding-right:0}.nav-heading{color:#6e6699;color:var(--color-muted);font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--font-text);font-size:.8rem;font-size:var(--text-xxs);font-weight:500;font-weight:var(--weight-medium);margin-bottom:.44444rem;margin-bottom:var(--space-xs);padding:0 .66667rem;padding:0 var(--space-sm);text-transform:uppercase;width:100%}*+.nav-heading{margin-top:1.5rem;margin-top:var(--space-lg)}.nav-link{align-items:center;border-radius:10px;border-radius:var(--control-radius);color:#000;color:var(--color-text);display:flex;font-weight:500;font-weight:var(--weight-medium);gap:.44444rem;gap:var(--space-xs);min-height:2.5em;min-height:var(--control-height);padding:.44444rem .66667rem;padding:var(--space-xs) var(--space-sm);-webkit-text-decoration:none!important;text-decoration:none!important}.nav-link>:not(.icon){overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nav-link>.icon{font-size:120%}.nav-link>[class^=icon-fa]{padding:2px}.nav-link>.badge{margin-left:auto}.nav-link.is-disabled,.nav-link:disabled{cursor:default;opacity:.5}.nav-link.is-inert{cursor:default}.nav-link:not(:disabled):not(.is-disabled):not(.is-inert){cursor:pointer}.nav-link.is-focused:not(:disabled):not(.is-disabled):not(.is-inert),.nav-link.is-hovered:not(:disabled):not(.is-disabled):not(.is-inert),.nav-link:not(:disabled):not(.is-disabled):not(.is-inert):focus,.nav-link:not(:disabled):not(.is-disabled):not(.is-inert):hover,.nav-link[aria-selected=true]:not(:disabled):not(.is-disabled):not(.is-inert){filter:brightness(.95);filter:var(--filter-hover)}.nav-link:not(:disabled):not(.is-disabled):not(.is-inert):active{filter:brightness(.9);filter:var(--filter-active);transform:scale(.97)}.nav-link{transform:none!important}.nav-link:focus,.nav-link:hover{background:rgba(110,102,153,.1);background:var(--color-fill)}.nav-link.is-active,.nav-link[aria-current=page]{background:#dfd8fe;background:var(--color-accent-soft);color:#4013f6;color:var(--color-accent-text)}.nav-link.is-active .badge,.nav-link[aria-current=page] .badge{background:inherit;color:inherit}@media (max-width:52rem){.collapsible-nav{flex:1 1 10ch;max-width:-moz-fit-content;max-width:fit-content;min-width:0}}@media (min-width:52.001rem){.collapsible-nav>:first-child{display:none}.collapsible-nav>:last-child{display:contents!important}}.placeholder{align-items:center;color:#6e6699;color:var(--color-muted);display:flex;flex-direction:column;gap:.66667rem;gap:var(--space-sm);padding:2.25rem 0;padding:var(--space-xl) 0;text-align:center}.placeholder>*{max-width:50ch}.placeholder__icon{stroke-width:1.5px;height:4em;width:4em}:root{--sidebar-width:25ch}.with-sidebar{align-items:flex-start;display:flex;gap:max(1.5rem,min(3vw,2.25rem));gap:var(--space-gutter);justify-content:center}.with-sidebar>:not(.sidebar){flex-grow:999;min-width:0}.sidebar{display:flex}@media (max-width:52rem){.with-sidebar{align-items:stretch;flex-direction:column;gap:1rem;gap:var(--space-md)}.with-sidebar>:not(.sidebar){width:100%}.sidebar{flex-direction:row;flex-wrap:wrap}.sidebar--bottom{align-items:center;background:#f9f8fc;background:var(--color-bg);bottom:0;flex-basis:auto!important;flex-direction:row!important;flex-wrap:nowrap!important;margin-left:calc(-1 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))));margin-left:calc(var(--space-gutter)*-1);margin-right:calc(-1 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))));margin-right:calc(var(--space-gutter)*-1);padding:.66667rem max(1.5rem,min(3vw,2.25rem));padding:var(--space-sm) var(--space-gutter);position:sticky;width:calc(100% + 2 * max(calc(1rem * 1.5), min(3vw, calc((1rem * 1.5) * 1.5))))!important;width:calc(100% + 2 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))))!important;width:calc(100% + var(--space-gutter)*2)!important;z-index:100;z-index:var(--z-index-header)}.sidebar--bottom.is-stuck{box-shadow:0 1px 4px rgba(110,102,153,.1);box-shadow:var(--shadow-sm)}}@media (min-width:52.001rem){.sidebar{flex-basis:25ch;flex-basis:var(--sidebar-width);flex-direction:column;flex-shrink:0}.sidebar--sticky{box-sizing:content-box;margin-bottom:calc(-1 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))));margin-bottom:calc(var(--space-gutter)*-1);margin-top:calc(-1 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))));margin-top:calc(var(--space-gutter)*-1);max-height:calc(100vh - 4rem - 2 * max(calc(1rem * 1.5), min(3vw, calc((1rem * 1.5) * 1.5))));max-height:calc(100vh - 4rem - 2 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))));max-height:calc(100vh - var(--header-height) - var(--space-gutter)*2);overflow:auto;padding-bottom:max(1.5rem,min(3vw,2.25rem));padding-bottom:var(--space-gutter);padding-top:max(1.5rem,min(3vw,2.25rem));padding-top:var(--space-gutter);position:sticky;top:4rem;top:var(--header-height)}.sidebar__collapsed{display:none}}.skip-link{background-color:#5830f8;background-color:var(--color-accent);color:#fff;color:var(--color-accent-contrast);padding:.44444rem;padding:var(--space-xs);position:absolute;top:-10rem}.skip-link:focus{left:.44444rem;left:var(--space-xs);position:absolute;top:.44444rem;top:var(--space-xs);z-index:200;z-index:var(--z-index-overlay)}.spinner{align-items:center;color:#6e6699;color:var(--color-muted);display:inline-flex;flex-direction:column;gap:.66667rem;gap:var(--space-sm)}.spinner:before{animation:spinner .6s linear infinite;border:.35em solid rgba(110,102,153,.1);border-top-color:rgba(110,102,153,.25);border:.35em solid var(--color-fill);border-radius:50%;border-top-color:var(--color-stroke);content:"";display:block;height:2em;margin:0 auto;width:2em}.spinner--sm{padding:0;vertical-align:-.3em}.spinner--sm:before{border-width:.25em;height:1.2em;width:1.2em}.spinner--block{display:flex;padding:1rem;padding:var(--space-md)}@keyframes spinner{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.table-container{max-width:100%;overflow:auto;width:-moz-fit-content;width:fit-content}.table-container *{word-wrap:normal}.table-container table{border:0;width:100%}table{border-collapse:collapse;border-spacing:0}table,table td,table th{border:1px solid rgba(110,102,153,.1);border:1px solid var(--color-fill)}table td,table th{padding:.66667rem;padding:var(--space-sm);text-align:left}table th{font-weight:600;font-weight:var(--weight-bold)}.table,.table-container table{border-collapse:separate;font-size:.875rem;font-size:var(--text-xs)}.table-container table td,.table-container table th,.table:not(does-not-exist) td,.table:not(does-not-exist) th{border-width:1px 0 0;padding:.66667rem;padding:var(--space-sm);text-align:left}.table-container table th,.table:not(does-not-exist) th{font-weight:600;font-weight:var(--weight-bold)}.table-container table thead td,.table-container table thead th,.table:not(does-not-exist) thead td,.table:not(does-not-exist) thead th{border-width:0}td.choice-cell{min-width:4ch;padding:0;position:relative}td.choice-cell>*{align-items:center;bottom:0;cursor:pointer;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.is-highlighted,td.choice-cell>.is-highlighted,td.choice-cell>:not(.is-disabled):hover{background:rgba(110,102,153,.1);background:var(--color-fill)}.tabs{align-items:center;display:flex;flex-wrap:wrap;margin-left:-.66667rem;margin-left:calc(var(--space-sm)*-1);margin-right:-.66667rem;margin-right:calc(var(--space-sm)*-1)}.tab{color:#6e6699;color:var(--color-muted);flex-shrink:0;font-weight:500;font-weight:var(--weight-medium);min-width:2ch;overflow:hidden;padding:.44444rem .66667rem;padding:var(--space-xs) var(--space-sm);position:relative;text-align:center;-webkit-text-decoration:none!important;text-decoration:none!important;text-overflow:ellipsis;white-space:nowrap}.tab.is-hovered:not(.is-disabled):not([aria-disabled=true]),.tab:not(.is-disabled):not([aria-disabled=true]):hover{color:#000;color:var(--color-text)}.tab.is-active,.tab[aria-current=page],.tab[aria-selected=true]{color:#4013f6!important;color:var(--color-accent-text)!important}.tab.is-active:after,.tab[aria-current=page]:after,.tab[aria-selected=true]:after{background:#dfd8fe;background:var(--color-accent-soft);border-radius:10px;border-radius:var(--radius);bottom:0;content:"";height:4px;left:50%;min-width:2ch;position:absolute;transform:translateX(-50%);width:calc(100% - 1.33333rem);width:calc(100% - var(--space-sm)*2)}.tab.is-disabled,.tab[aria-disabled=true]{cursor:default;opacity:.3}.tabs--vertical{align-items:stretch;flex-direction:column;flex-wrap:nowrap;font-size:.875rem;font-size:var(--text-xs);margin-right:0}.tabs--vertical .tab{display:block;padding:.2963rem .66667rem;padding:var(--space-xxs) var(--space-sm);text-align:left}.tabs--vertical .tab.is-active:after,.tabs--vertical .tab[aria-current=page]:after,.tabs--vertical .tab[aria-selected=true]:after{bottom:.2963rem;bottom:var(--space-xxs);height:calc(100% - .59259rem);height:calc(100% - var(--space-xxs)*2);left:0;min-width:0;transform:none;width:4px}ui-tooltip{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}.tooltip{--color-text:var(--color-emphasis-contrast);--color-muted:hsla(0,0%,100%,.5);--color-accent:var(--color-text);background:#2f3641;background:var(--color-emphasis);border-radius:10px;border-radius:var(--radius);box-shadow:1rem;box-shadow:var(--space-md);color:#fff;color:var(--color-emphasis-contrast);font-size:.875rem;font-size:var(--text-xs);font-weight:500;font-weight:var(--weight-medium);max-width:30ch;overflow:hidden;padding:.44444rem .66667rem;padding:var(--space-xs) var(--space-sm);text-align:center;z-index:200;z-index:var(--z-index-overlay)}.tooltip small{color:#6e6699;color:var(--color-muted);font-size:.8rem;font-size:var(--text-xxs)}.tooltip.enter-active,.tooltip.leave-active{transition:opacity .2s,transform .2s}.tooltip.enter-from,.tooltip.leave-to{opacity:0;transform:scale(.95)}.tooltip--block{font-size:.8rem;font-size:var(--text-xxs);padding:.44444rem .66667rem;padding:var(--space-xs) var(--space-sm);text-align:left}turbo-frame{display:block}.busy-spinner[aria-busy=true]{min-height:4em;position:relative;visibility:hidden}.busy-spinner[aria-busy=true]:after{animation:spinner .6s linear infinite;border:.35em solid rgba(110,102,153,.1);border-top-color:rgba(110,102,153,.25);border:.35em solid var(--color-fill);border-radius:50%;border-top-color:var(--color-stroke);content:"";height:2em;left:calc(50% - 1em);position:absolute;top:1rem;top:var(--space-md);visibility:visible;width:2em;z-index:2}.turbo-progress-bar{background-color:#5830f8;background-color:var(--color-accent)}.next-page{position:relative}.next-page:before{bottom:-100px;content:"";position:absolute;top:-100px}.user-label{align-items:baseline;color:inherit;display:inline-flex;gap:.2963rem;gap:var(--space-xxs);-webkit-text-decoration:none;text-decoration:none;vertical-align:baseline}.user-label .avatar{align-self:center;height:18px;width:18px}.emoji-picker{max-width:none;padding:0}.emoji-picker emoji-picker{--border-color:var(--color-stroke);--border-size:0;--background:var(--color-bg);--button-hover-background:var(--color-fill);--button-active-background:var(--color-fill);--category-font-color:var(--color-muted);--indicator-color:var(--color-accent);--input-border-color:var(--color-stroke);--input-border-radius:var(--radius);--input-font-color:var(--color-text);--input-placeholder-color:var(--color-muted);--input-padding:0.4em 0.7em;--outline-color:var(--color-accent)}.visually-hidden{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}.container{margin-left:auto;margin-right:auto;max-width:72rem;padding-left:max(1.5rem,min(3vw,2.25rem));padding-left:var(--space-gutter);padding-right:max(1.5rem,min(3vw,2.25rem));padding-right:var(--space-gutter);width:100%}.section{padding-bottom:max(1.5rem,min(3vw,2.25rem));padding-bottom:var(--space-gutter);padding-top:max(1.5rem,min(3vw,2.25rem));padding-top:var(--space-gutter)}.measure{max-width:92ch;max-width:var(--measure)}.gap-px{gap:1px;gap:var(--space-px)}.gap-x-px{-moz-column-gap:1px;column-gap:1px;-moz-column-gap:var(--space-px);column-gap:var(--space-px)}.gap-y-px{row-gap:1px;row-gap:var(--space-px)}.p-px{padding:1px;padding:var(--space-px)}.px-px{padding-left:1px;padding-left:var(--space-px);padding-right:1px;padding-right:var(--space-px)}.py-px{padding-bottom:1px;padding-bottom:var(--space-px);padding-top:1px;padding-top:var(--space-px)}.m-px{margin:1px;margin:var(--space-px)}.mx-px{margin-left:1px;margin-left:var(--space-px);margin-right:1px;margin-right:var(--space-px)}.my-px{margin-bottom:1px;margin-bottom:var(--space-px)}.mt-px,.my-px{margin-top:1px;margin-top:var(--space-px)}.-m-px{margin:-1px;margin:calc(var(--space-px)*-1)}.-mx-px{margin-left:-1px;margin-left:calc(var(--space-px)*-1);margin-right:-1px;margin-right:calc(var(--space-px)*-1)}.-my-px{margin-bottom:-1px;margin-bottom:calc(var(--space-px)*-1)}.-mt-px,.-my-px{margin-top:-1px;margin-top:calc(var(--space-px)*-1)}.gap-xxs{gap:.2963rem;gap:var(--space-xxs)}.gap-x-xxs{-moz-column-gap:.2963rem;column-gap:.2963rem;-moz-column-gap:var(--space-xxs);column-gap:var(--space-xxs)}.gap-y-xxs{row-gap:.2963rem;row-gap:var(--space-xxs)}.p-xxs{padding:.2963rem;padding:var(--space-xxs)}.px-xxs{padding-left:.2963rem;padding-left:var(--space-xxs);padding-right:.2963rem;padding-right:var(--space-xxs)}.py-xxs{padding-bottom:.2963rem;padding-bottom:var(--space-xxs);padding-top:.2963rem;padding-top:var(--space-xxs)}.m-xxs{margin:.2963rem;margin:var(--space-xxs)}.mx-xxs{margin-left:.2963rem;margin-left:var(--space-xxs);margin-right:.2963rem;margin-right:var(--space-xxs)}.my-xxs{margin-bottom:.2963rem;margin-bottom:var(--space-xxs)}.mt-xxs,.my-xxs{margin-top:.2963rem;margin-top:var(--space-xxs)}.-m-xxs{margin:-.2963rem;margin:calc(var(--space-xxs)*-1)}.-mx-xxs{margin-left:-.2963rem;margin-left:calc(var(--space-xxs)*-1);margin-right:-.2963rem;margin-right:calc(var(--space-xxs)*-1)}.-my-xxs{margin-bottom:-.2963rem;margin-bottom:calc(var(--space-xxs)*-1)}.-mt-xxs,.-my-xxs{margin-top:-.2963rem;margin-top:calc(var(--space-xxs)*-1)}.gap-xs{gap:.44444rem;gap:var(--space-xs)}.gap-x-xs{-moz-column-gap:.44444rem;column-gap:.44444rem;-moz-column-gap:var(--space-xs);column-gap:var(--space-xs)}.gap-y-xs{row-gap:.44444rem;row-gap:var(--space-xs)}.p-xs{padding:.44444rem;padding:var(--space-xs)}.px-xs{padding-left:.44444rem;padding-left:var(--space-xs);padding-right:.44444rem;padding-right:var(--space-xs)}.py-xs{padding-bottom:.44444rem;padding-bottom:var(--space-xs);padding-top:.44444rem;padding-top:var(--space-xs)}.m-xs{margin:.44444rem;margin:var(--space-xs)}.mx-xs{margin-left:.44444rem;margin-left:var(--space-xs);margin-right:.44444rem;margin-right:var(--space-xs)}.my-xs{margin-bottom:.44444rem;margin-bottom:var(--space-xs)}.mt-xs,.my-xs{margin-top:.44444rem;margin-top:var(--space-xs)}.-m-xs{margin:-.44444rem;margin:calc(var(--space-xs)*-1)}.-mx-xs{margin-left:-.44444rem;margin-left:calc(var(--space-xs)*-1);margin-right:-.44444rem;margin-right:calc(var(--space-xs)*-1)}.-my-xs{margin-bottom:-.44444rem;margin-bottom:calc(var(--space-xs)*-1)}.-mt-xs,.-my-xs{margin-top:-.44444rem;margin-top:calc(var(--space-xs)*-1)}.gap-sm{gap:.66667rem;gap:var(--space-sm)}.gap-x-sm{-moz-column-gap:.66667rem;column-gap:.66667rem;-moz-column-gap:var(--space-sm);column-gap:var(--space-sm)}.gap-y-sm{row-gap:.66667rem;row-gap:var(--space-sm)}.p-sm{padding:.66667rem;padding:var(--space-sm)}.px-sm{padding-left:.66667rem;padding-left:var(--space-sm);padding-right:.66667rem;padding-right:var(--space-sm)}.py-sm{padding-bottom:.66667rem;padding-bottom:var(--space-sm);padding-top:.66667rem;padding-top:var(--space-sm)}.m-sm{margin:.66667rem;margin:var(--space-sm)}.mx-sm{margin-left:.66667rem;margin-left:var(--space-sm);margin-right:.66667rem;margin-right:var(--space-sm)}.my-sm{margin-bottom:.66667rem;margin-bottom:var(--space-sm)}.mt-sm,.my-sm{margin-top:.66667rem;margin-top:var(--space-sm)}.-m-sm{margin:-.66667rem;margin:calc(var(--space-sm)*-1)}.-mx-sm{margin-left:-.66667rem;margin-left:calc(var(--space-sm)*-1);margin-right:-.66667rem;margin-right:calc(var(--space-sm)*-1)}.-my-sm{margin-bottom:-.66667rem;margin-bottom:calc(var(--space-sm)*-1)}.-mt-sm,.-my-sm{margin-top:-.66667rem;margin-top:calc(var(--space-sm)*-1)}.gap-md{gap:1rem;gap:var(--space-md)}.gap-x-md{-moz-column-gap:1rem;column-gap:1rem;-moz-column-gap:var(--space-md);column-gap:var(--space-md)}.gap-y-md{row-gap:1rem;row-gap:var(--space-md)}.p-md{padding:1rem;padding:var(--space-md)}.px-md{padding-left:1rem;padding-left:var(--space-md);padding-right:1rem;padding-right:var(--space-md)}.py-md{padding-bottom:1rem;padding-bottom:var(--space-md);padding-top:1rem;padding-top:var(--space-md)}.m-md{margin:1rem;margin:var(--space-md)}.mx-md{margin-left:1rem;margin-left:var(--space-md);margin-right:1rem;margin-right:var(--space-md)}.my-md{margin-bottom:1rem;margin-bottom:var(--space-md)}.mt-md,.my-md{margin-top:1rem;margin-top:var(--space-md)}.-m-md{margin:-1rem;margin:calc(var(--space-md)*-1)}.-mx-md{margin-left:-1rem;margin-left:calc(var(--space-md)*-1);margin-right:-1rem;margin-right:calc(var(--space-md)*-1)}.-my-md{margin-bottom:-1rem;margin-bottom:calc(var(--space-md)*-1)}.-mt-md,.-my-md{margin-top:-1rem;margin-top:calc(var(--space-md)*-1)}.gap-lg{gap:1.5rem;gap:var(--space-lg)}.gap-x-lg{-moz-column-gap:1.5rem;column-gap:1.5rem;-moz-column-gap:var(--space-lg);column-gap:var(--space-lg)}.gap-y-lg{row-gap:1.5rem;row-gap:var(--space-lg)}.p-lg{padding:1.5rem;padding:var(--space-lg)}.px-lg{padding-left:1.5rem;padding-left:var(--space-lg);padding-right:1.5rem;padding-right:var(--space-lg)}.py-lg{padding-bottom:1.5rem;padding-bottom:var(--space-lg);padding-top:1.5rem;padding-top:var(--space-lg)}.m-lg{margin:1.5rem;margin:var(--space-lg)}.mx-lg{margin-left:1.5rem;margin-left:var(--space-lg);margin-right:1.5rem;margin-right:var(--space-lg)}.my-lg{margin-bottom:1.5rem;margin-bottom:var(--space-lg)}.mt-lg,.my-lg{margin-top:1.5rem;margin-top:var(--space-lg)}.-m-lg{margin:-1.5rem;margin:calc(var(--space-lg)*-1)}.-mx-lg{margin-left:-1.5rem;margin-left:calc(var(--space-lg)*-1);margin-right:-1.5rem;margin-right:calc(var(--space-lg)*-1)}.-my-lg{margin-bottom:-1.5rem;margin-bottom:calc(var(--space-lg)*-1)}.-mt-lg,.-my-lg{margin-top:-1.5rem;margin-top:calc(var(--space-lg)*-1)}.gap-xl{gap:2.25rem;gap:var(--space-xl)}.gap-x-xl{-moz-column-gap:2.25rem;column-gap:2.25rem;-moz-column-gap:var(--space-xl);column-gap:var(--space-xl)}.gap-y-xl{row-gap:2.25rem;row-gap:var(--space-xl)}.p-xl{padding:2.25rem;padding:var(--space-xl)}.px-xl{padding-left:2.25rem;padding-left:var(--space-xl);padding-right:2.25rem;padding-right:var(--space-xl)}.py-xl{padding-bottom:2.25rem;padding-bottom:var(--space-xl);padding-top:2.25rem;padding-top:var(--space-xl)}.m-xl{margin:2.25rem;margin:var(--space-xl)}.mx-xl{margin-left:2.25rem;margin-left:var(--space-xl);margin-right:2.25rem;margin-right:var(--space-xl)}.my-xl{margin-bottom:2.25rem;margin-bottom:var(--space-xl)}.mt-xl,.my-xl{margin-top:2.25rem;margin-top:var(--space-xl)}.-m-xl{margin:-2.25rem;margin:calc(var(--space-xl)*-1)}.-mx-xl{margin-left:-2.25rem;margin-left:calc(var(--space-xl)*-1);margin-right:-2.25rem;margin-right:calc(var(--space-xl)*-1)}.-my-xl{margin-bottom:-2.25rem;margin-bottom:calc(var(--space-xl)*-1)}.-mt-xl,.-my-xl{margin-top:-2.25rem;margin-top:calc(var(--space-xl)*-1)}.gap-xxl{gap:3.375rem;gap:var(--space-xxl)}.gap-x-xxl{-moz-column-gap:3.375rem;column-gap:3.375rem;-moz-column-gap:var(--space-xxl);column-gap:var(--space-xxl)}.gap-y-xxl{row-gap:3.375rem;row-gap:var(--space-xxl)}.p-xxl{padding:3.375rem;padding:var(--space-xxl)}.px-xxl{padding-left:3.375rem;padding-left:var(--space-xxl);padding-right:3.375rem;padding-right:var(--space-xxl)}.py-xxl{padding-bottom:3.375rem;padding-bottom:var(--space-xxl);padding-top:3.375rem;padding-top:var(--space-xxl)}.m-xxl{margin:3.375rem;margin:var(--space-xxl)}.mx-xxl{margin-left:3.375rem;margin-left:var(--space-xxl);margin-right:3.375rem;margin-right:var(--space-xxl)}.my-xxl{margin-bottom:3.375rem;margin-bottom:var(--space-xxl)}.mt-xxl,.my-xxl{margin-top:3.375rem;margin-top:var(--space-xxl)}.-m-xxl{margin:-3.375rem;margin:calc(var(--space-xxl)*-1)}.-mx-xxl{margin-left:-3.375rem;margin-left:calc(var(--space-xxl)*-1);margin-right:-3.375rem;margin-right:calc(var(--space-xxl)*-1)}.-my-xxl{margin-bottom:-3.375rem;margin-bottom:calc(var(--space-xxl)*-1)}.-mt-xxl,.-my-xxl{margin-top:-3.375rem;margin-top:calc(var(--space-xxl)*-1)}.gap-xxxl{gap:5.0625rem;gap:var(--space-xxxl)}.gap-x-xxxl{-moz-column-gap:5.0625rem;column-gap:5.0625rem;-moz-column-gap:var(--space-xxxl);column-gap:var(--space-xxxl)}.gap-y-xxxl{row-gap:5.0625rem;row-gap:var(--space-xxxl)}.p-xxxl{padding:5.0625rem;padding:var(--space-xxxl)}.px-xxxl{padding-left:5.0625rem;padding-left:var(--space-xxxl);padding-right:5.0625rem;padding-right:var(--space-xxxl)}.py-xxxl{padding-bottom:5.0625rem;padding-bottom:var(--space-xxxl);padding-top:5.0625rem;padding-top:var(--space-xxxl)}.m-xxxl{margin:5.0625rem;margin:var(--space-xxxl)}.mx-xxxl{margin-left:5.0625rem;margin-left:var(--space-xxxl);margin-right:5.0625rem;margin-right:var(--space-xxxl)}.my-xxxl{margin-bottom:5.0625rem;margin-bottom:var(--space-xxxl)}.mt-xxxl,.my-xxxl{margin-top:5.0625rem;margin-top:var(--space-xxxl)}.-m-xxxl{margin:-5.0625rem;margin:calc(var(--space-xxxl)*-1)}.-mx-xxxl{margin-left:-5.0625rem;margin-left:calc(var(--space-xxxl)*-1);margin-right:-5.0625rem;margin-right:calc(var(--space-xxxl)*-1)}.-my-xxxl{margin-bottom:-5.0625rem;margin-bottom:calc(var(--space-xxxl)*-1)}.-mt-xxxl,.-my-xxxl{margin-top:-5.0625rem;margin-top:calc(var(--space-xxxl)*-1)}.gap-gutter{gap:max(1.5rem,min(3vw,2.25rem));gap:var(--space-gutter)}.gap-x-gutter{-moz-column-gap:max(1.5rem,min(3vw,2.25rem));column-gap:max(1.5rem,min(3vw,2.25rem));-moz-column-gap:var(--space-gutter);column-gap:var(--space-gutter)}.gap-y-gutter{row-gap:max(1.5rem,min(3vw,2.25rem));row-gap:var(--space-gutter)}.p-gutter{padding:max(1.5rem,min(3vw,2.25rem));padding:var(--space-gutter)}.px-gutter{padding-left:max(1.5rem,min(3vw,2.25rem));padding-left:var(--space-gutter);padding-right:max(1.5rem,min(3vw,2.25rem));padding-right:var(--space-gutter)}.py-gutter{padding-bottom:max(1.5rem,min(3vw,2.25rem));padding-bottom:var(--space-gutter);padding-top:max(1.5rem,min(3vw,2.25rem));padding-top:var(--space-gutter)}.m-gutter{margin:max(1.5rem,min(3vw,2.25rem));margin:var(--space-gutter)}.mx-gutter{margin-left:max(1.5rem,min(3vw,2.25rem));margin-left:var(--space-gutter);margin-right:max(1.5rem,min(3vw,2.25rem));margin-right:var(--space-gutter)}.my-gutter{margin-bottom:max(1.5rem,min(3vw,2.25rem));margin-bottom:var(--space-gutter)}.mt-gutter,.my-gutter{margin-top:max(1.5rem,min(3vw,2.25rem));margin-top:var(--space-gutter)}.-m-gutter{margin:calc(-1 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))));margin:calc(var(--space-gutter)*-1)}.-mx-gutter{margin-left:calc(-1 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))));margin-left:calc(var(--space-gutter)*-1);margin-right:calc(-1 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))));margin-right:calc(var(--space-gutter)*-1)}.-my-gutter{margin-bottom:calc(-1 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))));margin-bottom:calc(var(--space-gutter)*-1)}.-mt-gutter,.-my-gutter{margin-top:calc(-1 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))));margin-top:calc(var(--space-gutter)*-1)}.stack{display:flex;flex-direction:column}.stack.reverse{flex-direction:column-reverse}.row{align-items:center;display:flex}.row.reverse{flex-direction:row-reverse}.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(15ch,100%),1fr));grid-template-columns:repeat(auto-fill,minmax(min(var(--grid-min,15ch),100%),1fr))}.grid-fit{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(15ch,100%),1fr));grid-template-columns:repeat(auto-fit,minmax(min(var(--grid-min,15ch),100%),1fr))}.block{display:block;width:100%}.inline{display:inline;vertical-align:middle}.inline-block{display:inline-block}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.justify-between{justify-content:space-between}.align-center{align-items:center}.align-start{align-items:flex-start}.align-end{align-items:flex-end}.align-baseline{align-items:baseline}.align-stretch{align-items:stretch}.align-self-center{align-self:center}.align-self-start{align-self:flex-start}.align-self-end{align-self:flex-end}.align-self-baseline{align-self:baseline}.align-self-stretch{align-self:stretch}.push-center,.push-start{margin-right:auto}.push-center,.push-end{margin-left:auto}@media (max-width:40rem){.break-sm{flex-grow:1;order:999;width:100%}}.grow{flex-grow:1}.shrink{min-width:0}.no-shrink{flex-shrink:0}.full-width{width:100%}.full-height{height:100%}.wrap{flex-wrap:wrap}.wrap-reverse{flex-wrap:wrap-reverse}.nowrap{flex-wrap:nowrap;white-space:nowrap}.dividers>*+*{border-top:1px solid rgba(110,102,153,.25);border-top:1px solid var(--color-stroke);margin-top:1.5rem;margin-top:var(--space-lg);padding-top:1.5rem;padding-top:var(--space-lg)}.float-left{float:left}.float-right{float:right}.overflow-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.overflow-visible{overflow:visible}.overflow-hidden{overflow:hidden}.scrollable,.scrollable-x,.scrollable-y{-ms-overflow-style:none;overflow:auto;scrollbar-width:none}.scrollable-x::-webkit-scrollbar,.scrollable::-webkit-scrollbar{display:none}.scrollable-y::-webkit-scrollbar{display:none}.scrollable-x:after,.scrollable-x:before,.scrollable-y:after,.scrollable-y:before,.scrollable:after,.scrollable:before{content:"";display:block;flex-shrink:0;opacity:0;pointer-events:none;position:sticky;transition:opacity .5s;z-index:10}.scrollable-x:after,.scrollable-x:before{align-self:stretch;margin-left:-40px;width:40px}.scrollable-x:before{background-image:linear-gradient(90deg,#f9f8fc,transparent);background-image:linear-gradient(to right,var(--color-bg),transparent);left:0}.scrollable-x:after{background-image:linear-gradient(270deg,#f9f8fc,transparent);background-image:linear-gradient(to left,var(--color-bg),transparent);right:0}.scrollable-x.is-scrolled-left:after,.scrollable-x.is-scrolled-right:before{opacity:1}.scrollable-y:after,.scrollable-y:before{height:40px;margin-top:-40px;width:100%}.scrollable-y:before{background-image:linear-gradient(180deg,#f9f8fc,transparent);background-image:linear-gradient(to bottom,var(--color-bg),transparent);top:0}.scrollable-y:after{background-image:linear-gradient(0deg,#f9f8fc,transparent);background-image:linear-gradient(to top,var(--color-bg),transparent);bottom:0}.scrollable-y.is-scrolled-down:before,.scrollable-y.is-scrolled-up:after{opacity:1}.rotate-90{transform:rotate(90deg)}.rotate-180{transform:rotate(180deg)}.rotate-270{transform:rotate(270deg)}.flip-horizontal{transform:scaleX(-1)}.flip-vertical{transform:scaleY(-1)}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.color-text{color:#000;color:var(--color-text)}.color-muted{color:#6e6699;color:var(--color-muted)}.color-accent{color:#4013f6;color:var(--color-accent-text)}.color-success{color:#007a0e;color:var(--color-success-text)}.color-warning{color:#7a7a00;color:var(--color-warning-text)}.color-danger{color:#ad0000;color:var(--color-danger-text)}.color-activity{color:#d15000;color:var(--color-activity-text)}.color-inherit{color:inherit}.text-xxs{font-size:.8rem;font-size:var(--text-xxs)}.text-xs{font-size:.875rem;font-size:var(--text-xs)}.text-sm{font-size:1rem;font-size:var(--text-sm)}.text-md{font-size:1.125rem;font-size:var(--text-md)}.text-lg{font-size:1.5rem;font-size:var(--text-lg)}.text-xl{font-size:2rem;font-size:var(--text-xl)}.text-xxl{font-size:2.5rem;font-size:var(--text-xxl)}.animate-shake{animation:shake .8s}@keyframes shake{10%,90%{transform:translateX(-1px)}20%,80%{transform:translateX(2px)}30%,50%,70%{transform:translateX(-4px)}40%,60%{transform:translateX(4px)}}.animate-appear{animation:appear .5s}@keyframes appear{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:none}}.bg-accent,.bg-activity,.bg-danger,.bg-emphasis,.bg-success,.bg-warning{--color-fill:hsla(0,0%,100%,.1);--color-stroke:hsla(0,0%,100%,.25);--color-muted:var(--color-text);--color-accent:var(--color-text);--color-accent-text:var(--color-text);background-color:#f9f8fc;background-color:var(--color-bg);color:#000;color:var(--color-text)}.bg-fill{background-color:rgba(110,102,153,.1);background-color:var(--color-fill)}.bg-fill-soft{background-color:rgba(110,102,153,.05);background-color:var(--color-fill-soft)}.bg-emphasis{--color-bg:var(--palette-emphasis);--color-text:var(--palette-emphasis-contrast)}.bg-accent{--color-bg:var(--palette-accent);--color-text:var(--palette-accent-contrast)}.bg-accent-soft{background-color:#dfd8fe;background-color:var(--color-accent-soft);color:#4013f6;color:var(--color-accent-text)}.bg-success{--color-bg:var(--palette-success);--color-text:var(--palette-success-contrast)}.bg-success-soft{background-color:#d6ffdb;background-color:var(--color-success-soft);color:#007a0e;color:var(--color-success-text)}.bg-warning{--color-bg:var(--palette-warning);--color-text:var(--palette-warning-contrast)}.bg-warning-soft{background-color:#ffffd6;background-color:var(--color-warning-soft);color:#7a7a00;color:var(--color-warning-text)}.bg-danger{--color-bg:var(--palette-danger);--color-text:var(--palette-danger-contrast)}.bg-danger-soft{background-color:#ffd6d6;background-color:var(--color-danger-soft);color:#ad0000;color:var(--color-danger-text)}.bg-activity{--color-bg:var(--palette-activity);--color-text:var(--palette-activity-contrast)}.bg-activity-soft{background-color:#ffe6d6;background-color:var(--color-activity-soft);color:#d15000;color:var(--color-activity-text)}.no-pointer{pointer-events:none}.no-select{-moz-user-select:none;user-select:none;-webkit-user-select:none}.clickable.is-disabled,.clickable:disabled{cursor:default;opacity:.5}.clickable.is-inert{cursor:default}.clickable:not(:disabled):not(.is-disabled):not(.is-inert){cursor:pointer}.clickable.is-focused:not(:disabled):not(.is-disabled):not(.is-inert),.clickable.is-hovered:not(:disabled):not(.is-disabled):not(.is-inert),.clickable:not(:disabled):not(.is-disabled):not(.is-inert):focus,.clickable:not(:disabled):not(.is-disabled):not(.is-inert):hover,.clickable[aria-selected=true]:not(:disabled):not(.is-disabled):not(.is-inert){filter:brightness(.95);filter:var(--filter-hover)}.clickable:not(:disabled):not(.is-disabled):not(.is-inert):active{filter:brightness(.9);filter:var(--filter-active);transform:scale(.97)}.cursor-default{cursor:default!important}.cursor-help{cursor:help!important}.cursor-pointer{cursor:pointer!important}.js .no-js-only,.no-js .js-only{display:none!important}.rounded{border-radius:10px;border-radius:var(--radius)}.pill{border-radius:999px}.overlay-container{position:relative}.has-overlay:before,.overlay{bottom:0;left:0;position:absolute!important; /* !important to override .busy-spinner*/right:0;top:0}.has-overlay:before{content:""}.truncated{max-height:15em;overflow:hidden;position:relative}.truncated__expander{align-items:flex-end;background:linear-gradient(180deg,transparent,#f9f8fc 60%);background:linear-gradient(to bottom,transparent,var(--color-bg) 60%);bottom:0;display:flex;height:5em;left:0;position:absolute;right:0;width:100%}.font-text{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--font-text)}.font-display{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--font-display)}.font-mono{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--font-mono)}.weight-normal{font-weight:400;font-weight:var(--weight-normal)}.weight-medium{font-weight:500;font-weight:var(--weight-medium)}.weight-bold{font-weight:600;font-weight:var(--weight-bold)}.underline{-webkit-text-decoration:underline;text-decoration:underline}.no-underline{-webkit-text-decoration:none;text-decoration:none}@media (max-width:40rem){.hide-sm{display:none!important}}@media (min-width:40.001rem){.hide-md-up{display:none!important}}@media (max-width:52rem){.hide-md-down{display:none!important}}@media (min-width:52.001rem){.hide-lg-up{display:none!important}}@media (max-width:68rem){.hide-lg-down{display:none!important}}.hide-if-empty:empty,.hide-if-not-only-child:not(:only-child),[data-theme=dark] .light-only,[data-theme=light] .dark-only{display:none}.auth-button[data-provider=facebook]{background-color:#4267b2;color:#fff}.auth-button[data-provider^=twitter]{background-color:#1da1f2;color:#fff}.auth-button[data-provider=linkedin]{background-color:#0077b5;color:#fff}.auth-button[data-provider=google]{background-color:#fff;border:1px solid rgba(110,102,153,.25);border:1px solid var(--color-stroke);color:#555}.auth-button[data-provider=github]{background-color:#333;color:#fff}.auth-button[data-provider=gitlab]{background-color:#e24329;color:#fff}.auth-button[data-provider=bitbucket]{background-color:#205081;color:#fff}.channel-card__info,.channel-card__inner{flex-basis:30ch}.comment{--comment-padding:var(--space-lg);--comment-padding-left:var(--comment-padding);padding:1.5rem;padding:var(--comment-padding);padding-left:1.5rem;padding-left:var(--comment-padding-left);transition:background .2s}@media (min-width:40.001rem){.comment{--comment-padding-left:calc(var(--attribution-avatar-size) + var(--space-md) + var(--comment-padding))}.comment .attribution{padding-left:0}.comment .attribution__info{display:inline;margin-left:.2963rem;margin-left:var(--space-xxs)}}.comment.is-highlighted{background:#ffffd6;background:var(--color-warning-soft)}.comment.is-answer{border:2px solid #008a10;border:2px solid var(--color-success);border-radius:10px;border-radius:var(--radius);box-shadow:inset 0 0 10px 2px #d6ffdb;box-shadow:inset 0 0 10px 2px var(--color-success-soft)}.comment.is-removed{background:rgba(110,102,153,.1);background:var(--palette-fill);padding-top:1rem;padding-top:var(--space-md)}.comment.is-removed.is-expanded>.removed-banner{margin-bottom:1.5rem;margin-bottom:var(--space-lg)}.comment.is-removed.is-expanded>.removed-banner .icon-tabler-chevron-right{transform:rotate(90deg)}.comment.is-removed:not(.is-expanded){padding-bottom:1rem;padding-bottom:var(--space-md)}.comment.is-removed:not(.is-expanded)>.removed-banner~*{display:none}@media (max-width:40rem){.comment.is-removed:not(.is-expanded) .removed-banner__attribution{display:none}}@media (min-width:40.001rem){.comment__icon{margin-left:calc(-2.5em + -1rem);margin-left:calc((var(--attribution-avatar-size) + var(--space-md))*-1);position:absolute;text-align:right;width:2.5em;width:var(--attribution-avatar-size)}}.comment__parent{margin-top:.44444rem;margin-top:var(--space-xs);width:-moz-fit-content;width:fit-content}.comment__parent>a{color:#6e6699;color:var(--color-muted);font-size:.875rem;font-size:var(--text-xs);font-weight:500;font-weight:var(--weight-medium)}.comment__parent-tooltip{max-width:80ch;overflow:hidden;padding:0;text-align:left}.comment__parent-tooltip .comment{--comment-padding:var(--space-md)}.comment__parent-tooltip .comment>*+*{margin-top:.44444rem;margin-top:var(--space-xs)}.comment__replies{margin-top:1rem;margin-top:var(--space-md)}.comment__replies .comment__parent{display:none}.comment__replies .comment{--comment-padding:var(--space-md)}.comment-list .card__row{padding:0}.comment-list #page_1+.card__row{border-top:0}.composer{--height-transition-duration:0s;background:#f9f8fc;background:var(--color-bg);border-radius:10px;border-radius:var(--radius);bottom:-10px;bottom:calc(var(--radius)*-1);max-height:calc(100vh - 4rem);max-height:calc(100vh - var(--header-height));position:sticky;transition:box-shadow .2s,border .2s,height 0s,bottom .2s;transition:box-shadow .2s,border .2s,height var(--height-transition-duration),bottom .2s}.composer.is-static{height:70vh!important;position:static}.composer.is-static .composer__close{visibility:hidden;width:.44444rem;width:var(--space-xs)}.composer:not(.is-open){--height-transition-duration:0.2s;bottom:-4.75em;height:4.75em!important}.composer:not(.is-open) .composer__form{display:none}.composer.is-open{--color-bg:var(--palette-surface);--focus-shadow:0 0 0 transparent;box-shadow:0 0 0 transparent,0 0 0 1px rgba(110,102,153,.1),0 5px 15px rgba(110,102,153,.25);box-shadow:var(--focus-shadow),var(--shadow-md);height:300px;min-height:200px;padding-bottom:10px;padding-bottom:var(--radius);z-index:101;z-index:calc(var(--z-index-header) + 1)}.composer.is-open:focus-within{--focus-shadow:0 0 0 2px var(--color-accent)}.composer.is-open .composer__placeholder{display:none}@media (max-width:40rem){.composer.is-open{border-radius:0;margin-left:calc(-1 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))));margin-left:calc(var(--space-gutter)*-1);margin-right:calc(-1 * max(calc(1rem * 1.5), min(3vw, calc(calc(1rem * 1.5) * 1.5))));margin-right:calc(var(--space-gutter)*-1)}}.composer__placeholder{border:2px dashed rgba(110,102,153,.25);border:2px dashed var(--color-stroke);border-radius:10px;border-radius:var(--radius);cursor:text;padding:1rem;padding:var(--space-md);-webkit-text-decoration:none!important;text-decoration:none!important;transition:box-shadow .2s,border .2s,color .2s}.composer__placeholder:hover{border-color:transparent;box-shadow:0 0 0 1px rgba(110,102,153,.1),0 5px 15px rgba(110,102,153,.25);box-shadow:var(--shadow-md);color:inherit}.composer__placeholder .avatar{width:2.5em;width:var(--control-height)}.composer__form .text-editor{border:0;box-shadow:none;min-height:0}.composer__form .text-editor__input{resize:none}.composer__handle{cursor:ns-resize;height:20px;left:100px;position:absolute;right:100px;top:-5px;touch-action:none}.composer__handle:before{background:rgba(110,102,153,.1);background:var(--color-fill);border-radius:10px;border-radius:var(--radius);content:"";height:5px;left:50%;position:absolute;top:10px;transform:translateX(-50%);width:20%}.composer__toolbar{border-bottom:1px solid rgba(110,102,153,.25);border-bottom:1px solid var(--color-stroke);padding:.2963rem;padding:var(--space-xxs)}.composer__parent{padding-left:.66667rem;padding-left:var(--space-sm)}.emoji{display:inline-block}span.emoji{transform:scale(1.2)}img.emoji{height:1.2em;vertical-align:-.2em;width:1.2em}.icon .emoji{height:100%;vertical-align:0;width:100%}.flag-container{border:2px solid #e65800;border:2px solid var(--color-activity);border-radius:10px!important;border-radius:var(--radius)!important;box-shadow:inset 0 0 10px 2px #ffe6d6;box-shadow:inset 0 0 10px 2px var(--color-activity-soft);overflow:clip}.flag-container>.alert{border-radius:0}.flags-menu{max-width:50ch}.header{--color-bg:var(--palette-surface);background:#fff;background:var(--color-bg);box-shadow:0 1px 4px rgba(110,102,153,.1);box-shadow:var(--shadow-sm);position:sticky;top:-1px;transition:box-shadow .2s;z-index:100;z-index:var(--z-index-header)}.header .container{height:4rem;height:var(--header-height)}.header-breadcrumb{color:#6e6699;color:var(--color-muted);flex-shrink:99;margin-left:.44444rem;margin-left:var(--space-xs);transition:opacity .2s,transform .2s}.header-breadcrumb:before{content:"\203A";margin:0 .44444rem;margin:0 var(--space-xs)}.header-breadcrumb[hidden]{display:block!important;opacity:0;transform:translateY(10px);transition:opacity .2s,transform .2s,visibility 0s .2s;visibility:hidden}.header-search__form{margin-right:.44444rem;margin-right:var(--space-xs)}.header-search__form input{width:30ch}.header-user{margin-left:.44444rem;margin-left:var(--space-xs)}.email-verification-banner{padding-bottom:1rem;padding-bottom:var(--space-md);padding-top:1rem;padding-top:var(--space-md)}@media (max-width:52rem){.index-sidebar .index-create-post{margin-left:auto}}.index-footer{margin-top:1.5rem;margin-top:var(--space-lg)}.moderation-menu,.notifications-menu{max-height:40em;max-width:100%;width:55ch}.moderation-menu .menu-item,.notifications-menu .menu-item{margin-top:2px}.notification strong{color:#4013f6;color:var(--color-accent-text);font-weight:500;font-weight:var(--weight-medium)}.notification.is-unread{background-color:#f9f8fc;background-color:var(--color-bg);background-image:linear-gradient(#ffe6d6,#ffe6d6);background-image:linear-gradient(var(--color-activity-soft),var(--color-activity-soft))}.notification.is-unread .notification__time,.notification.is-unread strong,.notification.is-unread>.icon{color:#d15000;color:var(--color-activity-text)}.notification-grid .choice{width:8ch}.alert--notification{background-color:#f9f8fc;background-color:var(--color-bg);background-image:linear-gradient(#ffe6d6,#ffe6d6);background-image:linear-gradient(var(--color-activity-soft),var(--color-activity-soft))}.alert--notification .alert__message{line-height:inherit;margin:-.44444rem;margin:calc(var(--space-xs)*-1)}.alert--notification .notification__time{display:none}.post-feed__pinned{--grid-min:31ch}.post-feed__refresh{position:sticky;top:5rem;top:calc(var(--header-height) + var(--space-md))}.post-feed__refresh>*{left:50%;position:absolute;transform:translateX(-50%)}.post-feed__refresh .btn{box-shadow:0 0 0 1px rgba(110,102,153,.1),0 5px 15px rgba(110,102,153,.25);box-shadow:var(--shadow-md)}.post-list>:first-child>.post-list-item:first-of-type{border-top:0}.post-list-item{padding:1rem;padding:var(--space-md)}@media (min-width:40.001rem){.post-list-item{padding-left:1.5rem;padding-left:var(--space-lg)}}.post-list-item__avatar{flex-shrink:0;-webkit-text-decoration:none!important;text-decoration:none!important;width:2.5rem}.post-list-item__avatar,.post-list-item__controls,.post-list-item__end{margin-top:3px}@media (max-width:40rem){.post-list-item__main{width:100%}.post-list-item__upper{flex-wrap:wrap;gap:.44444rem;gap:var(--space-xs)}.post-list-item__end{flex-direction:row-reverse}}.post-title-link{color:inherit;display:block;margin:-10px 0;padding:10px 0}.is-read .post-title-link,.not-logged-in .post-title-link:visited{color:#6e6699;color:var(--color-muted)}.is-read .post-list-item__unread{display:none}.post-cards .post-card{margin-bottom:1.5rem;margin-bottom:var(--space-lg)}[data-route="waterhole.channels.show"] .post-feed__content .channel-label{display:none}.post-header .post-tags-summary .tag{font-size:1rem;font-size:var(--text-sm)}.post-header .attribution,.post-header .post-title{width:100%}.post-page .sidebar{flex-basis:16ch}#comments{scroll-margin-top:5.5rem;scroll-margin-top:calc(var(--space-lg) + var(--header-height))}.comments-pagination__pages{max-height:20rem}.reactions-menu{border-radius:999px;display:flex;flex-direction:row;max-width:none;min-width:0;overflow:visible}.reactions-menu button{padding:2px;transform-origin:bottom;transition:transform .2s}.reactions-menu button:hover{transform:scale(1.2)}.reactions-condensed .icon{filter:drop-shadow(1px 0 0 hsl(250,38%,98%));filter:drop-shadow(1px 0 0 var(--color-bg));margin-left:-4px;position:relative}.reactions-condensed[data-count="0"]{display:none}.reaction[data-count="0"] .icon{filter:grayscale(.9);opacity:.3}.search-results .post-list-item__title a:visited{color:#6e6699;color:var(--color-muted)}.text-editor{height:auto;min-height:15em;padding:0}.text-editor__toolbar{margin:.2963rem;margin:var(--space-xxs);margin-bottom:0}.is-previewing .text-editor__toolbar{pointer-events:none;z-index:1}.is-previewing .text-editor__toolbar>*{pointer-events:all}.is-previewing .text-editor__toolbar>:not(.text-editor__preview-button){display:none}.text-editor__expander{position:relative}.text-editor__input{background:transparent;border:0;box-shadow:none!important;max-height:70vh;outline:none;padding:1rem;padding:var(--space-md);padding-top:.44444rem;padding-top:var(--space-xs);position:relative;resize:vertical;width:100%}.text-editor__input[hidden]{display:inline!important;display:initial!important;visibility:hidden}.text-editor__preview{overflow:auto;padding:1rem;padding:var(--space-md)}.user-profile__card .avatar{width:12ch}.user-profile__content{flex-basis:60ch}.user-profile__controls{float:right;margin-left:-100%;position:relative} ================================================ FILE: resources/dist/global.js ================================================ (function(){var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n&&t(r,Symbol.toStringTag,{value:`Module`}),r},c=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},l=(n,r,a)=>(a=n==null?{}:e(i(n)),c(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n)),u=function(e,t,n,r,i){if(r===`m`)throw TypeError(`Private method is not writable`);if(r===`a`&&!i)throw TypeError(`Private accessor was defined without a setter`);if(typeof t==`function`?e!==t||!i:!t.has(e))throw TypeError(`Cannot write private member to an object whose class did not declare it`);return r===`a`?i.call(e,n):i?i.value=n:t.set(e,n),n},d=function(e,t,n,r){if(n===`a`&&!r)throw TypeError(`Private accessor was defined without a getter`);if(typeof t==`function`?e!==t||!r:!t.has(e))throw TypeError(`Cannot read private member from an object whose class did not declare it`);return n===`m`?r:n===`a`?r.call(e):r?r.value:t.get(e)},f,p=class{formatToParts(e){let t=[];for(let n of e)t.push({type:`element`,value:n}),t.push({type:`literal`,value:`, `});return t.slice(0,-1)}};let m=typeof Intl<`u`&&Intl.ListFormat||p,h=[[`years`,`year`],[`months`,`month`],[`weeks`,`week`],[`days`,`day`],[`hours`,`hour`],[`minutes`,`minute`],[`seconds`,`second`],[`milliseconds`,`millisecond`]],g={minimumIntegerDigits:2};var _=class{constructor(e,t={}){f.set(this,void 0);let n=String(t.style||`short`);n!==`long`&&n!==`short`&&n!==`narrow`&&n!==`digital`&&(n=`short`);let r=n===`digital`?`numeric`:n,i=t.hours||r;r=i===`2-digit`?`numeric`:i;let a=t.minutes||r;r=a===`2-digit`?`numeric`:a;let o=t.seconds||r;r=o===`2-digit`?`numeric`:o;let s=t.milliseconds||r;u(this,f,{locale:e,style:n,years:t.years||n===`digital`?`short`:n,yearsDisplay:t.yearsDisplay===`always`?`always`:`auto`,months:t.months||n===`digital`?`short`:n,monthsDisplay:t.monthsDisplay===`always`?`always`:`auto`,weeks:t.weeks||n===`digital`?`short`:n,weeksDisplay:t.weeksDisplay===`always`?`always`:`auto`,days:t.days||n===`digital`?`short`:n,daysDisplay:t.daysDisplay===`always`?`always`:`auto`,hours:i,hoursDisplay:t.hoursDisplay===`always`||n===`digital`?`always`:`auto`,minutes:a,minutesDisplay:t.minutesDisplay===`always`||n===`digital`?`always`:`auto`,seconds:o,secondsDisplay:t.secondsDisplay===`always`||n===`digital`?`always`:`auto`,milliseconds:s,millisecondsDisplay:t.millisecondsDisplay===`always`?`always`:`auto`},`f`)}resolvedOptions(){return d(this,f,`f`)}formatToParts(e){let t=[],n=d(this,f,`f`),r=n.style,i=n.locale;for(let[a,o]of h){let s=e[a];if(n[`${a}Display`]===`auto`&&!s)continue;let c=n[a],l=c===`2-digit`?g:c===`numeric`?{}:{style:`unit`,unit:o,unitDisplay:c},u=new Intl.NumberFormat(i,l).format(s);a===`months`&&(c===`narrow`||r===`narrow`&&u.endsWith(`m`))&&(u=u.replace(/(\d+)m$/,`$1mo`)),t.push(u)}return new m(i,{type:`unit`,style:r===`digital`?`short`:r}).formatToParts(t)}format(e){return this.formatToParts(e).map(e=>e.value).join(``)}};f=new WeakMap;let v=/^[-+]?P(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)W)?(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?)?$/,y=[`year`,`month`,`week`,`day`,`hour`,`minute`,`second`,`millisecond`],b=e=>v.test(e);var x=class e{constructor(e=0,t=0,n=0,r=0,i=0,a=0,o=0,s=0){this.years=e,this.months=t,this.weeks=n,this.days=r,this.hours=i,this.minutes=a,this.seconds=o,this.milliseconds=s,this.years||=0,this.sign||=Math.sign(this.years),this.months||=0,this.sign||=Math.sign(this.months),this.weeks||=0,this.sign||=Math.sign(this.weeks),this.days||=0,this.sign||=Math.sign(this.days),this.hours||=0,this.sign||=Math.sign(this.hours),this.minutes||=0,this.sign||=Math.sign(this.minutes),this.seconds||=0,this.sign||=Math.sign(this.seconds),this.milliseconds||=0,this.sign||=Math.sign(this.milliseconds),this.blank=this.sign===0}abs(){return new e(Math.abs(this.years),Math.abs(this.months),Math.abs(this.weeks),Math.abs(this.days),Math.abs(this.hours),Math.abs(this.minutes),Math.abs(this.seconds),Math.abs(this.milliseconds))}static from(t){if(typeof t==`string`){let n=String(t).trim(),r=n.startsWith(`-`)?-1:1,i=n.match(v)?.slice(1).map(e=>(Number(e)||0)*r);return i?new e(...i):new e}else if(typeof t==`object`){let{years:n,months:r,weeks:i,days:a,hours:o,minutes:s,seconds:c,milliseconds:l}=t;return new e(n,r,i,a,o,s,c,l)}throw RangeError(`invalid duration`)}static compare(t,n){let r=Date.now(),i=Math.abs(ee(r,e.from(t)).getTime()-r),a=Math.abs(ee(r,e.from(n)).getTime()-r);return i>a?-1:i=0?d*i:0,f>=1?(u-d*12)*i:0,0,f>=3?(l-u*30)*i:0,f>=4?(c-l*24)*i:0,f>=5?(s-c*60)*i:0,f>=6?(o-s*60)*i:0,f>=7?(a-o*1e3)*i:0)}function C(e,{relativeTo:t=Date.now()}={}){if(t=new Date(t),e.blank)return e;let n=e.sign,r=Math.abs(e.years),i=Math.abs(e.months),a=Math.abs(e.weeks),o=Math.abs(e.days),s=Math.abs(e.hours),c=Math.abs(e.minutes),l=Math.abs(e.seconds),u=Math.abs(e.milliseconds);u>=900&&(l+=Math.round(u/1e3)),(l||c||s||o||a||i||r)&&(u=0),l>=55&&(c+=Math.round(l/60)),(c||s||o||a||i||r)&&(l=0),c>=55&&(s+=Math.round(c/60)),(s||o||a||i||r)&&(c=0),o&&s>=12&&(o+=Math.round(s/24)),!o&&s>=21&&(o+=Math.round(s/24)),(o||a||i||r)&&(s=0);let d=t.getFullYear(),f=t.getMonth(),p=t.getDate();if(o>=27||r+i+o){let e=new Date(t);e.setDate(1),e.setMonth(f+i*n+1),e.setDate(0);let s=Math.max(0,p-e.getDate()),c=new Date(t);c.setFullYear(d+r*n),c.setDate(p-s),c.setMonth(f+i*n),c.setDate(p-s+o*n);let l=c.getFullYear()-t.getFullYear(),u=c.getMonth()-t.getMonth(),m=Math.abs(Math.round((Number(c)-Number(t))/864e5))+s,h=Math.abs(l*12+u);m<27?(o>=6?(a+=Math.round(o/7),o=0):o=m,i=r=0):h<=11?(i=h,r=0):(i=0,r=l*n),(i||r)&&(o=0)}return r&&(i=0),a>=4&&(i+=Math.round(a/4)),(i||r)&&(a=0),o&&a&&!i&&!r&&(a+=Math.round(o/7),o=0),new x(r*n,i*n,a*n,o*n,s*n,c*n,l*n,u*n)}function w(e,t){let n=C(e,t);if(n.blank)return[0,`second`];for(let e of y){if(e===`millisecond`)continue;let t=n[`${e}s`];if(t)return[t,e]}return[0,`second`]}var T=function(e,t,n,r){if(n===`a`&&!r)throw TypeError(`Private accessor was defined without a getter`);if(typeof t==`function`?e!==t||!r:!t.has(e))throw TypeError(`Cannot read private member from an object whose class did not declare it`);return n===`m`?r:n===`a`?r.call(e):r?r.value:t.get(e)},te=function(e,t,n,r,i){if(r===`m`)throw TypeError(`Private method is not writable`);if(r===`a`&&!i)throw TypeError(`Private accessor was defined without a setter`);if(typeof t==`function`?e!==t||!i:!t.has(e))throw TypeError(`Cannot write private member to an object whose class did not declare it`);return r===`a`?i.call(e,n):i?i.value=n:t.set(e,n),n},E,ne,re,D,ie,ae,oe,se,ce,le,O,k,ue,de,A,fe;let pe=globalThis.HTMLElement||null,me=new x,he=new x(0,0,0,0,0,1);var ge=class extends Event{constructor(e,t,n,r){super(`relative-time-updated`,{bubbles:!0,composed:!0}),this.oldText=e,this.newText=t,this.oldTitle=n,this.newTitle=r}};function _e(e){if(!e.date)return 1/0;if(e.format===`duration`||e.format===`elapsed`){let t=e.precision;if(t===`second`)return 1e3;if(t===`minute`)return 60*1e3}let t=Math.abs(Date.now()-e.date.getTime());return t<60*1e3?1e3:t<3600*1e3?60*1e3:3600*1e3}let ve=new class{constructor(){this.elements=new Set,this.time=1/0,this.timer=-1}observe(e){if(this.elements.has(e))return;this.elements.add(e);let t=e.date;if(t&&t.getTime()){let t=_e(e),n=Date.now()+t;nthis.update(),t),this.time=n)}}unobserve(e){this.elements.has(e)&&this.elements.delete(e)}update(){if(clearTimeout(this.timer),!this.elements.size)return;let e=1/0;for(let t of this.elements)e=Math.min(e,_e(t)),t.update();this.time=Math.min(3600*1e3,e),this.timer=setTimeout(()=>this.update(),this.time),this.time+=Date.now()}};var ye=class extends pe{constructor(){super(...arguments),E.add(this),ne.set(this,!1),re.set(this,!1),ie.set(this,this.shadowRoot?this.shadowRoot:this.attachShadow?this.attachShadow({mode:`open`}):this),fe.set(this,null)}static define(e=`relative-time`,t=customElements){return t.define(e,this),this}get timeZone(){return this.closest(`[time-zone]`)?.getAttribute(`time-zone`)||this.ownerDocument.documentElement.getAttribute(`time-zone`)||void 0}static get observedAttributes(){return[`second`,`minute`,`hour`,`weekday`,`day`,`month`,`year`,`time-zone-name`,`prefix`,`threshold`,`tense`,`precision`,`format`,`format-style`,`no-title`,`datetime`,`lang`,`title`,`aria-hidden`,`time-zone`]}get onRelativeTimeUpdated(){return T(this,fe,`f`)}set onRelativeTimeUpdated(e){T(this,fe,`f`)&&this.removeEventListener(`relative-time-updated`,T(this,fe,`f`)),te(this,fe,typeof e==`object`||typeof e==`function`?e:null,`f`),typeof e==`function`&&this.addEventListener(`relative-time-updated`,e)}get second(){let e=this.getAttribute(`second`);if(e===`numeric`||e===`2-digit`)return e}set second(e){this.setAttribute(`second`,e||``)}get minute(){let e=this.getAttribute(`minute`);if(e===`numeric`||e===`2-digit`)return e}set minute(e){this.setAttribute(`minute`,e||``)}get hour(){let e=this.getAttribute(`hour`);if(e===`numeric`||e===`2-digit`)return e}set hour(e){this.setAttribute(`hour`,e||``)}get weekday(){let e=this.getAttribute(`weekday`);if(e===`long`||e===`short`||e===`narrow`)return e;if(this.format===`datetime`&&e!==``)return this.formatStyle}set weekday(e){this.setAttribute(`weekday`,e||``)}get day(){let e=this.getAttribute(`day`)??`numeric`;if(e===`numeric`||e===`2-digit`)return e}set day(e){this.setAttribute(`day`,e||``)}get month(){let e=this.format,t=this.getAttribute(`month`);if(t!==``&&(t??=e===`datetime`?this.formatStyle:`short`,t===`numeric`||t===`2-digit`||t===`short`||t===`long`||t===`narrow`))return t}set month(e){this.setAttribute(`month`,e||``)}get year(){let e=this.getAttribute(`year`);if(e===`numeric`||e===`2-digit`)return e;if(!this.hasAttribute(`year`)&&new Date().getUTCFullYear()!==this.date?.getUTCFullYear())return`numeric`}set year(e){this.setAttribute(`year`,e||``)}get timeZoneName(){let e=this.getAttribute(`time-zone-name`);if(e===`long`||e===`short`||e===`shortOffset`||e===`longOffset`||e===`shortGeneric`||e===`longGeneric`)return e}set timeZoneName(e){this.setAttribute(`time-zone-name`,e||``)}get prefix(){return this.getAttribute(`prefix`)??(this.format===`datetime`?``:`on`)}set prefix(e){this.setAttribute(`prefix`,e)}get threshold(){let e=this.getAttribute(`threshold`);return e&&b(e)?e:`P30D`}set threshold(e){this.setAttribute(`threshold`,e)}get tense(){let e=this.getAttribute(`tense`);return e===`past`?`past`:e===`future`?`future`:`auto`}set tense(e){this.setAttribute(`tense`,e)}get precision(){let e=this.getAttribute(`precision`);return y.includes(e)?e:this.format===`micro`?`minute`:`second`}set precision(e){this.setAttribute(`precision`,e)}get format(){let e=this.getAttribute(`format`);return e===`datetime`?`datetime`:e===`relative`?`relative`:e===`duration`?`duration`:e===`micro`?`micro`:e===`elapsed`?`elapsed`:`auto`}set format(e){this.setAttribute(`format`,e)}get formatStyle(){let e=this.getAttribute(`format-style`);if(e===`long`)return`long`;if(e===`short`)return`short`;if(e===`narrow`)return`narrow`;let t=this.format;return t===`elapsed`||t===`micro`?`narrow`:t===`datetime`?`short`:`long`}set formatStyle(e){this.setAttribute(`format-style`,e)}get noTitle(){return this.hasAttribute(`no-title`)}set noTitle(e){this.toggleAttribute(`no-title`,e)}get datetime(){return this.getAttribute(`datetime`)||``}set datetime(e){this.setAttribute(`datetime`,e)}get date(){let e=Date.parse(this.datetime);return Number.isNaN(e)?null:new Date(e)}set date(e){this.datetime=e?.toISOString()||``}connectedCallback(){this.update()}disconnectedCallback(){ve.unobserve(this)}attributeChangedCallback(e,t,n){t!==n&&(e===`title`&&te(this,ne,n!==null&&(this.date&&T(this,E,`m`,ae).call(this,this.date))!==n,`f`),!T(this,re,`f`)&&!(e===`title`&&T(this,ne,`f`))&&te(this,re,(async()=>{await Promise.resolve(),this.update(),te(this,re,!1,`f`)})(),`f`))}update(){let e=T(this,ie,`f`).textContent||this.textContent||``,t=this.getAttribute(`title`)||``,n=t,r=this.date;if(typeof Intl>`u`||!Intl.DateTimeFormat||!r){T(this,ie,`f`).textContent=e;return}let i=Date.now();T(this,ne,`f`)||(n=T(this,E,`m`,ae).call(this,r)||``,n&&!this.noTitle&&this.setAttribute(`title`,n));let a=S(r,this.precision,i),o=T(this,E,`m`,oe).call(this,a),s=e,c=T(this,E,`m`,A).call(this,o);s=c?T(this,E,`m`,ue).call(this,r):o===`duration`?T(this,E,`m`,se).call(this,a):o===`relative`?T(this,E,`m`,ce).call(this,a):T(this,E,`m`,le).call(this,r),s?T(this,E,`m`,de).call(this,s):this.shadowRoot===T(this,ie,`f`)&&this.textContent&&T(this,E,`m`,de).call(this,this.textContent),(s!==e||n!==t)&&this.dispatchEvent(new ge(e,s,t,n)),o===`relative`||o===`duration`||c&&(T(this,E,`m`,O).call(this,r)||T(this,E,`m`,k).call(this,r))?ve.observe(this):ve.unobserve(this)}};ne=new WeakMap,re=new WeakMap,ie=new WeakMap,fe=new WeakMap,E=new WeakSet,D=function(){let e=this.closest(`[lang]`)?.getAttribute(`lang`)||this.ownerDocument.documentElement.getAttribute(`lang`);try{return new Intl.Locale(e??``).toString()}catch{return`default`}},ae=function(e){return new Intl.DateTimeFormat(T(this,E,`a`,D),{day:`numeric`,month:`short`,year:`numeric`,hour:`numeric`,minute:`2-digit`,timeZoneName:`short`,timeZone:this.timeZone}).format(e)},oe=function(e){let t=this.format;if(t===`datetime`)return`datetime`;if(t===`duration`||t===`elapsed`||t===`micro`)return`duration`;if((t===`auto`||t===`relative`)&&typeof Intl<`u`&&Intl.RelativeTimeFormat){let t=this.tense;if(t===`past`||t===`future`||x.compare(e,this.threshold)===1)return`relative`}return`datetime`},se=function(e){let t=T(this,E,`a`,D),n=this.format,r=this.formatStyle,i=this.tense,a=me;n===`micro`?(e=C(e),a=he,e.months===0&&(this.tense===`past`&&e.sign!==-1||this.tense===`future`&&e.sign!==1)&&(e=he)):(i===`past`&&e.sign!==-1||i===`future`&&e.sign!==1)&&(e=a);let o=`${this.precision}sDisplay`;return e.blank?a.toLocaleString(t,{style:r,[o]:`always`}):e.abs().toLocaleString(t,{style:r})},ce=function(e){let t=new Intl.RelativeTimeFormat(T(this,E,`a`,D),{numeric:`auto`,style:this.formatStyle}),n=this.tense;n===`future`&&e.sign!==1&&(e=me),n===`past`&&e.sign!==-1&&(e=me);let[r,i]=w(e);return i===`second`&&r<10?t.format(0,this.precision===`millisecond`?`second`:this.precision):t.format(r,i)},le=function(e){let t=new Intl.DateTimeFormat(T(this,E,`a`,D),{second:this.second,minute:this.minute,hour:this.hour,weekday:this.weekday,day:this.day,month:this.month,year:this.year,timeZoneName:this.timeZoneName,timeZone:this.timeZone});return`${this.prefix} ${t.format(e)}`.trim()},O=function(e){let t=new Date,n=new Intl.DateTimeFormat(T(this,E,`a`,D),{timeZone:this.timeZone,year:`numeric`,month:`2-digit`,day:`2-digit`});return n.format(t)===n.format(e)},k=function(e){let t=new Date,n=new Intl.DateTimeFormat(T(this,E,`a`,D),{timeZone:this.timeZone,year:`numeric`});return n.format(t)===n.format(e)},ue=function(e){let t={hour:`numeric`,minute:`2-digit`,timeZoneName:`short`,timeZone:this.timeZone};if(T(this,E,`m`,O).call(this,e)){let n=new Intl.RelativeTimeFormat(T(this,E,`a`,D),{numeric:`auto`}).format(0,`day`);n=n.charAt(0).toLocaleUpperCase(T(this,E,`a`,D))+n.slice(1);let r=new Intl.DateTimeFormat(T(this,E,`a`,D),t).format(e);return`${n} ${r}`}let n=Object.assign(Object.assign({},t),{day:`numeric`,month:`short`});return T(this,E,`m`,k).call(this,e)?new Intl.DateTimeFormat(T(this,E,`a`,D),n).format(e):new Intl.DateTimeFormat(T(this,E,`a`,D),Object.assign(Object.assign({},n),{year:`numeric`})).format(e)},de=function(e){if(this.hasAttribute(`aria-hidden`)&&this.getAttribute(`aria-hidden`)===`true`){let t=document.createElement(`span`);t.setAttribute(`aria-hidden`,`true`),t.textContent=e,T(this,ie,`f`).replaceChildren(t)}else T(this,ie,`f`).textContent=e},A=function(e){return e===`duration`?!1:this.ownerDocument.documentElement.getAttribute(`data-prefers-absolute-time`)===`true`||this.ownerDocument.body?.getAttribute(`data-prefers-absolute-time`)===`true`};let be=typeof globalThis<`u`?globalThis:window;try{be.RelativeTimeElement=ye.define()}catch(e){if(!(be.DOMException&&e instanceof DOMException&&e.name===`NotSupportedError`)&&!(e instanceof ReferenceError))throw e}var xe=class{constructor(e,t,n){this.eventTarget=e,this.eventName=t,this.eventOptions=n,this.unorderedBindings=new Set}connect(){this.eventTarget.addEventListener(this.eventName,this,this.eventOptions)}disconnect(){this.eventTarget.removeEventListener(this.eventName,this,this.eventOptions)}bindingConnected(e){this.unorderedBindings.add(e)}bindingDisconnected(e){this.unorderedBindings.delete(e)}handleEvent(e){let t=Se(e);for(let e of this.bindings)if(t.immediatePropagationStopped)break;else e.handleEvent(t)}hasBindings(){return this.unorderedBindings.size>0}get bindings(){return Array.from(this.unorderedBindings).sort((e,t)=>{let n=e.index,r=t.index;return nr?1:0})}};function Se(e){if(`immediatePropagationStopped`in e)return e;{let{stopImmediatePropagation:t}=e;return Object.assign(e,{immediatePropagationStopped:!1,stopImmediatePropagation(){this.immediatePropagationStopped=!0,t.call(this)}})}}var Ce=class{constructor(e){this.application=e,this.eventListenerMaps=new Map,this.started=!1}start(){this.started||(this.started=!0,this.eventListeners.forEach(e=>e.connect()))}stop(){this.started&&(this.started=!1,this.eventListeners.forEach(e=>e.disconnect()))}get eventListeners(){return Array.from(this.eventListenerMaps.values()).reduce((e,t)=>e.concat(Array.from(t.values())),[])}bindingConnected(e){this.fetchEventListenerForBinding(e).bindingConnected(e)}bindingDisconnected(e,t=!1){this.fetchEventListenerForBinding(e).bindingDisconnected(e),t&&this.clearEventListenersForBinding(e)}handleError(e,t,n={}){this.application.handleError(e,`Error ${t}`,n)}clearEventListenersForBinding(e){let t=this.fetchEventListenerForBinding(e);t.hasBindings()||(t.disconnect(),this.removeMappedEventListenerFor(e))}removeMappedEventListenerFor(e){let{eventTarget:t,eventName:n,eventOptions:r}=e,i=this.fetchEventListenerMapForEventTarget(t),a=this.cacheKey(n,r);i.delete(a),i.size==0&&this.eventListenerMaps.delete(t)}fetchEventListenerForBinding(e){let{eventTarget:t,eventName:n,eventOptions:r}=e;return this.fetchEventListener(t,n,r)}fetchEventListener(e,t,n){let r=this.fetchEventListenerMapForEventTarget(e),i=this.cacheKey(t,n),a=r.get(i);return a||(a=this.createEventListener(e,t,n),r.set(i,a)),a}createEventListener(e,t,n){let r=new xe(e,t,n);return this.started&&r.connect(),r}fetchEventListenerMapForEventTarget(e){let t=this.eventListenerMaps.get(e);return t||(t=new Map,this.eventListenerMaps.set(e,t)),t}cacheKey(e,t){let n=[e];return Object.keys(t).sort().forEach(e=>{n.push(`${t[e]?``:`!`}${e}`)}),n.join(`:`)}};let we={stop({event:e,value:t}){return t&&e.stopPropagation(),!0},prevent({event:e,value:t}){return t&&e.preventDefault(),!0},self({event:e,value:t,element:n}){return t?n===e.target:!0}},Te=/^(?:(?:([^.]+?)\+)?(.+?)(?:\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/;function Ee(e){let t=e.trim().match(Te)||[],n=t[2],r=t[3];return r&&![`keydown`,`keyup`,`keypress`].includes(n)&&(n+=`.${r}`,r=``),{eventTarget:j(t[4]),eventName:n,eventOptions:t[7]?De(t[7]):{},identifier:t[5],methodName:t[6],keyFilter:t[1]||r}}function j(e){if(e==`window`)return window;if(e==`document`)return document}function De(e){return e.split(`:`).reduce((e,t)=>Object.assign(e,{[t.replace(/^!/,``)]:!/^!/.test(t)}),{})}function Oe(e){if(e==window)return`window`;if(e==document)return`document`}function ke(e){return e.replace(/(?:[_-])([a-z0-9])/g,(e,t)=>t.toUpperCase())}function Ae(e){return ke(e.replace(/--/g,`-`).replace(/__/g,`_`))}function je(e){return e.charAt(0).toUpperCase()+e.slice(1)}function Me(e){return e.replace(/([A-Z])/g,(e,t)=>`-${t.toLowerCase()}`)}function Ne(e){return e.match(/[^\s]+/g)||[]}function Pe(e){return e!=null}function Fe(e,t){return Object.prototype.hasOwnProperty.call(e,t)}let Ie=[`meta`,`ctrl`,`alt`,`shift`];var Le=class{constructor(e,t,n,r){this.element=e,this.index=t,this.eventTarget=n.eventTarget||e,this.eventName=n.eventName||Re(e)||N(`missing event name`),this.eventOptions=n.eventOptions||{},this.identifier=n.identifier||N(`missing identifier`),this.methodName=n.methodName||N(`missing method name`),this.keyFilter=n.keyFilter||``,this.schema=r}static forToken(e,t){return new this(e.element,e.index,Ee(e.content),t)}toString(){let e=this.keyFilter?`.${this.keyFilter}`:``,t=this.eventTargetName?`@${this.eventTargetName}`:``;return`${this.eventName}${e}${t}->${this.identifier}#${this.methodName}`}shouldIgnoreKeyboardEvent(e){if(!this.keyFilter)return!1;let t=this.keyFilter.split(`+`);if(this.keyFilterDissatisfied(e,t))return!0;let n=t.filter(e=>!Ie.includes(e))[0];return n?(Fe(this.keyMappings,n)||N(`contains unknown key filter: ${this.keyFilter}`),this.keyMappings[n].toLowerCase()!==e.key.toLowerCase()):!1}shouldIgnoreMouseEvent(e){if(!this.keyFilter)return!1;let t=[this.keyFilter];return!!this.keyFilterDissatisfied(e,t)}get params(){let e={},t=RegExp(`^data-${this.identifier}-(.+)-param$`,`i`);for(let{name:n,value:r}of Array.from(this.element.attributes)){let i=n.match(t),a=i&&i[1];a&&(e[ke(a)]=ze(r))}return e}get eventTargetName(){return Oe(this.eventTarget)}get keyMappings(){return this.schema.keyMappings}keyFilterDissatisfied(e,t){let[n,r,i,a]=Ie.map(e=>t.includes(e));return e.metaKey!==n||e.ctrlKey!==r||e.altKey!==i||e.shiftKey!==a}};let M={a:()=>`click`,button:()=>`click`,form:()=>`submit`,details:()=>`toggle`,input:e=>e.getAttribute(`type`)==`submit`?`click`:`input`,select:()=>`change`,textarea:()=>`input`};function Re(e){let t=e.tagName.toLowerCase();if(t in M)return M[t](e)}function N(e){throw Error(e)}function ze(e){try{return JSON.parse(e)}catch{return e}}var Be=class{constructor(e,t){this.context=e,this.action=t}get index(){return this.action.index}get eventTarget(){return this.action.eventTarget}get eventOptions(){return this.action.eventOptions}get identifier(){return this.context.identifier}handleEvent(e){let t=this.prepareActionEvent(e);this.willBeInvokedByEvent(e)&&this.applyEventModifiers(t)&&this.invokeWithEvent(t)}get eventName(){return this.action.eventName}get method(){let e=this.controller[this.methodName];if(typeof e==`function`)return e;throw Error(`Action "${this.action}" references undefined method "${this.methodName}"`)}applyEventModifiers(e){let{element:t}=this.action,{actionDescriptorFilters:n}=this.context.application,{controller:r}=this.context,i=!0;for(let[a,o]of Object.entries(this.eventOptions))if(a in n){let s=n[a];i&&=s({name:a,value:o,event:e,element:t,controller:r})}else continue;return i}prepareActionEvent(e){return Object.assign(e,{params:this.action.params})}invokeWithEvent(e){let{target:t,currentTarget:n}=e;try{this.method.call(this.controller,e),this.context.logDebugActivity(this.methodName,{event:e,target:t,currentTarget:n,action:this.methodName})}catch(t){let{identifier:n,controller:r,element:i,index:a}=this,o={identifier:n,controller:r,element:i,index:a,event:e};this.context.handleError(t,`invoking action "${this.action}"`,o)}}willBeInvokedByEvent(e){let t=e.target;return e instanceof KeyboardEvent&&this.action.shouldIgnoreKeyboardEvent(e)||e instanceof MouseEvent&&this.action.shouldIgnoreMouseEvent(e)?!1:this.element===t?!0:t instanceof Element&&this.element.contains(t)?this.scope.containsElement(t):this.scope.containsElement(this.action.element)}get controller(){return this.context.controller}get methodName(){return this.action.methodName}get element(){return this.scope.element}get scope(){return this.context.scope}},Ve=class{constructor(e,t){this.mutationObserverInit={attributes:!0,childList:!0,subtree:!0},this.element=e,this.started=!1,this.delegate=t,this.elements=new Set,this.mutationObserver=new MutationObserver(e=>this.processMutations(e))}start(){this.started||(this.started=!0,this.mutationObserver.observe(this.element,this.mutationObserverInit),this.refresh())}pause(e){this.started&&=(this.mutationObserver.disconnect(),!1),e(),this.started||=(this.mutationObserver.observe(this.element,this.mutationObserverInit),!0)}stop(){this.started&&=(this.mutationObserver.takeRecords(),this.mutationObserver.disconnect(),!1)}refresh(){if(this.started){let e=new Set(this.matchElementsInTree());for(let t of Array.from(this.elements))e.has(t)||this.removeElement(t);for(let t of Array.from(e))this.addElement(t)}}processMutations(e){if(this.started)for(let t of e)this.processMutation(t)}processMutation(e){e.type==`attributes`?this.processAttributeChange(e.target,e.attributeName):e.type==`childList`&&(this.processRemovedNodes(e.removedNodes),this.processAddedNodes(e.addedNodes))}processAttributeChange(e,t){this.elements.has(e)?this.delegate.elementAttributeChanged&&this.matchElement(e)?this.delegate.elementAttributeChanged(e,t):this.removeElement(e):this.matchElement(e)&&this.addElement(e)}processRemovedNodes(e){for(let t of Array.from(e)){let e=this.elementFromNode(t);e&&this.processTree(e,this.removeElement)}}processAddedNodes(e){for(let t of Array.from(e)){let e=this.elementFromNode(t);e&&this.elementIsActive(e)&&this.processTree(e,this.addElement)}}matchElement(e){return this.delegate.matchElement(e)}matchElementsInTree(e=this.element){return this.delegate.matchElementsInTree(e)}processTree(e,t){for(let n of this.matchElementsInTree(e))t.call(this,n)}elementFromNode(e){if(e.nodeType==Node.ELEMENT_NODE)return e}elementIsActive(e){return e.isConnected==this.element.isConnected?this.element.contains(e):!1}addElement(e){this.elements.has(e)||this.elementIsActive(e)&&(this.elements.add(e),this.delegate.elementMatched&&this.delegate.elementMatched(e))}removeElement(e){this.elements.has(e)&&(this.elements.delete(e),this.delegate.elementUnmatched&&this.delegate.elementUnmatched(e))}},He=class{constructor(e,t,n){this.attributeName=t,this.delegate=n,this.elementObserver=new Ve(e,this)}get element(){return this.elementObserver.element}get selector(){return`[${this.attributeName}]`}start(){this.elementObserver.start()}pause(e){this.elementObserver.pause(e)}stop(){this.elementObserver.stop()}refresh(){this.elementObserver.refresh()}get started(){return this.elementObserver.started}matchElement(e){return e.hasAttribute(this.attributeName)}matchElementsInTree(e){let t=this.matchElement(e)?[e]:[],n=Array.from(e.querySelectorAll(this.selector));return t.concat(n)}elementMatched(e){this.delegate.elementMatchedAttribute&&this.delegate.elementMatchedAttribute(e,this.attributeName)}elementUnmatched(e){this.delegate.elementUnmatchedAttribute&&this.delegate.elementUnmatchedAttribute(e,this.attributeName)}elementAttributeChanged(e,t){this.delegate.elementAttributeValueChanged&&this.attributeName==t&&this.delegate.elementAttributeValueChanged(e,t)}};function Ue(e,t,n){Ge(e,t).add(n)}function We(e,t,n){Ge(e,t).delete(n),Ke(e,t)}function Ge(e,t){let n=e.get(t);return n||(n=new Set,e.set(t,n)),n}function Ke(e,t){let n=e.get(t);n!=null&&n.size==0&&e.delete(t)}var qe=class{constructor(){this.valuesByKey=new Map}get keys(){return Array.from(this.valuesByKey.keys())}get values(){return Array.from(this.valuesByKey.values()).reduce((e,t)=>e.concat(Array.from(t)),[])}get size(){return Array.from(this.valuesByKey.values()).reduce((e,t)=>e+t.size,0)}add(e,t){Ue(this.valuesByKey,e,t)}delete(e,t){We(this.valuesByKey,e,t)}has(e,t){let n=this.valuesByKey.get(e);return n!=null&&n.has(t)}hasKey(e){return this.valuesByKey.has(e)}hasValue(e){return Array.from(this.valuesByKey.values()).some(t=>t.has(e))}getValuesForKey(e){let t=this.valuesByKey.get(e);return t?Array.from(t):[]}getKeysForValue(e){return Array.from(this.valuesByKey).filter(([t,n])=>n.has(e)).map(([e,t])=>e)}},Je=class{constructor(e,t,n,r){this._selector=t,this.details=r,this.elementObserver=new Ve(e,this),this.delegate=n,this.matchesByElement=new qe}get started(){return this.elementObserver.started}get selector(){return this._selector}set selector(e){this._selector=e,this.refresh()}start(){this.elementObserver.start()}pause(e){this.elementObserver.pause(e)}stop(){this.elementObserver.stop()}refresh(){this.elementObserver.refresh()}get element(){return this.elementObserver.element}matchElement(e){let{selector:t}=this;if(t){let n=e.matches(t);return this.delegate.selectorMatchElement?n&&this.delegate.selectorMatchElement(e,this.details):n}else return!1}matchElementsInTree(e){let{selector:t}=this;if(t){let n=this.matchElement(e)?[e]:[],r=Array.from(e.querySelectorAll(t)).filter(e=>this.matchElement(e));return n.concat(r)}else return[]}elementMatched(e){let{selector:t}=this;t&&this.selectorMatched(e,t)}elementUnmatched(e){let t=this.matchesByElement.getKeysForValue(e);for(let n of t)this.selectorUnmatched(e,n)}elementAttributeChanged(e,t){let{selector:n}=this;if(n){let t=this.matchElement(e),r=this.matchesByElement.has(n,e);t&&!r?this.selectorMatched(e,n):!t&&r&&this.selectorUnmatched(e,n)}}selectorMatched(e,t){this.delegate.selectorMatched(e,t,this.details),this.matchesByElement.add(t,e)}selectorUnmatched(e,t){this.delegate.selectorUnmatched(e,t,this.details),this.matchesByElement.delete(t,e)}},Ye=class{constructor(e,t){this.element=e,this.delegate=t,this.started=!1,this.stringMap=new Map,this.mutationObserver=new MutationObserver(e=>this.processMutations(e))}start(){this.started||(this.started=!0,this.mutationObserver.observe(this.element,{attributes:!0,attributeOldValue:!0}),this.refresh())}stop(){this.started&&=(this.mutationObserver.takeRecords(),this.mutationObserver.disconnect(),!1)}refresh(){if(this.started)for(let e of this.knownAttributeNames)this.refreshAttribute(e,null)}processMutations(e){if(this.started)for(let t of e)this.processMutation(t)}processMutation(e){let t=e.attributeName;t&&this.refreshAttribute(t,e.oldValue)}refreshAttribute(e,t){let n=this.delegate.getStringMapKeyForAttribute(e);if(n!=null){this.stringMap.has(e)||this.stringMapKeyAdded(n,e);let r=this.element.getAttribute(e);if(this.stringMap.get(e)!=r&&this.stringMapValueChanged(r,n,t),r==null){let t=this.stringMap.get(e);this.stringMap.delete(e),t&&this.stringMapKeyRemoved(n,e,t)}else this.stringMap.set(e,r)}}stringMapKeyAdded(e,t){this.delegate.stringMapKeyAdded&&this.delegate.stringMapKeyAdded(e,t)}stringMapValueChanged(e,t,n){this.delegate.stringMapValueChanged&&this.delegate.stringMapValueChanged(e,t,n)}stringMapKeyRemoved(e,t,n){this.delegate.stringMapKeyRemoved&&this.delegate.stringMapKeyRemoved(e,t,n)}get knownAttributeNames(){return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)))}get currentAttributeNames(){return Array.from(this.element.attributes).map(e=>e.name)}get recordedAttributeNames(){return Array.from(this.stringMap.keys())}},Xe=class{constructor(e,t,n){this.attributeObserver=new He(e,t,this),this.delegate=n,this.tokensByElement=new qe}get started(){return this.attributeObserver.started}start(){this.attributeObserver.start()}pause(e){this.attributeObserver.pause(e)}stop(){this.attributeObserver.stop()}refresh(){this.attributeObserver.refresh()}get element(){return this.attributeObserver.element}get attributeName(){return this.attributeObserver.attributeName}elementMatchedAttribute(e){this.tokensMatched(this.readTokensForElement(e))}elementAttributeValueChanged(e){let[t,n]=this.refreshTokensForElement(e);this.tokensUnmatched(t),this.tokensMatched(n)}elementUnmatchedAttribute(e){this.tokensUnmatched(this.tokensByElement.getValuesForKey(e))}tokensMatched(e){e.forEach(e=>this.tokenMatched(e))}tokensUnmatched(e){e.forEach(e=>this.tokenUnmatched(e))}tokenMatched(e){this.delegate.tokenMatched(e),this.tokensByElement.add(e.element,e)}tokenUnmatched(e){this.delegate.tokenUnmatched(e),this.tokensByElement.delete(e.element,e)}refreshTokensForElement(e){let t=this.tokensByElement.getValuesForKey(e),n=this.readTokensForElement(e),r=Qe(t,n).findIndex(([e,t])=>!$e(e,t));return r==-1?[[],[]]:[t.slice(r),n.slice(r)]}readTokensForElement(e){let t=this.attributeName;return Ze(e.getAttribute(t)||``,e,t)}};function Ze(e,t,n){return e.trim().split(/\s+/).filter(e=>e.length).map((e,r)=>({element:t,attributeName:n,content:e,index:r}))}function Qe(e,t){let n=Math.max(e.length,t.length);return Array.from({length:n},(n,r)=>[e[r],t[r]])}function $e(e,t){return e&&t&&e.index==t.index&&e.content==t.content}var et=class{constructor(e,t,n){this.tokenListObserver=new Xe(e,t,this),this.delegate=n,this.parseResultsByToken=new WeakMap,this.valuesByTokenByElement=new WeakMap}get started(){return this.tokenListObserver.started}start(){this.tokenListObserver.start()}stop(){this.tokenListObserver.stop()}refresh(){this.tokenListObserver.refresh()}get element(){return this.tokenListObserver.element}get attributeName(){return this.tokenListObserver.attributeName}tokenMatched(e){let{element:t}=e,{value:n}=this.fetchParseResultForToken(e);n&&(this.fetchValuesByTokenForElement(t).set(e,n),this.delegate.elementMatchedValue(t,n))}tokenUnmatched(e){let{element:t}=e,{value:n}=this.fetchParseResultForToken(e);n&&(this.fetchValuesByTokenForElement(t).delete(e),this.delegate.elementUnmatchedValue(t,n))}fetchParseResultForToken(e){let t=this.parseResultsByToken.get(e);return t||(t=this.parseToken(e),this.parseResultsByToken.set(e,t)),t}fetchValuesByTokenForElement(e){let t=this.valuesByTokenByElement.get(e);return t||(t=new Map,this.valuesByTokenByElement.set(e,t)),t}parseToken(e){try{return{value:this.delegate.parseValueForToken(e)}}catch(e){return{error:e}}}},tt=class{constructor(e,t){this.context=e,this.delegate=t,this.bindingsByAction=new Map}start(){this.valueListObserver||(this.valueListObserver=new et(this.element,this.actionAttribute,this),this.valueListObserver.start())}stop(){this.valueListObserver&&(this.valueListObserver.stop(),delete this.valueListObserver,this.disconnectAllActions())}get element(){return this.context.element}get identifier(){return this.context.identifier}get actionAttribute(){return this.schema.actionAttribute}get schema(){return this.context.schema}get bindings(){return Array.from(this.bindingsByAction.values())}connectAction(e){let t=new Be(this.context,e);this.bindingsByAction.set(e,t),this.delegate.bindingConnected(t)}disconnectAction(e){let t=this.bindingsByAction.get(e);t&&(this.bindingsByAction.delete(e),this.delegate.bindingDisconnected(t))}disconnectAllActions(){this.bindings.forEach(e=>this.delegate.bindingDisconnected(e,!0)),this.bindingsByAction.clear()}parseValueForToken(e){let t=Le.forToken(e,this.schema);if(t.identifier==this.identifier)return t}elementMatchedValue(e,t){this.connectAction(t)}elementUnmatchedValue(e,t){this.disconnectAction(t)}},nt=class{constructor(e,t){this.context=e,this.receiver=t,this.stringMapObserver=new Ye(this.element,this),this.valueDescriptorMap=this.controller.valueDescriptorMap}start(){this.stringMapObserver.start(),this.invokeChangedCallbacksForDefaultValues()}stop(){this.stringMapObserver.stop()}get element(){return this.context.element}get controller(){return this.context.controller}getStringMapKeyForAttribute(e){if(e in this.valueDescriptorMap)return this.valueDescriptorMap[e].name}stringMapKeyAdded(e,t){let n=this.valueDescriptorMap[t];this.hasValue(e)||this.invokeChangedCallback(e,n.writer(this.receiver[e]),n.writer(n.defaultValue))}stringMapValueChanged(e,t,n){let r=this.valueDescriptorNameMap[t];e!==null&&(n===null&&(n=r.writer(r.defaultValue)),this.invokeChangedCallback(t,e,n))}stringMapKeyRemoved(e,t,n){let r=this.valueDescriptorNameMap[e];this.hasValue(e)?this.invokeChangedCallback(e,r.writer(this.receiver[e]),n):this.invokeChangedCallback(e,r.writer(r.defaultValue),n)}invokeChangedCallbacksForDefaultValues(){for(let{key:e,name:t,defaultValue:n,writer:r}of this.valueDescriptors)n!=null&&!this.controller.data.has(e)&&this.invokeChangedCallback(t,r(n),void 0)}invokeChangedCallback(e,t,n){let r=`${e}Changed`,i=this.receiver[r];if(typeof i==`function`){let r=this.valueDescriptorNameMap[e];try{let e=r.reader(t),a=n;n&&(a=r.reader(n)),i.call(this.receiver,e,a)}catch(e){throw e instanceof TypeError&&(e.message=`Stimulus Value "${this.context.identifier}.${r.name}" - ${e.message}`),e}}}get valueDescriptors(){let{valueDescriptorMap:e}=this;return Object.keys(e).map(t=>e[t])}get valueDescriptorNameMap(){let e={};return Object.keys(this.valueDescriptorMap).forEach(t=>{let n=this.valueDescriptorMap[t];e[n.name]=n}),e}hasValue(e){let t=this.valueDescriptorNameMap[e],n=`has${je(t.name)}`;return this.receiver[n]}},rt=class{constructor(e,t){this.context=e,this.delegate=t,this.targetsByName=new qe}start(){this.tokenListObserver||(this.tokenListObserver=new Xe(this.element,this.attributeName,this),this.tokenListObserver.start())}stop(){this.tokenListObserver&&(this.disconnectAllTargets(),this.tokenListObserver.stop(),delete this.tokenListObserver)}tokenMatched({element:e,content:t}){this.scope.containsElement(e)&&this.connectTarget(e,t)}tokenUnmatched({element:e,content:t}){this.disconnectTarget(e,t)}connectTarget(e,t){var n;this.targetsByName.has(t,e)||(this.targetsByName.add(t,e),(n=this.tokenListObserver)==null||n.pause(()=>this.delegate.targetConnected(e,t)))}disconnectTarget(e,t){var n;this.targetsByName.has(t,e)&&(this.targetsByName.delete(t,e),(n=this.tokenListObserver)==null||n.pause(()=>this.delegate.targetDisconnected(e,t)))}disconnectAllTargets(){for(let e of this.targetsByName.keys)for(let t of this.targetsByName.getValuesForKey(e))this.disconnectTarget(t,e)}get attributeName(){return`data-${this.context.identifier}-target`}get element(){return this.context.element}get scope(){return this.context.scope}};function it(e,t){let n=ot(e);return Array.from(n.reduce((e,n)=>(st(n,t).forEach(t=>e.add(t)),e),new Set))}function at(e,t){return ot(e).reduce((e,n)=>(e.push(...ct(n,t)),e),[])}function ot(e){let t=[];for(;e;)t.push(e),e=Object.getPrototypeOf(e);return t.reverse()}function st(e,t){let n=e[t];return Array.isArray(n)?n:[]}function ct(e,t){let n=e[t];return n?Object.keys(n).map(e=>[e,n[e]]):[]}var lt=class{constructor(e,t){this.started=!1,this.context=e,this.delegate=t,this.outletsByName=new qe,this.outletElementsByName=new qe,this.selectorObserverMap=new Map,this.attributeObserverMap=new Map}start(){this.started||(this.outletDefinitions.forEach(e=>{this.setupSelectorObserverForOutlet(e),this.setupAttributeObserverForOutlet(e)}),this.started=!0,this.dependentContexts.forEach(e=>e.refresh()))}refresh(){this.selectorObserverMap.forEach(e=>e.refresh()),this.attributeObserverMap.forEach(e=>e.refresh())}stop(){this.started&&(this.started=!1,this.disconnectAllOutlets(),this.stopSelectorObservers(),this.stopAttributeObservers())}stopSelectorObservers(){this.selectorObserverMap.size>0&&(this.selectorObserverMap.forEach(e=>e.stop()),this.selectorObserverMap.clear())}stopAttributeObservers(){this.attributeObserverMap.size>0&&(this.attributeObserverMap.forEach(e=>e.stop()),this.attributeObserverMap.clear())}selectorMatched(e,t,{outletName:n}){let r=this.getOutlet(e,n);r&&this.connectOutlet(r,e,n)}selectorUnmatched(e,t,{outletName:n}){let r=this.getOutletFromMap(e,n);r&&this.disconnectOutlet(r,e,n)}selectorMatchElement(e,{outletName:t}){let n=this.selector(t),r=this.hasOutlet(e,t),i=e.matches(`[${this.schema.controllerAttribute}~=${t}]`);return n?r&&i&&e.matches(n):!1}elementMatchedAttribute(e,t){let n=this.getOutletNameFromOutletAttributeName(t);n&&this.updateSelectorObserverForOutlet(n)}elementAttributeValueChanged(e,t){let n=this.getOutletNameFromOutletAttributeName(t);n&&this.updateSelectorObserverForOutlet(n)}elementUnmatchedAttribute(e,t){let n=this.getOutletNameFromOutletAttributeName(t);n&&this.updateSelectorObserverForOutlet(n)}connectOutlet(e,t,n){var r;this.outletElementsByName.has(n,t)||(this.outletsByName.add(n,e),this.outletElementsByName.add(n,t),(r=this.selectorObserverMap.get(n))==null||r.pause(()=>this.delegate.outletConnected(e,t,n)))}disconnectOutlet(e,t,n){var r;this.outletElementsByName.has(n,t)&&(this.outletsByName.delete(n,e),this.outletElementsByName.delete(n,t),(r=this.selectorObserverMap.get(n))==null||r.pause(()=>this.delegate.outletDisconnected(e,t,n)))}disconnectAllOutlets(){for(let e of this.outletElementsByName.keys)for(let t of this.outletElementsByName.getValuesForKey(e))for(let n of this.outletsByName.getValuesForKey(e))this.disconnectOutlet(n,t,e)}updateSelectorObserverForOutlet(e){let t=this.selectorObserverMap.get(e);t&&(t.selector=this.selector(e))}setupSelectorObserverForOutlet(e){let t=this.selector(e),n=new Je(document.body,t,this,{outletName:e});this.selectorObserverMap.set(e,n),n.start()}setupAttributeObserverForOutlet(e){let t=this.attributeNameForOutletName(e),n=new He(this.scope.element,t,this);this.attributeObserverMap.set(e,n),n.start()}selector(e){return this.scope.outlets.getSelectorForOutletName(e)}attributeNameForOutletName(e){return this.scope.schema.outletAttributeForScope(this.identifier,e)}getOutletNameFromOutletAttributeName(e){return this.outletDefinitions.find(t=>this.attributeNameForOutletName(t)===e)}get outletDependencies(){let e=new qe;return this.router.modules.forEach(t=>{let n=t.definition.controllerConstructor;it(n,`outlets`).forEach(n=>e.add(n,t.identifier))}),e}get outletDefinitions(){return this.outletDependencies.getKeysForValue(this.identifier)}get dependentControllerIdentifiers(){return this.outletDependencies.getValuesForKey(this.identifier)}get dependentContexts(){let e=this.dependentControllerIdentifiers;return this.router.contexts.filter(t=>e.includes(t.identifier))}hasOutlet(e,t){return!!this.getOutlet(e,t)||!!this.getOutletFromMap(e,t)}getOutlet(e,t){return this.application.getControllerForElementAndIdentifier(e,t)}getOutletFromMap(e,t){return this.outletsByName.getValuesForKey(t).find(t=>t.element===e)}get scope(){return this.context.scope}get schema(){return this.context.schema}get identifier(){return this.context.identifier}get application(){return this.context.application}get router(){return this.application.router}},ut=class{constructor(e,t){this.logDebugActivity=(e,t={})=>{let{identifier:n,controller:r,element:i}=this;t=Object.assign({identifier:n,controller:r,element:i},t),this.application.logDebugActivity(this.identifier,e,t)},this.module=e,this.scope=t,this.controller=new e.controllerConstructor(this),this.bindingObserver=new tt(this,this.dispatcher),this.valueObserver=new nt(this,this.controller),this.targetObserver=new rt(this,this),this.outletObserver=new lt(this,this);try{this.controller.initialize(),this.logDebugActivity(`initialize`)}catch(e){this.handleError(e,`initializing controller`)}}connect(){this.bindingObserver.start(),this.valueObserver.start(),this.targetObserver.start(),this.outletObserver.start();try{this.controller.connect(),this.logDebugActivity(`connect`)}catch(e){this.handleError(e,`connecting controller`)}}refresh(){this.outletObserver.refresh()}disconnect(){try{this.controller.disconnect(),this.logDebugActivity(`disconnect`)}catch(e){this.handleError(e,`disconnecting controller`)}this.outletObserver.stop(),this.targetObserver.stop(),this.valueObserver.stop(),this.bindingObserver.stop()}get application(){return this.module.application}get identifier(){return this.module.identifier}get schema(){return this.application.schema}get dispatcher(){return this.application.dispatcher}get element(){return this.scope.element}get parentElement(){return this.element.parentElement}handleError(e,t,n={}){let{identifier:r,controller:i,element:a}=this;n=Object.assign({identifier:r,controller:i,element:a},n),this.application.handleError(e,`Error ${t}`,n)}targetConnected(e,t){this.invokeControllerMethod(`${t}TargetConnected`,e)}targetDisconnected(e,t){this.invokeControllerMethod(`${t}TargetDisconnected`,e)}outletConnected(e,t,n){this.invokeControllerMethod(`${Ae(n)}OutletConnected`,e,t)}outletDisconnected(e,t,n){this.invokeControllerMethod(`${Ae(n)}OutletDisconnected`,e,t)}invokeControllerMethod(e,...t){let n=this.controller;typeof n[e]==`function`&&n[e](...t)}};function dt(e){return ft(e,pt(e))}function ft(e,t){let n=gt(e),r=mt(e.prototype,t);return Object.defineProperties(n.prototype,r),n}function pt(e){return it(e,`blessings`).reduce((t,n)=>{let r=n(e);for(let e in r){let n=t[e]||{};t[e]=Object.assign(n,r[e])}return t},{})}function mt(e,t){return ht(t).reduce((n,r)=>{let i=P(e,t,r);return i&&Object.assign(n,{[r]:i}),n},{})}function P(e,t,n){let r=Object.getOwnPropertyDescriptor(e,n);if(!(r&&`value`in r)){let e=Object.getOwnPropertyDescriptor(t,n).value;return r&&(e.get=r.get||e.get,e.set=r.set||e.set),e}}let ht=typeof Object.getOwnPropertySymbols==`function`?e=>[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)]:Object.getOwnPropertyNames,gt=(()=>{function e(e){function t(){return Reflect.construct(e,arguments,new.target)}return t.prototype=Object.create(e.prototype,{constructor:{value:t}}),Reflect.setPrototypeOf(t,e),t}function t(){let t=e(function(){this.a.call(this)});return t.prototype.a=function(){},new t}try{return t(),e}catch{return e=>class extends e{}}})();function _t(e){return{identifier:e.identifier,controllerConstructor:dt(e.controllerConstructor)}}var vt=class{constructor(e,t){this.application=e,this.definition=_t(t),this.contextsByScope=new WeakMap,this.connectedContexts=new Set}get identifier(){return this.definition.identifier}get controllerConstructor(){return this.definition.controllerConstructor}get contexts(){return Array.from(this.connectedContexts)}connectContextForScope(e){let t=this.fetchContextForScope(e);this.connectedContexts.add(t),t.connect()}disconnectContextForScope(e){let t=this.contextsByScope.get(e);t&&(this.connectedContexts.delete(t),t.disconnect())}fetchContextForScope(e){let t=this.contextsByScope.get(e);return t||(t=new ut(this,e),this.contextsByScope.set(e,t)),t}},yt=class{constructor(e){this.scope=e}has(e){return this.data.has(this.getDataKey(e))}get(e){return this.getAll(e)[0]}getAll(e){return Ne(this.data.get(this.getDataKey(e))||``)}getAttributeName(e){return this.data.getAttributeNameForKey(this.getDataKey(e))}getDataKey(e){return`${e}-class`}get data(){return this.scope.data}},bt=class{constructor(e){this.scope=e}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get(e){let t=this.getAttributeNameForKey(e);return this.element.getAttribute(t)}set(e,t){let n=this.getAttributeNameForKey(e);return this.element.setAttribute(n,t),this.get(e)}has(e){let t=this.getAttributeNameForKey(e);return this.element.hasAttribute(t)}delete(e){if(this.has(e)){let t=this.getAttributeNameForKey(e);return this.element.removeAttribute(t),!0}else return!1}getAttributeNameForKey(e){return`data-${this.identifier}-${Me(e)}`}},xt=class{constructor(e){this.warnedKeysByObject=new WeakMap,this.logger=e}warn(e,t,n){let r=this.warnedKeysByObject.get(e);r||(r=new Set,this.warnedKeysByObject.set(e,r)),r.has(t)||(r.add(t),this.logger.warn(n,e))}};function St(e,t){return`[${e}~="${t}"]`}var Ct=class{constructor(e){this.scope=e}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get schema(){return this.scope.schema}has(e){return this.find(e)!=null}find(...e){return e.reduce((e,t)=>e||this.findTarget(t)||this.findLegacyTarget(t),void 0)}findAll(...e){return e.reduce((e,t)=>[...e,...this.findAllTargets(t),...this.findAllLegacyTargets(t)],[])}findTarget(e){let t=this.getSelectorForTargetName(e);return this.scope.findElement(t)}findAllTargets(e){let t=this.getSelectorForTargetName(e);return this.scope.findAllElements(t)}getSelectorForTargetName(e){return St(this.schema.targetAttributeForScope(this.identifier),e)}findLegacyTarget(e){let t=this.getLegacySelectorForTargetName(e);return this.deprecate(this.scope.findElement(t),e)}findAllLegacyTargets(e){let t=this.getLegacySelectorForTargetName(e);return this.scope.findAllElements(t).map(t=>this.deprecate(t,e))}getLegacySelectorForTargetName(e){let t=`${this.identifier}.${e}`;return St(this.schema.targetAttribute,t)}deprecate(e,t){if(e){let{identifier:n}=this,r=this.schema.targetAttribute,i=this.schema.targetAttributeForScope(n);this.guide.warn(e,`target:${t}`,`Please replace ${r}="${n}.${t}" with ${i}="${t}". The ${r} attribute is deprecated and will be removed in a future version of Stimulus.`)}return e}get guide(){return this.scope.guide}},wt=class{constructor(e,t){this.scope=e,this.controllerElement=t}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get schema(){return this.scope.schema}has(e){return this.find(e)!=null}find(...e){return e.reduce((e,t)=>e||this.findOutlet(t),void 0)}findAll(...e){return e.reduce((e,t)=>[...e,...this.findAllOutlets(t)],[])}getSelectorForOutletName(e){let t=this.schema.outletAttributeForScope(this.identifier,e);return this.controllerElement.getAttribute(t)}findOutlet(e){let t=this.getSelectorForOutletName(e);if(t)return this.findElement(t,e)}findAllOutlets(e){let t=this.getSelectorForOutletName(e);return t?this.findAllElements(t,e):[]}findElement(e,t){return this.scope.queryElements(e).filter(n=>this.matchesElement(n,e,t))[0]}findAllElements(e,t){return this.scope.queryElements(e).filter(n=>this.matchesElement(n,e,t))}matchesElement(e,t,n){let r=e.getAttribute(this.scope.schema.controllerAttribute)||``;return e.matches(t)&&r.split(` `).includes(n)}},Tt=class e{constructor(e,t,n,r){this.targets=new Ct(this),this.classes=new yt(this),this.data=new bt(this),this.containsElement=e=>e.closest(this.controllerSelector)===this.element,this.schema=e,this.element=t,this.identifier=n,this.guide=new xt(r),this.outlets=new wt(this.documentScope,t)}findElement(e){return this.element.matches(e)?this.element:this.queryElements(e).find(this.containsElement)}findAllElements(e){return[...this.element.matches(e)?[this.element]:[],...this.queryElements(e).filter(this.containsElement)]}queryElements(e){return Array.from(this.element.querySelectorAll(e))}get controllerSelector(){return St(this.schema.controllerAttribute,this.identifier)}get isDocumentScope(){return this.element===document.documentElement}get documentScope(){return this.isDocumentScope?this:new e(this.schema,document.documentElement,this.identifier,this.guide.logger)}},Et=class{constructor(e,t,n){this.element=e,this.schema=t,this.delegate=n,this.valueListObserver=new et(this.element,this.controllerAttribute,this),this.scopesByIdentifierByElement=new WeakMap,this.scopeReferenceCounts=new WeakMap}start(){this.valueListObserver.start()}stop(){this.valueListObserver.stop()}get controllerAttribute(){return this.schema.controllerAttribute}parseValueForToken(e){let{element:t,content:n}=e;return this.parseValueForElementAndIdentifier(t,n)}parseValueForElementAndIdentifier(e,t){let n=this.fetchScopesByIdentifierForElement(e),r=n.get(t);return r||(r=this.delegate.createScopeForElementAndIdentifier(e,t),n.set(t,r)),r}elementMatchedValue(e,t){let n=(this.scopeReferenceCounts.get(t)||0)+1;this.scopeReferenceCounts.set(t,n),n==1&&this.delegate.scopeConnected(t)}elementUnmatchedValue(e,t){let n=this.scopeReferenceCounts.get(t);n&&(this.scopeReferenceCounts.set(t,n-1),n==1&&this.delegate.scopeDisconnected(t))}fetchScopesByIdentifierForElement(e){let t=this.scopesByIdentifierByElement.get(e);return t||(t=new Map,this.scopesByIdentifierByElement.set(e,t)),t}},Dt=class{constructor(e){this.application=e,this.scopeObserver=new Et(this.element,this.schema,this),this.scopesByIdentifier=new qe,this.modulesByIdentifier=new Map}get element(){return this.application.element}get schema(){return this.application.schema}get logger(){return this.application.logger}get controllerAttribute(){return this.schema.controllerAttribute}get modules(){return Array.from(this.modulesByIdentifier.values())}get contexts(){return this.modules.reduce((e,t)=>e.concat(t.contexts),[])}start(){this.scopeObserver.start()}stop(){this.scopeObserver.stop()}loadDefinition(e){this.unloadIdentifier(e.identifier);let t=new vt(this.application,e);this.connectModule(t);let n=e.controllerConstructor.afterLoad;n&&n.call(e.controllerConstructor,e.identifier,this.application)}unloadIdentifier(e){let t=this.modulesByIdentifier.get(e);t&&this.disconnectModule(t)}getContextForElementAndIdentifier(e,t){let n=this.modulesByIdentifier.get(t);if(n)return n.contexts.find(t=>t.element==e)}proposeToConnectScopeForElementAndIdentifier(e,t){let n=this.scopeObserver.parseValueForElementAndIdentifier(e,t);n?this.scopeObserver.elementMatchedValue(n.element,n):console.error(`Couldn't find or create scope for identifier: "${t}" and element:`,e)}handleError(e,t,n){this.application.handleError(e,t,n)}createScopeForElementAndIdentifier(e,t){return new Tt(this.schema,e,t,this.logger)}scopeConnected(e){this.scopesByIdentifier.add(e.identifier,e);let t=this.modulesByIdentifier.get(e.identifier);t&&t.connectContextForScope(e)}scopeDisconnected(e){this.scopesByIdentifier.delete(e.identifier,e);let t=this.modulesByIdentifier.get(e.identifier);t&&t.disconnectContextForScope(e)}connectModule(e){this.modulesByIdentifier.set(e.identifier,e),this.scopesByIdentifier.getValuesForKey(e.identifier).forEach(t=>e.connectContextForScope(t))}disconnectModule(e){this.modulesByIdentifier.delete(e.identifier),this.scopesByIdentifier.getValuesForKey(e.identifier).forEach(t=>e.disconnectContextForScope(t))}};let Ot={controllerAttribute:`data-controller`,actionAttribute:`data-action`,targetAttribute:`data-target`,targetAttributeForScope:e=>`data-${e}-target`,outletAttributeForScope:(e,t)=>`data-${e}-${t}-outlet`,keyMappings:Object.assign(Object.assign({enter:`Enter`,tab:`Tab`,esc:`Escape`,space:` `,up:`ArrowUp`,down:`ArrowDown`,left:`ArrowLeft`,right:`ArrowRight`,home:`Home`,end:`End`,page_up:`PageUp`,page_down:`PageDown`},kt(`abcdefghijklmnopqrstuvwxyz`.split(``).map(e=>[e,e]))),kt(`0123456789`.split(``).map(e=>[e,e])))};function kt(e){return e.reduce((e,[t,n])=>Object.assign(Object.assign({},e),{[t]:n}),{})}var At=class{constructor(e=document.documentElement,t=Ot){this.logger=console,this.debug=!1,this.logDebugActivity=(e,t,n={})=>{this.debug&&this.logFormattedMessage(e,t,n)},this.element=e,this.schema=t,this.dispatcher=new Ce(this),this.router=new Dt(this),this.actionDescriptorFilters=Object.assign({},we)}static start(e,t){let n=new this(e,t);return n.start(),n}async start(){await jt(),this.logDebugActivity(`application`,`starting`),this.dispatcher.start(),this.router.start(),this.logDebugActivity(`application`,`start`)}stop(){this.logDebugActivity(`application`,`stopping`),this.dispatcher.stop(),this.router.stop(),this.logDebugActivity(`application`,`stop`)}register(e,t){this.load({identifier:e,controllerConstructor:t})}registerActionOption(e,t){this.actionDescriptorFilters[e]=t}load(e,...t){(Array.isArray(e)?e:[e,...t]).forEach(e=>{e.controllerConstructor.shouldLoad&&this.router.loadDefinition(e)})}unload(e,...t){(Array.isArray(e)?e:[e,...t]).forEach(e=>this.router.unloadIdentifier(e))}get controllers(){return this.router.contexts.map(e=>e.controller)}getControllerForElementAndIdentifier(e,t){let n=this.router.getContextForElementAndIdentifier(e,t);return n?n.controller:null}handleError(e,t,n){var r;this.logger.error(`%s %o %o`,t,e,n),(r=window.onerror)==null||r.call(window,t,``,0,0,e)}logFormattedMessage(e,t,n={}){n=Object.assign({application:this},n),this.logger.groupCollapsed(`${e} #${t}`),this.logger.log(`details:`,Object.assign({},n)),this.logger.groupEnd()}};function jt(){return new Promise(e=>{document.readyState==`loading`?document.addEventListener(`DOMContentLoaded`,()=>e()):e()})}function Mt(e){return it(e,`classes`).reduce((e,t)=>Object.assign(e,Nt(t)),{})}function Nt(e){return{[`${e}Class`]:{get(){let{classes:t}=this;if(t.has(e))return t.get(e);{let n=t.getAttributeName(e);throw Error(`Missing attribute "${n}"`)}}},[`${e}Classes`]:{get(){return this.classes.getAll(e)}},[`has${je(e)}Class`]:{get(){return this.classes.has(e)}}}}function Pt(e){return it(e,`outlets`).reduce((e,t)=>Object.assign(e,It(t)),{})}function F(e,t,n){return e.application.getControllerForElementAndIdentifier(t,n)}function Ft(e,t,n){let r=F(e,t,n);if(r||(e.application.router.proposeToConnectScopeForElementAndIdentifier(t,n),r=F(e,t,n),r))return r}function It(e){let t=Ae(e);return{[`${t}Outlet`]:{get(){let t=this.outlets.find(e),n=this.outlets.getSelectorForOutletName(e);if(t){let n=Ft(this,t,e);if(n)return n;throw Error(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`)}throw Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${n}".`)}},[`${t}Outlets`]:{get(){let t=this.outlets.findAll(e);return t.length>0?t.map(t=>{let n=Ft(this,t,e);if(n)return n;console.warn(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`,t)}).filter(e=>e):[]}},[`${t}OutletElement`]:{get(){let t=this.outlets.find(e),n=this.outlets.getSelectorForOutletName(e);if(t)return t;throw Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${n}".`)}},[`${t}OutletElements`]:{get(){return this.outlets.findAll(e)}},[`has${je(t)}Outlet`]:{get(){return this.outlets.has(e)}}}}function Lt(e){return it(e,`targets`).reduce((e,t)=>Object.assign(e,Rt(t)),{})}function Rt(e){return{[`${e}Target`]:{get(){let t=this.targets.find(e);if(t)return t;throw Error(`Missing target element "${e}" for "${this.identifier}" controller`)}},[`${e}Targets`]:{get(){return this.targets.findAll(e)}},[`has${je(e)}Target`]:{get(){return this.targets.has(e)}}}}function zt(e){let t=at(e,`values`);return t.reduce((e,t)=>Object.assign(e,Bt(t)),{valueDescriptorMap:{get(){return t.reduce((e,t)=>{let n=Vt(t,this.identifier),r=this.data.getAttributeNameForKey(n.key);return Object.assign(e,{[r]:n})},{})}}})}function Bt(e,t){let n=Vt(e,t),{key:r,name:i,reader:a,writer:o}=n;return{[i]:{get(){let e=this.data.get(r);return e===null?n.defaultValue:a(e)},set(e){e===void 0?this.data.delete(r):this.data.set(r,o(e))}},[`has${je(i)}`]:{get(){return this.data.has(r)||n.hasCustomDefaultValue}}}}function Vt([e,t],n){return qt({controller:n,token:e,typeDefinition:t})}function Ht(e){switch(e){case Array:return`array`;case Boolean:return`boolean`;case Number:return`number`;case Object:return`object`;case String:return`string`}}function Ut(e){switch(typeof e){case`boolean`:return`boolean`;case`number`:return`number`;case`string`:return`string`}if(Array.isArray(e))return`array`;if(Object.prototype.toString.call(e)===`[object Object]`)return`object`}function Wt(e){let{controller:t,token:n,typeObject:r}=e,i=Pe(r.type),a=Pe(r.default),o=i&&a,s=i&&!a,c=!i&&a,l=Ht(r.type),u=Ut(e.typeObject.default);if(s)return l;if(c)return u;if(l!==u){let e=t?`${t}.${n}`:n;throw Error(`The specified default value for the Stimulus Value "${e}" must match the defined type "${l}". The provided default value of "${r.default}" is of type "${u}".`)}if(o)return l}function Gt(e){let{controller:t,token:n,typeDefinition:r}=e,i=Wt({controller:t,token:n,typeObject:r}),a=Ut(r),o=Ht(r),s=i||a||o;if(s)return s;let c=t?`${t}.${r}`:n;throw Error(`Unknown value type "${c}" for "${n}" value`)}function Kt(e){let t=Ht(e);if(t)return I[t];let n=Fe(e,`default`),r=Fe(e,`type`),i=e;if(n)return i.default;if(r){let{type:e}=i,t=Ht(e);if(t)return I[t]}return e}function qt(e){let{token:t,typeDefinition:n}=e,r=`${Me(t)}-value`,i=Gt(e);return{type:i,key:r,name:ke(r),get defaultValue(){return Kt(n)},get hasCustomDefaultValue(){return Ut(n)!==void 0},reader:Jt[i],writer:Yt[i]||Yt.default}}let I={get array(){return[]},boolean:!1,number:0,get object(){return{}},string:``},Jt={array(e){let t=JSON.parse(e);if(!Array.isArray(t))throw TypeError(`expected value of type "array" but instead got value "${e}" of type "${Ut(t)}"`);return t},boolean(e){return!(e==`0`||String(e).toLowerCase()==`false`)},number(e){return Number(e.replace(/_/g,``))},object(e){let t=JSON.parse(e);if(typeof t!=`object`||!t||Array.isArray(t))throw TypeError(`expected value of type "object" but instead got value "${e}" of type "${Ut(t)}"`);return t},string(e){return e}},Yt={default:Zt,array:Xt,object:Xt};function Xt(e){return JSON.stringify(e)}function Zt(e){return`${e}`}var L=class{constructor(e){this.context=e}static get shouldLoad(){return!0}static afterLoad(e,t){}get application(){return this.context.application}get scope(){return this.context.scope}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get targets(){return this.scope.targets}get outlets(){return this.scope.outlets}get classes(){return this.scope.classes}get data(){return this.scope.data}initialize(){}connect(){}disconnect(){}dispatch(e,{target:t=this.element,detail:n={},prefix:r=this.identifier,bubbles:i=!0,cancelable:a=!0}={}){let o=r?`${r}:${e}`:e,s=new CustomEvent(o,{detail:n,bubbles:i,cancelable:a});return t.dispatchEvent(s),s}};L.blessings=[Mt,Lt,zt,Pt],L.targets=[],L.outlets=[],L.values={};var Qt=class extends Error{response;request;options;constructor(e,t,n){let r=`${e.status||e.status===0?e.status:``} ${e.statusText??``}`.trim(),i=r?`status code ${r}`:`an unknown error`;super(`Request failed with ${i}: ${t.method} ${t.url}`),this.name=`HTTPError`,this.response=e,this.request=t,this.options=n}},$t=class extends Error{name=`NonError`;value;constructor(e){let t=`Non-error value was thrown`;try{typeof e==`string`?t=e:e&&typeof e==`object`&&`message`in e&&typeof e.message==`string`&&(t=e.message)}catch{}super(t),this.value=e}},en=class extends Error{name=`ForceRetryError`;customDelay;code;customRequest;constructor(e){let t=e?.cause?e.cause instanceof Error?e.cause:new $t(e.cause):void 0;super(e?.code?`Forced retry: ${e.code}`:`Forced retry`,t?{cause:t}:void 0),this.customDelay=e?.delay,this.code=e?.code,this.customRequest=e?.request}};let tn=(()=>{let e=!1,t=!1,n=typeof globalThis.ReadableStream==`function`,r=typeof globalThis.Request==`function`;if(n&&r)try{t=new globalThis.Request(`https://empty.invalid`,{body:new globalThis.ReadableStream,method:`POST`,get duplex(){return e=!0,`half`}}).headers.has(`Content-Type`)}catch(e){if(e instanceof Error&&e.message===`unsupported BodyInit type`)return!1;throw e}return e&&!t})(),nn=typeof globalThis.AbortController==`function`,rn=typeof globalThis.AbortSignal==`function`&&typeof globalThis.AbortSignal.any==`function`,an=typeof globalThis.ReadableStream==`function`,on=typeof globalThis.FormData==`function`,sn=[`get`,`post`,`put`,`patch`,`head`,`delete`],cn={json:`application/json`,text:`text/*`,formData:`multipart/form-data`,arrayBuffer:`*/*`,blob:`*/*`,bytes:`*/*`},ln=2147483647,un=new TextEncoder().encode(`------WebKitFormBoundaryaxpyiPgbbPti10Rw`).length,dn=Symbol(`stop`);var fn=class{options;constructor(e){this.options=e}};let pn=e=>new fn(e),mn={json:!0,parseJson:!0,stringifyJson:!0,searchParams:!0,prefixUrl:!0,retry:!0,timeout:!0,hooks:!0,throwHttpErrors:!0,onDownloadProgress:!0,onUploadProgress:!0,fetch:!0,context:!0},hn={next:!0},gn={method:!0,headers:!0,body:!0,mode:!0,credentials:!0,cache:!0,redirect:!0,referrer:!0,referrerPolicy:!0,integrity:!0,keepalive:!0,signal:!0,window:!0,duplex:!0},_n=e=>{if(!e)return 0;if(e instanceof FormData){let t=0;for(let[n,r]of e)t+=un,t+=new TextEncoder().encode(`Content-Disposition: form-data; name="${n}"`).length,t+=typeof r==`string`?new TextEncoder().encode(r).length:r.size;return t}if(e instanceof Blob)return e.size;if(e instanceof ArrayBuffer)return e.byteLength;if(typeof e==`string`)return new TextEncoder().encode(e).length;if(e instanceof URLSearchParams)return new TextEncoder().encode(e.toString()).length;if(`byteLength`in e)return e.byteLength;if(typeof e==`object`&&e)try{let t=JSON.stringify(e);return new TextEncoder().encode(t).length}catch{return 0}return 0},vn=(e,t,n)=>{let r,i=0;return e.pipeThrough(new TransformStream({transform(e,a){if(a.enqueue(e),r){i+=r.byteLength;let e=t===0?0:i/t;e>=1&&(e=1-2**-52),n?.({percent:e,totalBytes:Math.max(t,i),transferredBytes:i},r)}r=e},flush(){r&&(i+=r.byteLength,n?.({percent:1,totalBytes:Math.max(t,i),transferredBytes:i},r))}}))},yn=(e,t)=>{if(!e.body)return e;if(e.status===204)return new Response(null,{status:e.status,statusText:e.statusText,headers:e.headers});let n=Math.max(0,Number(e.headers.get(`content-length`))||0);return new Response(vn(e.body,n,t),{status:e.status,statusText:e.statusText,headers:e.headers})},bn=(e,t,n)=>{if(!e.body)return e;let r=_n(n??e.body);return new Request(e,{duplex:`half`,body:vn(e.body,r,t)})},R=e=>typeof e==`object`&&!!e,xn=(...e)=>{for(let t of e)if((!R(t)||Array.isArray(t))&&t!==void 0)throw TypeError("The `options` argument must be an object");return En({},...e)},Sn=(e={},t={})=>{let n=new globalThis.Headers(e),r=t instanceof globalThis.Headers,i=new globalThis.Headers(t);for(let[e,t]of i.entries())r&&t===`undefined`||t===void 0?n.delete(e):n.set(e,t);return n};function Cn(e,t,n){return Object.hasOwn(t,n)&&t[n]===void 0?[]:En(e[n]??[],t[n]??[])}let wn=(e={},t={})=>({beforeRequest:Cn(e,t,`beforeRequest`),beforeRetry:Cn(e,t,`beforeRetry`),afterResponse:Cn(e,t,`afterResponse`),beforeError:Cn(e,t,`beforeError`)}),Tn=(e,t)=>{let n=new URLSearchParams;for(let r of[e,t])if(r!==void 0)if(r instanceof URLSearchParams)for(let[e,t]of r.entries())n.append(e,t);else if(Array.isArray(r))for(let e of r){if(!Array.isArray(e)||e.length!==2)throw TypeError(`Array search parameters must be provided in [[key, value], ...] format`);n.append(String(e[0]),String(e[1]))}else if(R(r))for(let[e,t]of Object.entries(r))t!==void 0&&n.append(e,String(t));else{let e=new URLSearchParams(r);for(let[t,r]of e.entries())n.append(t,r)}return n},En=(...e)=>{let t={},n={},r={},i,a=[];for(let o of e)if(Array.isArray(o))Array.isArray(t)||(t=[]),t=[...t,...o];else if(R(o)){for(let[e,n]of Object.entries(o)){if(e===`signal`&&n instanceof globalThis.AbortSignal){a.push(n);continue}if(e===`context`){if(n!=null&&(!R(n)||Array.isArray(n)))throw TypeError("The `context` option must be an object");t={...t,context:n==null?{}:{...t.context,...n}};continue}if(e===`searchParams`){i=n==null?void 0:i===void 0?n:Tn(i,n);continue}R(n)&&e in t&&(n=En(t[e],n)),t={...t,[e]:n}}R(o.hooks)&&(r=wn(r,o.hooks),t.hooks=r),R(o.headers)&&(n=Sn(n,o.headers),t.headers=n)}return i!==void 0&&(t.searchParams=i),a.length>0&&(a.length===1?t.signal=a[0]:rn?t.signal=AbortSignal.any(a):t.signal=a.at(-1)),t.context===void 0&&(t.context={}),t},Dn=e=>sn.includes(e)?e.toUpperCase():e,On={limit:2,methods:[`get`,`put`,`head`,`delete`,`options`,`trace`],statusCodes:[408,413,429,500,502,503,504],afterStatusCodes:[413,429,503],maxRetryAfter:1/0,backoffLimit:1/0,delay:e=>.3*2**(e-1)*1e3,jitter:void 0,retryOnTimeout:!1},kn=(e={})=>{if(typeof e==`number`)return{...On,limit:e};if(e.methods&&!Array.isArray(e.methods))throw Error(`retry.methods must be an array`);if(e.methods&&=e.methods.map(e=>e.toLowerCase()),e.statusCodes&&!Array.isArray(e.statusCodes))throw Error(`retry.statusCodes must be an array`);let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));return{...On,...t}};var An=class extends Error{request;constructor(e){super(`Request timed out: ${e.method} ${e.url}`),this.name=`TimeoutError`,this.request=e}};async function jn(e,t,n,r){return new Promise((i,a)=>{let o=setTimeout(()=>{n&&n.abort(),a(new An(e))},r.timeout);r.fetch(e,t).then(i).catch(a).then(()=>{clearTimeout(o)})})}async function Mn(e,{signal:t}){return new Promise((n,r)=>{t&&(t.throwIfAborted(),t.addEventListener(`abort`,i,{once:!0}));function i(){clearTimeout(a),r(t.reason)}let a=setTimeout(()=>{t?.removeEventListener(`abort`,i),n()},e)})}let Nn=(e,t)=>{let n={};for(let r in t)Object.hasOwn(t,r)&&!(r in gn)&&!(r in mn)&&(!(r in e)||r in hn)&&(n[r]=t[r]);return n},Pn=e=>e===void 0?!1:Array.isArray(e)?e.length>0:e instanceof URLSearchParams?e.size>0:typeof e==`object`?Object.keys(e).length>0:typeof e==`string`?e.trim().length>0:!!e;function Fn(e){return e instanceof Qt||e?.name===Qt.name}function In(e){return e instanceof An||e?.name===An.name}var Ln=class e{static create(t,n){let r=new e(t,n),i=r.#p(async()=>{if(typeof r.#i.timeout==`number`&&r.#i.timeout>ln)throw RangeError(`The \`timeout\` option cannot be greater than ${ln}`);await Promise.resolve();let e=await r.#m();for(let t of r.#i.hooks.afterResponse){let n=r.#u(e.clone()),i;try{i=await t(r.request,r.#h(),n,{retryCount:r.#n})}catch(t){throw r.#f(n),r.#f(e),t}if(i instanceof fn)throw r.#f(n),r.#f(e),new en(i.options);let a=i instanceof globalThis.Response?i:e;n!==a&&r.#f(n),e!==a&&r.#f(e),e=a}if(r.#u(e),!e.ok&&(typeof r.#i.throwHttpErrors==`function`?r.#i.throwHttpErrors(e.status):r.#i.throwHttpErrors)){let t=new Qt(e,r.request,r.#h());for(let e of r.#i.hooks.beforeError)t=await e(t,{retryCount:r.#n});throw t}if(r.#i.onDownloadProgress){if(typeof r.#i.onDownloadProgress!=`function`)throw TypeError("The `onDownloadProgress` option must be a function");if(!an)throw Error("Streams are not supported in your environment. `ReadableStream` is missing.");let t=e.clone();return r.#f(e),yn(t,r.#i.onDownloadProgress)}return e}).finally(()=>{let e=r.#a;r.#d(e?.body??void 0),r.#d(r.request.body??void 0)});for(let[e,t]of Object.entries(cn))e===`bytes`&&typeof globalThis.Response?.prototype?.bytes!=`function`||(i[e]=async()=>{r.request.headers.set(`accept`,r.request.headers.get(`accept`)||t);let a=await i;if(e===`json`){if(a.status===204)return``;let e=await a.text();return e===``?``:n.parseJson?n.parseJson(e):JSON.parse(e)}return a[e]()});return i}static#e(e){return e&&typeof e==`object`&&!Array.isArray(e)&&!(e instanceof URLSearchParams)?Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0)):e}request;#t;#n=0;#r;#i;#a;#o;#s;constructor(t,n={}){if(this.#r=t,this.#i={...n,headers:Sn(this.#r.headers,n.headers),hooks:wn({beforeRequest:[],beforeRetry:[],beforeError:[],afterResponse:[]},n.hooks),method:Dn(n.method??this.#r.method??`GET`),prefixUrl:String(n.prefixUrl||``),retry:kn(n.retry),throwHttpErrors:n.throwHttpErrors??!0,timeout:n.timeout??1e4,fetch:n.fetch??globalThis.fetch.bind(globalThis),context:n.context??{}},typeof this.#r!=`string`&&!(this.#r instanceof URL||this.#r instanceof globalThis.Request))throw TypeError("`input` must be a string, URL, or Request");if(this.#i.prefixUrl&&typeof this.#r==`string`){if(this.#r.startsWith(`/`))throw Error("`input` must not begin with a slash when using `prefixUrl`");this.#i.prefixUrl.endsWith(`/`)||(this.#i.prefixUrl+=`/`),this.#r=this.#i.prefixUrl+this.#r}nn&&rn&&(this.#o=this.#i.signal??this.#r.signal,this.#t=new globalThis.AbortController,this.#i.signal=this.#o?AbortSignal.any([this.#o,this.#t.signal]):this.#t.signal),tn&&(this.#i.duplex=`half`),this.#i.json!==void 0&&(this.#i.body=this.#i.stringifyJson?.(this.#i.json)??JSON.stringify(this.#i.json),this.#i.headers.set(`content-type`,this.#i.headers.get(`content-type`)??`application/json`));let r=n.headers&&new globalThis.Headers(n.headers).has(`content-type`);if(this.#r instanceof globalThis.Request&&(on&&this.#i.body instanceof globalThis.FormData||this.#i.body instanceof URLSearchParams)&&!r&&this.#i.headers.delete(`content-type`),this.request=new globalThis.Request(this.#r,this.#i),Pn(this.#i.searchParams)){let t=`?`+(typeof this.#i.searchParams==`string`?this.#i.searchParams.replace(/^\?/,``):new URLSearchParams(e.#e(this.#i.searchParams)).toString()),n=this.request.url.replace(/(?:\?.*?)?(?=#|$)/,t);this.request=new globalThis.Request(n,this.#i)}if(this.#i.onUploadProgress){if(typeof this.#i.onUploadProgress!=`function`)throw TypeError("The `onUploadProgress` option must be a function");if(!tn)throw Error("Request streams are not supported in your environment. The `duplex` option for `Request` is not available.");this.request=this.#_(this.request,this.#i.body??void 0)}}#c(){let e=this.#i.retry.delay(this.#n),t=e;this.#i.retry.jitter===!0?t=Math.random()*e:typeof this.#i.retry.jitter==`function`&&(t=this.#i.retry.jitter(e),(!Number.isFinite(t)||t<0)&&(t=e));let n=this.#i.retry.backoffLimit??1/0;return Math.min(n,t)}async#l(e){if(this.#n++,this.#n>this.#i.retry.limit)throw e;let t=e instanceof Error?e:new $t(e);if(t instanceof en)return t.customDelay??this.#c();if(!this.#i.retry.methods.includes(this.request.method.toLowerCase()))throw e;if(this.#i.retry.shouldRetry!==void 0){let n=await this.#i.retry.shouldRetry({error:t,retryCount:this.#n});if(n===!1)throw e;if(n===!0)return this.#c()}if(In(e)&&!this.#i.retry.retryOnTimeout)throw e;if(Fn(e)){if(!this.#i.retry.statusCodes.includes(e.response.status))throw e;let t=e.response.headers.get(`Retry-After`)??e.response.headers.get(`RateLimit-Reset`)??e.response.headers.get(`X-RateLimit-Retry-After`)??e.response.headers.get(`X-RateLimit-Reset`)??e.response.headers.get(`X-Rate-Limit-Reset`);if(t&&this.#i.retry.afterStatusCodes.includes(e.response.status)){let e=Number(t)*1e3;Number.isNaN(e)?e=Date.parse(t)-Date.now():e>=Date.parse(`2024-01-01`)&&(e-=Date.now());let n=this.#i.retry.maxRetryAfter??e;return ethis.#i.parseJson(await e.text())),e}#d(e){e&&e.cancel().catch(()=>void 0)}#f(e){this.#d(e.body??void 0)}async#p(e){try{return await e()}catch(t){let n=Math.min(await this.#l(t),ln);if(this.#n<1)throw t;if(await Mn(n,this.#o?{signal:this.#o}:{}),t instanceof en&&t.customRequest){let e=this.#i.signal?new globalThis.Request(t.customRequest,{signal:this.#i.signal}):new globalThis.Request(t.customRequest);this.#g(e)}for(let e of this.#i.hooks.beforeRetry){let n=await e({request:this.request,options:this.#h(),error:t,retryCount:this.#n});if(n instanceof globalThis.Request){this.#g(n);break}if(n instanceof globalThis.Response)return n;if(n===dn)return}return this.#p(e)}}async#m(){this.#t?.signal.aborted&&(this.#t=new globalThis.AbortController,this.#i.signal=this.#o?AbortSignal.any([this.#o,this.#t.signal]):this.#t.signal,this.request=new globalThis.Request(this.request,{signal:this.#i.signal}));for(let e of this.#i.hooks.beforeRequest){let t=await e(this.request,this.#h(),{retryCount:this.#n});if(t instanceof Response)return t;if(t instanceof globalThis.Request){this.#g(t);break}}let e=Nn(this.request,this.#i);return this.#a=this.request,this.request=this.#a.clone(),this.#i.timeout===!1?this.#i.fetch(this.#a,e):jn(this.#a,e,this.#t,this.#i)}#h(){if(!this.#s){let{hooks:e,...t}=this.#i;this.#s=Object.freeze(t)}return this.#s}#g(e){this.#s=void 0,this.request=this.#_(e)}#_(e,t){return!this.#i.onUploadProgress||!e.body?e:bn(e,this.#i.onUploadProgress,t??this.#i.body??void 0)}}; /*! MIT License © Sindre Sorhus */ let Rn=e=>{let t=(t,n)=>Ln.create(t,xn(e,n));for(let n of sn)t[n]=(t,r)=>Ln.create(t,xn(e,r,{method:n}));return t.create=e=>Rn(xn(e)),t.extend=t=>(typeof t==`function`&&(t=t(e??{})),Rn(xn(e,t))),t.stop=dn,t.retry=pn,t};var zn=Rn(),Bn=class{constructor(e,t,{tabInsertsSuggestions:n,defaultFirstOption:r,scrollIntoViewOptions:i}={}){this.input=e,this.list=t,this.tabInsertsSuggestions=n??!0,this.defaultFirstOption=r??!1,this.scrollIntoViewOptions=i??{block:`nearest`,inline:`nearest`},this.isComposing=!1,t.id||=`combobox-${Math.random().toString().slice(2,6)}`,this.ctrlBindings=!!navigator.userAgent.match(/Macintosh/),this.keyboardEventHandler=e=>Vn(e,this),this.compositionEventHandler=e=>qn(e,this),this.inputHandler=this.clearSelection.bind(this),e.setAttribute(`role`,`combobox`),e.setAttribute(`aria-controls`,t.id),e.setAttribute(`aria-expanded`,`false`),e.setAttribute(`aria-autocomplete`,`list`),e.setAttribute(`aria-haspopup`,`listbox`)}destroy(){this.clearSelection(),this.stop(),this.input.removeAttribute(`role`),this.input.removeAttribute(`aria-controls`),this.input.removeAttribute(`aria-expanded`),this.input.removeAttribute(`aria-autocomplete`),this.input.removeAttribute(`aria-haspopup`)}start(){this.input.setAttribute(`aria-expanded`,`true`),this.input.addEventListener(`compositionstart`,this.compositionEventHandler),this.input.addEventListener(`compositionend`,this.compositionEventHandler),this.input.addEventListener(`input`,this.inputHandler),this.input.addEventListener(`keydown`,this.keyboardEventHandler),this.list.addEventListener(`click`,Hn),this.indicateDefaultOption()}stop(){this.clearSelection(),this.input.setAttribute(`aria-expanded`,`false`),this.input.removeEventListener(`compositionstart`,this.compositionEventHandler),this.input.removeEventListener(`compositionend`,this.compositionEventHandler),this.input.removeEventListener(`input`,this.inputHandler),this.input.removeEventListener(`keydown`,this.keyboardEventHandler),this.list.removeEventListener(`click`,Hn)}indicateDefaultOption(){var e;this.defaultFirstOption&&((e=Array.from(this.list.querySelectorAll(`[role="option"]:not([aria-disabled="true"])`)).filter(Kn)[0])==null||e.setAttribute(`data-combobox-option-default`,`true`))}navigate(e=1){let t=Array.from(this.list.querySelectorAll(`[aria-selected="true"]`)).filter(Kn)[0],n=Array.from(this.list.querySelectorAll(`[role="option"]`)).filter(Kn),r=n.indexOf(t);if(r===n.length-1&&e===1||r===0&&e===-1){this.clearSelection(),this.input.focus();return}let i=e===1?0:n.length-1;if(t&&r>=0){let t=r+e;t>=0&&t0||e.offsetHeight>0)}function qn(e,t){t.isComposing=e.type===`compositionstart`,document.getElementById(t.input.getAttribute(`aria-controls`)||``)&&t.clearSelection()}let Jn=/\s|\(|\[/;function Yn(e,t,n,{multiWord:r,lookBackIndex:i,lastMatchPosition:a}={multiWord:!1,lookBackIndex:0,lastMatchPosition:null}){let o=e.lastIndexOf(t,n-1);if(o===-1||o=o+t.length+1||e.lastIndexOf(` `,n-1)>o||e.lastIndexOf(`.`,n-1)>o)return}else if(e.lastIndexOf(` `,n-1)>o)return;let s=e[o-1];if(!(s&&!Jn.test(s)))return{text:e.substring(o+t.length,n),position:o+t.length}}var Xn=class extends Event{constructor(){super(`update`)}};let Zn=new WeakMap;var Qn=class e extends EventTarget{#e=new MutationObserver(()=>this.#f());#t=new ResizeObserver(()=>this.#d());#n;#r=document.createElement(`div`);#i=document.createElement(`div`);static for(t){let n=Zn.get(t);return n||(n=new e(t),Zn.set(t,n)),n}constructor(e){super(),this.#n=new WeakRef(e),this.#r.style.position=`absolute`,this.#r.style.pointerEvents=`none`,this.#r.setAttribute(`aria-hidden`,`true`),this.#r.appendChild(this.#i),this.#i.style.pointerEvents=`none`,this.#i.style.userSelect=`none`,this.#i.style.overflow=`hidden`,this.#i.style.display=`block`,this.#i.style.visibility=`hidden`,e instanceof HTMLTextAreaElement?(this.#i.style.whiteSpace=`pre-wrap`,this.#i.style.wordWrap=`break-word`):(this.#i.style.whiteSpace=`nowrap`,this.#i.style.display=`table-cell`,this.#i.style.verticalAlign=`middle`),e.after(this.#r),this.#f(),this.#p(),this.#e.observe(e,{attributeFilter:[`style`,`dir`]}),this.#t.observe(e),document.addEventListener(`scroll`,this.#h,{capture:!0}),window.addEventListener(`resize`,this.#h,{capture:!0}),e.addEventListener(`input`,this.#m,{capture:!0})}get element(){return this.#i}forceUpdate(){this.#f(),this.#p()}disconnect(){this.#r?.remove(),this.#e.disconnect(),this.#t.disconnect(),document.removeEventListener(`scroll`,this.#h,{capture:!0}),window.removeEventListener(`resize`,this.#h,{capture:!0});let e=this.#a;e&&(e.removeEventListener(`input`,this.#m,{capture:!0}),Zn.delete(e))}get#a(){return this.#n?.deref()}#o(e){let t=this.#a;return t?e(t):this.disconnect()}#s=0;#c=0;#l(){this.#o(e=>{let t=window.getComputedStyle(e);this.#i.style.height=t.height,this.#i.style.width=t.width,e.clientHeight!==this.#i.clientHeight&&(this.#i.style.height=`calc(${t.height} + ${e.clientHeight-this.#i.clientHeight}px)`),e.clientWidth!==this.#i.clientWidth&&(this.#i.style.width=`calc(${t.width} + ${e.clientWidth-this.#i.clientWidth}px)`);let n=e.getBoundingClientRect(),r=this.#i.getBoundingClientRect();this.#s=this.#s+n.left-r.left,this.#c=this.#c+n.top-r.top,this.#i.style.transform=`translate(${this.#s}px, ${this.#c}px)`,this.#i.scrollTop=e.scrollTop,this.#i.scrollLeft=e.scrollLeft,this.dispatchEvent(new Xn)})}#u=!1;#d(){this.#u||(this.#u=!0,requestAnimationFrame(()=>{this.#l(),this.#u=!1}))}#f(){this.#o(e=>{let t=window.getComputedStyle(e);for(let e of $n)this.#i.style[e]=t[e];this.#d()})}#p(){this.#o(e=>{this.#i.textContent=e.value,this.#l()})}#m=()=>this.#p();#h=e=>{this.#o(t=>{(e.target===document||e.target===window||e.target instanceof Node&&e.target.contains(t))&&this.#d()})}};let $n=`direction.writingMode.unicodeBidi.textOrientation.boxSizing.borderTopWidth.borderRightWidth.borderBottomWidth.borderLeftWidth.borderStyle.paddingTop.paddingRight.paddingBottom.paddingLeft.fontStyle.fontVariant.fontWeight.fontStretch.fontSize.fontSizeAdjust.lineHeight.fontFamily.textAlign.textTransform.textIndent.textDecoration.letterSpacing.wordSpacing.tabSize.MozTabSize`.split(`.`);var er=class e{#e;#t;#n;constructor(e,t=0,n=t){this.#e=e,this.#t=t,this.#n=n}static fromSelection(t){let{selectionStart:n,selectionEnd:r}=t;return new e(t,n??void 0,r??void 0)}get collapsed(){return this.startOffset===this.endOffset}get commonAncestorContainer(){return this.#e}get endContainer(){return this.#e}get startContainer(){return this.#e}get startOffset(){return this.#t}get endOffset(){return this.#n}setStartOffset(e){this.#t=this.#a(e)}setEndOffset(e){this.#n=this.#a(e)}collapse(e=!1){e?this.setEndOffset(this.startOffset):this.setStartOffset(this.endOffset)}cloneContents(){return this.#o().cloneContents()}cloneRange(){return new e(this.#e,this.startOffset,this.endOffset)}getBoundingClientRect(){return this.#o().getBoundingClientRect()}getClientRects(){return this.#o().getClientRects()}toString(){return this.#o().toString()}getStyleClone(){return this.#r}get#r(){return Qn.for(this.#e)}get#i(){return this.#r}#a(e){return Math.max(0,Math.min(e,this.#e.value.length))}#o(){let e=document.createRange(),t=this.#i.element.childNodes[0];return t&&(e.setStart(t,this.startOffset),e.setEnd(t,this.endOffset)),e}};let tr=new WeakMap;var nr=class{constructor(e,t){this.expander=e,this.input=t,this.combobox=null,this.menu=null,this.match=null,this.justPasted=!1,this.lookBackIndex=0,this.oninput=this.onInput.bind(this),this.onpaste=this.onPaste.bind(this),this.onkeydown=this.onKeydown.bind(this),this.oncommit=this.onCommit.bind(this),this.onmousedown=this.onMousedown.bind(this),this.onblur=this.onBlur.bind(this),this.interactingWithList=!1,t.addEventListener(`paste`,this.onpaste),t.addEventListener(`input`,this.oninput),t.addEventListener(`keydown`,this.onkeydown),t.addEventListener(`blur`,this.onblur)}destroy(){this.input.removeEventListener(`paste`,this.onpaste),this.input.removeEventListener(`input`,this.oninput),this.input.removeEventListener(`keydown`,this.onkeydown),this.input.removeEventListener(`blur`,this.onblur)}dismissMenu(){this.deactivate()&&(this.lookBackIndex=this.input.selectionEnd||this.lookBackIndex)}activate(e,t){this.input!==document.activeElement&&this.input!==document.activeElement?.shadowRoot?.activeElement||(this.deactivate(),this.menu=t,t.id||=`text-expander-${Math.floor(Math.random()*1e5).toString()}`,this.expander.append(t),this.combobox=new Bn(this.input,t),this.expander.dispatchEvent(new Event(`text-expander-activate`)),this.positionMenu(t,e.position),this.combobox.start(),t.addEventListener(`combobox-commit`,this.oncommit),t.addEventListener(`mousedown`,this.onmousedown),this.combobox.navigate(1))}positionMenu(e,t){let n=Math.min(t,this.input.value.length),r=new er(this.input,n).getBoundingClientRect(),i={left:r.left,top:r.top+r.height},a=e.getBoundingClientRect(),o={left:i.left-a.left,top:i.top-a.top};if(o.left!==0||o.top!==0){let t=getComputedStyle(e);e.style.left=t.left?`calc(${t.left} + ${o.left}px)`:`${o.left}px`,e.style.top=t.top?`calc(${t.top} + ${o.top}px)`:`${o.top}px`}}deactivate(){let e=this.menu;return!e||!this.combobox?!1:(this.expander.dispatchEvent(new Event(`text-expander-deactivate`)),this.menu=null,e.removeEventListener(`combobox-commit`,this.oncommit),e.removeEventListener(`mousedown`,this.onmousedown),this.combobox.destroy(),this.combobox=null,e.remove(),!0)}onCommit({target:e}){let t=e;if(!(t instanceof HTMLElement)||!this.combobox)return;let n=this.match;if(!n)return;let r=this.input.value.substring(0,n.position-n.key.length),i=this.input.value.substring(n.position+n.text.length),a={item:t,key:n.key,value:null,continue:!1};if(!this.expander.dispatchEvent(new CustomEvent(`text-expander-value`,{cancelable:!0,detail:a}))||!a.value)return;let o=this.expander.getAttribute(`suffix`)??` `;a.continue&&(o=``);let s=`${a.value}${o}`;this.input.value=r+s+i;let c=r.length+s.length;this.deactivate(),this.input.focus({preventScroll:!0}),this.input.selectionStart=c,this.input.selectionEnd=c,a.continue||(this.lookBackIndex=c,this.match=null),this.expander.dispatchEvent(new CustomEvent(`text-expander-committed`,{cancelable:!1,detail:{input:this.input}}))}onBlur(){if(this.interactingWithList){this.interactingWithList=!1;return}this.deactivate()}onPaste(){this.justPasted=!0}isMatchStillValid(e){return e.position<=this.input.value.length}async onInput(){if(this.justPasted){this.justPasted=!1;return}let e=this.findMatch();if(e){this.match=e;let t=await this.notifyProviders(e);if(!this.match||!this.isMatchStillValid(e)){this.match=null,this.deactivate();return}t?this.activate(e,t):this.deactivate()}else this.match=null,this.deactivate()}findMatch(){let e=this.input.selectionEnd||0,t=this.input.value;e<=this.lookBackIndex&&(this.lookBackIndex=e-1);for(let{key:n,multiWord:r}of this.expander.keys){let i=Yn(t,n,e,{multiWord:r,lookBackIndex:this.lookBackIndex,lastMatchPosition:this.match?this.match.position:null});if(i)return{text:i.text,key:n,position:i.position}}}async notifyProviders(e){let t=[],n=new CustomEvent(`text-expander-change`,{cancelable:!0,detail:{provide:e=>t.push(e),text:e.text,key:e.key}});if(this.expander.dispatchEvent(n))return(await Promise.all(t)).filter(e=>e.matched).map(e=>e.fragment)[0]}onMousedown(){this.interactingWithList=!0}onKeydown(e){e.key===`Escape`&&(this.match=null,this.deactivate()&&(this.lookBackIndex=this.input.selectionEnd||this.lookBackIndex,e.stopImmediatePropagation(),e.preventDefault()))}},rr=class extends HTMLElement{get keys(){let e=this.getAttribute(`keys`),t=e?e.split(` `):[],n=this.getAttribute(`multiword`),r=n?n.split(` `):[],i=r.length===0&&this.hasAttribute(`multiword`);return t.map(e=>({key:e,multiWord:i||r.includes(e)}))}set keys(e){this.setAttribute(`keys`,e)}connectedCallback(){let e=this.querySelector(`input[type="text"], textarea`);if(!(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement))return;let t=new nr(this,e);tr.set(this,t)}disconnectedCallback(){let e=tr.get(this);e&&(e.destroy(),tr.delete(this))}dismiss(){let e=tr.get(this);e&&e.dismissMenu()}};window.customElements.get(`text-expander`)||(window.TextExpanderElement=rr,window.customElements.define(`text-expander`,rr));var ir=Object.defineProperty,ar=(e,t,n)=>t in e?ir(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,or=(e,t,n)=>(ar(e,typeof t==`symbol`?t:t+``,n),n),sr=class extends HTMLElement{constructor(){super(...arguments),or(this,`onToggle`,e=>{let t=e.target;t.open&&this.querySelectorAll(`:scope > :is(ui-disclosure, details)`).forEach(e=>{e.toggleAttribute(`open`,e===t),this.required&&e.toggleAttribute(`disabled`,e===t)})})}connectedCallback(){this.addEventListener(`toggle`,this.onToggle,{capture:!0})}disconnectedCallback(){this.removeEventListener(`toggle`,this.onToggle,{capture:!0})}get required(){return this.hasAttribute(`required`)}},cr=Object.defineProperty,lr=(e,t,n)=>t in e?cr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,ur=(e,t,n)=>(lr(e,typeof t==`symbol`?t:t+``,n),n);let dr=class e extends HTMLElement{constructor(){super(...arguments),ur(this,`timeouts`,new Map),ur(this,`index`,0)}connectedCallback(){this.hasAttribute(`role`)||this.setAttribute(`role`,`status`),this.hasAttribute(`aria-live`)||this.setAttribute(`aria-live`,`polite`),this.hasAttribute(`aria-relevant`)||this.setAttribute(`aria-relevant`,`additions`);for(let e of this.children)this.show(e)}show(t,n={}){let r=n.key||t.dataset.key||String(this.index++);this.dismiss(r),t.dataset.key=r,this.contains(t)||this.append(t);let i=Number(n.duration===void 0?t.dataset.duration||e.duration:n.duration);return i>0&&(this.startTimeout(t,i),t.addEventListener(`mouseenter`,this.clearTimeout.bind(this,t)),t.addEventListener(`focusin`,this.clearTimeout.bind(this,t)),t.addEventListener(`mouseleave`,this.startTimeout.bind(this,t,i)),t.addEventListener(`focusout`,this.startTimeout.bind(this,t,i))),r}dismiss(e){if(typeof e==`string`){this.querySelectorAll(`[data-key="${e}"]`).forEach(e=>this.dismiss(e));return}e.remove(),this.clearTimeout(e)}clear(){Array.from(this.children).forEach(e=>{this.dismiss(e)})}speak(e){let t=document.createElement(`div`);Object.assign(t.style,{clip:`rect(0 0 0 0)`,clipPath:`inset(50%)`,height:`1px`,overflow:`hidden`,position:`absolute`,whiteSpace:`nowrap`,width:`1px`}),t.textContent=e,this.show(t)}startTimeout(e,t){this.clearTimeout(e),this.timeouts.set(e,window.setTimeout(()=>{this.dismiss(e)},t))}clearTimeout(e){this.timeouts.has(e)&&clearTimeout(this.timeouts.get(e))}};ur(dr,`duration`,1e4);let fr=dr;function pr(e){e._currentTransition&&=(e.classList.remove(...[`active`,`from`,`to`].map(t=>e._currentTransition+t)),null)}async function mr(e,t,n={}){let r=yr(n)+t+`-`,i=e.classList;pr(e),e._currentTransition=r,i.add(r+`active`,r+`from`),await _r(),i.add(r+`to`),i.remove(r+`from`),await vr(e),i.remove(r+`to`,r+`active`),e._currentTransition===r&&(e._currentTransition=null)}function hr(e,t={}){return mr(e,`enter`,t)}function gr(e,t={}){return mr(e,`leave`,t)}function _r(){return new Promise(e=>requestAnimationFrame(()=>requestAnimationFrame(()=>e())))}async function vr(e){if(getComputedStyle(e).transitionDuration.startsWith(`0s`))return;let t=!1,n=n=>t||=n.target===e;if(e.addEventListener(`transitionstart`,n),await _r(),e.removeEventListener(`transitionstart`,n),t)return new Promise(t=>{let n=r=>{r.target===e&&(t(),e.removeEventListener(`transitionend`,n),e.removeEventListener(`transitioncancel`,n))};e.addEventListener(`transitionend`,n),e.addEventListener(`transitioncancel`,n)})}function yr(e){return e!=null&&e.prefix?e.prefix+`-`:``}function br(e){return e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||e.button!==void 0&&e.button!==0}var xr=Object.defineProperty,Sr=(e,t,n)=>t in e?xr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Cr=(e,t,n)=>(Sr(e,typeof t==`symbol`?t:t+``,n),n),wr=class extends HTMLElement{constructor(){super(...arguments),Cr(this,`onButtonClick`,e=>{!br(e)&&!this.disabled&&(this.open=!this.open,e.preventDefault())})}static get observedAttributes(){return[`open`]}connectedCallback(){this.content.hidden=!this.open,this.button.setAttribute(`aria-expanded`,String(this.open)),this.button.addEventListener(`click`,this.onButtonClick)}disconnectedCallback(){pr(this.content),this.button.removeAttribute(`aria-expanded`),this.button.removeEventListener(`click`,this.onButtonClick)}get open(){return this.hasAttribute(`open`)}set open(e){e?this.setAttribute(`open`,``):this.removeAttribute(`open`)}get disabled(){return this.hasAttribute(`disabled`)}attributeChangedCallback(e,t,n){e===`open`&&(n===null?this.wasClosed():this.wasOpened())}wasOpened(){this.content.hidden&&(this.content.hidden=!1,hr(this.content)),this.button.setAttribute(`aria-expanded`,`true`),this.dispatchEvent(new Event(`toggle`))}wasClosed(){this.content.hidden||gr(this.content).then(()=>this.content.hidden=!0),this.button.setAttribute(`aria-expanded`,`false`),this.dispatchEvent(new Event(`toggle`))}get button(){return this.querySelector(`button, [role=button]`)}get content(){return this.children[1]}},Tr=[`input:not([inert]):not([inert] *)`,`select:not([inert]):not([inert] *)`,`textarea:not([inert]):not([inert] *)`,`a[href]:not([inert]):not([inert] *)`,`button:not([inert]):not([inert] *)`,`[tabindex]:not(slot):not([inert]):not([inert] *)`,`audio[controls]:not([inert]):not([inert] *)`,`video[controls]:not([inert]):not([inert] *)`,`[contenteditable]:not([contenteditable="false"]):not([inert]):not([inert] *)`,`details>summary:first-of-type:not([inert]):not([inert] *)`,`details:not([inert]):not([inert] *)`],Er=Tr.join(`,`),Dr=typeof Element>`u`,Or=Dr?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,kr=!Dr&&Element.prototype.getRootNode?function(e){return e?.getRootNode?.call(e)}:function(e){return e?.ownerDocument},Ar=function(e,t){t===void 0&&(t=!0);var n=e?.getAttribute?.call(e,`inert`);return n===``||n===`true`||t&&e&&(typeof e.closest==`function`?e.closest(`[inert]`):Ar(e.parentNode))},jr=function(e){var t=e?.getAttribute?.call(e,`contenteditable`);return t===``||t===`true`},Mr=function(e,t,n){if(Ar(e))return[];var r=Array.prototype.slice.apply(e.querySelectorAll(Er));return t&&Or.call(e,Er)&&r.unshift(e),r=r.filter(n),r},Nr=function(e,t,n){for(var r=[],i=Array.from(e);i.length;){var a=i.shift();if(!Ar(a,!1))if(a.tagName===`SLOT`){var o=a.assignedElements(),s=Nr(o.length?o:a.children,!0,n);n.flatten?r.push.apply(r,s):r.push({scopeParent:a,candidates:s})}else{Or.call(a,Er)&&n.filter(a)&&(t||!e.includes(a))&&r.push(a);var c=a.shadowRoot||typeof n.getShadowRoot==`function`&&n.getShadowRoot(a),l=!Ar(c,!1)&&(!n.shadowRootFilter||n.shadowRootFilter(a));if(c&&l){var u=Nr(c===!0?a.children:c.children,!0,n);n.flatten?r.push.apply(r,u):r.push({scopeParent:a,candidates:u})}else i.unshift.apply(i,a.children)}}return r},Pr=function(e){return!isNaN(parseInt(e.getAttribute(`tabindex`),10))},Fr=function(e){if(!e)throw Error(`No node provided`);return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||jr(e))&&!Pr(e)?0:e.tabIndex},Ir=function(e,t){var n=Fr(e);return n<0&&t&&!Pr(e)?0:n},Lr=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},Rr=function(e){return e.tagName===`INPUT`},zr=function(e){return Rr(e)&&e.type===`hidden`},Br=function(e){return e.tagName===`DETAILS`&&Array.prototype.slice.apply(e.children).some(function(e){return e.tagName===`SUMMARY`})},Vr=function(e,t){for(var n=0;nsummary:first-of-type`)?e.parentElement:e;if(Or.call(i,`details:not([open]) *`))return!0;if(!n||n===`full`||n===`full-native`||n===`legacy-full`){if(typeof r==`function`){for(var a=e;e;){var o=e.parentElement,s=kr(e);if(o&&!o.shadowRoot&&r(o)===!0)return Kr(e);e=e.assignedSlot?e.assignedSlot:!o&&s!==e.ownerDocument?s.host:o}e=a}if(Gr(e))return!e.getClientRects().length;if(n!==`legacy-full`)return!0}else if(n===`non-zero-area`)return Kr(e);return!1},Jr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName===`FIELDSET`&&t.disabled){for(var n=0;n=0)},Qr=function(e){var t=[],n=[];return e.forEach(function(e,r){var i=!!e.scopeParent,a=i?e.scopeParent:e,o=Ir(a,i),s=i?Qr(e.candidates):a;o===0?i?t.push.apply(t,s):t.push(a):n.push({documentOrder:r,tabIndex:o,item:e,isScope:i,content:s})}),n.sort(Lr).reduce(function(e,t){return t.isScope?e.push.apply(e,t.content):e.push(t.content),e},[]).concat(t)},$r=function(e,t){return t||={},Qr(t.getShadowRoot?Nr([e],t.includeContainer,{filter:Xr.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:Zr}):Mr(e,t.includeContainer,Xr.bind(null,t)))},ei=function(e,t){return t||={},t.getShadowRoot?Nr([e],t.includeContainer,{filter:Yr.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):Mr(e,t.includeContainer,Yr.bind(null,t))},ti=function(e,t){if(t||={},!e)throw Error(`No node provided`);return Or.call(e,Er)===!1?!1:Xr(t,e)},ni=Tr.concat(`iframe:not([inert]):not([inert] *)`).join(`,`),ri=function(e,t){if(t||={},!e)throw Error(`No node provided`);return Or.call(e,ni)===!1?!1:Yr(t,e)},ii=Object.defineProperty,ai=(e,t,n)=>t in e?ii(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,oi=(e,t,n)=>(ai(e,typeof t==`symbol`?t:t+``,n),n);let si=class e extends HTMLElement{constructor(){super(...arguments),oi(this,`search`,``),oi(this,`searchTimeout`),oi(this,`onKeyDown`,t=>{if(!this.hidden){if(t.key===`ArrowUp`){this.navigate(-1),t.preventDefault();return}if(t.key===`ArrowDown`){this.navigate(1),t.preventDefault();return}t.key.length>1||t.ctrlKey||t.metaKey||t.altKey||(this.search+=t.key.toLowerCase(),t.preventDefault(),clearTimeout(this.searchTimeout),this.searchTimeout=window.setTimeout(()=>{this.search=``},e.searchDelay),this.items.some(e=>e.textContent?.trim().toLowerCase().indexOf(this.search)===0?(e.focus(),!0):!1))}})}connectedCallback(){this.hasAttribute(`role`)||this.setAttribute(`role`,`menu`),this.hasAttribute(`tabindex`)||this.setAttribute(`tabindex`,`-1`),this.items.forEach(e=>{e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`-1`)}),this.addEventListener(`keydown`,this.onKeyDown)}disconnectedCallback(){this.removeEventListener(`keydown`,this.onKeyDown)}get items(){return Array.from(this.querySelectorAll(`[role^=menuitem]`)).filter(e=>ri(e))}navigate(e){var t;let n=this.items,r=(document.activeElement instanceof HTMLElement?n.indexOf(document.activeElement):-1)+e;r<0&&(r=n.length-1),r>=n.length&&(r=0),(t=n[r])==null||t.focus()}};oi(si,`searchDelay`,800);let ci=si; /*! * focus-trap 7.8.0 * @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE */ function li(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw TypeError(`Invalid attempt to iterate non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a,o=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,a=e},f:function(){try{o||n.return==null||n.return()}finally{if(s)throw a}}}}function fi(e,t,n){return(t=yi(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function pi(e){if(typeof Symbol<`u`&&e[Symbol.iterator]!=null||e[`@@iterator`]!=null)return Array.from(e)}function mi(){throw TypeError(`Invalid attempt to spread non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function hi(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function gi(e){for(var t=1;t0?e[e.length-1]:null},activateTrap:function(e,t){t!==xi.getActiveTrap(e)&&xi.pauseTrap(e);var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var n=e.indexOf(t);n!==-1&&e.splice(n,1),xi.unpauseTrap(e)},pauseTrap:function(e){xi.getActiveTrap(e)?._setPausedState(!0)},unpauseTrap:function(e){var t=xi.getActiveTrap(e);t&&!t._isManuallyPaused()&&t._setPausedState(!1)}},Si=function(e){return e.tagName&&e.tagName.toLowerCase()===`input`&&typeof e.select==`function`},Ci=function(e){return e?.key===`Escape`||e?.key===`Esc`||e?.keyCode===27},wi=function(e){return e?.key===`Tab`||e?.keyCode===9},Ti=function(e){return wi(e)&&!e.shiftKey},Ei=function(e){return wi(e)&&e.shiftKey},Di=function(e){return setTimeout(e,0)},Oi=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r1&&arguments[1]!==void 0?arguments[1]:{},r=t.hasFallback,a=r===void 0?!1:r,o=t.params,s=o===void 0?[]:o,c=i[e];if(typeof c==`function`&&(c=c.apply(void 0,_i(s))),c===!0&&(c=void 0),!c){if(c===void 0||c===!1)return c;throw Error(`\`${e}\` was specified but was not a node, or did not return a node`)}var l=c;if(typeof c==`string`){try{l=n.querySelector(c)}catch(t){throw Error(`\`${e}\` appears to be an invalid selector; error="${t.message}"`)}if(!l&&!a)throw Error(`\`${e}\` as selector refers to no known node`)}return l},u=function(){var e=l(`initialFocus`,{hasFallback:!0});if(e===!1)return!1;if(e===void 0||e&&!ri(e,i.tabbableOptions))if(c(n.activeElement)>=0)e=n.activeElement;else{var t=a.tabbableGroups[0];e=t&&t.firstTabbableNode||l(`fallbackFocus`)}else e===null&&(e=l(`fallbackFocus`));if(!e)throw Error(`Your focus-trap needs to have at least one focusable element`);return e},d=function(){if(a.containerGroups=a.containers.map(function(e){var t=$r(e,i.tabbableOptions),n=ei(e,i.tabbableOptions),r=t.length>0?t[0]:void 0,a=t.length>0?t[t.length-1]:void 0,o=n.find(function(e){return ti(e)}),s=n.slice().reverse().find(function(e){return ti(e)});return{container:e,tabbableNodes:t,focusableNodes:n,posTabIndexesFound:!!t.find(function(e){return Fr(e)>0}),firstTabbableNode:r,lastTabbableNode:a,firstDomTabbableNode:o,lastDomTabbableNode:s,nextTabbableNode:function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,i=t.indexOf(e);return i<0?r?n.slice(n.indexOf(e)+1).find(function(e){return ti(e)}):n.slice(0,n.indexOf(e)).reverse().find(function(e){return ti(e)}):t[i+(r?1:-1)]}}}),a.tabbableGroups=a.containerGroups.filter(function(e){return e.tabbableNodes.length>0}),a.tabbableGroups.length<=0&&!l(`fallbackFocus`))throw Error(`Your focus-trap must have at least one container with at least one tabbable node in it at all times`);if(a.containerGroups.find(function(e){return e.posTabIndexesFound})&&a.containerGroups.length>1)throw Error(`At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.`)},f=function(e){var t=e.activeElement;if(t)return t.shadowRoot&&t.shadowRoot.activeElement!==null?f(t.shadowRoot):t},p=function(e){if(e!==!1&&e!==f(document)){if(!e||!e.focus){p(u());return}e.focus({preventScroll:!!i.preventScroll}),a.mostRecentlyFocusedNode=e,Si(e)&&e.select()}},m=function(e){var t=l(`setReturnFocus`,{params:[e]});return t||(t===!1?!1:e)},h=function(e){var t=e.target,n=e.event,r=e.isBackward,o=r===void 0?!1:r;t||=ki(n),d();var s=null;if(a.tabbableGroups.length>0){var u=c(t,n),f=u>=0?a.containerGroups[u]:void 0;if(u<0)s=o?a.tabbableGroups[a.tabbableGroups.length-1].lastTabbableNode:a.tabbableGroups[0].firstTabbableNode;else if(o){var p=a.tabbableGroups.findIndex(function(e){var n=e.firstTabbableNode;return t===n});if(p<0&&(f.container===t||ri(t,i.tabbableOptions)&&!ti(t,i.tabbableOptions)&&!f.nextTabbableNode(t,!1))&&(p=u),p>=0){var m=p===0?a.tabbableGroups.length-1:p-1,h=a.tabbableGroups[m];s=Fr(t)>=0?h.lastTabbableNode:h.lastDomTabbableNode}else wi(n)||(s=f.nextTabbableNode(t,!1))}else{var g=a.tabbableGroups.findIndex(function(e){var n=e.lastTabbableNode;return t===n});if(g<0&&(f.container===t||ri(t,i.tabbableOptions)&&!ti(t,i.tabbableOptions)&&!f.nextTabbableNode(t))&&(g=u),g>=0){var _=g===a.tabbableGroups.length-1?0:g+1,v=a.tabbableGroups[_];s=Fr(t)>=0?v.firstTabbableNode:v.firstDomTabbableNode}else wi(n)||(s=f.nextTabbableNode(t))}}else s=l(`fallbackFocus`);return s},g=function(e){if(!(c(ki(e),e)>=0)){if(Oi(i.clickOutsideDeactivates,e)){o.deactivate({returnFocus:i.returnFocusOnDeactivate});return}Oi(i.allowOutsideClick,e)||e.preventDefault()}},_=function(e){var t=ki(e),n=c(t,e)>=0;if(n||t instanceof Document)n&&(a.mostRecentlyFocusedNode=t);else{e.stopImmediatePropagation();var r,o=!0;if(a.mostRecentlyFocusedNode)if(Fr(a.mostRecentlyFocusedNode)>0){var s=c(a.mostRecentlyFocusedNode),l=a.containerGroups[s].tabbableNodes;if(l.length>0){var d=l.findIndex(function(e){return e===a.mostRecentlyFocusedNode});d>=0&&(i.isKeyForward(a.recentNavEvent)?d+1=0&&(r=l[d-1],o=!1))}}else a.containerGroups.some(function(e){return e.tabbableNodes.some(function(e){return Fr(e)>0})})||(o=!1);else o=!1;o&&(r=h({target:a.mostRecentlyFocusedNode,isBackward:i.isKeyBackward(a.recentNavEvent)})),p(r||a.mostRecentlyFocusedNode||u())}a.recentNavEvent=void 0},v=function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;a.recentNavEvent=e;var n=h({event:e,isBackward:t});n&&(wi(e)&&e.preventDefault(),p(n))},y=function(e){(i.isKeyForward(e)||i.isKeyBackward(e))&&v(e,i.isKeyBackward(e))},b=function(e){Ci(e)&&Oi(i.escapeDeactivates,e)!==!1&&(e.preventDefault(),o.deactivate())},x=function(e){c(ki(e),e)>=0||Oi(i.clickOutsideDeactivates,e)||Oi(i.allowOutsideClick,e)||(e.preventDefault(),e.stopImmediatePropagation())},ee=function(){if(a.active)return xi.activateTrap(r,o),a.delayInitialFocusTimer=i.delayInitialFocus?Di(function(){p(u())}):p(u()),n.addEventListener(`focusin`,_,!0),n.addEventListener(`mousedown`,g,{capture:!0,passive:!1}),n.addEventListener(`touchstart`,g,{capture:!0,passive:!1}),n.addEventListener(`click`,x,{capture:!0,passive:!1}),n.addEventListener(`keydown`,y,{capture:!0,passive:!1}),n.addEventListener(`keydown`,b),o},S=function(e){a.active&&!a.paused&&o._setSubtreeIsolation(!1),a.adjacentElements.clear(),a.alreadySilent.clear();var t=new Set,n=new Set,r=di(e),i;try{for(r.s();!(i=r.n()).done;){var s=i.value;t.add(s);for(var c=typeof ShadowRoot<`u`&&s.getRootNode()instanceof ShadowRoot,l=s;l;){t.add(l);var u=l.parentElement,d=[];u?d=u.children:!u&&c&&(d=l.getRootNode().children,u=l.getRootNode().host,c=typeof ShadowRoot<`u`&&u.getRootNode()instanceof ShadowRoot);var f=di(d),p;try{for(f.s();!(p=f.n()).done;){var m=p.value;n.add(m)}}catch(e){f.e(e)}finally{f.f()}l=u}}}catch(e){r.e(e)}finally{r.f()}t.forEach(function(e){n.delete(e)}),a.adjacentElements=n},C=function(){if(a.active)return n.removeEventListener(`focusin`,_,!0),n.removeEventListener(`mousedown`,g,!0),n.removeEventListener(`touchstart`,g,!0),n.removeEventListener(`click`,x,!0),n.removeEventListener(`keydown`,y,!0),n.removeEventListener(`keydown`,b),o},w=typeof window<`u`&&`MutationObserver`in window?new MutationObserver(function(e){e.some(function(e){return Array.from(e.removedNodes).some(function(e){return e===a.mostRecentlyFocusedNode})})&&p(u())}):void 0,T=function(){w&&(w.disconnect(),a.active&&!a.paused&&a.containers.map(function(e){w.observe(e,{subtree:!0,childList:!0})}))};return o={get active(){return a.active},get paused(){return a.paused},activate:function(e){if(a.active)return this;var t=s(e,`onActivate`),c=s(e,`onPostActivate`),l=s(e,`checkCanFocusTrap`),u=xi.getActiveTrap(r),p=!1;if(u&&!u.paused){var m;(m=u._setSubtreeIsolation)==null||m.call(u,!1),p=!0}try{l||d(),a.active=!0,a.paused=!1,a.nodeFocusedBeforeActivation=f(n),t?.();var h=function(){l&&d(),ee(),T(),i.isolateSubtrees&&o._setSubtreeIsolation(!0),c?.()};if(l)return l(a.containers.concat()).then(h,h),this;h()}catch(e){if(u===xi.getActiveTrap(r)&&p){var g;(g=u._setSubtreeIsolation)==null||g.call(u,!0)}throw e}return this},deactivate:function(e){if(!a.active)return this;var t=gi({onDeactivate:i.onDeactivate,onPostDeactivate:i.onPostDeactivate,checkCanReturnFocus:i.checkCanReturnFocus},e);clearTimeout(a.delayInitialFocusTimer),a.delayInitialFocusTimer=void 0,a.paused||o._setSubtreeIsolation(!1),a.alreadySilent.clear(),C(),a.active=!1,a.paused=!1,T(),xi.deactivateTrap(r,o);var n=s(t,`onDeactivate`),c=s(t,`onPostDeactivate`),l=s(t,`checkCanReturnFocus`),u=s(t,`returnFocus`,`returnFocusOnDeactivate`);n?.();var d=function(){Di(function(){u&&p(m(a.nodeFocusedBeforeActivation)),c?.()})};return u&&l?(l(m(a.nodeFocusedBeforeActivation)).then(d,d),this):(d(),this)},pause:function(e){return a.active?(a.manuallyPaused=!0,this._setPausedState(!0,e)):this},unpause:function(e){return!a.active||(a.manuallyPaused=!1,r[r.length-1]!==this)?this:this._setPausedState(!1,e)},updateContainerElements:function(e){return a.containers=[].concat(e).filter(Boolean).map(function(e){return typeof e==`string`?n.querySelector(e):e}),i.isolateSubtrees&&S(a.containers),a.active&&(d(),i.isolateSubtrees&&!a.paused&&o._setSubtreeIsolation(!0)),T(),this}},Object.defineProperties(o,{_isManuallyPaused:{value:function(){return a.manuallyPaused}},_setPausedState:{value:function(e,t){if(a.paused===e)return this;if(a.paused=e,e){var n=s(t,`onPause`),r=s(t,`onPostPause`);n?.(),C(),T(),o._setSubtreeIsolation(!1),r?.()}else{var i=s(t,`onUnpause`),c=s(t,`onPostUnpause`);i?.(),o._setSubtreeIsolation(!0),d(),ee(),T(),c?.()}return this}},_setSubtreeIsolation:{value:function(e){i.isolateSubtrees&&a.adjacentElements.forEach(function(t){if(e)switch(i.isolateSubtrees){case`aria-hidden`:(t.ariaHidden===`true`||t.getAttribute(`aria-hidden`)?.toLowerCase()===`true`)&&a.alreadySilent.add(t),t.setAttribute(`aria-hidden`,`true`);break;default:(t.inert||t.hasAttribute(`inert`))&&a.alreadySilent.add(t),t.setAttribute(`inert`,!0);break}else if(!a.alreadySilent.has(t))switch(i.isolateSubtrees){case`aria-hidden`:t.removeAttribute(`aria-hidden`);break;default:t.removeAttribute(`inert`);break}})}}}),o.updateContainerElements(e),o},Mi=Object.defineProperty,Ni=(e,t,n)=>t in e?Mi(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Pi=(e,t,n)=>(Ni(e,typeof t==`symbol`?t:t+``,n),n);let Fi=class e extends HTMLElement{constructor(){super(),Pi(this,`focusTrap`),Pi(this,`connected`,!1);let t=document.createElement(`template`);t.innerHTML=`
`;let n=this.attachShadow({mode:`open`});n.appendChild(t.content.cloneNode(!0)),this.backdrop.addEventListener(`click`,()=>{var t;this.hasAttribute(`static`)?(t=e.attention)==null||t.call(e,n.children[1]):this.close()}),this.focusTrap=ji(this,{escapeDeactivates:!1,allowOutsideClick:!0,preventScroll:!0,initialFocus:()=>this.querySelector(`[autofocus]`)||void 0})}static get observedAttributes(){return[`open`]}connectedCallback(){var e,t,n,r,i,a;this.connected=!0,(e=this.content)!=null&&e.hasAttribute(`role`)||(t=this.content)==null||t.setAttribute(`role`,`dialog`),(n=this.content)!=null&&n.hasAttribute(`aria-modal`)||(r=this.content)==null||r.setAttribute(`aria-modal`,`true`),(i=this.content)!=null&&i.hasAttribute(`tabindex`)||(a=this.content)==null||a.setAttribute(`tabindex`,`-1`),this.addEventListener(`keydown`,e=>{e.key===`Escape`&&this.open&&(e.preventDefault(),e.stopPropagation(),this.close())}),this.open&&this.wasOpened()}disconnectedCallback(){this.connected=!1}get open(){return this.hasAttribute(`open`)}set open(e){e?this.setAttribute(`open`,``):this.removeAttribute(`open`)}close(){if(!this.open)return;let e=new Event(`beforeclose`,{cancelable:!0});this.dispatchEvent(e)&&(this.open=!1)}attributeChangedCallback(e,t,n){e!==`open`||!this.connected||(n===null?this.wasClosed():this.wasOpened())}async wasOpened(){document.documentElement.style.overflow=`hidden`,this.hidden=!1,hr(this),requestAnimationFrame(()=>this.focusTrap?.activate()),this.dispatchEvent(new Event(`open`))}wasClosed(){var e;document.documentElement.style.overflow=``,(e=this.focusTrap)==null||e.deactivate(),gr(this).then(()=>this.hidden=!0),this.dispatchEvent(new Event(`close`))}get backdrop(){return this.shadowRoot?.firstElementChild}get content(){return this.firstElementChild}};Pi(Fi,`attention`,e=>e.animate([{transform:`scale(1)`},{transform:`scale(1.1)`},{transform:`scale(1)`}],300));let Ii=Fi,Li=Math.min,z=Math.max,Ri=Math.round,zi=Math.floor,B=e=>({x:e,y:e}),Bi={left:`right`,right:`left`,bottom:`top`,top:`bottom`},Vi={start:`end`,end:`start`};function Hi(e,t,n){return z(e,Li(t,n))}function Ui(e,t){return typeof e==`function`?e(t):e}function Wi(e){return e.split(`-`)[0]}function Gi(e){return e.split(`-`)[1]}function Ki(e){return e===`x`?`y`:`x`}function qi(e){return e===`y`?`height`:`width`}let Ji=new Set([`top`,`bottom`]);function Yi(e){return Ji.has(Wi(e))?`y`:`x`}function Xi(e){return Ki(Yi(e))}function Zi(e,t,n){n===void 0&&(n=!1);let r=Gi(e),i=Xi(e),a=qi(i),o=i===`x`?r===(n?`end`:`start`)?`right`:`left`:r===`start`?`bottom`:`top`;return t.reference[a]>t.floating[a]&&(o=oa(o)),[o,oa(o)]}function Qi(e){let t=oa(e);return[$i(e),t,$i(t)]}function $i(e){return e.replace(/start|end/g,e=>Vi[e])}let ea=[`left`,`right`],ta=[`right`,`left`],na=[`top`,`bottom`],ra=[`bottom`,`top`];function ia(e,t,n){switch(e){case`top`:case`bottom`:return n?t?ta:ea:t?ea:ta;case`left`:case`right`:return t?na:ra;default:return[]}}function aa(e,t,n,r){let i=Gi(e),a=ia(Wi(e),n===`start`,r);return i&&(a=a.map(e=>e+`-`+i),t&&(a=a.concat(a.map($i)))),a}function oa(e){return e.replace(/left|right|bottom|top/g,e=>Bi[e])}function sa(e){return{top:0,right:0,bottom:0,left:0,...e}}function ca(e){return typeof e==`number`?{top:e,right:e,bottom:e,left:e}:sa(e)}function la(e){let{x:t,y:n,width:r,height:i}=e;return{width:r,height:i,top:n,left:t,right:t+r,bottom:n+i,x:t,y:n}}function ua(e,t,n){let{reference:r,floating:i}=e,a=Yi(t),o=Xi(t),s=qi(o),c=Wi(t),l=a===`y`,u=r.x+r.width/2-i.width/2,d=r.y+r.height/2-i.height/2,f=r[s]/2-i[s]/2,p;switch(c){case`top`:p={x:u,y:r.y-i.height};break;case`bottom`:p={x:u,y:r.y+r.height};break;case`right`:p={x:r.x+r.width,y:d};break;case`left`:p={x:r.x-i.width,y:d};break;default:p={x:r.x,y:r.y}}switch(Gi(t)){case`start`:p[o]-=f*(n&&l?-1:1);break;case`end`:p[o]+=f*(n&&l?-1:1);break}return p}let da=async(e,t,n)=>{let{placement:r=`bottom`,strategy:i=`absolute`,middleware:a=[],platform:o}=n,s=a.filter(Boolean),c=await(o.isRTL==null?void 0:o.isRTL(t)),l=await o.getElementRects({reference:e,floating:t,strategy:i}),{x:u,y:d}=ua(l,r,c),f=r,p={},m=0;for(let n=0;ne<=0)){let e=(i.flip?.index||0)+1,t=ee[e];if(t&&(!(u===`alignment`&&_!==Yi(t))||w.every(e=>Yi(e.placement)===_?e.overflows[0]>0:!0)))return{data:{index:e,overflows:w},reset:{placement:t}};let n=w.filter(e=>e.overflows[0]<=0).sort((e,t)=>e.overflows[1]-t.overflows[1])[0]?.placement;if(!n)switch(f){case`bestFit`:{let e=w.filter(e=>{if(x){let t=Yi(e.placement);return t===_||t===`y`}return!0}).map(e=>[e.placement,e.overflows.filter(e=>e>0).reduce((e,t)=>e+t,0)]).sort((e,t)=>e[1]-t[1])[0]?.[0];e&&(n=e);break}case`initialPlacement`:n=o;break}if(r!==n)return{reset:{placement:n}}}return{}}}},ma=new Set([`left`,`top`]);async function ha(e,t){let{placement:n,platform:r,elements:i}=e,a=await(r.isRTL==null?void 0:r.isRTL(i.floating)),o=Wi(n),s=Gi(n),c=Yi(n)===`y`,l=ma.has(o)?-1:1,u=a&&c?-1:1,d=Ui(t,e),{mainAxis:f,crossAxis:p,alignmentAxis:m}=typeof d==`number`?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:d.mainAxis||0,crossAxis:d.crossAxis||0,alignmentAxis:d.alignmentAxis};return s&&typeof m==`number`&&(p=s===`end`?m*-1:m),c?{x:p*u,y:f*l}:{x:f*l,y:p*u}}let ga=function(e){return e===void 0&&(e=0),{name:`offset`,options:e,async fn(t){var n;let{x:r,y:i,placement:a,middlewareData:o}=t,s=await ha(t,e);return a===o.offset?.placement&&(n=o.arrow)!=null&&n.alignmentOffset?{}:{x:r+s.x,y:i+s.y,data:{...s,placement:a}}}}},_a=function(e){return e===void 0&&(e={}),{name:`shift`,options:e,async fn(t){let{x:n,y:r,placement:i}=t,{mainAxis:a=!0,crossAxis:o=!1,limiter:s={fn:e=>{let{x:t,y:n}=e;return{x:t,y:n}}},...c}=Ui(e,t),l={x:n,y:r},u=await fa(t,c),d=Yi(Wi(i)),f=Ki(d),p=l[f],m=l[d];if(a){let e=f===`y`?`top`:`left`,t=f===`y`?`bottom`:`right`,n=p+u[e],r=p-u[t];p=Hi(n,p,r)}if(o){let e=d===`y`?`top`:`left`,t=d===`y`?`bottom`:`right`,n=m+u[e],r=m-u[t];m=Hi(n,m,r)}let h=s.fn({...t,[f]:p,[d]:m});return{...h,data:{x:h.x-n,y:h.y-r,enabled:{[f]:a,[d]:o}}}}}},va=function(e){return e===void 0&&(e={}),{name:`size`,options:e,async fn(t){var n,r;let{placement:i,rects:a,platform:o,elements:s}=t,{apply:c=()=>{},...l}=Ui(e,t),u=await fa(t,l),d=Wi(i),f=Gi(i),p=Yi(i)===`y`,{width:m,height:h}=a.floating,g,_;d===`top`||d===`bottom`?(g=d,_=f===(await(o.isRTL==null?void 0:o.isRTL(s.floating))?`start`:`end`)?`left`:`right`):(_=d,g=f===`end`?`top`:`bottom`);let v=h-u.top-u.bottom,y=m-u.left-u.right,b=Li(h-u[g],v),x=Li(m-u[_],y),ee=!t.middlewareData.shift,S=b,C=x;if((n=t.middlewareData.shift)!=null&&n.enabled.x&&(C=y),(r=t.middlewareData.shift)!=null&&r.enabled.y&&(S=v),ee&&!f){let e=z(u.left,0),t=z(u.right,0),n=z(u.top,0),r=z(u.bottom,0);p?C=m-2*(e!==0||t!==0?e+t:z(u.left,u.right)):S=h-2*(n!==0||r!==0?n+r:z(u.top,u.bottom))}await c({...t,availableWidth:C,availableHeight:S});let w=await o.getDimensions(s.floating);return m!==w.width||h!==w.height?{reset:{rects:!0}}:{}}}};function ya(){return typeof window<`u`}function ba(e){return xa(e)?(e.nodeName||``).toLowerCase():`#document`}function V(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function H(e){return((xa(e)?e.ownerDocument:e.document)||window.document)?.documentElement}function xa(e){return ya()?e instanceof Node||e instanceof V(e).Node:!1}function U(e){return ya()?e instanceof Element||e instanceof V(e).Element:!1}function W(e){return ya()?e instanceof HTMLElement||e instanceof V(e).HTMLElement:!1}function Sa(e){return!ya()||typeof ShadowRoot>`u`?!1:e instanceof ShadowRoot||e instanceof V(e).ShadowRoot}let Ca=new Set([`inline`,`contents`]);function wa(e){let{overflow:t,overflowX:n,overflowY:r,display:i}=G(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&!Ca.has(i)}let Ta=new Set([`table`,`td`,`th`]);function Ea(e){return Ta.has(ba(e))}let Da=[`:popover-open`,`:modal`];function Oa(e){return Da.some(t=>{try{return e.matches(t)}catch{return!1}})}let ka=[`transform`,`translate`,`scale`,`rotate`,`perspective`],Aa=[`transform`,`translate`,`scale`,`rotate`,`perspective`,`filter`],ja=[`paint`,`layout`,`strict`,`content`];function Ma(e){let t=Pa(),n=U(e)?G(e):e;return ka.some(e=>n[e]?n[e]!==`none`:!1)||(n.containerType?n.containerType!==`normal`:!1)||!t&&(n.backdropFilter?n.backdropFilter!==`none`:!1)||!t&&(n.filter?n.filter!==`none`:!1)||Aa.some(e=>(n.willChange||``).includes(e))||ja.some(e=>(n.contain||``).includes(e))}function Na(e){let t=Ra(e);for(;W(t)&&!Ia(t);){if(Ma(t))return t;if(Oa(t))return null;t=Ra(t)}return null}function Pa(){return typeof CSS>`u`||!CSS.supports?!1:CSS.supports(`-webkit-backdrop-filter`,`none`)}let Fa=new Set([`html`,`body`,`#document`]);function Ia(e){return Fa.has(ba(e))}function G(e){return V(e).getComputedStyle(e)}function La(e){return U(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function Ra(e){if(ba(e)===`html`)return e;let t=e.assignedSlot||e.parentNode||Sa(e)&&e.host||H(e);return Sa(t)?t.host:t}function za(e){let t=Ra(e);return Ia(t)?e.ownerDocument?e.ownerDocument.body:e.body:W(t)&&wa(t)?t:za(t)}function Ba(e,t,n){t===void 0&&(t=[]),n===void 0&&(n=!0);let r=za(e),i=r===e.ownerDocument?.body,a=V(r);if(i){let e=Va(a);return t.concat(a,a.visualViewport||[],wa(r)?r:[],e&&n?Ba(e):[])}return t.concat(r,Ba(r,[],n))}function Va(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function Ha(e){let t=G(e),n=parseFloat(t.width)||0,r=parseFloat(t.height)||0,i=W(e),a=i?e.offsetWidth:n,o=i?e.offsetHeight:r,s=Ri(n)!==a||Ri(r)!==o;return s&&(n=a,r=o),{width:n,height:r,$:s}}function Ua(e){return U(e)?e:e.contextElement}function Wa(e){let t=Ua(e);if(!W(t))return B(1);let n=t.getBoundingClientRect(),{width:r,height:i,$:a}=Ha(t),o=(a?Ri(n.width):n.width)/r,s=(a?Ri(n.height):n.height)/i;return(!o||!Number.isFinite(o))&&(o=1),(!s||!Number.isFinite(s))&&(s=1),{x:o,y:s}}let Ga=B(0);function Ka(e){let t=V(e);return!Pa()||!t.visualViewport?Ga:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function qa(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==V(e)?!1:t}function Ja(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);let i=e.getBoundingClientRect(),a=Ua(e),o=B(1);t&&(r?U(r)&&(o=Wa(r)):o=Wa(e));let s=qa(a,n,r)?Ka(a):B(0),c=(i.left+s.x)/o.x,l=(i.top+s.y)/o.y,u=i.width/o.x,d=i.height/o.y;if(a){let e=V(a),t=r&&U(r)?V(r):r,n=e,i=Va(n);for(;i&&r&&t!==n;){let e=Wa(i),t=i.getBoundingClientRect(),r=G(i),a=t.left+(i.clientLeft+parseFloat(r.paddingLeft))*e.x,o=t.top+(i.clientTop+parseFloat(r.paddingTop))*e.y;c*=e.x,l*=e.y,u*=e.x,d*=e.y,c+=a,l+=o,n=V(i),i=Va(n)}}return la({width:u,height:d,x:c,y:l})}function Ya(e,t){let n=La(e).scrollLeft;return t?t.left+n:Ja(H(e)).left+n}function Xa(e,t){let n=e.getBoundingClientRect();return{x:n.left+t.scrollLeft-Ya(e,n),y:n.top+t.scrollTop}}function Za(e){let{elements:t,rect:n,offsetParent:r,strategy:i}=e,a=i===`fixed`,o=H(r),s=t?Oa(t.floating):!1;if(r===o||s&&a)return n;let c={scrollLeft:0,scrollTop:0},l=B(1),u=B(0),d=W(r);if((d||!d&&!a)&&((ba(r)!==`body`||wa(o))&&(c=La(r)),W(r))){let e=Ja(r);l=Wa(r),u.x=e.x+r.clientLeft,u.y=e.y+r.clientTop}let f=o&&!d&&!a?Xa(o,c):B(0);return{width:n.width*l.x,height:n.height*l.y,x:n.x*l.x-c.scrollLeft*l.x+u.x+f.x,y:n.y*l.y-c.scrollTop*l.y+u.y+f.y}}function Qa(e){return Array.from(e.getClientRects())}function $a(e){let t=H(e),n=La(e),r=e.ownerDocument.body,i=z(t.scrollWidth,t.clientWidth,r.scrollWidth,r.clientWidth),a=z(t.scrollHeight,t.clientHeight,r.scrollHeight,r.clientHeight),o=-n.scrollLeft+Ya(e),s=-n.scrollTop;return G(r).direction===`rtl`&&(o+=z(t.clientWidth,r.clientWidth)-i),{width:i,height:a,x:o,y:s}}function eo(e,t){let n=V(e),r=H(e),i=n.visualViewport,a=r.clientWidth,o=r.clientHeight,s=0,c=0;if(i){a=i.width,o=i.height;let e=Pa();(!e||e&&t===`fixed`)&&(s=i.offsetLeft,c=i.offsetTop)}let l=Ya(r);if(l<=0){let e=r.ownerDocument,t=e.body,n=getComputedStyle(t),i=e.compatMode===`CSS1Compat`&&parseFloat(n.marginLeft)+parseFloat(n.marginRight)||0,o=Math.abs(r.clientWidth-t.clientWidth-i);o<=25&&(a-=o)}else l<=25&&(a+=l);return{width:a,height:o,x:s,y:c}}let to=new Set([`absolute`,`fixed`]);function no(e,t){let n=Ja(e,!0,t===`fixed`),r=n.top+e.clientTop,i=n.left+e.clientLeft,a=W(e)?Wa(e):B(1);return{width:e.clientWidth*a.x,height:e.clientHeight*a.y,x:i*a.x,y:r*a.y}}function ro(e,t,n){let r;if(t===`viewport`)r=eo(e,n);else if(t===`document`)r=$a(H(e));else if(U(t))r=no(t,n);else{let n=Ka(e);r={x:t.x-n.x,y:t.y-n.y,width:t.width,height:t.height}}return la(r)}function io(e,t){let n=Ra(e);return n===t||!U(n)||Ia(n)?!1:G(n).position===`fixed`||io(n,t)}function ao(e,t){let n=t.get(e);if(n)return n;let r=Ba(e,[],!1).filter(e=>U(e)&&ba(e)!==`body`),i=null,a=G(e).position===`fixed`,o=a?Ra(e):e;for(;U(o)&&!Ia(o);){let t=G(o),n=Ma(o);!n&&t.position===`fixed`&&(i=null),(a?!n&&!i:!n&&t.position===`static`&&i&&to.has(i.position)||wa(o)&&!n&&io(e,o))?r=r.filter(e=>e!==o):i=t,o=Ra(o)}return t.set(e,r),r}function oo(e){let{element:t,boundary:n,rootBoundary:r,strategy:i}=e,a=[...n===`clippingAncestors`?Oa(t)?[]:ao(t,this._c):[].concat(n),r],o=a[0],s=a.reduce((e,n)=>{let r=ro(t,n,i);return e.top=z(r.top,e.top),e.right=Li(r.right,e.right),e.bottom=Li(r.bottom,e.bottom),e.left=z(r.left,e.left),e},ro(t,o,i));return{width:s.right-s.left,height:s.bottom-s.top,x:s.left,y:s.top}}function so(e){let{width:t,height:n}=Ha(e);return{width:t,height:n}}function co(e,t,n){let r=W(t),i=H(t),a=n===`fixed`,o=Ja(e,!0,a,t),s={scrollLeft:0,scrollTop:0},c=B(0);function l(){c.x=Ya(i)}if(r||!r&&!a)if((ba(t)!==`body`||wa(i))&&(s=La(t)),r){let e=Ja(t,!0,a,t);c.x=e.x+t.clientLeft,c.y=e.y+t.clientTop}else i&&l();a&&!r&&i&&l();let u=i&&!r&&!a?Xa(i,s):B(0);return{x:o.left+s.scrollLeft-c.x-u.x,y:o.top+s.scrollTop-c.y-u.y,width:o.width,height:o.height}}function lo(e){return G(e).position===`static`}function uo(e,t){if(!W(e)||G(e).position===`fixed`)return null;if(t)return t(e);let n=e.offsetParent;return H(e)===n&&(n=n.ownerDocument.body),n}function fo(e,t){let n=V(e);if(Oa(e))return n;if(!W(e)){let t=Ra(e);for(;t&&!Ia(t);){if(U(t)&&!lo(t))return t;t=Ra(t)}return n}let r=uo(e,t);for(;r&&Ea(r)&&lo(r);)r=uo(r,t);return r&&Ia(r)&&lo(r)&&!Ma(r)?n:r||Na(e)||n}let po=async function(e){let t=this.getOffsetParent||fo,n=this.getDimensions,r=await n(e.floating);return{reference:co(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:r.width,height:r.height}}};function mo(e){return G(e).direction===`rtl`}let ho={convertOffsetParentRelativeRectToViewportRelativeRect:Za,getDocumentElement:H,getClippingRect:oo,getOffsetParent:fo,getElementRects:po,getClientRects:Qa,getDimensions:so,getScale:Wa,isElement:U,isRTL:mo};function go(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function _o(e,t){let n=null,r,i=H(e);function a(){var e;clearTimeout(r),(e=n)==null||e.disconnect(),n=null}function o(s,c){s===void 0&&(s=!1),c===void 0&&(c=1),a();let l=e.getBoundingClientRect(),{left:u,top:d,width:f,height:p}=l;if(s||t(),!f||!p)return;let m=zi(d),h=zi(i.clientWidth-(u+f)),g=zi(i.clientHeight-(d+p)),_=zi(u),v={rootMargin:-m+`px `+-h+`px `+-g+`px `+-_+`px`,threshold:z(0,Li(1,c))||1},y=!0;function b(t){let n=t[0].intersectionRatio;if(n!==c){if(!y)return o();n?o(!1,n):r=setTimeout(()=>{o(!1,1e-7)},1e3)}n===1&&!go(l,e.getBoundingClientRect())&&o(),y=!1}try{n=new IntersectionObserver(b,{...v,root:i.ownerDocument})}catch{n=new IntersectionObserver(b,v)}n.observe(e)}return o(!0),a}function vo(e,t,n,r){r===void 0&&(r={});let{ancestorScroll:i=!0,ancestorResize:a=!0,elementResize:o=typeof ResizeObserver==`function`,layoutShift:s=typeof IntersectionObserver==`function`,animationFrame:c=!1}=r,l=Ua(e),u=i||a?[...l?Ba(l):[],...Ba(t)]:[];u.forEach(e=>{i&&e.addEventListener(`scroll`,n,{passive:!0}),a&&e.addEventListener(`resize`,n)});let d=l&&s?_o(l,n):null,f=-1,p=null;o&&(p=new ResizeObserver(e=>{let[r]=e;r&&r.target===l&&p&&(p.unobserve(t),cancelAnimationFrame(f),f=requestAnimationFrame(()=>{var e;(e=p)==null||e.observe(t)})),n()}),l&&!c&&p.observe(l),p.observe(t));let m,h=c?Ja(e):null;c&&g();function g(){let t=Ja(e);h&&!go(h,t)&&n(),h=t,m=requestAnimationFrame(g)}return n(),()=>{var e;u.forEach(e=>{i&&e.removeEventListener(`scroll`,n),a&&e.removeEventListener(`resize`,n)}),d?.(),(e=p)==null||e.disconnect(),p=null,c&&cancelAnimationFrame(m)}}let yo=ga,bo=_a,xo=pa,So=va,Co=(e,t,n)=>{let r=new Map,i={platform:ho,...n},a={...i.platform,_c:r};return da(e,t,{...i,platform:a})};var wo=Object.defineProperty,To=(e,t,n)=>t in e?wo(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Eo=(e,t,n)=>(To(e,typeof t==`symbol`?t:t+``,n),n),Do=class extends HTMLElement{constructor(){super(),Eo(this,`cleanup`),Eo(this,`onButtonClick`,e=>{!br(e)&&!this.disabled&&(this.open=!this.open,e.preventDefault())}),Eo(this,`onButtonKeyDown`,e=>{var t;e.key===`ArrowDown`&&!this.disabled&&(e.preventDefault(),this.open=!0,this.content&&((t=ei(this.content)[0])==null||t.focus()))}),Eo(this,`onKeyDown`,e=>{var t;e.key===`Escape`&&this.open&&(e.preventDefault(),e.stopPropagation(),this.open=!1,(t=this.button)==null||t.focus())}),Eo(this,`onFocusOut`,e=>{e.relatedTarget instanceof Node&&!this.contains(e.relatedTarget)&&(this.open=!1)}),Eo(this,`onContentClick`,e=>{var t;e.target instanceof Element&&e.target.closest(`[role=menuitem], [role=menuitemradio]`)&&(this.open=!1,(t=this.button)==null||t.focus())});let e=document.createElement(`template`);e.innerHTML=` `,this.attachShadow({mode:`open`}).appendChild(e.content.cloneNode(!0)),this.backdrop.onclick=()=>this.open=!1}static get observedAttributes(){return[`open`]}connectedCallback(){var e,t,n,r;this.backdrop.hidden=!this.open,this.content&&(this.content.hidden=!this.open),(e=this.button)==null||e.setAttribute(`aria-expanded`,this.open?`true`:`false`),setTimeout(()=>{var e;this.content?.getAttribute(`role`)===`menu`&&((e=this.button)==null||e.setAttribute(`aria-haspopup`,`true`))}),(t=this.button)==null||t.addEventListener(`click`,this.onButtonClick),(n=this.button)==null||n.addEventListener(`keydown`,this.onButtonKeyDown),this.addEventListener(`keydown`,this.onKeyDown),this.addEventListener(`focusout`,this.onFocusOut),(r=this.content)==null||r.addEventListener(`click`,this.onContentClick)}disconnectedCallback(){var e,t,n,r,i;pr(this.backdrop),this.content&&pr(this.content),(e=this.button)==null||e.removeAttribute(`aria-expanded`),(t=this.button)==null||t.removeAttribute(`aria-haspopup`),(n=this.button)==null||n.removeEventListener(`click`,this.onButtonClick),(r=this.button)==null||r.removeEventListener(`keydown`,this.onButtonKeyDown),this.removeEventListener(`keydown`,this.onKeyDown),this.removeEventListener(`focusout`,this.onFocusOut),(i=this.content)==null||i.removeEventListener(`click`,this.onContentClick)}get open(){return this.hasAttribute(`open`)}set open(e){e?this.setAttribute(`open`,``):this.removeAttribute(`open`)}get disabled(){return this.hasAttribute(`disabled`)}attributeChangedCallback(e,t,n){e===`open`&&(n===null?this.wasClosed():this.wasOpened())}wasOpened(){var e,t;if(!((e=this.content)!=null&&e.hidden))return;this.content.hidden=!1,this.content.style.position=`fixed`,this.backdrop.hidden=!1,hr(this.content),hr(this.backdrop),(t=this.button)==null||t.setAttribute(`aria-expanded`,`true`),this.button&&(this.cleanup=vo(this.button,this.content,()=>{!this.button||!this.content||Co(this.button,this.content,{strategy:`fixed`,placement:this.getAttribute(`placement`)||`bottom`,middleware:[bo(),xo(),So({apply:({availableWidth:e,availableHeight:t,placement:n})=>{if(!this.content)return;this.content.dataset.placement=n,Object.assign(this.content.style,{maxWidth:``,maxHeight:``});let r=getComputedStyle(this.content);e-=parseInt(r.marginLeft)+parseInt(r.marginRight),(r.maxWidth===`none`||e{this.content&&Object.assign(this.content.style,{left:`${e}px`,top:`${t}px`})})},{ancestorScroll:!1}));let n=this.content.querySelector(`[autofocus]`);n?n.focus():this.content.focus(),this.dispatchEvent(new Event(`open`))}wasClosed(){var e,t,n;(e=this.content)!=null&&e.hidden||((t=this.button)==null||t.setAttribute(`aria-expanded`,`false`),(n=this.cleanup)==null||n.call(this),gr(this.backdrop).then(()=>this.backdrop.hidden=!0),this.content&&gr(this.content).then(()=>this.content.hidden=!0),this.dispatchEvent(new Event(`close`)))}get backdrop(){return this.shadowRoot?.firstElementChild}get button(){return this.querySelector(`button, [role=button]`)}get content(){return this.children[1]}},Oo=Object.defineProperty,ko=(e,t,n)=>t in e?Oo(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ao=(e,t,n)=>(ko(e,typeof t==`symbol`?t:t+``,n),n),jo=class extends HTMLElement{constructor(){super(...arguments),Ao(this,`onInitialFocus`,()=>{this.removeAttribute(`tabindex`),this.focusControlAtIndex(0)}),Ao(this,`onKeyDown`,e=>{if(e.key!==`ArrowRight`&&e.key!==`ArrowLeft`&&e.key!==`Home`&&e.key!==`End`)return;let t=this.controls,n=this.controls.length,r=t.indexOf(e.target);if(r===-1)return;let i=0;e.key===`ArrowLeft`&&(i=r-1),e.key===`ArrowRight`&&(i=r+1),e.key===`End`&&(i=n-1),i<0&&(i=n-1),i>n-1&&(i=0),this.focusControlAtIndex(i),e.preventDefault()})}connectedCallback(){this.hasAttribute(`role`)||this.setAttribute(`role`,`toolbar`),this.setAttribute(`tabindex`,`0`),this.addEventListener(`focus`,this.onInitialFocus,{once:!0}),this.addEventListener(`keydown`,this.onKeyDown)}disconnectedCallback(){this.removeEventListener(`keydown`,this.onKeyDown)}focusControlAtIndex(e){this.controls.forEach((t,n)=>{n===e?(t.setAttribute(`tabindex`,`0`),t.focus()):t.setAttribute(`tabindex`,`-1`)})}get controls(){return ei(this)}},Mo=Object.defineProperty,No=(e,t,n)=>t in e?Mo(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,K=(e,t,n)=>(No(e,typeof t==`symbol`?t:t+``,n),n);let Po=class e extends HTMLElement{constructor(){super(...arguments),K(this,`parent`),K(this,`tooltip`),K(this,`timeout`),K(this,`disabledObserver`),K(this,`showing`,!1),K(this,`cleanup`),K(this,`prevInnerHTML`),K(this,`tabPressed`,!1),K(this,`onMouseEnter`,()=>{window.matchMedia(`(hover: hover) and (pointer: fine)`).matches&&this.afterDelay(this.show)}),K(this,`onFocus`,()=>{this.tabPressed&&this.show()}),K(this,`onMouseLeave`,this.afterDelay.bind(this,this.hide)),K(this,`onBlur`,this.hide.bind(this)),K(this,`onKeyDown`,e=>{e.key===`Tab`&&(this.tabPressed=!0),e.key===`Escape`&&this.hide()}),K(this,`onKeyUp`,e=>{e.key===`Tab`&&(this.tabPressed=!1)})}connectedCallback(){this.parent=this.parentNode,this.parent&&(this.parent.addEventListener(`mouseenter`,this.onMouseEnter),this.parent.addEventListener(`focus`,this.onFocus),this.parent.addEventListener(`mouseleave`,this.onMouseLeave),this.parent.addEventListener(`blur`,this.onBlur),this.parent.addEventListener(`click`,this.onBlur),this.disabledObserver=new MutationObserver(e=>{e.forEach(e=>{e.attributeName===`disabled`&&this.hide()})}),this.disabledObserver.observe(this.parent,{attributes:!0})),document.addEventListener(`keydown`,this.onKeyDown),document.addEventListener(`keyup`,this.onKeyUp),document.addEventListener(`scroll`,this.onBlur)}disconnectedCallback(){var e,t;(e=this.cleanup)==null||e.call(this),this.tooltip&&=(this.tooltip.remove(),void 0),this.parent&&=(this.parent.removeEventListener(`mouseenter`,this.onMouseEnter),this.parent.removeEventListener(`focus`,this.onFocus),this.parent.removeEventListener(`mouseleave`,this.onMouseLeave),this.parent.removeEventListener(`blur`,this.onBlur),this.parent.removeEventListener(`click`,this.onBlur),void 0),document.removeEventListener(`keydown`,this.onKeyDown),document.removeEventListener(`keyup`,this.onKeyUp),document.removeEventListener(`scroll`,this.onBlur),(t=this.disabledObserver)==null||t.disconnect(),clearTimeout(this.timeout)}get disabled(){return this.hasAttribute(`disabled`)}set disabled(e){e?this.setAttribute(`disabled`,``):this.removeAttribute(`disabled`)}show(){var t;if(this.disabled)return;let n=this.createTooltip();clearTimeout(this.timeout),this.showing||=(n.hidden=!1,hr(n),!0),this.innerHTML!==this.prevInnerHTML&&(this.prevInnerHTML=n.innerHTML=this.innerHTML),n.style.position=`absolute`,(t=this.cleanup)==null||t.call(this),this.cleanup=vo(this.parent,n,()=>Co(this.parent,n,{placement:this.getAttribute(`placement`)||e.placement,middleware:[bo(),xo()]}).then(({x:e,y:t,placement:r})=>{Object.assign(n.style,{left:`${e}px`,top:`${t}px`}),n.dataset.placement=r})),this.dispatchEvent(new Event(`open`))}hide(){var e;clearTimeout(this.timeout),(e=this.cleanup)==null||e.call(this),this.showing&&(this.showing=!1,this.tooltip&&gr(this.tooltip).then(()=>{this.tooltip&&(this.tooltip.hidden=!0)}),this.dispatchEvent(new Event(`close`)))}afterDelay(t){clearTimeout(this.timeout);let n=parseInt(this.getAttribute(`delay`)||``);this.timeout=window.setTimeout(t.bind(this),isNaN(n)?e.delay:n)}createTooltip(){return this.tooltip||(this.tooltip=document.createElement(`div`),this.tooltip.hidden=!0,this.tooltip.addEventListener(`mouseenter`,this.show.bind(this)),this.tooltip.addEventListener(`mouseleave`,this.afterDelay.bind(this,this.hide)),document.body.appendChild(this.tooltip)),this.tooltip.className=this.getAttribute(`tooltip-class`)||e.tooltipClass,this.tooltip}};K(Po,`delay`,100),K(Po,`placement`,`top`),K(Po,`tooltipClass`,`tooltip`);let Fo=Po;window.customElements.define(`ui-accordion`,sr),window.customElements.define(`ui-alerts`,fr),window.customElements.define(`ui-disclosure`,wr),window.customElements.define(`ui-menu`,ci),window.customElements.define(`ui-modal`,Ii),window.customElements.define(`ui-popup`,Do),window.customElements.define(`ui-toolbar`,jo),window.customElements.define(`ui-tooltip`,Fo);var Io=class{constructor(){this.title=``,this.count=0}initialize(){this.title=document.title,this.count=0}increment(){this.count++,this.update()}reset(){this.count=0,this.update()}update(){document.title=(this.count?`(${this.count}) `:``)+this.title}};Waterhole.documentTitle=new Io,document.addEventListener(`turbo:load`,()=>Waterhole.documentTitle.initialize()),window.addEventListener(`focus`,()=>Waterhole.documentTitle.reset());var Lo=class{constructor(){this.notificationCreatedEvent=`.Illuminate\\Notifications\\Events\\BroadcastNotificationCreated`}listenForWhisper(e,t){return this.listen(`.client-`+e,t)}notification(e){return this.listen(this.notificationCreatedEvent,e)}stopListeningForNotification(e){return this.stopListening(this.notificationCreatedEvent,e)}stopListeningForWhisper(e,t){return this.stopListening(`.client-`+e,t)}},Ro=class{constructor(e){this.namespace=e}format(e){return[`.`,`\\`].includes(e.charAt(0))?e.substring(1):(this.namespace&&(e=this.namespace+`.`+e),e.replace(/\./g,`\\`))}setNamespace(e){this.namespace=e}};function zo(e){try{new e}catch(e){if(e instanceof Error&&e.message.includes(`is not a constructor`))return!1}return!0}var Bo=class extends Lo{constructor(e,t,n){super(),this.name=t,this.pusher=e,this.options=n,this.eventFormatter=new Ro(this.options.namespace),this.subscribe()}subscribe(){this.subscription=this.pusher.subscribe(this.name)}unsubscribe(){this.pusher.unsubscribe(this.name)}listen(e,t){return this.on(this.eventFormatter.format(e),t),this}listenToAll(e){return this.subscription.bind_global((t,n)=>{if(t.startsWith(`pusher:`))return;let r=String(this.options.namespace??``).replace(/\./g,`\\`);e(t.startsWith(r)?t.substring(r.length+1):`.`+t,n)}),this}stopListening(e,t){return t?this.subscription.unbind(this.eventFormatter.format(e),t):this.subscription.unbind(this.eventFormatter.format(e)),this}stopListeningToAll(e){return e?this.subscription.unbind_global(e):this.subscription.unbind_global(),this}subscribed(e){return this.on(`pusher:subscription_succeeded`,()=>{e()}),this}error(e){return this.on(`pusher:subscription_error`,t=>{e(t)}),this}on(e,t){return this.subscription.bind(e,t),this}},Vo=class extends Bo{whisper(e,t){return this.pusher.channels.channels[this.name].trigger(`client-${e}`,t),this}},Ho=class extends Bo{whisper(e,t){return this.pusher.channels.channels[this.name].trigger(`client-${e}`,t),this}},Uo=class extends Vo{here(e){return this.on(`pusher:subscription_succeeded`,t=>{e(Object.keys(t.members).map(e=>t.members[e]))}),this}joining(e){return this.on(`pusher:member_added`,t=>{e(t.info)}),this}whisper(e,t){return this.pusher.channels.channels[this.name].trigger(`client-${e}`,t),this}leaving(e){return this.on(`pusher:member_removed`,t=>{e(t.info)}),this}},Wo=class extends Lo{constructor(e,t,n){super(),this.events={},this.listeners={},this.name=t,this.socket=e,this.options=n,this.eventFormatter=new Ro(this.options.namespace),this.subscribe()}subscribe(){this.socket.emit(`subscribe`,{channel:this.name,auth:this.options.auth||{}})}unsubscribe(){this.unbind(),this.socket.emit(`unsubscribe`,{channel:this.name,auth:this.options.auth||{}})}listen(e,t){return this.on(this.eventFormatter.format(e),t),this}stopListening(e,t){return this.unbindEvent(this.eventFormatter.format(e),t),this}subscribed(e){return this.on(`connect`,t=>{e(t)}),this}error(e){return this}on(e,t){return this.listeners[e]=this.listeners[e]||[],this.events[e]||(this.events[e]=(t,n)=>{this.name===t&&this.listeners[e]&&this.listeners[e].forEach(e=>e(n))},this.socket.on(e,this.events[e])),this.listeners[e].push(t),this}unbind(){Object.keys(this.events).forEach(e=>{this.unbindEvent(e)})}unbindEvent(e,t){this.listeners[e]=this.listeners[e]||[],t&&(this.listeners[e]=this.listeners[e].filter(e=>e!==t)),(!t||this.listeners[e].length===0)&&(this.events[e]&&(this.socket.removeListener(e,this.events[e]),delete this.events[e]),delete this.listeners[e])}},Go=class extends Wo{whisper(e,t){return this.socket.emit(`client event`,{channel:this.name,event:`client-${e}`,data:t}),this}},Ko=class extends Go{here(e){return this.on(`presence:subscribed`,t=>{e(t.map(e=>e.user_info))}),this}joining(e){return this.on(`presence:joining`,t=>e(t.user_info)),this}whisper(e,t){return this.socket.emit(`client event`,{channel:this.name,event:`client-${e}`,data:t}),this}leaving(e){return this.on(`presence:leaving`,t=>e(t.user_info)),this}},qo=class extends Lo{subscribe(){}unsubscribe(){}listen(e,t){return this}listenToAll(e){return this}stopListening(e,t){return this}subscribed(e){return this}error(e){return this}on(e,t){return this}},Jo=class extends qo{whisper(e,t){return this}},Yo=class extends qo{whisper(e,t){return this}},Xo=class extends Jo{here(e){return this}joining(e){return this}whisper(e,t){return this}leaving(e){return this}};let Zo=class e{constructor(e){this.setOptions(e),this.connect()}setOptions(t){this.options={...e._defaultOptions,...t,broadcaster:t.broadcaster};let n=this.csrfToken();n&&(this.options.auth.headers[`X-CSRF-TOKEN`]=n,this.options.userAuthentication.headers[`X-CSRF-TOKEN`]=n),n=this.options.bearerToken,n&&(this.options.auth.headers.Authorization=`Bearer `+n,this.options.userAuthentication.headers.Authorization=`Bearer `+n)}csrfToken(){var e;return typeof window<`u`&&(e=window.Laravel)!=null&&e.csrfToken?window.Laravel.csrfToken:this.options.csrfToken?this.options.csrfToken:typeof document<`u`&&typeof document.querySelector==`function`?document.querySelector(`meta[name="csrf-token"]`)?.getAttribute(`content`)??null:null}};Zo._defaultOptions={auth:{headers:{}},authEndpoint:`/broadcasting/auth`,userAuthentication:{endpoint:`/broadcasting/user-auth`,headers:{}},csrfToken:null,bearerToken:null,host:null,key:null,namespace:`App.Events`};let Qo=Zo;var $o=class extends Qo{constructor(){super(...arguments),this.channels={}}connect(){if(typeof this.options.client<`u`)this.pusher=this.options.client;else if(this.options.Pusher)this.pusher=new this.options.Pusher(this.options.key,this.options);else if(typeof window<`u`&&typeof window.Pusher<`u`)this.pusher=new window.Pusher(this.options.key,this.options);else throw Error(`Pusher client not found. Should be globally available or passed via options.client`)}signin(){this.pusher.signin()}listen(e,t,n){return this.channel(e).listen(t,n)}channel(e){return this.channels[e]||(this.channels[e]=new Bo(this.pusher,e,this.options)),this.channels[e]}privateChannel(e){return this.channels[`private-`+e]||(this.channels[`private-`+e]=new Vo(this.pusher,`private-`+e,this.options)),this.channels[`private-`+e]}encryptedPrivateChannel(e){return this.channels[`private-encrypted-`+e]||(this.channels[`private-encrypted-`+e]=new Ho(this.pusher,`private-encrypted-`+e,this.options)),this.channels[`private-encrypted-`+e]}presenceChannel(e){return this.channels[`presence-`+e]||(this.channels[`presence-`+e]=new Uo(this.pusher,`presence-`+e,this.options)),this.channels[`presence-`+e]}leave(e){[e,`private-`+e,`private-encrypted-`+e,`presence-`+e].forEach(e=>{this.leaveChannel(e)})}leaveChannel(e){this.channels[e]&&(this.channels[e].unsubscribe(),delete this.channels[e])}socketId(){return this.pusher.connection.socket_id}connectionStatus(){let e=this.pusher.connection.state;switch(e){case`connected`:case`connecting`:return e;case`failed`:case`unavailable`:return`failed`;default:return`disconnected`}}onConnectionChange(e){let t=()=>{e(this.connectionStatus())},n=[`state_change`,`connected`,`disconnected`];return n.forEach(e=>{this.pusher.connection.bind(e,t)}),()=>{n.forEach(e=>{this.pusher.connection.unbind(e,t)})}}disconnect(){this.pusher.disconnect()}},es=class extends Qo{constructor(){super(...arguments),this.channels={}}connect(){this.socket=this.getSocketIO()(this.options.host??void 0,this.options),this.socket.io.on(`reconnect`,()=>{Object.values(this.channels).forEach(e=>{e.subscribe()})})}getSocketIO(){if(typeof this.options.client<`u`)return this.options.client;if(typeof window<`u`&&typeof window.io<`u`)return window.io;throw Error(`Socket.io client not found. Should be globally available or passed via options.client`)}listen(e,t,n){return this.channel(e).listen(t,n)}channel(e){return this.channels[e]||(this.channels[e]=new Wo(this.socket,e,this.options)),this.channels[e]}privateChannel(e){return this.channels[`private-`+e]||(this.channels[`private-`+e]=new Go(this.socket,`private-`+e,this.options)),this.channels[`private-`+e]}presenceChannel(e){return this.channels[`presence-`+e]||(this.channels[`presence-`+e]=new Ko(this.socket,`presence-`+e,this.options)),this.channels[`presence-`+e]}leave(e){[e,`private-`+e,`presence-`+e].forEach(e=>{this.leaveChannel(e)})}leaveChannel(e){this.channels[e]&&(this.channels[e].unsubscribe(),delete this.channels[e])}socketId(){return this.socket.id}connectionStatus(){return this.socket.connected?`connected`:this.socket.io._reconnecting?`reconnecting`:this.socket.id===void 0?`connecting`:`disconnected`}onConnectionChange(e){let t=()=>{e(this.connectionStatus())},n=[`connect`,`disconnect`,`connect_error`,`reconnect_attempt`,`reconnect`,`reconnect_error`,`reconnect_failed`];return n.forEach(e=>{this.socket.on(e,t)}),()=>{n.forEach(e=>{this.socket.off(e,t)})}}disconnect(){this.socket.disconnect()}},ts=class extends Qo{constructor(){super(...arguments),this.channels={}}connect(){}listen(e,t,n){return new qo}channel(e){return new qo}privateChannel(e){return new Jo}encryptedPrivateChannel(e){return new Yo}presenceChannel(e){return new Xo}leave(e){}leaveChannel(e){}socketId(){return`fake-socket-id`}connectionStatus(){return`connected`}onConnectionChange(e){return()=>{}}disconnect(){}},ns=class{constructor(e){this.options=e,this.connect(),this.options.withoutInterceptors||this.registerInterceptors()}channel(e){return this.connector.channel(e)}connect(){if(this.options.broadcaster===`reverb`)this.connector=new $o({...this.options,cluster:``});else if(this.options.broadcaster===`pusher`)this.connector=new $o(this.options);else if(this.options.broadcaster===`ably`)this.connector=new $o({...this.options,cluster:``,broadcaster:`pusher`});else if(this.options.broadcaster===`socket.io`)this.connector=new es(this.options);else if(this.options.broadcaster===`null`)this.connector=new ts(this.options);else if(typeof this.options.broadcaster==`function`&&zo(this.options.broadcaster))this.connector=new this.options.broadcaster(this.options);else throw Error(`Broadcaster ${typeof this.options.broadcaster} ${String(this.options.broadcaster)} is not supported.`)}disconnect(){this.connector.disconnect()}join(e){return this.connector.presenceChannel(e)}leave(e){this.connector.leave(e)}leaveChannel(e){this.connector.leaveChannel(e)}leaveAllChannels(){for(let e in this.connector.channels)this.leaveChannel(e)}listen(e,t,n){return this.connector.listen(e,t,n)}private(e){return this.connector.privateChannel(e)}encryptedPrivate(e){if(this.connectorSupportsEncryptedPrivateChannels(this.connector))return this.connector.encryptedPrivateChannel(e);throw Error(`Broadcaster ${typeof this.options.broadcaster} ${String(this.options.broadcaster)} does not support encrypted private channels.`)}connectorSupportsEncryptedPrivateChannels(e){return e instanceof $o||e instanceof ts}socketId(){return this.connector.socketId()}connectionStatus(){return this.connector.connectionStatus()}registerInterceptors(){typeof Vue<`u`&&Vue!=null&&Vue.http&&this.registerVueRequestInterceptor(),typeof axios==`function`&&this.registerAxiosRequestInterceptor(),typeof jQuery==`function`&&this.registerjQueryAjaxSetup(),typeof Turbo==`object`&&this.registerTurboRequestInterceptor()}registerVueRequestInterceptor(){Vue.http.interceptors.push((e,t)=>{this.socketId()&&e.headers.set(`X-Socket-ID`,this.socketId()),t()})}registerAxiosRequestInterceptor(){axios.interceptors.request.use(e=>(this.socketId()&&(e.headers[`X-Socket-Id`]=this.socketId()),e))}registerjQueryAjaxSetup(){typeof jQuery.ajax<`u`&&jQuery.ajaxPrefilter((e,t,n)=>{this.socketId()&&n.setRequestHeader(`X-Socket-Id`,this.socketId())})}registerTurboRequestInterceptor(){document.addEventListener(`turbo:before-fetch-request`,e=>{e.detail.fetchOptions.headers[`X-Socket-Id`]=this.socketId()})}},rs=l(o(((e,t)=>{ /*! * Pusher JavaScript Library v8.4.0 * https://pusher.com/ * * Copyright 2020, Pusher * Released under the MIT licence. */ (function(n,r){typeof e==`object`&&typeof t==`object`?t.exports=r():typeof define==`function`&&define.amd?define([],r):typeof e==`object`?e.Pusher=r():n.Pusher=r()})(window,function(){return(function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){typeof Symbol<`u`&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:`Module`}),Object.defineProperty(e,`__esModule`,{value:!0})},n.t=function(e,t){if(t&1&&(e=n(e)),t&8||t&4&&typeof e==`object`&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,`default`,{enumerable:!0,value:e}),t&2&&typeof e!=`string`)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,`a`,t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=``,n(n.s=2)})([(function(e,t,n){"use strict";var r=this&&this.__extends||(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})();Object.defineProperty(t,`__esModule`,{value:!0});var i=256,a=function(){function e(e){e===void 0&&(e=`=`),this._paddingCharacter=e}return e.prototype.encodedLength=function(e){return this._paddingCharacter?(e+2)/3*4|0:(e*8+5)/6|0},e.prototype.encode=function(e){for(var t=``,n=0;n>>18&63),t+=this._encodeByte(r>>>12&63),t+=this._encodeByte(r>>>6&63),t+=this._encodeByte(r>>>0&63)}var i=e.length-n;if(i>0){var r=e[n]<<16|(i===2?e[n+1]<<8:0);t+=this._encodeByte(r>>>18&63),t+=this._encodeByte(r>>>12&63),i===2?t+=this._encodeByte(r>>>6&63):t+=this._paddingCharacter||``,t+=this._paddingCharacter||``}return t},e.prototype.maxDecodedLength=function(e){return this._paddingCharacter?e/4*3|0:(e*6+7)/8|0},e.prototype.decodedLength=function(e){return this.maxDecodedLength(e.length-this._getPaddingLength(e))},e.prototype.decode=function(e){if(e.length===0)return new Uint8Array;for(var t=this._getPaddingLength(e),n=e.length-t,r=new Uint8Array(this.maxDecodedLength(n)),a=0,o=0,s=0,c=0,l=0,u=0,d=0;o>>4,r[a++]=l<<4|u>>>2,r[a++]=u<<6|d,s|=c&i,s|=l&i,s|=u&i,s|=d&i;if(o>>4,s|=c&i,s|=l&i),o>>2,s|=u&i),o>>8&6,t+=51-e>>>8&-75,t+=61-e>>>8&-15,t+=62-e>>>8&3,String.fromCharCode(t)},e.prototype._decodeChar=function(e){var t=i;return t+=(42-e&e-44)>>>8&-i+e-43+62,t+=(46-e&e-48)>>>8&-i+e-47+63,t+=(47-e&e-58)>>>8&-i+e-48+52,t+=(64-e&e-91)>>>8&-i+e-65+0,t+=(96-e&e-123)>>>8&-i+e-97+26,t},e.prototype._getPaddingLength=function(e){var t=0;if(this._paddingCharacter){for(var n=e.length-1;n>=0&&e[n]===this._paddingCharacter;n--)t++;if(e.length<4||t>2)throw Error(`Base64Coder: incorrect padding`)}return t},e}();t.Coder=a;var o=new a;function s(e){return o.encode(e)}t.encode=s;function c(e){return o.decode(e)}t.decode=c;var l=function(e){r(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype._encodeByte=function(e){var t=e;return t+=65,t+=25-e>>>8&6,t+=51-e>>>8&-75,t+=61-e>>>8&-13,t+=62-e>>>8&49,String.fromCharCode(t)},t.prototype._decodeChar=function(e){var t=i;return t+=(44-e&e-46)>>>8&-i+e-45+62,t+=(94-e&e-96)>>>8&-i+e-95+63,t+=(47-e&e-58)>>>8&-i+e-48+52,t+=(64-e&e-91)>>>8&-i+e-65+0,t+=(96-e&e-123)>>>8&-i+e-97+26,t},t}(a);t.URLSafeCoder=l;var u=new l;function d(e){return u.encode(e)}t.encodeURLSafe=d;function f(e){return u.decode(e)}t.decodeURLSafe=f,t.encodedLength=function(e){return o.encodedLength(e)},t.maxDecodedLength=function(e){return o.maxDecodedLength(e)},t.decodedLength=function(e){return o.decodedLength(e)}}),(function(e,t,n){"use strict";Object.defineProperty(t,`__esModule`,{value:!0});var r=`utf8: invalid string`,i=`utf8: invalid source encoding`;function a(e){for(var t=new Uint8Array(o(e)),n=0,r=0;r>6,t[n++]=128|i&63):i<55296?(t[n++]=224|i>>12,t[n++]=128|i>>6&63,t[n++]=128|i&63):(r++,i=(i&1023)<<10,i|=e.charCodeAt(r)&1023,i+=65536,t[n++]=240|i>>18,t[n++]=128|i>>12&63,t[n++]=128|i>>6&63,t[n++]=128|i&63)}return t}t.encode=a;function o(e){for(var t=0,n=0;n=e.length-1)throw Error(r);n++,t+=4}else throw Error(r)}return t}t.encodedLength=o;function s(e){for(var t=[],n=0;n=e.length)throw Error(i);var o=e[++n];if((o&192)!=128)throw Error(i);r=(r&31)<<6|o&63,a=128}else if(r<240){if(n>=e.length-1)throw Error(i);var o=e[++n],s=e[++n];if((o&192)!=128||(s&192)!=128)throw Error(i);r=(r&15)<<12|(o&63)<<6|s&63,a=2048}else if(r<248){if(n>=e.length-2)throw Error(i);var o=e[++n],s=e[++n],c=e[++n];if((o&192)!=128||(s&192)!=128||(c&192)!=128)throw Error(i);r=(r&15)<<18|(o&63)<<12|(s&63)<<6|c&63,a=65536}else throw Error(i);if(r=55296&&r<=57343)throw Error(i);if(r>=65536){if(r>1114111)throw Error(i);r-=65536,t.push(String.fromCharCode(55296|r>>10)),r=56320|r&1023}}t.push(String.fromCharCode(r))}return t.join(``)}t.decode=s}),(function(e,t,n){e.exports=n(3).default}),(function(e,t,n){"use strict";n.r(t);class r{constructor(e,t){this.lastId=0,this.prefix=e,this.name=t}create(e){this.lastId++;var t=this.lastId,n=this.prefix+t,r=this.name+`[`+t+`]`,i=!1,a=function(){i||=(e.apply(null,arguments),!0)};return this[t]=a,{number:t,id:n,name:r,callback:a}}remove(e){delete this[e.number]}}var i=new r(`_pusher_script_`,`Pusher.ScriptReceivers`),a={VERSION:`8.4.0`,PROTOCOL:7,wsPort:80,wssPort:443,wsPath:``,httpHost:`sockjs.pusher.com`,httpPort:80,httpsPort:443,httpPath:`/pusher`,stats_host:`stats.pusher.com`,authEndpoint:`/pusher/auth`,authTransport:`ajax`,activityTimeout:12e4,pongTimeout:3e4,unavailableTimeout:1e4,userAuthentication:{endpoint:`/pusher/user-auth`,transport:`ajax`},channelAuthorization:{endpoint:`/pusher/auth`,transport:`ajax`},cdn_http:`http://js.pusher.com`,cdn_https:`https://js.pusher.com`,dependency_suffix:``};class o{constructor(e){this.options=e,this.receivers=e.receivers||i,this.loading={}}load(e,t,n){var r=this;if(r.loading[e]&&r.loading[e].length>0)r.loading[e].push(n);else{r.loading[e]=[n];var i=I.createScriptRequest(r.getPath(e,t)),a=r.receivers.create(function(t){if(r.receivers.remove(a),r.loading[e]){var n=r.loading[e];delete r.loading[e];for(var o=function(e){e||i.cleanup()},s=0;s>>6)+S(128|t&63):S(224|t>>>12&15)+S(128|t>>>6&63)+S(128|t&63)},ne=function(e){return e.replace(/[^\x00-\x7F]/g,E)},re=function(e){var t=[0,2,1][e.length%3],n=e.charCodeAt(0)<<16|(e.length>1?e.charCodeAt(1):0)<<8|(e.length>2?e.charCodeAt(2):0);return[C.charAt(n>>>18),C.charAt(n>>>12&63),t>=2?`=`:C.charAt(n>>>6&63),t>=1?`=`:C.charAt(n&63)].join(``)},D=window.btoa||function(e){return e.replace(/[\s\S]{1,3}/g,re)};class ie{constructor(e,t,n,r){this.clear=t,this.timer=e(()=>{this.timer&&=r(this.timer)},n)}isRunning(){return this.timer!==null}ensureAborted(){this.timer&&=(this.clear(this.timer),null)}}var ae=ie;function oe(e){window.clearTimeout(e)}function se(e){window.clearInterval(e)}class ce extends ae{constructor(e,t){super(setTimeout,oe,e,function(e){return t(),null})}}class le extends ae{constructor(e,t){super(setInterval,se,e,function(e){return t(),e})}}var O={now(){return Date.now?Date.now():new Date().valueOf()},defer(e){return new ce(0,e)},method(e,...t){var n=Array.prototype.slice.call(arguments,1);return function(t){return t[e].apply(t,n.concat(arguments))}}};function k(e,...t){for(var n=0;n{window.console&&window.console.log&&window.console.log(e)}}debug(...e){this.log(this.globalLog,e)}warn(...e){this.log(this.globalLogWarn,e)}error(...e){this.log(this.globalLogError,e)}globalLogWarn(e){window.console&&window.console.warn?window.console.warn(e):this.globalLog(e)}globalLogError(e){window.console&&window.console.error?window.console.error(e):this.globalLogWarn(e)}log(e,...t){var n=ue.apply(this,arguments);xn.log?xn.log(n):xn.logToConsole&&e.bind(this)(n)}}var j=new Ee,De=function(e,t,n,r,i){(n.headers!==void 0||n.headersProvider!=null)&&j.warn(`To send headers with the ${r.toString()} request, you must use AJAX, rather than JSONP.`);var a=e.nextAuthCallbackID.toString();e.nextAuthCallbackID++;var o=e.getDocument(),s=o.createElement(`script`);e.auth_callbacks[a]=function(e){i(null,e)};var c=`Pusher.auth_callbacks['`+a+`']`;s.src=n.endpoint+`?callback=`+encodeURIComponent(c)+`&`+t;var l=o.getElementsByTagName(`head`)[0]||o.documentElement;l.insertBefore(s,l.firstChild)};class Oe{constructor(e){this.src=e}send(e){var t=this,n=`Error loading `+t.src;t.script=document.createElement(`script`),t.script.id=e.id,t.script.src=t.src,t.script.type=`text/javascript`,t.script.charset=`UTF-8`,t.script.addEventListener?(t.script.onerror=function(){e.callback(n)},t.script.onload=function(){e.callback(null)}):t.script.onreadystatechange=function(){(t.script.readyState===`loaded`||t.script.readyState===`complete`)&&e.callback(null)},t.script.async===void 0&&document.attachEvent&&/opera/i.test(navigator.userAgent)?(t.errorScript=document.createElement(`script`),t.errorScript.id=e.id+`_error`,t.errorScript.text=e.name+`('`+n+`');`,t.script.async=t.errorScript.async=!1):t.script.async=!0;var r=document.getElementsByTagName(`head`)[0];r.insertBefore(t.script,r.firstChild),t.errorScript&&r.insertBefore(t.errorScript,t.script.nextSibling)}cleanup(){this.script&&(this.script.onload=this.script.onerror=null,this.script.onreadystatechange=null),this.script&&this.script.parentNode&&this.script.parentNode.removeChild(this.script),this.errorScript&&this.errorScript.parentNode&&this.errorScript.parentNode.removeChild(this.errorScript),this.script=null,this.errorScript=null}}class ke{constructor(e,t){this.url=e,this.data=t}send(e){if(!this.request){var t=Ce(this.data),n=this.url+`/`+e.number+`?`+t;this.request=I.createScriptRequest(n),this.request.send(e)}}cleanup(){this.request&&this.request.cleanup()}}var Ae={name:`jsonp`,getAgent:function(e,t){return function(n,r){var a=`http`+(t?`s`:``)+`://`+(e.host||e.options.host)+e.options.path,o=I.createJSONPRequest(a,n),s=I.ScriptReceivers.create(function(t,n){i.remove(s),o.cleanup(),n&&n.host&&(e.host=n.host),r&&r(t,n)});o.send(s)}}};function je(e,t,n){var r=e+(t.useTLS?`s`:``),i=t.useTLS?t.hostTLS:t.hostNonTLS;return r+`://`+i+n}function Me(e,t){return`/app/`+e+(`?protocol=`+a.PROTOCOL+`&client=js&version=`+a.VERSION+(t?`&`+t:``))}var Ne={getInitial:function(e,t){return je(`ws`,t,(t.httpPath||``)+Me(e,`flash=false`))}},Pe={getInitial:function(e,t){return je(`http`,t,(t.httpPath||`/pusher`)+Me(e))}},Fe={getInitial:function(e,t){return je(`http`,t,t.httpPath||`/pusher`)},getPath:function(e,t){return Me(e)}};class Ie{constructor(){this._callbacks={}}get(e){return this._callbacks[Le(e)]}add(e,t,n){var r=Le(e);this._callbacks[r]=this._callbacks[r]||[],this._callbacks[r].push({fn:t,context:n})}remove(e,t,n){if(!e&&!t&&!n){this._callbacks={};return}var r=e?[Le(e)]:fe(this._callbacks);t||n?this.removeCallback(r,t,n):this.removeAllCallbacks(r)}removeCallback(e,t,n){me(e,function(e){this._callbacks[e]=_e(this._callbacks[e]||[],function(e){return t&&t!==e.fn||n&&n!==e.context}),this._callbacks[e].length===0&&delete this._callbacks[e]},this)}removeAllCallbacks(e){me(e,function(e){delete this._callbacks[e]},this)}}function Le(e){return`_`+e}class M{constructor(e){this.callbacks=new Ie,this.global_callbacks=[],this.failThrough=e}bind(e,t,n){return this.callbacks.add(e,t,n),this}bind_global(e){return this.global_callbacks.push(e),this}unbind(e,t,n){return this.callbacks.remove(e,t,n),this}unbind_global(e){return e?(this.global_callbacks=_e(this.global_callbacks||[],t=>t!==e),this):(this.global_callbacks=[],this)}unbind_all(){return this.unbind(),this.unbind_global(),this}emit(e,t,n){for(var r=0;r0)for(var r=0;r{this.onError(e),this.changeState(`closed`)}),!1}return this.bindListeners(),j.debug(`Connecting`,{transport:this.name,url:e}),this.changeState(`connecting`),!0}close(){return this.socket?(this.socket.close(),!0):!1}send(e){return this.state===`open`?(O.defer(()=>{this.socket&&this.socket.send(e)}),!0):!1}ping(){this.state===`open`&&this.supportsPing()&&this.socket.ping()}onOpen(){this.hooks.beforeOpen&&this.hooks.beforeOpen(this.socket,this.hooks.urls.getPath(this.key,this.options)),this.changeState(`open`),this.socket.onopen=void 0}onError(e){this.emit(`error`,{type:`WebSocketError`,error:e}),this.timeline.error(this.buildTimelineMessage({error:e.toString()}))}onClose(e){e?this.changeState(`closed`,{code:e.code,reason:e.reason,wasClean:e.wasClean}):this.changeState(`closed`),this.unbindListeners(),this.socket=void 0}onMessage(e){this.emit(`message`,e)}onActivity(){this.emit(`activity`)}bindListeners(){this.socket.onopen=()=>{this.onOpen()},this.socket.onerror=e=>{this.onError(e)},this.socket.onclose=e=>{this.onClose(e)},this.socket.onmessage=e=>{this.onMessage(e)},this.supportsPing()&&(this.socket.onactivity=()=>{this.onActivity()})}unbindListeners(){this.socket&&(this.socket.onopen=void 0,this.socket.onerror=void 0,this.socket.onclose=void 0,this.socket.onmessage=void 0,this.supportsPing()&&(this.socket.onactivity=void 0))}changeState(e,t){this.state=e,this.timeline.info(this.buildTimelineMessage({state:e,params:t})),this.emit(e,t)}buildTimelineMessage(e){return k({cid:this.id},e)}}class N{constructor(e){this.hooks=e}isSupported(e){return this.hooks.isSupported(e)}createConnection(e,t,n,r){return new Re(this.hooks,e,t,n,r)}}var ze=new N({urls:Ne,handlesActivityChecks:!1,supportsPing:!1,isInitialized:function(){return!!I.getWebSocketAPI()},isSupported:function(){return!!I.getWebSocketAPI()},getSocket:function(e){return I.createWebSocket(e)}}),Be={urls:Pe,handlesActivityChecks:!1,supportsPing:!0,isInitialized:function(){return!0}},Ve=k({getSocket:function(e){return I.HTTPFactory.createStreamingSocket(e)}},Be),He=k({getSocket:function(e){return I.HTTPFactory.createPollingSocket(e)}},Be),Ue={isSupported:function(){return I.isXHRSupported()}},We={ws:ze,xhr_streaming:new N(k({},Ve,Ue)),xhr_polling:new N(k({},He,Ue))},Ge=new N({file:`sockjs`,urls:Fe,handlesActivityChecks:!0,supportsPing:!1,isSupported:function(){return!0},isInitialized:function(){return window.SockJS!==void 0},getSocket:function(e,t){return new window.SockJS(e,null,{js_path:c.getPath(`sockjs`,{useTLS:t.useTLS}),ignore_null_origin:t.ignoreNullOrigin})},beforeOpen:function(e,t){e.send(JSON.stringify({path:t}))}}),Ke={isSupported:function(e){return I.isXDRSupported(e.useTLS)}},qe=new N(k({},Ve,Ke)),Je=new N(k({},He,Ke));We.xdr_streaming=qe,We.xdr_polling=Je,We.sockjs=Ge;var Ye=We;class Xe extends M{constructor(){super();var e=this;window.addEventListener!==void 0&&(window.addEventListener(`online`,function(){e.emit(`online`)},!1),window.addEventListener(`offline`,function(){e.emit(`offline`)},!1))}isOnline(){return window.navigator.onLine===void 0?!0:window.navigator.onLine}}var Ze=new Xe;class Qe{constructor(e,t,n){this.manager=e,this.transport=t,this.minPingDelay=n.minPingDelay,this.maxPingDelay=n.maxPingDelay,this.pingDelay=void 0}createConnection(e,t,n,r){r=k({},r,{activityTimeout:this.pingDelay});var i=this.transport.createConnection(e,t,n,r),a=null,o=function(){i.unbind(`open`,o),i.bind(`closed`,s),a=O.now()},s=e=>{if(i.unbind(`closed`,s),e.code===1002||e.code===1003)this.manager.reportDeath();else if(!e.wasClean&&a){var t=O.now()-a;t<2*this.maxPingDelay&&(this.manager.reportDeath(),this.pingDelay=Math.max(t/2,this.minPingDelay))}};return i.bind(`open`,o),i}isSupported(e){return this.manager.isAlive()&&this.transport.isSupported(e)}}let $e={decodeMessage:function(e){try{var t=JSON.parse(e.data),n=t.data;if(typeof n==`string`)try{n=JSON.parse(t.data)}catch{}var r={event:t.event,channel:t.channel,data:n};return t.user_id&&(r.user_id=t.user_id),r}catch(t){throw{type:`MessageParseError`,error:t,data:e.data}}},encodeMessage:function(e){return JSON.stringify(e)},processHandshake:function(e){var t=$e.decodeMessage(e);if(t.event===`pusher:connection_established`){if(!t.data.activity_timeout)throw`No activity timeout specified in handshake`;return{action:`connected`,id:t.data.socket_id,activityTimeout:t.data.activity_timeout*1e3}}else if(t.event===`pusher:error`)return{action:this.getCloseAction(t.data),error:this.getCloseError(t.data)};else throw`Invalid handshake`},getCloseAction:function(e){return e.code<4e3?e.code>=1002&&e.code<=1004?`backoff`:null:e.code===4e3?`tls_only`:e.code<4100?`refused`:e.code<4200?`backoff`:e.code<4300?`retry`:`refused`},getCloseError:function(e){return e.code!==1e3&&e.code!==1001?{type:`PusherError`,data:{code:e.code,message:e.reason||e.message}}:null}};var et=$e;class tt extends M{constructor(e,t){super(),this.id=e,this.transport=t,this.activityTimeout=t.activityTimeout,this.bindListeners()}handlesActivityChecks(){return this.transport.handlesActivityChecks()}send(e){return this.transport.send(e)}send_event(e,t,n){var r={event:e,data:t};return n&&(r.channel=n),j.debug(`Event sent`,r),this.send(et.encodeMessage(r))}ping(){this.transport.supportsPing()?this.transport.ping():this.send_event(`pusher:ping`,{})}close(){this.transport.close()}bindListeners(){var e={message:e=>{var t;try{t=et.decodeMessage(e)}catch(t){this.emit(`error`,{type:`MessageParseError`,error:t,data:e.data})}if(t!==void 0){switch(j.debug(`Event recd`,t),t.event){case`pusher:error`:this.emit(`error`,{type:`PusherError`,data:t.data});break;case`pusher:ping`:this.emit(`ping`);break;case`pusher:pong`:this.emit(`pong`);break}this.emit(`message`,t)}},activity:()=>{this.emit(`activity`)},error:e=>{this.emit(`error`,e)},closed:e=>{t(),e&&e.code&&this.handleCloseEvent(e),this.transport=null,this.emit(`closed`)}},t=()=>{A(e,(e,t)=>{this.transport.unbind(t,e)})};A(e,(e,t)=>{this.transport.bind(t,e)})}handleCloseEvent(e){var t=et.getCloseAction(e),n=et.getCloseError(e);n&&this.emit(`error`,n),t&&this.emit(t,{action:t,error:n})}}class nt{constructor(e,t){this.transport=e,this.callback=t,this.bindListeners()}close(){this.unbindListeners(),this.transport.close()}bindListeners(){this.onMessage=e=>{this.unbindListeners();var t;try{t=et.processHandshake(e)}catch(e){this.finish(`error`,{error:e}),this.transport.close();return}t.action===`connected`?this.finish(`connected`,{connection:new tt(t.id,this.transport),activityTimeout:t.activityTimeout}):(this.finish(t.action,{error:t.error}),this.transport.close())},this.onClosed=e=>{this.unbindListeners();var t=et.getCloseAction(e)||`backoff`,n=et.getCloseError(e);this.finish(t,{error:n})},this.transport.bind(`message`,this.onMessage),this.transport.bind(`closed`,this.onClosed)}unbindListeners(){this.transport.unbind(`message`,this.onMessage),this.transport.unbind(`closed`,this.onClosed)}finish(e,t){this.callback(k({transport:this.transport,action:e},t))}}class rt{constructor(e,t){this.timeline=e,this.options=t||{}}send(e,t){this.timeline.isEmpty()||this.timeline.send(I.TimelineTransport.getAgent(this,e),t)}}class it extends M{constructor(e,t){super(function(t,n){j.debug(`No callbacks on `+e+` for `+t)}),this.name=e,this.pusher=t,this.subscribed=!1,this.subscriptionPending=!1,this.subscriptionCancelled=!1}authorize(e,t){return t(null,{auth:``})}trigger(e,t){if(e.indexOf(`client-`)!==0)throw new f(`Event '`+e+`' does not start with 'client-'`);if(!this.subscribed){var n=u.buildLogSuffix(`triggeringClientEvents`);j.warn(`Client event triggered before channel 'subscription_succeeded' event . ${n}`)}return this.pusher.send_event(e,t,this.name)}disconnect(){this.subscribed=!1,this.subscriptionPending=!1}handleEvent(e){var t=e.event,n=e.data;t===`pusher_internal:subscription_succeeded`?this.handleSubscriptionSucceededEvent(e):t===`pusher_internal:subscription_count`?this.handleSubscriptionCountEvent(e):t.indexOf(`pusher_internal:`)!==0&&this.emit(t,n,{})}handleSubscriptionSucceededEvent(e){this.subscriptionPending=!1,this.subscribed=!0,this.subscriptionCancelled?this.pusher.unsubscribe(this.name):this.emit(`pusher:subscription_succeeded`,e.data)}handleSubscriptionCountEvent(e){e.data.subscription_count&&(this.subscriptionCount=e.data.subscription_count),this.emit(`pusher:subscription_count`,e.data)}subscribe(){this.subscribed||(this.subscriptionPending=!0,this.subscriptionCancelled=!1,this.authorize(this.pusher.connection.socket_id,(e,t)=>{e?(this.subscriptionPending=!1,j.error(e.toString()),this.emit(`pusher:subscription_error`,Object.assign({},{type:`AuthError`,error:e.message},e instanceof b?{status:e.status}:{}))):this.pusher.send_event(`pusher:subscribe`,{auth:t.auth,channel_data:t.channel_data,channel:this.name})}))}unsubscribe(){this.subscribed=!1,this.pusher.send_event(`pusher:unsubscribe`,{channel:this.name})}cancelSubscription(){this.subscriptionCancelled=!0}reinstateSubscription(){this.subscriptionCancelled=!1}}class at extends it{authorize(e,t){return this.pusher.config.channelAuthorizer({channelName:this.name,socketId:e},t)}}class ot{constructor(){this.reset()}get(e){return Object.prototype.hasOwnProperty.call(this.members,e)?{id:e,info:this.members[e]}:null}each(e){A(this.members,(t,n)=>{e(this.get(n))})}setMyID(e){this.myID=e}onSubscription(e){this.members=e.presence.hash,this.count=e.presence.count,this.me=this.get(this.myID)}addMember(e){return this.get(e.user_id)===null&&this.count++,this.members[e.user_id]=e.user_info,this.get(e.user_id)}removeMember(e){var t=this.get(e.user_id);return t&&(delete this.members[e.user_id],this.count--),t}reset(){this.members={},this.count=0,this.myID=null,this.me=null}}var st=function(e,t,n,r){function i(e){return e instanceof n?e:new n(function(t){t(e)})}return new(n||=Promise)(function(n,a){function o(e){try{c(r.next(e))}catch(e){a(e)}}function s(e){try{c(r.throw(e))}catch(e){a(e)}}function c(e){e.done?n(e.value):i(e.value).then(o,s)}c((r=r.apply(e,t||[])).next())})};class ct extends at{constructor(e,t){super(e,t),this.members=new ot}authorize(e,t){super.authorize(e,(e,n)=>st(this,void 0,void 0,function*(){if(!e)if(n=n,n.channel_data!=null){var r=JSON.parse(n.channel_data);this.members.setMyID(r.user_id)}else if(yield this.pusher.user.signinDonePromise,this.pusher.user.user_data!=null)this.members.setMyID(this.pusher.user.user_data.id);else{let e=u.buildLogSuffix(`authorizationEndpoint`);j.error(`Invalid auth response for channel '${this.name}', expected 'channel_data' field. ${e}, or the user should be signed in.`),t(`Invalid auth response`);return}t(e,n)}))}handleEvent(e){var t=e.event;if(t.indexOf(`pusher_internal:`)===0)this.handleInternalEvent(e);else{var n=e.data,r={};e.user_id&&(r.user_id=e.user_id),this.emit(t,n,r)}}handleInternalEvent(e){var t=e.event,n=e.data;switch(t){case`pusher_internal:subscription_succeeded`:this.handleSubscriptionSucceededEvent(e);break;case`pusher_internal:subscription_count`:this.handleSubscriptionCountEvent(e);break;case`pusher_internal:member_added`:var r=this.members.addMember(n);this.emit(`pusher:member_added`,r);break;case`pusher_internal:member_removed`:var i=this.members.removeMember(n);i&&this.emit(`pusher:member_removed`,i);break}}handleSubscriptionSucceededEvent(e){this.subscriptionPending=!1,this.subscribed=!0,this.subscriptionCancelled?this.pusher.unsubscribe(this.name):(this.members.onSubscription(e.data),this.emit(`pusher:subscription_succeeded`,this.members))}disconnect(){this.members.reset(),super.disconnect()}}var lt=n(1),ut=n(0);class dt extends at{constructor(e,t,n){super(e,t),this.key=null,this.nacl=n}authorize(e,t){super.authorize(e,(e,n)=>{if(e){t(e,n);return}let r=n.shared_secret;if(!r){t(Error(`No shared_secret key in auth payload for encrypted channel: ${this.name}`),null);return}this.key=(0,ut.decode)(r),delete n.shared_secret,t(null,n)})}trigger(e,t){throw new _(`Client events are not currently supported for encrypted channels`)}handleEvent(e){var t=e.event,n=e.data;if(t.indexOf(`pusher_internal:`)===0||t.indexOf(`pusher:`)===0){super.handleEvent(e);return}this.handleEncryptedEvent(t,n)}handleEncryptedEvent(e,t){if(!this.key){j.debug(`Received encrypted event before key has been retrieved from the authEndpoint`);return}if(!t.ciphertext||!t.nonce){j.error("Unexpected format for encrypted event, expected object with `ciphertext` and `nonce` fields, got: "+t);return}let n=(0,ut.decode)(t.ciphertext);if(n.length{if(t){j.error(`Failed to make a request to the authEndpoint: ${a}. Unable to fetch new key, so dropping encrypted event`);return}if(i=this.nacl.secretbox.open(n,r,this.key),i===null){j.error(`Failed to decrypt event with new key. Dropping encrypted event`);return}this.emit(e,this.getDataToEmit(i))});return}this.emit(e,this.getDataToEmit(i))}getDataToEmit(e){let t=(0,lt.decode)(e);try{return JSON.parse(t)}catch{return t}}}class ft extends M{constructor(e,t){super(),this.state=`initialized`,this.connection=null,this.key=e,this.options=t,this.timeline=this.options.timeline,this.usingTLS=this.options.useTLS,this.errorCallbacks=this.buildErrorCallbacks(),this.connectionCallbacks=this.buildConnectionCallbacks(this.errorCallbacks),this.handshakeCallbacks=this.buildHandshakeCallbacks(this.errorCallbacks);var n=I.getNetwork();n.bind(`online`,()=>{this.timeline.info({netinfo:`online`}),(this.state===`connecting`||this.state===`unavailable`)&&this.retryIn(0)}),n.bind(`offline`,()=>{this.timeline.info({netinfo:`offline`}),this.connection&&this.sendActivityCheck()}),this.updateStrategy()}connect(){if(!(this.connection||this.runner)){if(!this.strategy.isSupported()){this.updateState(`failed`);return}this.updateState(`connecting`),this.startConnecting(),this.setUnavailableTimer()}}send(e){return this.connection?this.connection.send(e):!1}send_event(e,t,n){return this.connection?this.connection.send_event(e,t,n):!1}disconnect(){this.disconnectInternally(),this.updateState(`disconnected`)}isUsingTLS(){return this.usingTLS}startConnecting(){var e=(t,n)=>{t?this.runner=this.strategy.connect(0,e):n.action===`error`?(this.emit(`error`,{type:`HandshakeError`,error:n.error}),this.timeline.error({handshakeError:n.error})):(this.abortConnecting(),this.handshakeCallbacks[n.action](n))};this.runner=this.strategy.connect(0,e)}abortConnecting(){this.runner&&=(this.runner.abort(),null)}disconnectInternally(){this.abortConnecting(),this.clearRetryTimer(),this.clearUnavailableTimer(),this.connection&&this.abandonConnection().close()}updateStrategy(){this.strategy=this.options.getStrategy({key:this.key,timeline:this.timeline,useTLS:this.usingTLS})}retryIn(e){this.timeline.info({action:`retry`,delay:e}),e>0&&this.emit(`connecting_in`,Math.round(e/1e3)),this.retryTimer=new ce(e||0,()=>{this.disconnectInternally(),this.connect()})}clearRetryTimer(){this.retryTimer&&=(this.retryTimer.ensureAborted(),null)}setUnavailableTimer(){this.unavailableTimer=new ce(this.options.unavailableTimeout,()=>{this.updateState(`unavailable`)})}clearUnavailableTimer(){this.unavailableTimer&&this.unavailableTimer.ensureAborted()}sendActivityCheck(){this.stopActivityCheck(),this.connection.ping(),this.activityTimer=new ce(this.options.pongTimeout,()=>{this.timeline.error({pong_timed_out:this.options.pongTimeout}),this.retryIn(0)})}resetActivityCheck(){this.stopActivityCheck(),this.connection&&!this.connection.handlesActivityChecks()&&(this.activityTimer=new ce(this.activityTimeout,()=>{this.sendActivityCheck()}))}stopActivityCheck(){this.activityTimer&&this.activityTimer.ensureAborted()}buildConnectionCallbacks(e){return k({},e,{message:e=>{this.resetActivityCheck(),this.emit(`message`,e)},ping:()=>{this.send_event(`pusher:pong`,{})},activity:()=>{this.resetActivityCheck()},error:e=>{this.emit(`error`,e)},closed:()=>{this.abandonConnection(),this.shouldRetry()&&this.retryIn(1e3)}})}buildHandshakeCallbacks(e){return k({},e,{connected:e=>{this.activityTimeout=Math.min(this.options.activityTimeout,e.activityTimeout,e.connection.activityTimeout||1/0),this.clearUnavailableTimer(),this.setConnection(e.connection),this.socket_id=this.connection.id,this.updateState(`connected`,{socket_id:this.socket_id})}})}buildErrorCallbacks(){let e=e=>t=>{t.error&&this.emit(`error`,{type:`WebSocketError`,error:t.error}),e(t)};return{tls_only:e(()=>{this.usingTLS=!0,this.updateStrategy(),this.retryIn(0)}),refused:e(()=>{this.disconnect()}),backoff:e(()=>{this.retryIn(1e3)}),retry:e(()=>{this.retryIn(0)})}}setConnection(e){for(var t in this.connection=e,this.connectionCallbacks)this.connection.bind(t,this.connectionCallbacks[t]);this.resetActivityCheck()}abandonConnection(){if(this.connection){for(var e in this.stopActivityCheck(),this.connectionCallbacks)this.connection.unbind(e,this.connectionCallbacks[e]);var t=this.connection;return this.connection=null,t}}updateState(e,t){var n=this.state;if(this.state=e,n!==e){var r=e;r===`connected`&&(r+=` with new socket ID `+t.socket_id),j.debug(`State changed`,n+` -> `+r),this.timeline.info({state:e,params:t}),this.emit(`state_change`,{previous:n,current:e}),this.emit(e,t)}}shouldRetry(){return this.state===`connecting`||this.state===`connected`}}class pt{constructor(){this.channels={}}add(e,t){return this.channels[e]||(this.channels[e]=mt(e,t)),this.channels[e]}all(){return pe(this.channels)}find(e){return this.channels[e]}remove(e){var t=this.channels[e];return delete this.channels[e],t}disconnect(){A(this.channels,function(e){e.disconnect()})}}function mt(e,t){if(e.indexOf(`private-encrypted-`)===0){if(t.config.nacl)return P.createEncryptedChannel(e,t,t.config.nacl);throw new _(`Tried to subscribe to a private-encrypted- channel but no nacl implementation available. ${u.buildLogSuffix(`encryptedChannelSupport`)}`)}else if(e.indexOf(`private-`)===0)return P.createPrivateChannel(e,t);else if(e.indexOf(`presence-`)===0)return P.createPresenceChannel(e,t);else if(e.indexOf(`#`)===0)throw new p(`Cannot create a channel with name "`+e+`".`);else return P.createChannel(e,t)}var P={createChannels(){return new pt},createConnectionManager(e,t){return new ft(e,t)},createChannel(e,t){return new it(e,t)},createPrivateChannel(e,t){return new at(e,t)},createPresenceChannel(e,t){return new ct(e,t)},createEncryptedChannel(e,t,n){return new dt(e,t,n)},createTimelineSender(e,t){return new rt(e,t)},createHandshake(e,t){return new nt(e,t)},createAssistantToTheTransportManager(e,t,n){return new Qe(e,t,n)}};class ht{constructor(e){this.options=e||{},this.livesLeft=this.options.lives||1/0}getAssistant(e){return P.createAssistantToTheTransportManager(this,e,{minPingDelay:this.options.minPingDelay,maxPingDelay:this.options.maxPingDelay})}isAlive(){return this.livesLeft>0}reportDeath(){--this.livesLeft}}class gt{constructor(e,t){this.strategies=e,this.loop=!!t.loop,this.failFast=!!t.failFast,this.timeout=t.timeout,this.timeoutLimit=t.timeoutLimit}isSupported(){return be(this.strategies,O.method(`isSupported`))}connect(e,t){var n=this.strategies,r=0,i=this.timeout,a=null,o=(s,c)=>{c?t(null,c):(r+=1,this.loop&&(r%=n.length),r0&&(i=new ce(n.timeout,function(){a.abort(),r(!0)})),a=e.connect(t,function(e,t){e&&i&&i.isRunning()&&!n.failFast||(i&&i.ensureAborted(),r(e,t))}),{abort:function(){i&&i.ensureAborted(),a.abort()},forceMinPriority:function(e){a.forceMinPriority(e)}}}}class _t{constructor(e){this.strategies=e}isSupported(){return be(this.strategies,O.method(`isSupported`))}connect(e,t){return vt(this.strategies,e,function(e,n){return function(r,i){if(n[e].error=r,r){yt(n)&&t(!0);return}me(n,function(e){e.forceMinPriority(i.transport.priority)}),t(null,i)}})}}function vt(e,t,n){var r=he(e,function(e,r,i,a){return e.connect(t,n(r,a))});return{abort:function(){me(r,bt)},forceMinPriority:function(e){me(r,function(t){t.forceMinPriority(e)})}}}function yt(e){return xe(e,function(e){return!!e.error})}function bt(e){!e.error&&!e.aborted&&(e.abort(),e.aborted=!0)}class xt{constructor(e,t,n){this.strategy=e,this.transports=t,this.ttl=n.ttl||1800*1e3,this.usingTLS=n.useTLS,this.timeline=n.timeline}isSupported(){return this.strategy.isSupported()}connect(e,t){var n=this.usingTLS,r=Ct(n),i=r&&r.cacheSkipCount?r.cacheSkipCount:0,a=[this.strategy];if(r&&r.timestamp+this.ttl>=O.now()){var o=this.transports[r.transport];o&&([`ws`,`wss`].includes(r.transport)||i>3?(this.timeline.info({cached:!0,transport:r.transport,latency:r.latency}),a.push(new gt([o],{timeout:r.latency*2+1e3,failFast:!0}))):i++)}var s=O.now(),c=a.pop().connect(e,function r(o,l){o?(Tt(n),a.length>0?(s=O.now(),c=a.pop().connect(e,r)):t(o)):(wt(n,l.transport.name,O.now()-s,i),t(null,l))});return{abort:function(){c.abort()},forceMinPriority:function(t){e=t,c&&c.forceMinPriority(t)}}}}function St(e){return`pusherTransport`+(e?`TLS`:`NonTLS`)}function Ct(e){var t=I.getLocalStorage();if(t)try{var n=t[St(e)];if(n)return JSON.parse(n)}catch{Tt(e)}return null}function wt(e,t,n,r){var i=I.getLocalStorage();if(i)try{i[St(e)]=Te({timestamp:O.now(),transport:t,latency:n,cacheSkipCount:r})}catch{}}function Tt(e){var t=I.getLocalStorage();if(t)try{delete t[St(e)]}catch{}}class Et{constructor(e,{delay:t}){this.strategy=e,this.options={delay:t}}isSupported(){return this.strategy.isSupported()}connect(e,t){var n=this.strategy,r,i=new ce(this.options.delay,function(){r=n.connect(e,t)});return{abort:function(){i.ensureAborted(),r&&r.abort()},forceMinPriority:function(t){e=t,r&&r.forceMinPriority(t)}}}}class Dt{constructor(e,t,n){this.test=e,this.trueBranch=t,this.falseBranch=n}isSupported(){return(this.test()?this.trueBranch:this.falseBranch).isSupported()}connect(e,t){return(this.test()?this.trueBranch:this.falseBranch).connect(e,t)}}class Ot{constructor(e){this.strategy=e}isSupported(){return this.strategy.isSupported()}connect(e,t){var n=this.strategy.connect(e,function(e,r){r&&n.abort(),t(e,r)});return n}}function kt(e){return function(){return e.isSupported()}}var At=function(e,t,n){var r={};function i(t,i,a,o,s){var c=n(e,t,i,a,o,s);return r[t]=c,c}var a=Object.assign({},t,{hostNonTLS:e.wsHost+`:`+e.wsPort,hostTLS:e.wsHost+`:`+e.wssPort,httpPath:e.wsPath}),o=Object.assign({},a,{useTLS:!0}),s=Object.assign({},t,{hostNonTLS:e.httpHost+`:`+e.httpPort,hostTLS:e.httpHost+`:`+e.httpsPort,httpPath:e.httpPath}),c={loop:!0,timeout:15e3,timeoutLimit:6e4},l=new ht({minPingDelay:1e4,maxPingDelay:e.activityTimeout}),u=new ht({lives:2,minPingDelay:1e4,maxPingDelay:e.activityTimeout}),d=i(`ws`,`ws`,3,a,l),f=i(`wss`,`ws`,3,o,l),p=i(`sockjs`,`sockjs`,1,s),m=i(`xhr_streaming`,`xhr_streaming`,1,s,u),h=i(`xdr_streaming`,`xdr_streaming`,1,s,u),g=i(`xhr_polling`,`xhr_polling`,1,s),_=i(`xdr_polling`,`xdr_polling`,1,s),v=new gt([d],c),y=new gt([f],c),b=new gt([p],c),x=new gt([new Dt(kt(m),m,h)],c),ee=new gt([new Dt(kt(g),g,_)],c),S=new gt([new Dt(kt(x),new _t([x,new Et(ee,{delay:4e3})]),ee)],c),C=new Dt(kt(S),S,b),w=t.useTLS?new _t([v,new Et(C,{delay:2e3})]):new _t([v,new Et(y,{delay:2e3}),new Et(C,{delay:5e3})]);return new xt(new Ot(new Dt(kt(d),w,C)),r,{ttl:18e5,timeline:t.timeline,useTLS:t.useTLS})},jt=(function(){var e=this;e.timeline.info(e.buildTimelineMessage({transport:e.name+(e.options.useTLS?`s`:``)})),e.hooks.isInitialized()?e.changeState(`initialized`):e.hooks.file?(e.changeState(`initializing`),c.load(e.hooks.file,{useTLS:e.options.useTLS},function(t,n){e.hooks.isInitialized()?(e.changeState(`initialized`),n(!0)):(t&&e.onError(t),e.onClose(),n(!1))})):e.onClose()}),Mt={getRequest:function(e){var t=new window.XDomainRequest;return t.ontimeout=function(){e.emit(`error`,new m),e.close()},t.onerror=function(t){e.emit(`error`,t),e.close()},t.onprogress=function(){t.responseText&&t.responseText.length>0&&e.onChunk(200,t.responseText)},t.onload=function(){t.responseText&&t.responseText.length>0&&e.onChunk(200,t.responseText),e.emit(`finished`,200),e.close()},t},abortRequest:function(e){e.ontimeout=e.onerror=e.onprogress=e.onload=null,e.abort()}};class Nt extends M{constructor(e,t,n){super(),this.hooks=e,this.method=t,this.url=n}start(e){this.position=0,this.xhr=this.hooks.getRequest(this),this.unloader=()=>{this.close()},I.addUnloadListener(this.unloader),this.xhr.open(this.method,this.url,!0),this.xhr.setRequestHeader&&this.xhr.setRequestHeader(`Content-Type`,`application/json`),this.xhr.send(e)}close(){this.unloader&&=(I.removeUnloadListener(this.unloader),null),this.xhr&&=(this.hooks.abortRequest(this.xhr),null)}onChunk(e,t){for(;;){var n=this.advanceBuffer(t);if(n)this.emit(`chunk`,{status:e,data:n});else break}this.isBufferTooLong(t)&&this.emit(`buffer_too_long`)}advanceBuffer(e){var t=e.slice(this.position),n=t.indexOf(` `);return n===-1?null:(this.position+=n+1,t.slice(0,n))}isBufferTooLong(e){return this.position===e.length&&e.length>262144}}var Pt;(function(e){e[e.CONNECTING=0]=`CONNECTING`,e[e.OPEN=1]=`OPEN`,e[e.CLOSED=3]=`CLOSED`})(Pt||={});var F=Pt,Ft=1;class It{constructor(e,t){this.hooks=e,this.session=Vt(1e3)+`/`+Ht(8),this.location=Lt(t),this.readyState=F.CONNECTING,this.openStream()}send(e){return this.sendRaw(JSON.stringify([e]))}ping(){this.hooks.sendHeartbeat(this)}close(e,t){this.onClose(e,t,!0)}sendRaw(e){if(this.readyState===F.OPEN)try{return I.createSocketRequest(`POST`,zt(Rt(this.location,this.session))).start(e),!0}catch{return!1}else return!1}reconnect(){this.closeStream(),this.openStream()}onClose(e,t,n){this.closeStream(),this.readyState=F.CLOSED,this.onclose&&this.onclose({code:e,reason:t,wasClean:n})}onChunk(e){if(e.status===200){this.readyState===F.OPEN&&this.onActivity();var t;switch(e.data.slice(0,1)){case`o`:t=JSON.parse(e.data.slice(1)||`{}`),this.onOpen(t);break;case`a`:t=JSON.parse(e.data.slice(1)||`[]`);for(var n=0;n{this.onChunk(e)}),this.stream.bind(`finished`,e=>{this.hooks.onFinished(this,e)}),this.stream.bind(`buffer_too_long`,()=>{this.reconnect()});try{this.stream.start()}catch(e){O.defer(()=>{this.onError(e),this.onClose(1006,`Could not start streaming`,!1)})}}closeStream(){this.stream&&=(this.stream.unbind_all(),this.stream.close(),null)}}function Lt(e){var t=/([^\?]*)\/*(\??.*)/.exec(e);return{base:t[1],queryString:t[2]}}function Rt(e,t){return e.base+`/`+t+`/xhr_send`}function zt(e){return e+(e.indexOf(`?`)===-1?`?`:`&`)+`t=`+ +new Date+`&n=`+ Ft++}function Bt(e,t){var n=/(https?:\/\/)([^\/:]+)((\/|:)?.*)/.exec(e);return n[1]+t+n[3]}function Vt(e){return I.randomInt(e)}function Ht(e){for(var t=[],n=0;n0&&e.onChunk(t.status,t.responseText);break;case 4:t.responseText&&t.responseText.length>0&&e.onChunk(t.status,t.responseText),e.emit(`finished`,t.status),e.close();break}},t},abortRequest:function(e){e.onreadystatechange=null,e.abort()}},qt={createStreamingSocket(e){return this.createSocket(Wt,e)},createPollingSocket(e){return this.createSocket(Gt,e)},createSocket(e,t){return new Ut(e,t)},createXHR(e,t){return this.createRequest(Kt,e,t)},createRequest(e,t,n){return new Nt(e,t,n)}};qt.createXDR=function(e,t){return this.createRequest(Mt,e,t)};var I={nextAuthCallbackID:1,auth_callbacks:{},ScriptReceivers:i,DependenciesReceivers:s,getDefaultStrategy:At,Transports:Ye,transportConnectionInitializer:jt,HTTPFactory:qt,TimelineTransport:Ae,getXHRAPI(){return window.XMLHttpRequest},getWebSocketAPI(){return window.WebSocket||window.MozWebSocket},setup(e){window.Pusher=e;var t=()=>{this.onDocumentBody(e.ready)};window.JSON?t():c.load(`json2`,{},t)},getDocument(){return document},getProtocol(){return this.getDocument().location.protocol},getAuthorizers(){return{ajax:x,jsonp:De}},onDocumentBody(e){document.body?e():setTimeout(()=>{this.onDocumentBody(e)},0)},createJSONPRequest(e,t){return new ke(e,t)},createScriptRequest(e){return new Oe(e)},getLocalStorage(){try{return window.localStorage}catch{return}},createXHR(){return this.getXHRAPI()?this.createXMLHttpRequest():this.createMicrosoftXHR()},createXMLHttpRequest(){return new(this.getXHRAPI())},createMicrosoftXHR(){return new ActiveXObject(`Microsoft.XMLHTTP`)},getNetwork(){return Ze},createWebSocket(e){return new(this.getWebSocketAPI())(e)},createSocketRequest(e,t){if(this.isXHRSupported())return this.HTTPFactory.createXHR(e,t);if(this.isXDRSupported(t.indexOf(`https:`)===0))return this.HTTPFactory.createXDR(e,t);throw`Cross-origin HTTP requests are not supported`},isXHRSupported(){var e=this.getXHRAPI();return!!e&&new e().withCredentials!==void 0},isXDRSupported(e){var t=e?`https:`:`http:`,n=this.getProtocol();return!!window.XDomainRequest&&n===t},addUnloadListener(e){window.addEventListener===void 0?window.attachEvent!==void 0&&window.attachEvent(`onunload`,e):window.addEventListener(`unload`,e,!1)},removeUnloadListener(e){window.addEventListener===void 0?window.detachEvent!==void 0&&window.detachEvent(`onunload`,e):window.removeEventListener(`unload`,e,!1)},randomInt(e){return Math.floor(function(){return(window.crypto||window.msCrypto).getRandomValues(new Uint32Array(1))[0]/2**32}()*e)}},Jt;(function(e){e[e.ERROR=3]=`ERROR`,e[e.INFO=6]=`INFO`,e[e.DEBUG=7]=`DEBUG`})(Jt||={});var Yt=Jt;class Xt{constructor(e,t,n){this.key=e,this.session=t,this.events=[],this.options=n||{},this.sent=0,this.uniqueID=0}log(e,t){e<=this.options.level&&(this.events.push(k({},t,{timestamp:O.now()})),this.options.limit&&this.events.length>this.options.limit&&this.events.shift())}error(e){this.log(Yt.ERROR,e)}info(e){this.log(Yt.INFO,e)}debug(e){this.log(Yt.DEBUG,e)}isEmpty(){return this.events.length===0}send(e,t){var n=k({session:this.session,bundle:this.sent+1,key:this.key,lib:`js`,version:this.options.version,cluster:this.options.cluster,features:this.options.features,timeline:this.events},this.options.params);return this.events=[],e(n,(e,n)=>{e||this.sent++,t&&t(e,n)}),!0}generateUniqueID(){return this.uniqueID++,this.uniqueID}}class Zt{constructor(e,t,n,r){this.name=e,this.priority=t,this.transport=n,this.options=r||{}}isSupported(){return this.transport.isSupported({useTLS:this.options.useTLS})}connect(e,t){if(!this.isSupported())return L(new y,t);if(this.priority{n||(l(),i?i.close():r.close())},forceMinPriority:e=>{n||this.priority{var n=`socket_id=`+encodeURIComponent(e.socketId);for(var r in t.params)n+=`&`+encodeURIComponent(r)+`=`+encodeURIComponent(t.params[r]);if(t.paramsProvider!=null){let e=t.paramsProvider();for(var r in e)n+=`&`+encodeURIComponent(r)+`=`+encodeURIComponent(e[r])}return n};var rn=e=>{if(I.getAuthorizers()[e.transport]===void 0)throw`'${e.transport}' is not a recognized auth transport`;return(t,n)=>{let r=nn(t,e);I.getAuthorizers()[e.transport](I,r,e,d.UserAuthentication,n)}};let an=(e,t)=>{var n=`socket_id=`+encodeURIComponent(e.socketId);for(var r in n+=`&channel_name=`+encodeURIComponent(e.channelName),t.params)n+=`&`+encodeURIComponent(r)+`=`+encodeURIComponent(t.params[r]);if(t.paramsProvider!=null){let e=t.paramsProvider();for(var r in e)n+=`&`+encodeURIComponent(r)+`=`+encodeURIComponent(e[r])}return n};var on=e=>{if(I.getAuthorizers()[e.transport]===void 0)throw`'${e.transport}' is not a recognized auth transport`;return(t,n)=>{let r=an(t,e);I.getAuthorizers()[e.transport](I,r,e,d.ChannelAuthorization,n)}};let sn=(e,t,n)=>{let r={authTransport:t.transport,authEndpoint:t.endpoint,auth:{params:t.params,headers:t.headers}};return(t,i)=>{n(e.channel(t.channelName),r).authorize(t.socketId,i)}};function cn(e,t){let n={activityTimeout:e.activityTimeout||a.activityTimeout,cluster:e.cluster,httpPath:e.httpPath||a.httpPath,httpPort:e.httpPort||a.httpPort,httpsPort:e.httpsPort||a.httpsPort,pongTimeout:e.pongTimeout||a.pongTimeout,statsHost:e.statsHost||a.stats_host,unavailableTimeout:e.unavailableTimeout||a.unavailableTimeout,wsPath:e.wsPath||a.wsPath,wsPort:e.wsPort||a.wsPort,wssPort:e.wssPort||a.wssPort,enableStats:pn(e),httpHost:ln(e),useTLS:fn(e),wsHost:un(e),userAuthenticator:mn(e),channelAuthorizer:gn(e,t)};return`disabledTransports`in e&&(n.disabledTransports=e.disabledTransports),`enabledTransports`in e&&(n.enabledTransports=e.enabledTransports),`ignoreNullOrigin`in e&&(n.ignoreNullOrigin=e.ignoreNullOrigin),`timelineParams`in e&&(n.timelineParams=e.timelineParams),`nacl`in e&&(n.nacl=e.nacl),n}function ln(e){return e.httpHost?e.httpHost:e.cluster?`sockjs-${e.cluster}.pusher.com`:a.httpHost}function un(e){return e.wsHost?e.wsHost:dn(e.cluster)}function dn(e){return`ws-${e}.pusher.com`}function fn(e){return I.getProtocol()===`https:`?!0:e.forceTLS!==!1}function pn(e){return`enableStats`in e?e.enableStats:`disableStats`in e?!e.disableStats:!1}function mn(e){let t=Object.assign(Object.assign({},a.userAuthentication),e.userAuthentication);return`customHandler`in t&&t.customHandler!=null?t.customHandler:rn(t)}function hn(e,t){let n;return`channelAuthorization`in e?n=Object.assign(Object.assign({},a.channelAuthorization),e.channelAuthorization):(n={transport:e.authTransport||a.authTransport,endpoint:e.authEndpoint||a.authEndpoint},`auth`in e&&(`params`in e.auth&&(n.params=e.auth.params),`headers`in e.auth&&(n.headers=e.auth.headers)),`authorizer`in e&&(n.customHandler=sn(t,n,e.authorizer))),n}function gn(e,t){let n=hn(e,t);return`customHandler`in n&&n.customHandler!=null?n.customHandler:on(n)}class _n extends M{constructor(e){super(function(e,t){j.debug(`No callbacks on watchlist events for ${e}`)}),this.pusher=e,this.bindWatchlistInternalEvent()}handleEvent(e){e.data.events.forEach(e=>{this.emit(e.name,e)})}bindWatchlistInternalEvent(){this.pusher.connection.bind(`message`,e=>{e.event===`pusher_internal:watchlist_events`&&this.handleEvent(e)})}}function vn(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}}var yn=vn;class bn extends M{constructor(e){super(function(e,t){j.debug(`No callbacks on user for `+e)}),this.signin_requested=!1,this.user_data=null,this.serverToUserChannel=null,this.signinDonePromise=null,this._signinDoneResolve=null,this._onAuthorize=(e,t)=>{if(e){j.warn(`Error during signin: ${e}`),this._cleanup();return}this.pusher.send_event(`pusher:signin`,{auth:t.auth,user_data:t.user_data})},this.pusher=e,this.pusher.connection.bind(`state_change`,({previous:e,current:t})=>{e!==`connected`&&t===`connected`&&this._signin(),e===`connected`&&t!==`connected`&&(this._cleanup(),this._newSigninPromiseIfNeeded())}),this.watchlist=new _n(e),this.pusher.connection.bind(`message`,e=>{e.event===`pusher:signin_success`&&this._onSigninSuccess(e.data),this.serverToUserChannel&&this.serverToUserChannel.name===e.channel&&this.serverToUserChannel.handleEvent(e)})}signin(){this.signin_requested||(this.signin_requested=!0,this._signin())}_signin(){this.signin_requested&&(this._newSigninPromiseIfNeeded(),this.pusher.connection.state===`connected`&&this.pusher.config.userAuthenticator({socketId:this.pusher.connection.socket_id},this._onAuthorize))}_onSigninSuccess(e){try{this.user_data=JSON.parse(e.user_data)}catch{j.error(`Failed parsing user data after signin: ${e.user_data}`),this._cleanup();return}if(typeof this.user_data.id!=`string`||this.user_data.id===``){j.error(`user_data doesn't contain an id. user_data: ${this.user_data}`),this._cleanup();return}this._signinDoneResolve(),this._subscribeChannels()}_subscribeChannels(){this.serverToUserChannel=new it(`#server-to-user-${this.user_data.id}`,this.pusher),this.serverToUserChannel.bind_global((e,t)=>{e.indexOf(`pusher_internal:`)===0||e.indexOf(`pusher:`)===0||this.emit(e,t)}),(e=>{e.subscriptionPending&&e.subscriptionCancelled?e.reinstateSubscription():!e.subscriptionPending&&this.pusher.connection.state===`connected`&&e.subscribe()})(this.serverToUserChannel)}_cleanup(){this.user_data=null,this.serverToUserChannel&&=(this.serverToUserChannel.unbind_all(),this.serverToUserChannel.disconnect(),null),this.signin_requested&&this._signinDoneResolve()}_newSigninPromiseIfNeeded(){if(!this.signin_requested||this.signinDonePromise&&!this.signinDonePromise.done)return;let{promise:e,resolve:t,reject:n}=yn();e.done=!1;let r=()=>{e.done=!0};e.then(r).catch(r),this.signinDonePromise=e,this._signinDoneResolve=t}}class R{static ready(){R.isReady=!0;for(var e=0,t=R.instances.length;eI.getDefaultStrategy(this.config,e,$t),timeline:this.timeline,activityTimeout:this.config.activityTimeout,pongTimeout:this.config.pongTimeout,unavailableTimeout:this.config.unavailableTimeout,useTLS:!!this.config.useTLS}),this.connection.bind(`connected`,()=>{this.subscribeAll(),this.timelineSender&&this.timelineSender.send(this.connection.isUsingTLS())}),this.connection.bind(`message`,e=>{var t=e.event.indexOf(`pusher_internal:`)===0;if(e.channel){var n=this.channel(e.channel);n&&n.handleEvent(e)}t||this.global_emitter.emit(e.event,e.data)}),this.connection.bind(`connecting`,()=>{this.channels.disconnect()}),this.connection.bind(`disconnected`,()=>{this.channels.disconnect()}),this.connection.bind(`error`,e=>{j.warn(e)}),R.instances.push(this),this.timeline.info({instances:R.instances.length}),this.user=new bn(this),R.isReady&&this.connect()}channel(e){return this.channels.find(e)}allChannels(){return this.channels.all()}connect(){if(this.connection.connect(),this.timelineSender&&!this.timelineSenderTimer){var e=this.connection.isUsingTLS(),t=this.timelineSender;this.timelineSenderTimer=new le(6e4,function(){t.send(e)})}}disconnect(){this.connection.disconnect(),this.timelineSenderTimer&&=(this.timelineSenderTimer.ensureAborted(),null)}bind(e,t,n){return this.global_emitter.bind(e,t,n),this}unbind(e,t,n){return this.global_emitter.unbind(e,t,n),this}bind_global(e){return this.global_emitter.bind_global(e),this}unbind_global(e){return this.global_emitter.unbind_global(e),this}unbind_all(e){return this.global_emitter.unbind_all(),this}subscribeAll(){for(var e in this.channels.channels)this.channels.channels.hasOwnProperty(e)&&this.subscribe(e)}subscribe(e){var t=this.channels.add(e,this);return t.subscriptionPending&&t.subscriptionCancelled?t.reinstateSubscription():!t.subscriptionPending&&this.connection.state===`connected`&&t.subscribe(),t}unsubscribe(e){var t=this.channels.find(e);t&&t.subscriptionPending?t.cancelSubscription():(t=this.channels.remove(e),t&&t.subscribed&&t.unsubscribe())}send_event(e,t,n){return this.connection.send_event(e,t,n)}shouldUseTLS(){return this.config.useTLS}signin(){this.user.signin()}}R.instances=[],R.isReady=!1,R.logToConsole=!1,R.Runtime=I,R.ScriptReceivers=I.ScriptReceivers,R.DependenciesReceivers=I.DependenciesReceivers,R.auth_callbacks=I.auth_callbacks;var xn=t.default=R;function Sn(e){if(e==null)throw`You must pass your app key when you instantiate Pusher.`}I.setup(R)})])})}))(),1),is=s({FetchEnctype:()=>nc,FetchMethod:()=>Z,FetchRequest:()=>rc,FetchResponse:()=>Zs,FrameElement:()=>q,FrameLoadingStyle:()=>as,FrameRenderer:()=>zc,PageRenderer:()=>Ll,PageSnapshot:()=>Q,StreamActions:()=>lu,StreamElement:()=>uu,StreamSourceElement:()=>du,cache:()=>Kl,config:()=>Y,connectStreamSource:()=>Zl,disconnectStreamSource:()=>Ql,fetch:()=>$s,fetchEnctypeFromString:()=>tc,fetchMethodFromString:()=>ec,isSafe:()=>ic,morphBodyElements:()=>ru,morphChildren:()=>Wc,morphElements:()=>Uc,morphTurboFrameElements:()=>iu,navigator:()=>ql,registerAdapter:()=>Yl,renderStreamMessage:()=>$l,session:()=>$,setConfirmMethod:()=>tu,setFormMode:()=>nu,setProgressBarDelay:()=>eu,start:()=>Jl,visit:()=>Xl}); /*! Turbo 8.0.21 Copyright © 2026 37signals LLC */ let as={eager:`eager`,lazy:`lazy`};var q=class e extends HTMLElement{static delegateConstructor=void 0;loaded=Promise.resolve();static get observedAttributes(){return[`disabled`,`loading`,`src`]}constructor(){super(),this.delegate=new e.delegateConstructor(this)}connectedCallback(){this.delegate.connect()}disconnectedCallback(){this.delegate.disconnect()}reload(){return this.delegate.sourceURLReloaded()}attributeChangedCallback(e){e==`loading`?this.delegate.loadingStyleChanged():e==`src`?this.delegate.sourceURLChanged():e==`disabled`&&this.delegate.disabledChanged()}get src(){return this.getAttribute(`src`)}set src(e){e?this.setAttribute(`src`,e):this.removeAttribute(`src`)}get refresh(){return this.getAttribute(`refresh`)}set refresh(e){e?this.setAttribute(`refresh`,e):this.removeAttribute(`refresh`)}get shouldReloadWithMorph(){return this.src&&this.refresh===`morph`}get loading(){return os(this.getAttribute(`loading`)||``)}set loading(e){e?this.setAttribute(`loading`,e):this.removeAttribute(`loading`)}get disabled(){return this.hasAttribute(`disabled`)}set disabled(e){e?this.setAttribute(`disabled`,``):this.removeAttribute(`disabled`)}get autoscroll(){return this.hasAttribute(`autoscroll`)}set autoscroll(e){e?this.setAttribute(`autoscroll`,``):this.removeAttribute(`autoscroll`)}get complete(){return!this.delegate.isLoading}get isActive(){return this.ownerDocument===document&&!this.isPreview}get isPreview(){return this.ownerDocument?.documentElement?.hasAttribute(`data-turbo-preview`)}};function os(e){switch(e.toLowerCase()){case`lazy`:return as.lazy;default:return as.eager}}let ss={enabled:!0,progressBarDelay:500,unvisitableExtensions:new Set(`.7z,.aac,.apk,.avi,.bmp,.bz2,.css,.csv,.deb,.dmg,.doc,.docx,.exe,.gif,.gz,.heic,.heif,.ico,.iso,.jpeg,.jpg,.js,.json,.m4a,.mkv,.mov,.mp3,.mp4,.mpeg,.mpg,.msi,.ogg,.ogv,.pdf,.pkg,.png,.ppt,.pptx,.rar,.rtf,.svg,.tar,.tif,.tiff,.txt,.wav,.webm,.webp,.wma,.wmv,.xls,.xlsx,.xml,.zip`.split(`,`))};function cs(e){if(e.getAttribute(`data-turbo-eval`)==`false`)return e;{let t=document.createElement(`script`),n=ks();return n&&(t.nonce=n),t.textContent=e.textContent,t.async=!1,ls(t,e),t}}function ls(e,t){for(let{name:n,value:r}of t.attributes)e.setAttribute(n,r)}function us(e){let t=document.createElement(`template`);return t.innerHTML=e,t.content}function J(e,{target:t,cancelable:n,detail:r}={}){let i=new CustomEvent(e,{cancelable:n,bubbles:!0,composed:!0,detail:r});return t&&t.isConnected?t.dispatchEvent(i):document.documentElement.dispatchEvent(i),i}function ds(e){e.preventDefault(),e.stopImmediatePropagation()}function fs(){return document.visibilityState===`hidden`?ms():ps()}function ps(){return new Promise(e=>requestAnimationFrame(()=>e()))}function ms(){return new Promise(e=>setTimeout(()=>e(),0))}function hs(e=``){return new DOMParser().parseFromString(e,`text/html`)}function gs(e,...t){let n=_s(e,t).replace(/^\n/,``).split(` `),r=n[0].match(/^\s+/),i=r?r[0].length:0;return n.map(e=>e.slice(i)).join(` `)}function _s(e,t){return e.reduce((e,n,r)=>{let i=t[r]==null?``:t[r];return e+n+i},``)}function vs(){return Array.from({length:36}).map((e,t)=>t==8||t==13||t==18||t==23?`-`:t==14?`4`:t==19?(Math.floor(Math.random()*4)+8).toString(16):Math.floor(Math.random()*16).toString(16)).join(``)}function ys(e,...t){for(let n of t.map(t=>t?.getAttribute(e)))if(typeof n==`string`)return n;return null}function bs(e,...t){return t.some(t=>t&&t.hasAttribute(e))}function xs(...e){for(let t of e)t.localName==`turbo-frame`&&t.setAttribute(`busy`,``),t.setAttribute(`aria-busy`,`true`)}function Ss(...e){for(let t of e)t.localName==`turbo-frame`&&t.removeAttribute(`busy`),t.removeAttribute(`aria-busy`)}function Cs(e,t=2e3){return new Promise(n=>{let r=()=>{e.removeEventListener(`error`,r),e.removeEventListener(`load`,r),n()};e.addEventListener(`load`,r,{once:!0}),e.addEventListener(`error`,r,{once:!0}),setTimeout(n,t)})}function ws(e){switch(e){case`replace`:return history.replaceState;case`advance`:case`restore`:return history.pushState}}function Ts(e){return e==`advance`||e==`replace`||e==`restore`}function Es(...e){let t=ys(`data-turbo-action`,...e);return Ts(t)?t:null}function Ds(e){return document.querySelector(`meta[name="${e}"]`)}function Os(e){let t=Ds(e);return t&&t.content}function ks(){let e=Ds(`csp-nonce`);if(e){let{nonce:t,content:n}=e;return t==``?n:t}}function As(e,t){let n=Ds(e);return n||(n=document.createElement(`meta`),n.setAttribute(`name`,e),document.head.appendChild(n)),n.setAttribute(`content`,t),n}function js(e,t){if(e instanceof Element)return e.closest(t)||js(e.assignedSlot||e.getRootNode()?.host,t)}function Ms(e){return!!e&&e.closest(`[inert], :disabled, [hidden], details:not([open]), dialog:not([open])`)==null&&typeof e.focus==`function`}function Ns(e){return Array.from(e.querySelectorAll(`[autofocus]`)).find(Ms)}async function Ps(e,t){let n=t();return e(),await ps(),[n,t()]}function Fs(e){if(e===`_blank`)return!1;if(e){for(let t of document.getElementsByName(e))if(t instanceof HTMLIFrameElement)return!1;return!0}else return!0}function Is(e){let t=js(e,`a[href], a[xlink\\:href]`);if(!t||t.href.startsWith(`#`)||t.hasAttribute(`download`))return null;let n=t.getAttribute(`target`);return n&&n!==`_self`?null:t}function Ls(e,t){let n=null;return(...r)=>{clearTimeout(n),n=setTimeout(()=>e.apply(this,r),t)}}let Rs={"aria-disabled":{beforeSubmit:e=>{e.setAttribute(`aria-disabled`,`true`),e.addEventListener(`click`,ds)},afterSubmit:e=>{e.removeAttribute(`aria-disabled`),e.removeEventListener(`click`,ds)}},disabled:{beforeSubmit:e=>e.disabled=!0,afterSubmit:e=>e.disabled=!1}},Y={drive:ss,forms:new class{#e=null;constructor(e){Object.assign(this,e)}get submitter(){return this.#e}set submitter(e){this.#e=Rs[e]||e}}({mode:`on`,submitter:`disabled`})};function X(e){return new URL(e.toString(),document.baseURI)}function zs(e){let t;if(e.hash)return e.hash.slice(1);if(t=e.href.match(/#(.*)$/))return t[1]}function Bs(e,t){return X(t?.getAttribute(`formaction`)||e.getAttribute(`action`)||e.action)}function Vs(e){return(Ys(e).match(/\.[^.]*$/)||[])[0]||``}function Hs(e,t){let n=Xs(t.origin+t.pathname);return Xs(e.href)===n||e.href.startsWith(n)}function Us(e,t){return Hs(e,t)&&!Y.drive.unvisitableExtensions.has(Vs(e))}function Ws(e){return X(e.getAttribute(`href`)||``)}function Gs(e){let t=zs(e);return t==null?e.href:e.href.slice(0,-(t.length+1))}function Ks(e){return Gs(e)}function qs(e,t){return X(e).href==X(t).href}function Js(e){return e.pathname.split(`/`).slice(1)}function Ys(e){return Js(e).slice(-1)[0]}function Xs(e){return e.endsWith(`/`)?e:e+`/`}var Zs=class{constructor(e){this.response=e}get succeeded(){return this.response.ok}get failed(){return!this.succeeded}get clientError(){return this.statusCode>=400&&this.statusCode<=499}get serverError(){return this.statusCode>=500&&this.statusCode<=599}get redirected(){return this.response.redirected}get location(){return X(this.response.url)}get isHTML(){return this.contentType&&this.contentType.match(/^(?:text\/([^\s;,]+\b)?html|application\/xhtml\+xml)\b/)}get statusCode(){return this.response.status}get contentType(){return this.header(`Content-Type`)}get responseText(){return this.response.clone().text()}get responseHTML(){return this.isHTML?this.response.clone().text():Promise.resolve(void 0)}header(e){return this.response.headers.get(e)}};let Qs=new class extends Set{constructor(e){super(),this.maxSize=e}add(e){if(this.size>=this.maxSize){let e=this.values().next().value;this.delete(e)}super.add(e)}}(20);function $s(e,t={}){let n=new Headers(t.headers||{}),r=vs();return Qs.add(r),n.append(`X-Turbo-Request-Id`,r),window.fetch(e,{...t,headers:n})}function ec(e){switch(e.toLowerCase()){case`get`:return Z.get;case`post`:return Z.post;case`put`:return Z.put;case`patch`:return Z.patch;case`delete`:return Z.delete}}let Z={get:`get`,post:`post`,put:`put`,patch:`patch`,delete:`delete`};function tc(e){switch(e.toLowerCase()){case nc.multipart:return nc.multipart;case nc.plain:return nc.plain;default:return nc.urlEncoded}}let nc={urlEncoded:`application/x-www-form-urlencoded`,multipart:`multipart/form-data`,plain:`text/plain`};var rc=class{abortController=new AbortController;#e=e=>{};constructor(e,t,n,r=new URLSearchParams,i=null,a=nc.urlEncoded){let[o,s]=ac(X(n),t,r,a);this.delegate=e,this.url=o,this.target=i,this.fetchOptions={credentials:`same-origin`,redirect:`follow`,method:t.toUpperCase(),headers:{...this.defaultHeaders},body:s,signal:this.abortSignal,referrer:this.delegate.referrer?.href},this.enctype=a}get method(){return this.fetchOptions.method}set method(e){let t=this.isSafe?this.url.searchParams:this.fetchOptions.body||new FormData,n=ec(e)||Z.get;this.url.search=``;let[r,i]=ac(this.url,n,t,this.enctype);this.url=r,this.fetchOptions.body=i,this.fetchOptions.method=n.toUpperCase()}get headers(){return this.fetchOptions.headers}set headers(e){this.fetchOptions.headers=e}get body(){return this.isSafe?this.url.searchParams:this.fetchOptions.body}set body(e){this.fetchOptions.body=e}get location(){return this.url}get params(){return this.url.searchParams}get entries(){return this.body?Array.from(this.body.entries()):[]}cancel(){this.abortController.abort()}async perform(){let{fetchOptions:e}=this;this.delegate.prepareRequest(this);let t=await this.#t(e);try{this.delegate.requestStarted(this),t.detail.fetchRequest?this.response=t.detail.fetchRequest.response:this.response=$s(this.url.href,e);let n=await this.response;return await this.receive(n)}catch(e){if(e.name!==`AbortError`)throw this.#n(e)&&this.delegate.requestErrored(this,e),e}finally{this.delegate.requestFinished(this)}}async receive(e){let t=new Zs(e);return J(`turbo:before-fetch-response`,{cancelable:!0,detail:{fetchResponse:t},target:this.target}).defaultPrevented?this.delegate.requestPreventedHandlingResponse(this,t):t.succeeded?this.delegate.requestSucceededWithResponse(this,t):this.delegate.requestFailedWithResponse(this,t),t}get defaultHeaders(){return{Accept:`text/html, application/xhtml+xml`}}get isSafe(){return ic(this.method)}get abortSignal(){return this.abortController.signal}acceptResponseType(e){this.headers.Accept=[e,this.headers.Accept].join(`, `)}async#t(e){let t=new Promise(e=>this.#e=e),n=J(`turbo:before-fetch-request`,{cancelable:!0,detail:{fetchOptions:e,url:this.url,resume:this.#e},target:this.target});return this.url=n.detail.url,n.defaultPrevented&&await t,n}#n(e){return!J(`turbo:fetch-request-error`,{target:this.target,cancelable:!0,detail:{request:this,error:e}}).defaultPrevented}};function ic(e){return ec(e)==Z.get}function ac(e,t,n,r){let i=Array.from(n).length>0?new URLSearchParams(oc(n)):e.searchParams;return ic(t)?[sc(e,i),null]:r==nc.urlEncoded?[e,i]:[e,n]}function oc(e){let t=[];for(let[n,r]of e)if(r instanceof File)continue;else t.push([n,r]);return t}function sc(e,t){return e.search=new URLSearchParams(oc(t)).toString(),e}var cc=class{started=!1;constructor(e,t){this.delegate=e,this.element=t,this.intersectionObserver=new IntersectionObserver(this.intersect)}start(){this.started||(this.started=!0,this.intersectionObserver.observe(this.element))}stop(){this.started&&(this.started=!1,this.intersectionObserver.unobserve(this.element))}intersect=e=>{e.slice(-1)[0]?.isIntersecting&&this.delegate.elementAppearedInViewport(this.element)}},lc=class{static contentType=`text/vnd.turbo-stream.html`;static wrap(e){return typeof e==`string`?new this(us(e)):e}constructor(e){this.fragment=uc(e)}};function uc(e){for(let t of e.querySelectorAll(`turbo-stream`)){let e=document.importNode(t,!0);for(let t of e.templateElement.content.querySelectorAll(`script`))t.replaceWith(cs(t));t.replaceWith(e)}return e}let dc=e=>e;var fc=class{keys=[];entries={};#e;constructor(e,t=dc){this.size=e,this.#e=t}has(e){return this.#e(e)in this.entries}get(e){if(this.has(e)){let t=this.read(e);return this.touch(e),t}}put(e,t){return this.write(e,t),this.touch(e),t}clear(){for(let e of Object.keys(this.entries))this.evict(e)}read(e){return this.entries[this.#e(e)]}write(e,t){this.entries[this.#e(e)]=t}touch(e){e=this.#e(e);let t=this.keys.indexOf(e);t>-1&&this.keys.splice(t,1),this.keys.unshift(e),this.trim()}trim(){for(let e of this.keys.splice(this.size))this.evict(e)}evict(e){delete this.entries[e]}},pc=class extends fc{#e=null;#t={};constructor(e=1,t=100){super(e,Ks),this.prefetchDelay=t}putLater(e,t,n){this.#e=setTimeout(()=>{t.perform(),this.put(e,t,n),this.#e=null},this.prefetchDelay)}put(e,t,n=mc){super.put(e,t),this.#t[Ks(e)]=new Date(new Date().getTime()+n)}clear(){super.clear(),this.#e&&clearTimeout(this.#e)}evict(e){super.evict(e),delete this.#t[e]}has(e){if(super.has(e)){let t=this.#t[Ks(e)];return t&&t>Date.now()}else return!1}};let mc=10*1e3,hc=new pc,gc={initialized:`initialized`,requesting:`requesting`,waiting:`waiting`,receiving:`receiving`,stopping:`stopping`,stopped:`stopped`};var _c=class e{state=gc.initialized;static confirmMethod(e){return Promise.resolve(confirm(e))}constructor(e,t,n,r=!1){let i=Cc(t,n),a=Sc(xc(t,n),i),o=vc(t,n),s=wc(t,n);this.delegate=e,this.formElement=t,this.submitter=n,this.fetchRequest=new rc(this,i,a,o,t,s),this.mustRedirect=r}get method(){return this.fetchRequest.method}set method(e){this.fetchRequest.method=e}get action(){return this.fetchRequest.url.toString()}set action(e){this.fetchRequest.url=X(e)}get body(){return this.fetchRequest.body}get enctype(){return this.fetchRequest.enctype}get isSafe(){return this.fetchRequest.isSafe}get location(){return this.fetchRequest.url}async start(){let{initialized:t,requesting:n}=gc,r=ys(`data-turbo-confirm`,this.submitter,this.formElement);if(!(typeof r==`string`&&!await(typeof Y.forms.confirm==`function`?Y.forms.confirm:e.confirmMethod)(r,this.formElement,this.submitter))&&this.state==t)return this.state=n,this.fetchRequest.perform()}stop(){let{stopping:e,stopped:t}=gc;if(this.state!=e&&this.state!=t)return this.state=e,this.fetchRequest.cancel(),!0}prepareRequest(e){if(!e.isSafe){let t=yc(Os(`csrf-param`))||Os(`csrf-token`);t&&(e.headers[`X-CSRF-Token`]=t)}this.requestAcceptsTurboStreamResponse(e)&&e.acceptResponseType(lc.contentType)}requestStarted(e){this.state=gc.waiting,this.submitter&&Y.forms.submitter.beforeSubmit(this.submitter),this.setSubmitsWith(),xs(this.formElement),J(`turbo:submit-start`,{target:this.formElement,detail:{formSubmission:this}}),this.delegate.formSubmissionStarted(this)}requestPreventedHandlingResponse(e,t){hc.clear(),this.result={success:t.succeeded,fetchResponse:t}}requestSucceededWithResponse(e,t){if(t.clientError||t.serverError){this.delegate.formSubmissionFailedWithResponse(this,t);return}if(hc.clear(),this.requestMustRedirect(e)&&bc(t)){let e=Error(`Form responses must redirect to another location`);this.delegate.formSubmissionErrored(this,e)}else this.state=gc.receiving,this.result={success:!0,fetchResponse:t},this.delegate.formSubmissionSucceededWithResponse(this,t)}requestFailedWithResponse(e,t){this.result={success:!1,fetchResponse:t},this.delegate.formSubmissionFailedWithResponse(this,t)}requestErrored(e,t){this.result={success:!1,error:t},this.delegate.formSubmissionErrored(this,t)}requestFinished(e){this.state=gc.stopped,this.submitter&&Y.forms.submitter.afterSubmit(this.submitter),this.resetSubmitterText(),Ss(this.formElement),J(`turbo:submit-end`,{target:this.formElement,detail:{formSubmission:this,...this.result}}),this.delegate.formSubmissionFinished(this)}setSubmitsWith(){if(!(!this.submitter||!this.submitsWith)){if(this.submitter.matches(`button`))this.originalSubmitText=this.submitter.innerHTML,this.submitter.innerHTML=this.submitsWith;else if(this.submitter.matches(`input`)){let e=this.submitter;this.originalSubmitText=e.value,e.value=this.submitsWith}}}resetSubmitterText(){if(!(!this.submitter||!this.originalSubmitText)){if(this.submitter.matches(`button`))this.submitter.innerHTML=this.originalSubmitText;else if(this.submitter.matches(`input`)){let e=this.submitter;e.value=this.originalSubmitText}}}requestMustRedirect(e){return!e.isSafe&&this.mustRedirect}requestAcceptsTurboStreamResponse(e){return!e.isSafe||bs(`data-turbo-stream`,this.submitter,this.formElement)}get submitsWith(){return this.submitter?.getAttribute(`data-turbo-submits-with`)}};function vc(e,t){let n=new FormData(e),r=t?.getAttribute(`name`),i=t?.getAttribute(`value`);return r&&n.append(r,i||``),n}function yc(e){if(e!=null){let t=(document.cookie?document.cookie.split(`; `):[]).find(t=>t.startsWith(e));if(t){let e=t.split(`=`).slice(1).join(`=`);return e?decodeURIComponent(e):void 0}}}function bc(e){return e.statusCode==200&&!e.redirected}function xc(e,t){let n=typeof e.action==`string`?e.action:null;return t?.hasAttribute(`formaction`)?t.getAttribute(`formaction`)||``:e.getAttribute(`action`)||n||``}function Sc(e,t){let n=X(e);return ic(t)&&(n.search=``),n}function Cc(e,t){return ec((t?.getAttribute(`formmethod`)||e.getAttribute(`method`)||``).toLowerCase())||Z.get}function wc(e,t){return tc(t?.getAttribute(`formenctype`)||e.enctype)}var Tc=class{constructor(e){this.element=e}get activeElement(){return this.element.ownerDocument.activeElement}get children(){return[...this.element.children]}hasAnchor(e){return this.getElementForAnchor(e)!=null}getElementForAnchor(e){return e?this.element.querySelector(`[id='${e}'], a[name='${e}']`):null}get isConnected(){return this.element.isConnected}get firstAutofocusableElement(){return Ns(this.element)}get permanentElements(){return Dc(this.element)}getPermanentElementById(e){return Ec(this.element,e)}getPermanentElementMapForSnapshot(e){let t={};for(let n of this.permanentElements){let{id:r}=n,i=e.getPermanentElementById(r);i&&(t[r]=[n,i])}return t}};function Ec(e,t){return e.querySelector(`#${t}[data-turbo-permanent]`)}function Dc(e){return e.querySelectorAll(`[id][data-turbo-permanent]`)}var Oc=class{started=!1;constructor(e,t){this.delegate=e,this.eventTarget=t}start(){this.started||=(this.eventTarget.addEventListener(`submit`,this.submitCaptured,!0),!0)}stop(){this.started&&=(this.eventTarget.removeEventListener(`submit`,this.submitCaptured,!0),!1)}submitCaptured=()=>{this.eventTarget.removeEventListener(`submit`,this.submitBubbled,!1),this.eventTarget.addEventListener(`submit`,this.submitBubbled,!1)};submitBubbled=e=>{if(!e.defaultPrevented){let t=e.target instanceof HTMLFormElement?e.target:void 0,n=e.submitter||void 0;t&&kc(t,n)&&Ac(t,n)&&this.delegate.willSubmitForm(t,n)&&(e.preventDefault(),e.stopImmediatePropagation(),this.delegate.formSubmitted(t,n))}}};function kc(e,t){return(t?.getAttribute(`formmethod`)||e.getAttribute(`method`))!=`dialog`}function Ac(e,t){return Fs(t?.getAttribute(`formtarget`)||e.getAttribute(`target`))}var jc=class{#e=e=>{};#t=e=>{};constructor(e,t){this.delegate=e,this.element=t}scrollToAnchor(e){let t=this.snapshot.getElementForAnchor(e);t?(this.focusElement(t),this.scrollToElement(t)):this.scrollToPosition({x:0,y:0})}scrollToAnchorFromLocation(e){this.scrollToAnchor(zs(e))}scrollToElement(e){e.scrollIntoView()}focusElement(e){e instanceof HTMLElement&&(e.hasAttribute(`tabindex`)?e.focus():(e.setAttribute(`tabindex`,`-1`),e.focus(),e.removeAttribute(`tabindex`)))}scrollToPosition({x:e,y:t}){this.scrollRoot.scrollTo(e,t)}scrollToTop(){this.scrollToPosition({x:0,y:0})}get scrollRoot(){return window}async render(e){let{isPreview:t,shouldRender:n,willRender:r,newSnapshot:i}=e,a=r;if(n)try{this.renderPromise=new Promise(e=>this.#e=e),this.renderer=e,await this.prepareToRenderSnapshot(e);let n=new Promise(e=>this.#t=e),r={resume:this.#t,render:this.renderer.renderElement,renderMethod:this.renderer.renderMethod};this.delegate.allowsImmediateRender(i,r)||await n,await this.renderSnapshot(e),this.delegate.viewRenderedSnapshot(i,t,this.renderer.renderMethod),this.delegate.preloadOnLoadLinksForView(this.element),this.finishRenderingSnapshot(e)}finally{delete this.renderer,this.#e(void 0),delete this.renderPromise}else a&&this.invalidate(e.reloadReason)}invalidate(e){this.delegate.viewInvalidated(e)}async prepareToRenderSnapshot(e){this.markAsPreview(e.isPreview),await e.prepareToRender()}markAsPreview(e){e?this.element.setAttribute(`data-turbo-preview`,``):this.element.removeAttribute(`data-turbo-preview`)}markVisitDirection(e){this.element.setAttribute(`data-turbo-visit-direction`,e)}unmarkVisitDirection(){this.element.removeAttribute(`data-turbo-visit-direction`)}async renderSnapshot(e){await e.render()}finishRenderingSnapshot(e){e.finishRendering()}},Mc=class extends jc{missing(){this.element.innerHTML=`Content missing`}get snapshot(){return new Tc(this.element)}},Nc=class{constructor(e,t){this.delegate=e,this.element=t}start(){this.element.addEventListener(`click`,this.clickBubbled),document.addEventListener(`turbo:click`,this.linkClicked),document.addEventListener(`turbo:before-visit`,this.willVisit)}stop(){this.element.removeEventListener(`click`,this.clickBubbled),document.removeEventListener(`turbo:click`,this.linkClicked),document.removeEventListener(`turbo:before-visit`,this.willVisit)}clickBubbled=e=>{this.clickEventIsSignificant(e)?this.clickEvent=e:delete this.clickEvent};linkClicked=e=>{this.clickEvent&&this.clickEventIsSignificant(e)&&this.delegate.shouldInterceptLinkClick(e.target,e.detail.url,e.detail.originalEvent)&&(this.clickEvent.preventDefault(),e.preventDefault(),this.delegate.linkClickIntercepted(e.target,e.detail.url,e.detail.originalEvent)),delete this.clickEvent};willVisit=e=>{delete this.clickEvent};clickEventIsSignificant(e){let t=e.composed?e.target?.parentElement:e.target,n=Is(t)||t;return n instanceof Element&&n.closest(`turbo-frame, html`)==this.element}},Pc=class{started=!1;constructor(e,t){this.delegate=e,this.eventTarget=t}start(){this.started||=(this.eventTarget.addEventListener(`click`,this.clickCaptured,!0),!0)}stop(){this.started&&=(this.eventTarget.removeEventListener(`click`,this.clickCaptured,!0),!1)}clickCaptured=()=>{this.eventTarget.removeEventListener(`click`,this.clickBubbled,!1),this.eventTarget.addEventListener(`click`,this.clickBubbled,!1)};clickBubbled=e=>{if(e instanceof MouseEvent&&this.clickEventIsSignificant(e)){let t=Is(e.composedPath&&e.composedPath()[0]||e.target);if(t&&Fs(t.target)){let n=Ws(t);this.delegate.willFollowLinkToLocation(t,n,e)&&(e.preventDefault(),this.delegate.followedLinkToLocation(t,n))}}};clickEventIsSignificant(e){return!(e.target&&e.target.isContentEditable||e.defaultPrevented||e.which>1||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)}},Fc=class{constructor(e,t){this.delegate=e,this.linkInterceptor=new Pc(this,t)}start(){this.linkInterceptor.start()}stop(){this.linkInterceptor.stop()}canPrefetchRequestToLocation(e,t){return!1}prefetchAndCacheRequestToLocation(e,t){}willFollowLinkToLocation(e,t,n){return this.delegate.willSubmitFormLinkToLocation(e,t,n)&&(e.hasAttribute(`data-turbo-method`)||e.hasAttribute(`data-turbo-stream`))}followedLinkToLocation(e,t){let n=document.createElement(`form`);for(let[e,r]of t.searchParams)n.append(Object.assign(document.createElement(`input`),{type:`hidden`,name:e,value:r}));let r=Object.assign(t,{search:``});n.setAttribute(`data-turbo`,`true`),n.setAttribute(`action`,r.href),n.setAttribute(`hidden`,``);let i=e.getAttribute(`data-turbo-method`);i&&n.setAttribute(`method`,i);let a=e.getAttribute(`data-turbo-frame`);a&&n.setAttribute(`data-turbo-frame`,a);let o=Es(e);o&&n.setAttribute(`data-turbo-action`,o);let s=e.getAttribute(`data-turbo-confirm`);s&&n.setAttribute(`data-turbo-confirm`,s),e.hasAttribute(`data-turbo-stream`)&&n.setAttribute(`data-turbo-stream`,``),this.delegate.submittedFormLinkToLocation(e,t,n),document.body.appendChild(n),n.addEventListener(`turbo:submit-end`,()=>n.remove(),{once:!0}),requestAnimationFrame(()=>n.requestSubmit())}},Ic=class{static async preservingPermanentElements(e,t,n){let r=new this(e,t);r.enter(),await n(),r.leave()}constructor(e,t){this.delegate=e,this.permanentElementMap=t}enter(){for(let e in this.permanentElementMap){let[t,n]=this.permanentElementMap[e];this.delegate.enteringBardo(t,n),this.replaceNewPermanentElementWithPlaceholder(n)}}leave(){for(let e in this.permanentElementMap){let[t]=this.permanentElementMap[e];this.replaceCurrentPermanentElementWithClone(t),this.replacePlaceholderWithPermanentElement(t),this.delegate.leavingBardo(t)}}replaceNewPermanentElementWithPlaceholder(e){let t=Lc(e);e.replaceWith(t)}replaceCurrentPermanentElementWithClone(e){let t=e.cloneNode(!0);e.replaceWith(t)}replacePlaceholderWithPermanentElement(e){this.getPlaceholderById(e.id)?.replaceWith(e)}getPlaceholderById(e){return this.placeholders.find(t=>t.content==e)}get placeholders(){return[...document.querySelectorAll(`meta[name=turbo-permanent-placeholder][content]`)]}};function Lc(e){let t=document.createElement(`meta`);return t.setAttribute(`name`,`turbo-permanent-placeholder`),t.setAttribute(`content`,e.id),t}var Rc=class{#e=null;static renderElement(e,t){}constructor(e,t,n,r=!0){this.currentSnapshot=e,this.newSnapshot=t,this.isPreview=n,this.willRender=r,this.renderElement=this.constructor.renderElement,this.promise=new Promise((e,t)=>this.resolvingFunctions={resolve:e,reject:t})}get shouldRender(){return!0}get shouldAutofocus(){return!0}get reloadReason(){}prepareToRender(){}render(){}finishRendering(){this.resolvingFunctions&&(this.resolvingFunctions.resolve(),delete this.resolvingFunctions)}async preservingPermanentElements(e){await Ic.preservingPermanentElements(this,this.permanentElementMap,e)}focusFirstAutofocusableElement(){if(this.shouldAutofocus){let e=this.connectedSnapshot.firstAutofocusableElement;e&&e.focus()}}enteringBardo(e){this.#e||e.contains(this.currentSnapshot.activeElement)&&(this.#e=this.currentSnapshot.activeElement)}leavingBardo(e){e.contains(this.#e)&&this.#e instanceof HTMLElement&&(this.#e.focus(),this.#e=null)}get connectedSnapshot(){return this.newSnapshot.isConnected?this.newSnapshot:this.currentSnapshot}get currentElement(){return this.currentSnapshot.element}get newElement(){return this.newSnapshot.element}get permanentElementMap(){return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot)}get renderMethod(){return`replace`}},zc=class extends Rc{static renderElement(e,t){let n=document.createRange();n.selectNodeContents(e),n.deleteContents();let r=t,i=r.ownerDocument?.createRange();i&&(i.selectNodeContents(r),e.appendChild(i.extractContents()))}constructor(e,t,n,r,i,a=!0){super(t,n,r,i,a),this.delegate=e}get shouldRender(){return!0}async render(){await fs(),this.preservingPermanentElements(()=>{this.loadFrameElement()}),this.scrollFrameIntoView(),await fs(),this.focusFirstAutofocusableElement(),await fs(),this.activateScriptElements()}loadFrameElement(){this.delegate.willRenderFrame(this.currentElement,this.newElement),this.renderElement(this.currentElement,this.newElement)}scrollFrameIntoView(){if(this.currentElement.autoscroll||this.newElement.autoscroll){let e=this.currentElement.firstElementChild,t=Bc(this.currentElement.getAttribute(`data-autoscroll-block`),`end`),n=Vc(this.currentElement.getAttribute(`data-autoscroll-behavior`),`auto`);if(e)return e.scrollIntoView({block:t,behavior:n}),!0}return!1}activateScriptElements(){for(let e of this.newScriptElements){let t=cs(e);e.replaceWith(t)}}get newScriptElements(){return this.currentElement.querySelectorAll(`script`)}};function Bc(e,t){return e==`end`||e==`start`||e==`center`||e==`nearest`?e:t}function Vc(e,t){return e==`auto`||e==`smooth`?e:t}var Hc=(function(){let e=()=>{},t={morphStyle:`outerHTML`,callbacks:{beforeNodeAdded:e,afterNodeAdded:e,beforeNodeMorphed:e,afterNodeMorphed:e,beforeNodeRemoved:e,afterNodeRemoved:e,beforeAttributeUpdated:e},head:{style:`merge`,shouldPreserve:e=>e.getAttribute(`im-preserve`)===`true`,shouldReAppend:e=>e.getAttribute(`im-re-append`)===`true`,shouldRemove:e,afterHeadMorphed:e},restoreFocus:!0};function n(e,t,n={}){e=u(e);let o=d(t),c=l(e,o,n),f=i(c,()=>s(c,e,o,t=>t.morphStyle===`innerHTML`?(a(t,e,o),Array.from(e.childNodes)):r(t,e,o)));return c.pantry.remove(),f}function r(e,t,n){let r=d(t);return a(e,r,n,t,t.nextSibling),Array.from(r.childNodes)}function i(e,t){if(!e.config.restoreFocus)return t();let n=document.activeElement;if(!(n instanceof HTMLInputElement||n instanceof HTMLTextAreaElement))return t();let{id:r,selectionStart:i,selectionEnd:a}=n,o=t();return r&&r!==document.activeElement?.getAttribute(`id`)&&(n=e.target.querySelector(`[id="${r}"]`),n?.focus()),n&&!n.selectionEnd&&a&&n.setSelectionRange(i,a),o}let a=(function(){function e(e,s,c,l=null,u=null){s instanceof HTMLTemplateElement&&c instanceof HTMLTemplateElement&&(s=s.content,c=c.content),l||=s.firstChild;for(let r of c.childNodes){if(l&&l!=u){let t=n(e,r,l,u);if(t){t!==l&&i(e,l,t),o(t,r,e),l=t.nextSibling;continue}}if(r instanceof Element){let t=r.getAttribute(`id`);if(e.persistentIds.has(t)){let n=a(s,t,l,e);o(n,r,e),l=n.nextSibling;continue}}let c=t(s,r,l,e);c&&(l=c.nextSibling)}for(;l&&l!=u;){let t=l;l=l.nextSibling,r(e,t)}}function t(e,t,n,r){if(r.callbacks.beforeNodeAdded(t)===!1)return null;if(r.idMap.has(t)){let i=document.createElement(t.tagName);return e.insertBefore(i,n),o(i,t,r),r.callbacks.afterNodeAdded(i),i}else{let i=document.importNode(t,!0);return e.insertBefore(i,n),r.callbacks.afterNodeAdded(i),i}}let n=(function(){function e(e,r,i,a){let o=null,s=r.nextSibling,c=0,l=i;for(;l&&l!=a;){if(n(l,r)){if(t(e,l,r))return l;o===null&&(e.idMap.has(l)||(o=l))}if(o===null&&s&&n(l,s)&&(c++,s=s.nextSibling,c>=2&&(o=void 0)),e.activeElementAndParents.includes(l))break;l=l.nextSibling}return o||null}function t(e,t,n){let r=e.idMap.get(t),i=e.idMap.get(n);if(!i||!r)return!1;for(let e of r)if(i.has(e))return!0;return!1}function n(e,t){let n=e,r=t;return n.nodeType===r.nodeType&&n.tagName===r.tagName&&(!n.getAttribute?.(`id`)||n.getAttribute?.(`id`)===r.getAttribute?.(`id`))}return e})();function r(e,t){if(e.idMap.has(t))c(e.pantry,t,null);else{if(e.callbacks.beforeNodeRemoved(t)===!1)return;t.parentNode?.removeChild(t),e.callbacks.afterNodeRemoved(t)}}function i(e,t,n){let i=t;for(;i&&i!==n;){let t=i;i=i.nextSibling,r(e,t)}return i}function a(e,t,n,r){let i=r.target.getAttribute?.(`id`)===t&&r.target||r.target.querySelector(`[id="${t}"]`)||r.pantry.querySelector(`[id="${t}"]`);return s(i,r),c(e,i,n),i}function s(e,t){let n=e.getAttribute(`id`);for(;e=e.parentNode;){let r=t.idMap.get(e);r&&(r.delete(n),r.size||t.idMap.delete(e))}}function c(e,t,n){if(e.moveBefore)try{e.moveBefore(t,n)}catch{e.insertBefore(t,n)}else e.insertBefore(t,n)}return e})(),o=(function(){function e(e,n,r){return r.ignoreActive&&e===document.activeElement?null:r.callbacks.beforeNodeMorphed(e,n)===!1?e:(e instanceof HTMLHeadElement&&r.head.ignore||(e instanceof HTMLHeadElement&&r.head.style!==`morph`?c(e,n,r):(t(e,n,r),o(e,r)||a(r,e,n))),r.callbacks.afterNodeMorphed(e,n),e)}function t(e,t,r){let a=t.nodeType;if(a===1){let a=e,s=t,c=a.attributes,l=s.attributes;for(let e of l)i(e.name,a,`update`,r)||a.getAttribute(e.name)!==e.value&&a.setAttribute(e.name,e.value);for(let e=c.length-1;0<=e;e--){let t=c[e];if(t&&!s.hasAttribute(t.name)){if(i(t.name,a,`remove`,r))continue;a.removeAttribute(t.name)}}o(a,r)||n(a,s,r)}(a===8||a===3)&&e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue)}function n(e,t,n){if(e instanceof HTMLInputElement&&t instanceof HTMLInputElement&&t.type!==`file`){let a=t.value,o=e.value;r(e,t,`checked`,n),r(e,t,`disabled`,n),t.hasAttribute(`value`)?o!==a&&(i(`value`,e,`update`,n)||(e.setAttribute(`value`,a),e.value=a)):i(`value`,e,`remove`,n)||(e.value=``,e.removeAttribute(`value`))}else if(e instanceof HTMLOptionElement&&t instanceof HTMLOptionElement)r(e,t,`selected`,n);else if(e instanceof HTMLTextAreaElement&&t instanceof HTMLTextAreaElement){let r=t.value,a=e.value;if(i(`value`,e,`update`,n))return;r!==a&&(e.value=r),e.firstChild&&e.firstChild.nodeValue!==r&&(e.firstChild.nodeValue=r)}}function r(e,t,n,r){let a=t[n];if(a!==e[n]){let o=i(n,e,`update`,r);o||(e[n]=t[n]),a?o||e.setAttribute(n,``):i(n,e,`remove`,r)||e.removeAttribute(n)}}function i(e,t,n,r){return e===`value`&&r.ignoreActiveValue&&t===document.activeElement?!0:r.callbacks.beforeAttributeUpdated(e,t,n)===!1}function o(e,t){return!!t.ignoreActiveValue&&e===document.activeElement&&e!==document.body}return e})();function s(e,t,n,r){if(e.head.block){let i=t.querySelector(`head`),a=n.querySelector(`head`);if(i&&a){let t=c(i,a,e);return Promise.all(t).then(()=>r(Object.assign(e,{head:{block:!1,ignore:!0}})))}}return r(e)}function c(e,t,n){let r=[],i=[],a=[],o=[],s=new Map;for(let e of t.children)s.set(e.outerHTML,e);for(let t of e.children){let e=s.has(t.outerHTML),r=n.head.shouldReAppend(t),c=n.head.shouldPreserve(t);e||c?r?i.push(t):(s.delete(t.outerHTML),a.push(t)):n.head.style===`append`?r&&(i.push(t),o.push(t)):n.head.shouldRemove(t)!==!1&&i.push(t)}o.push(...s.values());let c=[];for(let t of o){let i=document.createRange().createContextualFragment(t.outerHTML).firstChild;if(n.callbacks.beforeNodeAdded(i)!==!1){if(`href`in i&&i.href||`src`in i&&i.src){let e,t=new Promise(function(t){e=t});i.addEventListener(`load`,function(){e()}),c.push(t)}e.appendChild(i),n.callbacks.afterNodeAdded(i),r.push(i)}}for(let t of i)n.callbacks.beforeNodeRemoved(t)!==!1&&(e.removeChild(t),n.callbacks.afterNodeRemoved(t));return n.head.afterHeadMorphed(e,{added:r,kept:a,removed:i}),c}let l=(function(){function e(e,t,a){let{persistentIds:o,idMap:c}=s(e,t),l=n(a),u=l.morphStyle||`outerHTML`;if(![`innerHTML`,`outerHTML`].includes(u))throw`Do not understand how to morph style ${u}`;return{target:e,newContent:t,config:l,morphStyle:u,ignoreActive:l.ignoreActive,ignoreActiveValue:l.ignoreActiveValue,restoreFocus:l.restoreFocus,idMap:c,persistentIds:o,pantry:r(),activeElementAndParents:i(e),callbacks:l.callbacks,head:l.head}}function n(e){let n=Object.assign({},t);return Object.assign(n,e),n.callbacks=Object.assign({},t.callbacks,e.callbacks),n.head=Object.assign({},t.head,e.head),n}function r(){let e=document.createElement(`div`);return e.hidden=!0,document.body.insertAdjacentElement(`afterend`,e),e}function i(e){let t=[],n=document.activeElement;if(n?.tagName!==`BODY`&&e.contains(n))for(;n&&(t.push(n),n!==e);)n=n.parentElement;return t}function a(e){let t=Array.from(e.querySelectorAll(`[id]`));return e.getAttribute?.(`id`)&&t.push(e),t}function o(e,t,n,r){for(let i of r){let r=i.getAttribute(`id`);if(t.has(r)){let t=i;for(;t;){let i=e.get(t);if(i??(i=new Set,e.set(t,i)),i.add(r),t===n)break;t=t.parentElement}}}}function s(e,t){let n=a(e),r=a(t),i=c(n,r),s=new Map;return o(s,i,e,n),o(s,i,t.__idiomorphRoot||t,r),{persistentIds:i,idMap:s}}function c(e,t){let n=new Set,r=new Map;for(let{id:t,tagName:i}of e)r.has(t)?n.add(t):r.set(t,i);let i=new Set;for(let{id:e,tagName:a}of t)i.has(e)?n.add(e):r.get(e)===a&&i.add(e);for(let e of n)i.delete(e);return i}return e})(),{normalizeElement:u,normalizeParent:d}=(function(){let e=new WeakSet;function t(e){return e instanceof Document?e.documentElement:e}function n(t){if(t==null)return document.createElement(`div`);if(typeof t==`string`)return n(i(t));if(e.has(t))return t;if(t instanceof Node){if(t.parentNode)return new r(t);{let e=document.createElement(`div`);return e.append(t),e}}else{let e=document.createElement(`div`);for(let n of[...t])e.append(n);return e}}class r{constructor(e){this.originalNode=e,this.realParentNode=e.parentNode,this.previousSibling=e.previousSibling,this.nextSibling=e.nextSibling}get childNodes(){let e=[],t=this.previousSibling?this.previousSibling.nextSibling:this.realParentNode.firstChild;for(;t&&t!=this.nextSibling;)e.push(t),t=t.nextSibling;return e}querySelectorAll(e){return this.childNodes.reduce((t,n)=>{if(n instanceof Element){n.matches(e)&&t.push(n);let r=n.querySelectorAll(e);for(let e=0;e]*>|>)([\s\S]*?)<\/svg>/gim,``);if(r.match(/<\/html>/)||r.match(/<\/head>/)||r.match(/<\/body>/)){let i=n.parseFromString(t,`text/html`);if(r.match(/<\/html>/))return e.add(i),i;{let t=i.firstChild;return t&&e.add(t),t}}else{let r=n.parseFromString(``,`text/html`).body.querySelector(`template`).content;return e.add(r),r}}return{normalizeElement:t,normalizeParent:n}})();return{morph:n,defaults:t}})();function Uc(e,t,{callbacks:n,...r}={}){Hc.morph(e,t,{...r,callbacks:new Jc(n)})}function Wc(e,t,n={}){Uc(e,t.childNodes,{...n,morphStyle:`innerHTML`})}function Gc(e,t){return e instanceof q&&e.shouldReloadWithMorph&&(!t||Kc(e,t))&&!e.closest(`[data-turbo-permanent]`)}function Kc(e,t){return t instanceof Element&&t.nodeName===`TURBO-FRAME`&&e.id===t.id&&(!t.getAttribute(`src`)||qs(e.src,t.getAttribute(`src`)))}function qc(e){return e.parentElement.closest(`turbo-frame[src][refresh=morph]`)}var Jc=class{#e;constructor({beforeNodeMorphed:e}={}){this.#e=e||(()=>!0)}beforeNodeAdded=e=>!(e.id&&e.hasAttribute(`data-turbo-permanent`)&&document.getElementById(e.id));beforeNodeMorphed=(e,t)=>{if(e instanceof Element)return!e.hasAttribute(`data-turbo-permanent`)&&this.#e(e,t)?!J(`turbo:before-morph-element`,{cancelable:!0,target:e,detail:{currentElement:e,newElement:t}}).defaultPrevented:!1};beforeAttributeUpdated=(e,t,n)=>!J(`turbo:before-morph-attribute`,{cancelable:!0,target:t,detail:{attributeName:e,mutationType:n}}).defaultPrevented;beforeNodeRemoved=e=>this.beforeNodeMorphed(e);afterNodeMorphed=(e,t)=>{e instanceof Element&&J(`turbo:morph-element`,{target:e,detail:{currentElement:e,newElement:t}})}},Yc=class extends zc{static renderElement(e,t){J(`turbo:before-frame-morph`,{target:e,detail:{currentElement:e,newElement:t}}),Wc(e,t,{callbacks:{beforeNodeMorphed:(t,n)=>Gc(t,n)&&qc(t)===e?(t.reload(),!1):!0}})}async preservingPermanentElements(e){return await e()}},Xc=class e{static animationDuration=300;static get defaultCSS(){return gs` .turbo-progress-bar { position: fixed; display: block; top: 0; left: 0; height: 3px; background: #0076ff; z-index: 2147483647; transition: width ${e.animationDuration}ms ease-out, opacity ${e.animationDuration/2}ms ${e.animationDuration/2}ms ease-in; transform: translate3d(0, 0, 0); } `}hiding=!1;value=0;visible=!1;constructor(){this.stylesheetElement=this.createStylesheetElement(),this.progressElement=this.createProgressElement(),this.installStylesheetElement(),this.setValue(0)}show(){this.visible||(this.visible=!0,this.installProgressElement(),this.startTrickling())}hide(){this.visible&&!this.hiding&&(this.hiding=!0,this.fadeProgressElement(()=>{this.uninstallProgressElement(),this.stopTrickling(),this.visible=!1,this.hiding=!1}))}setValue(e){this.value=e,this.refresh()}installStylesheetElement(){document.head.insertBefore(this.stylesheetElement,document.head.firstChild)}installProgressElement(){this.progressElement.style.width=`0`,this.progressElement.style.opacity=`1`,document.documentElement.insertBefore(this.progressElement,document.body),this.refresh()}fadeProgressElement(t){this.progressElement.style.opacity=`0`,setTimeout(t,e.animationDuration*1.5)}uninstallProgressElement(){this.progressElement.parentNode&&document.documentElement.removeChild(this.progressElement)}startTrickling(){this.trickleInterval||=window.setInterval(this.trickle,e.animationDuration)}stopTrickling(){window.clearInterval(this.trickleInterval),delete this.trickleInterval}trickle=()=>{this.setValue(this.value+Math.random()/100)};refresh(){requestAnimationFrame(()=>{this.progressElement.style.width=`${10+this.value*90}%`})}createStylesheetElement(){let t=document.createElement(`style`);t.type=`text/css`,t.textContent=e.defaultCSS;let n=ks();return n&&(t.nonce=n),t}createProgressElement(){let e=document.createElement(`div`);return e.className=`turbo-progress-bar`,e}},Zc=class extends Tc{detailsByOuterHTML=this.children.filter(e=>!tl(e)).map(e=>il(e)).reduce((e,t)=>{let{outerHTML:n}=t,r=n in e?e[n]:{type:Qc(t),tracked:$c(t),elements:[]};return{...e,[n]:{...r,elements:[...r.elements,t]}}},{});get trackedElementSignature(){return Object.keys(this.detailsByOuterHTML).filter(e=>this.detailsByOuterHTML[e].tracked).join(``)}getScriptElementsNotInSnapshot(e){return this.getElementsMatchingTypeNotInSnapshot(`script`,e)}getStylesheetElementsNotInSnapshot(e){return this.getElementsMatchingTypeNotInSnapshot(`stylesheet`,e)}getElementsMatchingTypeNotInSnapshot(e,t){return Object.keys(this.detailsByOuterHTML).filter(e=>!(e in t.detailsByOuterHTML)).map(e=>this.detailsByOuterHTML[e]).filter(({type:t})=>t==e).map(({elements:[e]})=>e)}get provisionalElements(){return Object.keys(this.detailsByOuterHTML).reduce((e,t)=>{let{type:n,tracked:r,elements:i}=this.detailsByOuterHTML[t];return n==null&&!r?[...e,...i]:i.length>1?[...e,...i.slice(1)]:e},[])}getMetaValue(e){let t=this.findMetaElementByName(e);return t?t.getAttribute(`content`):null}findMetaElementByName(e){return Object.keys(this.detailsByOuterHTML).reduce((t,n)=>{let{elements:[r]}=this.detailsByOuterHTML[n];return rl(r,e)?r:t},0)}};function Qc(e){if(el(e))return`script`;if(nl(e))return`stylesheet`}function $c(e){return e.getAttribute(`data-turbo-track`)==`reload`}function el(e){return e.localName==`script`}function tl(e){return e.localName==`noscript`}function nl(e){let t=e.localName;return t==`style`||t==`link`&&e.getAttribute(`rel`)==`stylesheet`}function rl(e,t){return e.localName==`meta`&&e.getAttribute(`name`)==t}function il(e){return e.hasAttribute(`nonce`)&&e.setAttribute(`nonce`,``),e}var Q=class e extends Tc{static fromHTMLString(e=``){return this.fromDocument(hs(e))}static fromElement(e){return this.fromDocument(e.ownerDocument)}static fromDocument({documentElement:e,body:t,head:n}){return new this(e,t,new Zc(n))}constructor(e,t,n){super(t),this.documentElement=e,this.headSnapshot=n}clone(){let t=this.element.cloneNode(!0),n=this.element.querySelectorAll(`select`),r=t.querySelectorAll(`select`);for(let[e,t]of n.entries()){let n=r[e];for(let e of n.selectedOptions)e.selected=!1;for(let e of t.selectedOptions)n.options[e.index].selected=!0}for(let e of t.querySelectorAll(`input[type="password"]`))e.value=``;for(let e of t.querySelectorAll(`noscript`))e.remove();return new e(this.documentElement,t,this.headSnapshot)}get lang(){return this.documentElement.getAttribute(`lang`)}get dir(){return this.documentElement.getAttribute(`dir`)}get headElement(){return this.headSnapshot.element}get rootLocation(){return X(this.getSetting(`root`)??`/`)}get cacheControlValue(){return this.getSetting(`cache-control`)}get isPreviewable(){return this.cacheControlValue!=`no-preview`}get isCacheable(){return this.cacheControlValue!=`no-cache`}get isVisitable(){return this.getSetting(`visit-control`)!=`reload`}get prefersViewTransitions(){return(this.getSetting(`view-transition`)===`true`||this.headSnapshot.getMetaValue(`view-transition`)===`same-origin`)&&!window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}get refreshMethod(){return this.getSetting(`refresh-method`)}get refreshScroll(){return this.getSetting(`refresh-scroll`)}getSetting(e){return this.headSnapshot.getMetaValue(`turbo-${e}`)}},al=class{#e=!1;#t=Promise.resolve();renderChange(e,t){return e&&this.viewTransitionsAvailable&&!this.#e?(this.#e=!0,this.#t=this.#t.then(async()=>{await document.startViewTransition(t).finished})):this.#t=this.#t.then(t),this.#t}get viewTransitionsAvailable(){return document.startViewTransition}};let ol={action:`advance`,historyChanged:!1,visitCachedSnapshot:()=>{},willRender:!0,updateHistory:!0,shouldCacheSnapshot:!0,acceptsStreamResponse:!1,refresh:{}},sl={visitStart:`visitStart`,requestStart:`requestStart`,requestEnd:`requestEnd`,visitEnd:`visitEnd`},cl={initialized:`initialized`,started:`started`,canceled:`canceled`,failed:`failed`,completed:`completed`},ll={networkFailure:0,timeoutFailure:-1,contentTypeMismatch:-2},ul={advance:`forward`,restore:`back`,replace:`none`};var dl=class{identifier=vs();timingMetrics={};followedRedirect=!1;historyChanged=!1;scrolled=!1;shouldCacheSnapshot=!0;acceptsStreamResponse=!1;snapshotCached=!1;state=cl.initialized;viewTransitioner=new al;constructor(e,t,n,r={}){this.delegate=e,this.location=t,this.restorationIdentifier=n||vs();let{action:i,historyChanged:a,referrer:o,snapshot:s,snapshotHTML:c,response:l,visitCachedSnapshot:u,willRender:d,updateHistory:f,shouldCacheSnapshot:p,acceptsStreamResponse:m,direction:h,refresh:g}={...ol,...r};this.action=i,this.historyChanged=a,this.referrer=o,this.snapshot=s,this.snapshotHTML=c,this.response=l,this.isPageRefresh=this.view.isPageRefresh(this),this.visitCachedSnapshot=u,this.willRender=d,this.updateHistory=f,this.scrolled=!d,this.shouldCacheSnapshot=p,this.acceptsStreamResponse=m,this.direction=h||ul[i],this.refresh=g}get adapter(){return this.delegate.adapter}get view(){return this.delegate.view}get history(){return this.delegate.history}get restorationData(){return this.history.getRestorationDataForIdentifier(this.restorationIdentifier)}start(){this.state==cl.initialized&&(this.recordTimingMetric(sl.visitStart),this.state=cl.started,this.adapter.visitStarted(this),this.delegate.visitStarted(this))}cancel(){this.state==cl.started&&(this.request&&this.request.cancel(),this.cancelRender(),this.state=cl.canceled)}complete(){this.state==cl.started&&(this.recordTimingMetric(sl.visitEnd),this.adapter.visitCompleted(this),this.state=cl.completed,this.followRedirect(),this.followedRedirect||this.delegate.visitCompleted(this))}fail(){this.state==cl.started&&(this.state=cl.failed,this.adapter.visitFailed(this),this.delegate.visitCompleted(this))}changeHistory(){if(!this.historyChanged&&this.updateHistory){let e=ws(this.location.href===this.referrer?.href?`replace`:this.action);this.history.update(e,this.location,this.restorationIdentifier),this.historyChanged=!0}}issueRequest(){this.hasPreloadedResponse()?this.simulateRequest():this.shouldIssueRequest()&&!this.request&&(this.request=new rc(this,Z.get,this.location),this.request.perform())}simulateRequest(){this.response&&(this.startRequest(),this.recordResponse(),this.finishRequest())}startRequest(){this.recordTimingMetric(sl.requestStart),this.adapter.visitRequestStarted(this)}recordResponse(e=this.response){if(this.response=e,e){let{statusCode:t}=e;fl(t)?this.adapter.visitRequestCompleted(this):this.adapter.visitRequestFailedWithStatusCode(this,t)}}finishRequest(){this.recordTimingMetric(sl.requestEnd),this.adapter.visitRequestFinished(this)}loadResponse(){if(this.response){let{statusCode:e,responseHTML:t}=this.response;this.render(async()=>{if(this.shouldCacheSnapshot&&this.cacheSnapshot(),this.view.renderPromise&&await this.view.renderPromise,fl(e)&&t!=null){let e=Q.fromHTMLString(t);await this.renderPageSnapshot(e,!1),this.adapter.visitRendered(this),this.complete()}else await this.view.renderError(Q.fromHTMLString(t),this),this.adapter.visitRendered(this),this.fail()})}}getCachedSnapshot(){let e=this.view.getCachedSnapshotForLocation(this.location)||this.getPreloadedSnapshot();if(e&&(!zs(this.location)||e.hasAnchor(zs(this.location)))&&(this.action==`restore`||e.isPreviewable))return e}getPreloadedSnapshot(){if(this.snapshotHTML)return Q.fromHTMLString(this.snapshotHTML)}hasCachedSnapshot(){return this.getCachedSnapshot()!=null}loadCachedSnapshot(){let e=this.getCachedSnapshot();if(e){let t=this.shouldIssueRequest();this.render(async()=>{this.cacheSnapshot(),this.isPageRefresh?this.adapter.visitRendered(this):(this.view.renderPromise&&await this.view.renderPromise,await this.renderPageSnapshot(e,t),this.adapter.visitRendered(this),t||this.complete())})}}followRedirect(){this.redirectedToLocation&&!this.followedRedirect&&this.response?.redirected&&(this.adapter.visitProposedToLocation(this.redirectedToLocation,{action:`replace`,response:this.response,shouldCacheSnapshot:!1,willRender:!1}),this.followedRedirect=!0)}prepareRequest(e){this.acceptsStreamResponse&&e.acceptResponseType(lc.contentType)}requestStarted(){this.startRequest()}requestPreventedHandlingResponse(e,t){}async requestSucceededWithResponse(e,t){let n=await t.responseHTML,{redirected:r,statusCode:i}=t;n==null?this.recordResponse({statusCode:ll.contentTypeMismatch,redirected:r}):(this.redirectedToLocation=t.redirected?t.location:void 0,this.recordResponse({statusCode:i,responseHTML:n,redirected:r}))}async requestFailedWithResponse(e,t){let n=await t.responseHTML,{redirected:r,statusCode:i}=t;n==null?this.recordResponse({statusCode:ll.contentTypeMismatch,redirected:r}):this.recordResponse({statusCode:i,responseHTML:n,redirected:r})}requestErrored(e,t){this.recordResponse({statusCode:ll.networkFailure,redirected:!1})}requestFinished(){this.finishRequest()}performScroll(){!this.scrolled&&!this.view.forceReloaded&&!this.view.shouldPreserveScrollPosition(this)&&(this.action==`restore`?this.scrollToRestoredPosition()||this.scrollToAnchor()||this.view.scrollToTop():this.scrollToAnchor()||this.view.scrollToTop(),this.scrolled=!0)}scrollToRestoredPosition(){let{scrollPosition:e}=this.restorationData;if(e)return this.view.scrollToPosition(e),!0}scrollToAnchor(){let e=zs(this.location);if(e!=null)return this.view.scrollToAnchor(e),!0}recordTimingMetric(e){this.timingMetrics[e]=new Date().getTime()}getTimingMetrics(){return{...this.timingMetrics}}hasPreloadedResponse(){return typeof this.response==`object`}shouldIssueRequest(){return this.action==`restore`?!this.hasCachedSnapshot():this.willRender}cacheSnapshot(){this.snapshotCached||=(this.view.cacheSnapshot(this.snapshot).then(e=>e&&this.visitCachedSnapshot(e)),!0)}async render(e){this.cancelRender(),await new Promise(e=>{this.frame=document.visibilityState===`hidden`?setTimeout(()=>e(),0):requestAnimationFrame(()=>e())}),await e(),delete this.frame}async renderPageSnapshot(e,t){await this.viewTransitioner.renderChange(this.view.shouldTransitionTo(e),async()=>{await this.view.renderPage(e,t,this.willRender,this),this.performScroll()})}cancelRender(){this.frame&&(cancelAnimationFrame(this.frame),delete this.frame)}};function fl(e){return e>=200&&e<300}var pl=class{progressBar=new Xc;constructor(e){this.session=e}visitProposedToLocation(e,t){Us(e,this.navigator.rootLocation)?this.navigator.startVisit(e,t?.restorationIdentifier||vs(),t):window.location.href=e.toString()}visitStarted(e){this.location=e.location,this.redirectedToLocation=null,e.loadCachedSnapshot(),e.issueRequest()}visitRequestStarted(e){this.progressBar.setValue(0),e.hasCachedSnapshot()||e.action!=`restore`?this.showVisitProgressBarAfterDelay():this.showProgressBar()}visitRequestCompleted(e){e.loadResponse(),e.response.redirected&&(this.redirectedToLocation=e.redirectedToLocation)}visitRequestFailedWithStatusCode(e,t){switch(t){case ll.networkFailure:case ll.timeoutFailure:case ll.contentTypeMismatch:return this.reload({reason:`request_failed`,context:{statusCode:t}});default:return e.loadResponse()}}visitRequestFinished(e){}visitCompleted(e){this.progressBar.setValue(1),this.hideVisitProgressBar()}pageInvalidated(e){this.reload(e)}visitFailed(e){this.progressBar.setValue(1),this.hideVisitProgressBar()}visitRendered(e){}linkPrefetchingIsEnabledForLocation(e){return!0}formSubmissionStarted(e){this.progressBar.setValue(0),this.showFormProgressBarAfterDelay()}formSubmissionFinished(e){this.progressBar.setValue(1),this.hideFormProgressBar()}showVisitProgressBarAfterDelay(){this.visitProgressBarTimeout=window.setTimeout(this.showProgressBar,this.session.progressBarDelay)}hideVisitProgressBar(){this.progressBar.hide(),this.visitProgressBarTimeout!=null&&(window.clearTimeout(this.visitProgressBarTimeout),delete this.visitProgressBarTimeout)}showFormProgressBarAfterDelay(){this.formProgressBarTimeout??=window.setTimeout(this.showProgressBar,this.session.progressBarDelay)}hideFormProgressBar(){this.progressBar.hide(),this.formProgressBarTimeout!=null&&(window.clearTimeout(this.formProgressBarTimeout),delete this.formProgressBarTimeout)}showProgressBar=()=>{this.progressBar.show()};reload(e){J(`turbo:reload`,{detail:e}),window.location.href=(this.redirectedToLocation||this.location)?.toString()||window.location.href}get navigator(){return this.session.navigator}},ml=class{selector=`[data-turbo-temporary]`;started=!1;start(){this.started||(this.started=!0,addEventListener(`turbo:before-cache`,this.removeTemporaryElements,!1))}stop(){this.started&&(this.started=!1,removeEventListener(`turbo:before-cache`,this.removeTemporaryElements,!1))}removeTemporaryElements=e=>{for(let e of this.temporaryElements)e.remove()};get temporaryElements(){return[...document.querySelectorAll(this.selector)]}},hl=class{constructor(e,t){this.session=e,this.element=t,this.linkInterceptor=new Nc(this,t),this.formSubmitObserver=new Oc(this,t)}start(){this.linkInterceptor.start(),this.formSubmitObserver.start()}stop(){this.linkInterceptor.stop(),this.formSubmitObserver.stop()}shouldInterceptLinkClick(e,t,n){return this.#t(e)}linkClickIntercepted(e,t,n){let r=this.#n(e);r&&r.delegate.linkClickIntercepted(e,t,n)}willSubmitForm(e,t){return e.closest(`turbo-frame`)==null&&this.#e(e,t)&&this.#t(e,t)}formSubmitted(e,t){let n=this.#n(e,t);n&&n.delegate.formSubmitted(e,t)}#e(e,t){let n=Bs(e,t),r=X(this.element.ownerDocument.querySelector(`meta[name="turbo-root"]`)?.content??`/`);return this.#t(e,t)&&Us(n,r)}#t(e,t){if(e instanceof HTMLFormElement?this.session.submissionIsNavigatable(e,t):this.session.elementIsNavigatable(e)){let n=this.#n(e,t);return n?n!=e.closest(`turbo-frame`):!1}else return!1}#n(e,t){let n=t?.getAttribute(`data-turbo-frame`)||e.getAttribute(`data-turbo-frame`);if(n&&n!=`_top`){let e=this.element.querySelector(`#${n}:not([disabled])`);if(e instanceof q)return e}}},gl=class{location;restorationIdentifier=vs();restorationData={};started=!1;currentIndex=0;constructor(e){this.delegate=e}start(){this.started||(addEventListener(`popstate`,this.onPopState,!1),this.currentIndex=history.state?.turbo?.restorationIndex||0,this.started=!0,this.replace(new URL(window.location.href)))}stop(){this.started&&=(removeEventListener(`popstate`,this.onPopState,!1),!1)}push(e,t){this.update(history.pushState,e,t)}replace(e,t){this.update(history.replaceState,e,t)}update(e,t,n=vs()){e===history.pushState&&++this.currentIndex;let r={turbo:{restorationIdentifier:n,restorationIndex:this.currentIndex}};e.call(history,r,``,t.href),this.location=t,this.restorationIdentifier=n}getRestorationDataForIdentifier(e){return this.restorationData[e]||{}}updateRestorationData(e){let{restorationIdentifier:t}=this,n=this.restorationData[t];this.restorationData[t]={...n,...e}}assumeControlOfScrollRestoration(){this.previousScrollRestoration||(this.previousScrollRestoration=history.scrollRestoration??`auto`,history.scrollRestoration=`manual`)}relinquishControlOfScrollRestoration(){this.previousScrollRestoration&&(history.scrollRestoration=this.previousScrollRestoration,delete this.previousScrollRestoration)}onPopState=e=>{let{turbo:t}=e.state||{};if(this.location=new URL(window.location.href),t){let{restorationIdentifier:e,restorationIndex:n}=t;this.restorationIdentifier=e;let r=n>this.currentIndex?`forward`:`back`;this.delegate.historyPoppedToLocationWithRestorationIdentifierAndDirection(this.location,e,r),this.currentIndex=n}else this.currentIndex++,this.delegate.historyPoppedWithEmptyState(this.location)}},_l=class{started=!1;#e=null;constructor(e,t){this.delegate=e,this.eventTarget=t}start(){this.started||(this.eventTarget.readyState===`loading`?this.eventTarget.addEventListener(`DOMContentLoaded`,this.#t,{once:!0}):this.#t())}stop(){this.started&&=(this.eventTarget.removeEventListener(`mouseenter`,this.#n,{capture:!0,passive:!0}),this.eventTarget.removeEventListener(`mouseleave`,this.#r,{capture:!0,passive:!0}),this.eventTarget.removeEventListener(`turbo:before-fetch-request`,this.#a,!0),!1)}#t=()=>{this.eventTarget.addEventListener(`mouseenter`,this.#n,{capture:!0,passive:!0}),this.eventTarget.addEventListener(`mouseleave`,this.#r,{capture:!0,passive:!0}),this.eventTarget.addEventListener(`turbo:before-fetch-request`,this.#a,!0),this.started=!0};#n=e=>{if(Os(`turbo-prefetch`)===`false`)return;let t=e.target;if(t.matches&&t.matches(`a[href]:not([target^=_]):not([download])`)&&this.#s(t)){let e=t,n=Ws(e);if(this.delegate.canPrefetchRequestToLocation(e,n)){this.#e=e;let r=new rc(this,Z.get,n,new URLSearchParams,t);r.fetchOptions.priority=`low`,hc.putLater(n,r,this.#o)}}};#r=e=>{e.target===this.#e&&this.#i()};#i=()=>{hc.clear(),this.#e=null};#a=e=>{if(e.target.tagName!==`FORM`&&e.detail.fetchOptions.method===`GET`){let t=hc.get(e.detail.url);t&&(e.detail.fetchRequest=t),hc.clear()}};prepareRequest(e){let t=e.target;e.headers[`X-Sec-Purpose`]=`prefetch`;let n=t.closest(`turbo-frame`),r=t.getAttribute(`data-turbo-frame`)||n?.getAttribute(`target`)||n?.id;r&&r!==`_top`&&(e.headers[`Turbo-Frame`]=r)}requestSucceededWithResponse(){}requestStarted(e){}requestErrored(e){}requestFinished(e){}requestPreventedHandlingResponse(e,t){}requestFailedWithResponse(e,t){}get#o(){return Number(Os(`turbo-prefetch-cache-time`))||mc}#s(e){return!(!e.getAttribute(`href`)||vl(e)||yl(e)||bl(e)||xl(e)||Cl(e))}};let vl=e=>e.origin!==document.location.origin||![`http:`,`https:`].includes(e.protocol)||e.hasAttribute(`target`),yl=e=>e.pathname+e.search===document.location.pathname+document.location.search||e.href.startsWith(`#`),bl=e=>{if(e.getAttribute(`data-turbo-prefetch`)===`false`||e.getAttribute(`data-turbo`)===`false`)return!0;let t=js(e,`[data-turbo-prefetch]`);return!!(t&&t.getAttribute(`data-turbo-prefetch`)===`false`)},xl=e=>{let t=e.getAttribute(`data-turbo-method`);return!!(t&&t.toLowerCase()!==`get`||Sl(e)||e.hasAttribute(`data-turbo-confirm`)||e.hasAttribute(`data-turbo-stream`))},Sl=e=>e.hasAttribute(`data-remote`)||e.hasAttribute(`data-behavior`)||e.hasAttribute(`data-confirm`)||e.hasAttribute(`data-method`),Cl=e=>J(`turbo:before-prefetch`,{target:e,cancelable:!0}).defaultPrevented;var wl=class{constructor(e){this.delegate=e}proposeVisit(e,t={}){this.delegate.allowsVisitingLocationWithAction(e,t.action)&&this.delegate.visitProposedToLocation(e,t)}startVisit(e,t,n={}){this.stop(),this.currentVisit=new dl(this,X(e),t,{referrer:this.location,...n}),this.currentVisit.start()}submitForm(e,t){this.stop(),this.formSubmission=new _c(this,e,t,!0),this.formSubmission.start()}stop(){this.formSubmission&&(this.formSubmission.stop(),delete this.formSubmission),this.currentVisit&&(this.currentVisit.cancel(),delete this.currentVisit)}get adapter(){return this.delegate.adapter}get view(){return this.delegate.view}get rootLocation(){return this.view.snapshot.rootLocation}get history(){return this.delegate.history}formSubmissionStarted(e){typeof this.adapter.formSubmissionStarted==`function`&&this.adapter.formSubmissionStarted(e)}async formSubmissionSucceededWithResponse(e,t){if(e==this.formSubmission){let n=await t.responseHTML;if(n){let r=e.isSafe;r||this.view.clearSnapshotCache();let{statusCode:i,redirected:a}=t,o={action:this.#e(e,t),shouldCacheSnapshot:r,response:{statusCode:i,responseHTML:n,redirected:a}};this.proposeVisit(t.location,o)}}}async formSubmissionFailedWithResponse(e,t){let n=await t.responseHTML;if(n){let e=Q.fromHTMLString(n);t.serverError?await this.view.renderError(e,this.currentVisit):await this.view.renderPage(e,!1,!0,this.currentVisit),e.refreshScroll!==`preserve`&&this.view.scrollToTop(),this.view.clearSnapshotCache()}}formSubmissionErrored(e,t){console.error(t)}formSubmissionFinished(e){typeof this.adapter.formSubmissionFinished==`function`&&this.adapter.formSubmissionFinished(e)}linkPrefetchingIsEnabledForLocation(e){return typeof this.adapter.linkPrefetchingIsEnabledForLocation==`function`?this.adapter.linkPrefetchingIsEnabledForLocation(e):!0}visitStarted(e){this.delegate.visitStarted(e)}visitCompleted(e){this.delegate.visitCompleted(e),delete this.currentVisit}locationWithActionIsSamePage(e,t){return!1}get location(){return this.history.location}get restorationIdentifier(){return this.history.restorationIdentifier}#e(e,t){let{submitter:n,formElement:r}=e;return Es(n,r)||this.#t(t)}#t(e){return e.redirected&&e.location.href===this.location?.href?`replace`:`advance`}};let Tl={initial:0,loading:1,interactive:2,complete:3};var El=class{stage=Tl.initial;started=!1;constructor(e){this.delegate=e}start(){this.started||=(this.stage==Tl.initial&&(this.stage=Tl.loading),document.addEventListener(`readystatechange`,this.interpretReadyState,!1),addEventListener(`pagehide`,this.pageWillUnload,!1),!0)}stop(){this.started&&=(document.removeEventListener(`readystatechange`,this.interpretReadyState,!1),removeEventListener(`pagehide`,this.pageWillUnload,!1),!1)}interpretReadyState=()=>{let{readyState:e}=this;e==`interactive`?this.pageIsInteractive():e==`complete`&&this.pageIsComplete()};pageIsInteractive(){this.stage==Tl.loading&&(this.stage=Tl.interactive,this.delegate.pageBecameInteractive())}pageIsComplete(){this.pageIsInteractive(),this.stage==Tl.interactive&&(this.stage=Tl.complete,this.delegate.pageLoaded())}pageWillUnload=()=>{this.delegate.pageWillUnload()};get readyState(){return document.readyState}},Dl=class{started=!1;constructor(e){this.delegate=e}start(){this.started||=(addEventListener(`scroll`,this.onScroll,!1),this.onScroll(),!0)}stop(){this.started&&=(removeEventListener(`scroll`,this.onScroll,!1),!1)}onScroll=()=>{this.updatePosition({x:window.pageXOffset,y:window.pageYOffset})};updatePosition(e){this.delegate.scrollPositionChanged(e)}},Ol=class{render({fragment:e}){Ic.preservingPermanentElements(this,kl(e),()=>{Al(e,()=>{jl(()=>{document.documentElement.appendChild(e)})})})}enteringBardo(e,t){t.replaceWith(e.cloneNode(!0))}leavingBardo(){}};function kl(e){let t=Dc(document.documentElement),n={};for(let r of t){let{id:t}=r;for(let i of e.querySelectorAll(`turbo-stream`)){let e=Ec(i.templateElement.content,t);e&&(n[t]=[r,e])}}return n}async function Al(e,t){let n=`turbo-stream-autofocus-${vs()}`,r=Ml(e.querySelectorAll(`turbo-stream`)),i=null;if(r&&(i=r.id?r.id:n,r.id=i),t(),await fs(),(document.activeElement==null||document.activeElement==document.body)&&i){let e=document.getElementById(i);Ms(e)&&e.focus(),e&&e.id==n&&e.removeAttribute(`id`)}}async function jl(e){let[t,n]=await Ps(e,()=>document.activeElement),r=t&&t.id;if(r){let e=document.getElementById(r);Ms(e)&&e!=n&&e.focus()}}function Ml(e){for(let t of e){let e=Ns(t.templateElement.content);if(e)return e}return null}var Nl=class{sources=new Set;#e=!1;constructor(e){this.delegate=e}start(){this.#e||(this.#e=!0,addEventListener(`turbo:before-fetch-response`,this.inspectFetchResponse,!1))}stop(){this.#e&&(this.#e=!1,removeEventListener(`turbo:before-fetch-response`,this.inspectFetchResponse,!1))}connectStreamSource(e){this.streamSourceIsConnected(e)||(this.sources.add(e),e.addEventListener(`message`,this.receiveMessageEvent,!1))}disconnectStreamSource(e){this.streamSourceIsConnected(e)&&(this.sources.delete(e),e.removeEventListener(`message`,this.receiveMessageEvent,!1))}streamSourceIsConnected(e){return this.sources.has(e)}inspectFetchResponse=e=>{let t=Pl(e);t&&Fl(t)&&(e.preventDefault(),this.receiveMessageResponse(t))};receiveMessageEvent=e=>{this.#e&&typeof e.data==`string`&&this.receiveMessageHTML(e.data)};async receiveMessageResponse(e){let t=await e.responseHTML;t&&this.receiveMessageHTML(t)}receiveMessageHTML(e){this.delegate.receivedMessageFromStream(lc.wrap(e))}};function Pl(e){let t=e.detail?.fetchResponse;if(t instanceof Zs)return t}function Fl(e){return(e.contentType??``).startsWith(lc.contentType)}var Il=class extends Rc{static renderElement(e,t){let{documentElement:n,body:r}=document;n.replaceChild(t,r)}async render(){this.replaceHeadAndBody(),this.activateScriptElements()}replaceHeadAndBody(){let{documentElement:e,head:t}=document;e.replaceChild(this.newHead,t),this.renderElement(this.currentElement,this.newElement)}activateScriptElements(){for(let e of this.scriptElements){let t=e.parentNode;if(t){let n=cs(e);t.replaceChild(n,e)}}}get newHead(){return this.newSnapshot.headSnapshot.element}get scriptElements(){return document.documentElement.querySelectorAll(`script`)}},Ll=class extends Rc{static renderElement(e,t){document.body&&t instanceof HTMLBodyElement?document.body.replaceWith(t):document.documentElement.appendChild(t)}get shouldRender(){return this.newSnapshot.isVisitable&&this.trackedElementsAreIdentical}get reloadReason(){if(!this.newSnapshot.isVisitable)return{reason:`turbo_visit_control_is_reload`};if(!this.trackedElementsAreIdentical)return{reason:`tracked_element_mismatch`}}async prepareToRender(){this.#e(),await this.mergeHead()}async render(){this.willRender&&await this.replaceBody()}finishRendering(){super.finishRendering(),this.isPreview||this.focusFirstAutofocusableElement()}get currentHeadSnapshot(){return this.currentSnapshot.headSnapshot}get newHeadSnapshot(){return this.newSnapshot.headSnapshot}get newElement(){return this.newSnapshot.element}#e(){let{documentElement:e}=this.currentSnapshot,{dir:t,lang:n}=this.newSnapshot;n?e.setAttribute(`lang`,n):e.removeAttribute(`lang`),t?e.setAttribute(`dir`,t):e.removeAttribute(`dir`)}async mergeHead(){let e=this.mergeProvisionalElements(),t=this.copyNewHeadStylesheetElements();this.copyNewHeadScriptElements(),await e,await t,this.willRender&&this.removeUnusedDynamicStylesheetElements()}async replaceBody(){await this.preservingPermanentElements(async()=>{this.activateNewBody(),await this.assignNewBody()})}get trackedElementsAreIdentical(){return this.currentHeadSnapshot.trackedElementSignature==this.newHeadSnapshot.trackedElementSignature}async copyNewHeadStylesheetElements(){let e=[];for(let t of this.newHeadStylesheetElements)e.push(Cs(t)),document.head.appendChild(t);await Promise.all(e)}copyNewHeadScriptElements(){for(let e of this.newHeadScriptElements)document.head.appendChild(cs(e))}removeUnusedDynamicStylesheetElements(){for(let e of this.unusedDynamicStylesheetElements)document.head.removeChild(e)}async mergeProvisionalElements(){let e=[...this.newHeadProvisionalElements];for(let t of this.currentHeadProvisionalElements)this.isCurrentElementInElementList(t,e)||document.head.removeChild(t);for(let t of e)document.head.appendChild(t)}isCurrentElementInElementList(e,t){for(let[n,r]of t.entries()){if(e.tagName==`TITLE`){if(r.tagName!=`TITLE`)continue;if(e.innerHTML==r.innerHTML)return t.splice(n,1),!0}if(r.isEqualNode(e))return t.splice(n,1),!0}return!1}removeCurrentHeadProvisionalElements(){for(let e of this.currentHeadProvisionalElements)document.head.removeChild(e)}copyNewHeadProvisionalElements(){for(let e of this.newHeadProvisionalElements)document.head.appendChild(e)}activateNewBody(){document.adoptNode(this.newElement),this.removeNoscriptElements(),this.activateNewBodyScriptElements()}removeNoscriptElements(){for(let e of this.newElement.querySelectorAll(`noscript`))e.remove()}activateNewBodyScriptElements(){for(let e of this.newBodyScriptElements){let t=cs(e);e.replaceWith(t)}}async assignNewBody(){await this.renderElement(this.currentElement,this.newElement)}get unusedDynamicStylesheetElements(){return this.oldHeadStylesheetElements.filter(e=>e.getAttribute(`data-turbo-track`)===`dynamic`)}get oldHeadStylesheetElements(){return this.currentHeadSnapshot.getStylesheetElementsNotInSnapshot(this.newHeadSnapshot)}get newHeadStylesheetElements(){return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot)}get newHeadScriptElements(){return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot)}get currentHeadProvisionalElements(){return this.currentHeadSnapshot.provisionalElements}get newHeadProvisionalElements(){return this.newHeadSnapshot.provisionalElements}get newBodyScriptElements(){return this.newElement.querySelectorAll(`script`)}},Rl=class extends Ll{static renderElement(e,t){Uc(e,t,{callbacks:{beforeNodeMorphed:(e,t)=>Gc(e,t)&&!qc(e)?(e.reload(),!1):!0}}),J(`turbo:morph`,{detail:{currentElement:e,newElement:t}})}async preservingPermanentElements(e){return await e()}get renderMethod(){return`morph`}get shouldAutofocus(){return!1}},zl=class extends fc{constructor(e){super(e,Ks)}get snapshots(){return this.entries}},Bl=class extends jc{snapshotCache=new zl(10);lastRenderedLocation=new URL(location.href);forceReloaded=!1;shouldTransitionTo(e){return this.snapshot.prefersViewTransitions&&e.prefersViewTransitions}renderPage(e,t=!1,n=!0,r){let i=new(this.isPageRefresh(r)&&(r?.refresh?.method||this.snapshot.refreshMethod)===`morph`?Rl:Ll)(this.snapshot,e,t,n);return i.shouldRender?r?.changeHistory():this.forceReloaded=!0,this.render(i)}renderError(e,t){t?.changeHistory();let n=new Il(this.snapshot,e,!1);return this.render(n)}clearSnapshotCache(){this.snapshotCache.clear()}async cacheSnapshot(e=this.snapshot){if(e.isCacheable){this.delegate.viewWillCacheSnapshot();let{lastRenderedLocation:t}=this;await ms();let n=e.clone();return this.snapshotCache.put(t,n),n}}getCachedSnapshotForLocation(e){return this.snapshotCache.get(e)}isPageRefresh(e){return!e||this.lastRenderedLocation.pathname===e.location.pathname&&e.action===`replace`}shouldPreserveScrollPosition(e){return this.isPageRefresh(e)&&(e?.refresh?.scroll||this.snapshot.refreshScroll)===`preserve`}get snapshot(){return Q.fromElement(this.element)}},Vl=class{selector=`a[data-turbo-preload]`;constructor(e,t){this.delegate=e,this.snapshotCache=t}start(){document.readyState===`loading`?document.addEventListener(`DOMContentLoaded`,this.#e):this.preloadOnLoadLinksForView(document.body)}stop(){document.removeEventListener(`DOMContentLoaded`,this.#e)}preloadOnLoadLinksForView(e){for(let t of e.querySelectorAll(this.selector))this.delegate.shouldPreloadLink(t)&&this.preloadURL(t)}async preloadURL(e){let t=new URL(e.href);this.snapshotCache.has(t)||await new rc(this,Z.get,t,new URLSearchParams,e).perform()}prepareRequest(e){e.headers[`X-Sec-Purpose`]=`prefetch`}async requestSucceededWithResponse(e,t){try{let n=await t.responseHTML,r=Q.fromHTMLString(n);this.snapshotCache.put(e.url,r)}catch{}}requestStarted(e){}requestErrored(e){}requestFinished(e){}requestPreventedHandlingResponse(e,t){}requestFailedWithResponse(e,t){}#e=()=>{this.preloadOnLoadLinksForView(document.body)}},Hl=class{constructor(e){this.session=e}clear(){this.session.clearCache()}resetCacheControl(){this.#e(``)}exemptPageFromCache(){this.#e(`no-cache`)}exemptPageFromPreview(){this.#e(`no-preview`)}#e(e){As(`turbo-cache-control`,e)}},Ul=class{navigator=new wl(this);history=new gl(this);view=new Bl(this,document.documentElement);adapter=new pl(this);pageObserver=new El(this);cacheObserver=new ml;linkPrefetchObserver=new _l(this,document);linkClickObserver=new Pc(this,window);formSubmitObserver=new Oc(this,document);scrollObserver=new Dl(this);streamObserver=new Nl(this);formLinkClickObserver=new Fc(this,document.documentElement);frameRedirector=new hl(this,document.documentElement);streamMessageRenderer=new Ol;cache=new Hl(this);enabled=!0;started=!1;#e=150;constructor(e){this.recentRequests=e,this.preloader=new Vl(this,this.view.snapshotCache),this.debouncedRefresh=this.refresh,this.pageRefreshDebouncePeriod=this.pageRefreshDebouncePeriod}start(){this.started||(this.pageObserver.start(),this.cacheObserver.start(),this.linkPrefetchObserver.start(),this.formLinkClickObserver.start(),this.linkClickObserver.start(),this.formSubmitObserver.start(),this.scrollObserver.start(),this.streamObserver.start(),this.frameRedirector.start(),this.history.start(),this.preloader.start(),this.started=!0,this.enabled=!0)}disable(){this.enabled=!1}stop(){this.started&&=(this.pageObserver.stop(),this.cacheObserver.stop(),this.linkPrefetchObserver.stop(),this.formLinkClickObserver.stop(),this.linkClickObserver.stop(),this.formSubmitObserver.stop(),this.scrollObserver.stop(),this.streamObserver.stop(),this.frameRedirector.stop(),this.history.stop(),this.preloader.stop(),!1)}registerAdapter(e){this.adapter=e}visit(e,t={}){let n=t.frame?document.getElementById(t.frame):null;if(n instanceof q){let r=t.action||Es(n);n.delegate.proposeVisitIfNavigatedWithAction(n,r),n.src=e.toString()}else this.navigator.proposeVisit(X(e),t)}refresh(e,t={}){t=typeof t==`string`?{requestId:t}:t;let{method:n,requestId:r,scroll:i}=t,a=r&&this.recentRequests.has(r),o=e===document.baseURI;!a&&!this.navigator.currentVisit&&o&&this.visit(e,{action:`replace`,shouldCacheSnapshot:!1,refresh:{method:n,scroll:i}})}connectStreamSource(e){this.streamObserver.connectStreamSource(e)}disconnectStreamSource(e){this.streamObserver.disconnectStreamSource(e)}renderStreamMessage(e){this.streamMessageRenderer.render(lc.wrap(e))}clearCache(){this.view.clearSnapshotCache()}setProgressBarDelay(e){console.warn("Please replace `session.setProgressBarDelay(delay)` with `session.progressBarDelay = delay`. The function is deprecated and will be removed in a future version of Turbo.`"),this.progressBarDelay=e}set progressBarDelay(e){Y.drive.progressBarDelay=e}get progressBarDelay(){return Y.drive.progressBarDelay}set drive(e){Y.drive.enabled=e}get drive(){return Y.drive.enabled}set formMode(e){Y.forms.mode=e}get formMode(){return Y.forms.mode}get location(){return this.history.location}get restorationIdentifier(){return this.history.restorationIdentifier}get pageRefreshDebouncePeriod(){return this.#e}set pageRefreshDebouncePeriod(e){this.refresh=Ls(this.debouncedRefresh.bind(this),e),this.#e=e}shouldPreloadLink(e){let t=e.hasAttribute(`data-turbo-method`),n=e.hasAttribute(`data-turbo-stream`),r=e.getAttribute(`data-turbo-frame`),i=r==`_top`?null:document.getElementById(r)||js(e,`turbo-frame:not([disabled])`);if(t||n||i instanceof q)return!1;{let t=new URL(e.href);return this.elementIsNavigatable(e)&&Us(t,this.snapshot.rootLocation)}}historyPoppedToLocationWithRestorationIdentifierAndDirection(e,t,n){this.enabled?this.navigator.startVisit(e,t,{action:`restore`,historyChanged:!0,direction:n}):this.adapter.pageInvalidated({reason:`turbo_disabled`})}historyPoppedWithEmptyState(e){this.history.replace(e),this.view.lastRenderedLocation=e,this.view.cacheSnapshot()}scrollPositionChanged(e){this.history.updateRestorationData({scrollPosition:e})}willSubmitFormLinkToLocation(e,t){return this.elementIsNavigatable(e)&&Us(t,this.snapshot.rootLocation)}submittedFormLinkToLocation(){}canPrefetchRequestToLocation(e,t){return this.elementIsNavigatable(e)&&Us(t,this.snapshot.rootLocation)&&this.navigator.linkPrefetchingIsEnabledForLocation(t)}willFollowLinkToLocation(e,t,n){return this.elementIsNavigatable(e)&&Us(t,this.snapshot.rootLocation)&&this.applicationAllowsFollowingLinkToLocation(e,t,n)}followedLinkToLocation(e,t){let n=this.getActionForLink(e),r=e.hasAttribute(`data-turbo-stream`);this.visit(t.href,{action:n,acceptsStreamResponse:r})}allowsVisitingLocationWithAction(e,t){return this.applicationAllowsVisitingLocation(e)}visitProposedToLocation(e,t){Wl(e),this.adapter.visitProposedToLocation(e,t)}visitStarted(e){e.acceptsStreamResponse||(xs(document.documentElement),this.view.markVisitDirection(e.direction)),Wl(e.location),this.notifyApplicationAfterVisitingLocation(e.location,e.action)}visitCompleted(e){this.view.unmarkVisitDirection(),Ss(document.documentElement),this.notifyApplicationAfterPageLoad(e.getTimingMetrics())}willSubmitForm(e,t){let n=Bs(e,t);return this.submissionIsNavigatable(e,t)&&Us(X(n),this.snapshot.rootLocation)}formSubmitted(e,t){this.navigator.submitForm(e,t)}pageBecameInteractive(){this.view.lastRenderedLocation=this.location,this.notifyApplicationAfterPageLoad()}pageLoaded(){this.history.assumeControlOfScrollRestoration()}pageWillUnload(){this.history.relinquishControlOfScrollRestoration()}receivedMessageFromStream(e){this.renderStreamMessage(e)}viewWillCacheSnapshot(){this.notifyApplicationBeforeCachingSnapshot()}allowsImmediateRender({element:e},t){let{defaultPrevented:n,detail:{render:r}}=this.notifyApplicationBeforeRender(e,t);return this.view.renderer&&r&&(this.view.renderer.renderElement=r),!n}viewRenderedSnapshot(e,t,n){this.view.lastRenderedLocation=this.history.location,this.notifyApplicationAfterRender(n)}preloadOnLoadLinksForView(e){this.preloader.preloadOnLoadLinksForView(e)}viewInvalidated(e){this.adapter.pageInvalidated(e)}frameLoaded(e){this.notifyApplicationAfterFrameLoad(e)}frameRendered(e,t){this.notifyApplicationAfterFrameRender(e,t)}applicationAllowsFollowingLinkToLocation(e,t,n){return!this.notifyApplicationAfterClickingLinkToLocation(e,t,n).defaultPrevented}applicationAllowsVisitingLocation(e){return!this.notifyApplicationBeforeVisitingLocation(e).defaultPrevented}notifyApplicationAfterClickingLinkToLocation(e,t,n){return J(`turbo:click`,{target:e,detail:{url:t.href,originalEvent:n},cancelable:!0})}notifyApplicationBeforeVisitingLocation(e){return J(`turbo:before-visit`,{detail:{url:e.href},cancelable:!0})}notifyApplicationAfterVisitingLocation(e,t){return J(`turbo:visit`,{detail:{url:e.href,action:t}})}notifyApplicationBeforeCachingSnapshot(){return J(`turbo:before-cache`)}notifyApplicationBeforeRender(e,t){return J(`turbo:before-render`,{detail:{newBody:e,...t},cancelable:!0})}notifyApplicationAfterRender(e){return J(`turbo:render`,{detail:{renderMethod:e}})}notifyApplicationAfterPageLoad(e={}){return J(`turbo:load`,{detail:{url:this.location.href,timing:e}})}notifyApplicationAfterFrameLoad(e){return J(`turbo:frame-load`,{target:e})}notifyApplicationAfterFrameRender(e,t){return J(`turbo:frame-render`,{detail:{fetchResponse:e},target:t,cancelable:!0})}submissionIsNavigatable(e,t){if(Y.forms.mode==`off`)return!1;{let n=t?this.elementIsNavigatable(t):!0;return Y.forms.mode==`optin`?n&&e.closest(`[data-turbo="true"]`)!=null:n&&this.elementIsNavigatable(e)}}elementIsNavigatable(e){let t=js(e,`[data-turbo]`),n=js(e,`turbo-frame`);return Y.drive.enabled||n?t?t.getAttribute(`data-turbo`)!=`false`:!0:t?t.getAttribute(`data-turbo`)==`true`:!1}getActionForLink(e){return Es(e)||`advance`}get snapshot(){return this.view.snapshot}};function Wl(e){Object.defineProperties(e,Gl)}let Gl={absoluteURL:{get(){return this.toString()}}},$=new Ul(Qs),{cache:Kl,navigator:ql}=$;function Jl(){$.start()}function Yl(e){$.registerAdapter(e)}function Xl(e,t){$.visit(e,t)}function Zl(e){$.connectStreamSource(e)}function Ql(e){$.disconnectStreamSource(e)}function $l(e){$.renderStreamMessage(e)}function eu(e){console.warn("Please replace `Turbo.setProgressBarDelay(delay)` with `Turbo.config.drive.progressBarDelay = delay`. The top-level function is deprecated and will be removed in a future version of Turbo.`"),Y.drive.progressBarDelay=e}function tu(e){console.warn("Please replace `Turbo.setConfirmMethod(confirmMethod)` with `Turbo.config.forms.confirm = confirmMethod`. The top-level function is deprecated and will be removed in a future version of Turbo.`"),Y.forms.confirm=e}function nu(e){console.warn("Please replace `Turbo.setFormMode(mode)` with `Turbo.config.forms.mode = mode`. The top-level function is deprecated and will be removed in a future version of Turbo.`"),Y.forms.mode=e}function ru(e,t){Rl.renderElement(e,t)}function iu(e,t){Yc.renderElement(e,t)}var au=Object.freeze({__proto__:null,navigator:ql,session:$,cache:Kl,PageRenderer:Ll,PageSnapshot:Q,FrameRenderer:zc,fetch:$s,config:Y,start:Jl,registerAdapter:Yl,visit:Xl,connectStreamSource:Zl,disconnectStreamSource:Ql,renderStreamMessage:$l,setProgressBarDelay:eu,setConfirmMethod:tu,setFormMode:nu,morphBodyElements:ru,morphTurboFrameElements:iu,morphChildren:Wc,morphElements:Uc}),ou=class extends Error{},su=class{fetchResponseLoaded=e=>Promise.resolve();#e=null;#t=()=>{};#n=!1;#r=!1;#i=new Set;#a=!1;action=null;constructor(e){this.element=e,this.view=new Mc(this,this.element),this.appearanceObserver=new cc(this,this.element),this.formLinkClickObserver=new Fc(this,this.element),this.linkInterceptor=new Nc(this,this.element),this.restorationIdentifier=vs(),this.formSubmitObserver=new Oc(this,this.element)}connect(){this.#n||(this.#n=!0,this.loadingStyle==as.lazy?this.appearanceObserver.start():this.#o(),this.formLinkClickObserver.start(),this.linkInterceptor.start(),this.formSubmitObserver.start())}disconnect(){this.#n&&(this.#n=!1,this.appearanceObserver.stop(),this.formLinkClickObserver.stop(),this.linkInterceptor.stop(),this.formSubmitObserver.stop(),this.element.hasAttribute(`recurse`)||this.#e?.cancel())}disabledChanged(){this.disabled?this.#e?.cancel():this.loadingStyle==as.eager&&this.#o()}sourceURLChanged(){this.#v(`src`)||(this.sourceURL||this.#e?.cancel(),this.element.isConnected&&(this.complete=!1),(this.loadingStyle==as.eager||this.#r)&&this.#o())}sourceURLReloaded(){let{refresh:e,src:t}=this.element;return this.#a=t&&e===`morph`,this.element.removeAttribute(`complete`),this.element.src=null,this.element.src=t,this.element.loaded}loadingStyleChanged(){this.loadingStyle==as.lazy?this.appearanceObserver.start():(this.appearanceObserver.stop(),this.#o())}async#o(){this.enabled&&this.isActive&&!this.complete&&this.sourceURL&&(this.element.loaded=this.#c(X(this.sourceURL)),this.appearanceObserver.stop(),await this.element.loaded,this.#r=!0)}async loadResponse(e){(e.redirected||e.succeeded&&e.isHTML)&&(this.sourceURL=e.response.url);try{let t=await e.responseHTML;if(t){let n=hs(t);Q.fromDocument(n).isVisitable?await this.#s(e,n):await this.#u(e)}}finally{this.#a=!1,this.fetchResponseLoaded=()=>Promise.resolve()}}elementAppearedInViewport(e){this.proposeVisitIfNavigatedWithAction(e,Es(e)),this.#o()}willSubmitFormLinkToLocation(e){return this.#_(e)}submittedFormLinkToLocation(e,t,n){let r=this.#h(e);r&&n.setAttribute(`data-turbo-frame`,r.id)}shouldInterceptLinkClick(e,t,n){return this.#_(e)}linkClickIntercepted(e,t){this.#l(e,t)}willSubmitForm(e,t){return e.closest(`turbo-frame`)==this.element&&this.#_(e,t)}formSubmitted(e,t){this.formSubmission&&this.formSubmission.stop(),this.formSubmission=new _c(this,e,t);let{fetchRequest:n}=this.formSubmission,r=this.#h(e,t);this.prepareRequest(n,r),this.formSubmission.start()}prepareRequest(e,t=this){e.headers[`Turbo-Frame`]=t.id,this.currentNavigationElement?.hasAttribute(`data-turbo-stream`)&&e.acceptResponseType(lc.contentType)}requestStarted(e){xs(this.element)}requestPreventedHandlingResponse(e,t){this.#t()}async requestSucceededWithResponse(e,t){await this.loadResponse(t),this.#t()}async requestFailedWithResponse(e,t){await this.loadResponse(t),this.#t()}requestErrored(e,t){console.error(t),this.#t()}requestFinished(e){Ss(this.element)}formSubmissionStarted({formElement:e}){xs(e,this.#h(e))}formSubmissionSucceededWithResponse(e,t){let n=this.#h(e.formElement,e.submitter);n.delegate.proposeVisitIfNavigatedWithAction(n,Es(e.submitter,e.formElement,n)),n.delegate.loadResponse(t),e.isSafe||$.clearCache()}formSubmissionFailedWithResponse(e,t){this.element.delegate.loadResponse(t),$.clearCache()}formSubmissionErrored(e,t){console.error(t)}formSubmissionFinished({formElement:e}){Ss(e,this.#h(e))}allowsImmediateRender({element:e},t){let{defaultPrevented:n,detail:{render:r}}=J(`turbo:before-frame-render`,{target:this.element,detail:{newFrame:e,...t},cancelable:!0});return this.view.renderer&&r&&(this.view.renderer.renderElement=r),!n}viewRenderedSnapshot(e,t,n){}preloadOnLoadLinksForView(e){$.preloadOnLoadLinksForView(e)}viewInvalidated(){}willRenderFrame(e,t){this.previousFrameElement=e.cloneNode(!0)}visitCachedSnapshot=({element:e})=>{let t=e.querySelector(`#`+this.element.id);t&&this.previousFrameElement&&t.replaceChildren(...this.previousFrameElement.children),delete this.previousFrameElement};async#s(e,t){let n=await this.extractForeignFrameElement(t.body),r=this.#a?Yc:zc;if(n){let t=new Tc(n),i=new r(this,this.view.snapshot,t,!1,!1);this.view.renderPromise&&await this.view.renderPromise,this.changeHistory(),await this.view.render(i),this.complete=!0,$.frameRendered(e,this.element),$.frameLoaded(this.element),await this.fetchResponseLoaded(e)}else this.#d(e)&&this.#f(e)}async#c(e){let t=new rc(this,Z.get,e,new URLSearchParams,this.element);return this.#e?.cancel(),this.#e=t,new Promise(e=>{this.#t=()=>{this.#t=()=>{},this.#e=null,e()},t.perform()})}#l(e,t,n){let r=this.#h(e,n);r.delegate.proposeVisitIfNavigatedWithAction(r,Es(n,e,r)),this.#b(e,()=>{r.src=t})}proposeVisitIfNavigatedWithAction(e,t=null){if(this.action=t,this.action){let t=Q.fromElement(e).clone(),{visitCachedSnapshot:n}=e.delegate;e.delegate.fetchResponseLoaded=async r=>{if(e.src){let{statusCode:i,redirected:a}=r,o={response:{statusCode:i,redirected:a,responseHTML:await r.responseHTML},visitCachedSnapshot:n,willRender:!1,updateHistory:!1,restorationIdentifier:this.restorationIdentifier,snapshot:t};this.action&&(o.action=this.action),$.visit(e.src,o)}}}}changeHistory(){if(this.action){let e=ws(this.action);$.history.update(e,X(this.element.src||``),this.restorationIdentifier)}}async#u(e){console.warn(`The response (${e.statusCode}) from is performing a full page visit due to turbo-visit-control.`),await this.#m(e.response)}#d(e){this.element.setAttribute(`complete`,``);let t=e.response;return!J(`turbo:frame-missing`,{target:this.element,detail:{response:t,visit:async(e,t)=>{e instanceof Response?this.#m(e):$.visit(e,t)}},cancelable:!0}).defaultPrevented}#f(e){this.view.missing(),this.#p(e)}#p(e){throw new ou(`The response (${e.statusCode}) did not contain the expected and will be ignored. To perform a full page visit instead, set turbo-visit-control to reload.`)}async#m(e){let t=new Zs(e),n=await t.responseHTML,{location:r,redirected:i,statusCode:a}=t;return $.visit(r,{response:{redirected:i,statusCode:a,responseHTML:n}})}#h(e,t){let n=ys(`data-turbo-frame`,t,e)||this.element.getAttribute(`target`),r=this.#x(n);return r instanceof q?r:this.element}async extractForeignFrameElement(e){let t,n=CSS.escape(this.id);try{if(t=cu(e.querySelector(`turbo-frame#${n}`),this.sourceURL),t)return t;if(t=cu(e.querySelector(`turbo-frame[src][recurse~=${n}]`),this.sourceURL),t)return await t.loaded,await this.extractForeignFrameElement(t)}catch(e){return console.error(e),new q}return null}#g(e,t){return Us(X(Bs(e,t)),this.rootLocation)}#_(e,t){let n=ys(`data-turbo-frame`,t,e)||this.element.getAttribute(`target`);if(e instanceof HTMLFormElement&&!this.#g(e,t)||!this.enabled||n==`_top`)return!1;if(n){let e=this.#x(n);if(e)return!e.disabled;if(n==`_parent`)return!1}return!(!$.elementIsNavigatable(e)||t&&!$.elementIsNavigatable(t))}get id(){return this.element.id}get disabled(){return this.element.disabled}get enabled(){return!this.disabled}get sourceURL(){if(this.element.src)return this.element.src}set sourceURL(e){this.#y(`src`,()=>{this.element.src=e??null})}get loadingStyle(){return this.element.loading}get isLoading(){return this.formSubmission!==void 0||this.#t()!==void 0}get complete(){return this.element.hasAttribute(`complete`)}set complete(e){e?this.element.setAttribute(`complete`,``):this.element.removeAttribute(`complete`)}get isActive(){return this.element.isActive&&this.#n}get rootLocation(){return X(this.element.ownerDocument.querySelector(`meta[name="turbo-root"]`)?.content??`/`)}#v(e){return this.#i.has(e)}#y(e,t){this.#i.add(e),t(),this.#i.delete(e)}#b(e,t){this.currentNavigationElement=e,t(),delete this.currentNavigationElement}#x(e){if(e!=null){let t=e===`_parent`?this.element.parentElement.closest(`turbo-frame`):document.getElementById(e);if(t instanceof q)return t}}};function cu(e,t){if(e){let n=e.getAttribute(`src`);if(n!=null&&t!=null&&qs(n,t))throw Error(`Matching element has a source URL which references itself`);if(e.ownerDocument!==document&&(e=document.importNode(e,!0)),e instanceof q)return e.connectedCallback(),e.disconnectedCallback(),e}}let lu={after(){this.removeDuplicateTargetSiblings(),this.targetElements.forEach(e=>e.parentElement?.insertBefore(this.templateContent,e.nextSibling))},append(){this.removeDuplicateTargetChildren(),this.targetElements.forEach(e=>e.append(this.templateContent))},before(){this.removeDuplicateTargetSiblings(),this.targetElements.forEach(e=>e.parentElement?.insertBefore(this.templateContent,e))},prepend(){this.removeDuplicateTargetChildren(),this.targetElements.forEach(e=>e.prepend(this.templateContent))},remove(){this.targetElements.forEach(e=>e.remove())},replace(){let e=this.getAttribute(`method`);this.targetElements.forEach(t=>{e===`morph`?Uc(t,this.templateContent):t.replaceWith(this.templateContent)})},update(){let e=this.getAttribute(`method`);this.targetElements.forEach(t=>{e===`morph`?Wc(t,this.templateContent):(t.innerHTML=``,t.append(this.templateContent))})},refresh(){let e=this.getAttribute(`method`),t=this.requestId,n=this.getAttribute(`scroll`);$.refresh(this.baseURI,{method:e,requestId:t,scroll:n})}};var uu=class e extends HTMLElement{static async renderElement(e){await e.performAction()}async connectedCallback(){try{await this.render()}catch(e){console.error(e)}finally{this.disconnect()}}async render(){return this.renderPromise??=(async()=>{let e=this.beforeRenderEvent;this.dispatchEvent(e)&&(await fs(),await e.detail.render(this))})()}disconnect(){try{this.remove()}catch{}}removeDuplicateTargetChildren(){this.duplicateChildren.forEach(e=>e.remove())}get duplicateChildren(){let e=this.targetElements.flatMap(e=>[...e.children]).filter(e=>!!e.getAttribute(`id`)),t=[...this.templateContent?.children||[]].filter(e=>!!e.getAttribute(`id`)).map(e=>e.getAttribute(`id`));return e.filter(e=>t.includes(e.getAttribute(`id`)))}removeDuplicateTargetSiblings(){this.duplicateSiblings.forEach(e=>e.remove())}get duplicateSiblings(){let e=this.targetElements.flatMap(e=>[...e.parentElement.children]).filter(e=>!!e.id),t=[...this.templateContent?.children||[]].filter(e=>!!e.id).map(e=>e.id);return e.filter(e=>t.includes(e.id))}get performAction(){if(this.action){let e=lu[this.action];if(e)return e;this.#e(`unknown action`)}this.#e(`action attribute is missing`)}get targetElements(){if(this.target)return this.targetElementsById;if(this.targets)return this.targetElementsByQuery;this.#e(`target or targets attribute is missing`)}get templateContent(){return this.templateElement.content.cloneNode(!0)}get templateElement(){if(this.firstElementChild===null){let e=this.ownerDocument.createElement(`template`);return this.appendChild(e),e}else if(this.firstElementChild instanceof HTMLTemplateElement)return this.firstElementChild;this.#e(`first child element must be a