├── .env.example ├── .env.example.complete ├── .gitattributes ├── .github ├── CODE_OF_CONDUCT.md ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── api_request.yml │ ├── bug_report.yml │ ├── config.yml │ ├── feature_request.yml │ ├── language_request.yml │ ├── support_request.yml │ └── z_blank_request.yml ├── SECURITY.md ├── translators.txt └── workflows │ ├── analyse-php.yml │ ├── lint-js.yml │ ├── lint-php.yml │ ├── test-js.yml │ ├── test-migrations.yml │ └── test-php.yml ├── .gitignore ├── LICENSE ├── app ├── Access │ ├── Controllers │ │ ├── ConfirmEmailController.php │ │ ├── ForgotPasswordController.php │ │ ├── HandlesPartialLogins.php │ │ ├── LoginController.php │ │ ├── MfaBackupCodesController.php │ │ ├── MfaController.php │ │ ├── MfaTotpController.php │ │ ├── OidcController.php │ │ ├── RegisterController.php │ │ ├── ResetPasswordController.php │ │ ├── Saml2Controller.php │ │ ├── SocialController.php │ │ ├── ThrottlesLogins.php │ │ └── UserInviteController.php │ ├── EmailConfirmationService.php │ ├── ExternalBaseUserProvider.php │ ├── GroupSyncService.php │ ├── Guards │ │ ├── AsyncExternalBaseSessionGuard.php │ │ ├── ExternalBaseSessionGuard.php │ │ └── LdapSessionGuard.php │ ├── Ldap.php │ ├── LdapService.php │ ├── LoginService.php │ ├── Mfa │ │ ├── BackupCodeService.php │ │ ├── MfaSession.php │ │ ├── MfaValue.php │ │ ├── TotpService.php │ │ └── TotpValidationRule.php │ ├── Notifications │ │ ├── ConfirmEmailNotification.php │ │ ├── ResetPasswordNotification.php │ │ └── UserInviteNotification.php │ ├── Oidc │ │ ├── OidcAccessToken.php │ │ ├── OidcException.php │ │ ├── OidcIdToken.php │ │ ├── OidcInvalidKeyException.php │ │ ├── OidcInvalidTokenException.php │ │ ├── OidcIssuerDiscoveryException.php │ │ ├── OidcJwtSigningKey.php │ │ ├── OidcJwtWithClaims.php │ │ ├── OidcOAuthProvider.php │ │ ├── OidcProviderSettings.php │ │ ├── OidcService.php │ │ ├── OidcUserDetails.php │ │ ├── OidcUserinfoResponse.php │ │ └── ProvidesClaims.php │ ├── RegistrationService.php │ ├── Saml2Service.php │ ├── SocialAccount.php │ ├── SocialAuthService.php │ ├── SocialDriverManager.php │ ├── UserInviteException.php │ ├── UserInviteService.php │ └── UserTokenService.php ├── Activity │ ├── ActivityQueries.php │ ├── ActivityType.php │ ├── CommentRepo.php │ ├── Controllers │ │ ├── AuditLogApiController.php │ │ ├── AuditLogController.php │ │ ├── CommentController.php │ │ ├── FavouriteController.php │ │ ├── TagController.php │ │ ├── WatchController.php │ │ └── WebhookController.php │ ├── DispatchWebhookJob.php │ ├── Models │ │ ├── Activity.php │ │ ├── Comment.php │ │ ├── Favouritable.php │ │ ├── Favourite.php │ │ ├── Loggable.php │ │ ├── Tag.php │ │ ├── View.php │ │ ├── Viewable.php │ │ ├── Watch.php │ │ ├── Webhook.php │ │ └── WebhookTrackedEvent.php │ ├── Notifications │ │ ├── Handlers │ │ │ ├── BaseNotificationHandler.php │ │ │ ├── CommentCreationNotificationHandler.php │ │ │ ├── NotificationHandler.php │ │ │ ├── PageCreationNotificationHandler.php │ │ │ └── PageUpdateNotificationHandler.php │ │ ├── MessageParts │ │ │ ├── EntityLinkMessageLine.php │ │ │ ├── EntityPathMessageLine.php │ │ │ ├── LinkedMailMessageLine.php │ │ │ └── ListMessageLine.php │ │ ├── Messages │ │ │ ├── BaseActivityNotification.php │ │ │ ├── CommentCreationNotification.php │ │ │ ├── PageCreationNotification.php │ │ │ └── PageUpdateNotification.php │ │ └── NotificationManager.php │ ├── Queries │ │ └── WebhooksAllPaginatedAndSorted.php │ ├── TagRepo.php │ ├── Tools │ │ ├── ActivityLogger.php │ │ ├── CommentTree.php │ │ ├── CommentTreeNode.php │ │ ├── EntityWatchers.php │ │ ├── IpFormatter.php │ │ ├── TagClassGenerator.php │ │ ├── UserEntityWatchOptions.php │ │ ├── WatchedParentDetails.php │ │ └── WebhookFormatter.php │ └── WatchLevels.php ├── Api │ ├── ApiDocsController.php │ ├── ApiDocsGenerator.php │ ├── ApiEntityListFormatter.php │ ├── ApiToken.php │ ├── ApiTokenGuard.php │ ├── ListingResponseBuilder.php │ └── UserApiTokenController.php ├── App │ ├── AppVersion.php │ ├── Application.php │ ├── HomeController.php │ ├── MailNotification.php │ ├── MetaController.php │ ├── Model.php │ ├── Providers │ │ ├── AppServiceProvider.php │ │ ├── AuthServiceProvider.php │ │ ├── EventServiceProvider.php │ │ ├── RouteServiceProvider.php │ │ ├── ThemeServiceProvider.php │ │ ├── TranslationServiceProvider.php │ │ ├── ValidationRuleServiceProvider.php │ │ └── ViewTweaksServiceProvider.php │ ├── PwaManifestBuilder.php │ ├── Sluggable.php │ ├── SystemApiController.php │ └── helpers.php ├── Config │ ├── api.php │ ├── app.php │ ├── auth.php │ ├── cache.php │ ├── clockwork.php │ ├── database.php │ ├── debugbar.php │ ├── exports.php │ ├── filesystems.php │ ├── hashing.php │ ├── logging.php │ ├── mail.php │ ├── oidc.php │ ├── queue.php │ ├── saml2.php │ ├── services.php │ ├── session.php │ ├── setting-defaults.php │ └── view.php ├── Console │ ├── Commands │ │ ├── AssignSortRuleCommand.php │ │ ├── CleanupImagesCommand.php │ │ ├── ClearActivityCommand.php │ │ ├── ClearRevisionsCommand.php │ │ ├── ClearViewsCommand.php │ │ ├── CopyShelfPermissionsCommand.php │ │ ├── CreateAdminCommand.php │ │ ├── DeleteUsersCommand.php │ │ ├── HandlesSingleUser.php │ │ ├── RefreshAvatarCommand.php │ │ ├── RegeneratePermissionsCommand.php │ │ ├── RegenerateReferencesCommand.php │ │ ├── RegenerateSearchCommand.php │ │ ├── ResetMfaCommand.php │ │ ├── UpdateUrlCommand.php │ │ └── UpgradeDatabaseEncodingCommand.php │ └── Kernel.php ├── Entities │ ├── BreadcrumbsViewComposer.php │ ├── Controllers │ │ ├── BookApiController.php │ │ ├── BookController.php │ │ ├── BookshelfApiController.php │ │ ├── BookshelfController.php │ │ ├── ChapterApiController.php │ │ ├── ChapterController.php │ │ ├── PageApiController.php │ │ ├── PageController.php │ │ ├── PageRevisionController.php │ │ ├── PageTemplateController.php │ │ ├── RecycleBinApiController.php │ │ └── RecycleBinController.php │ ├── EntityProvider.php │ ├── Models │ │ ├── Book.php │ │ ├── BookChild.php │ │ ├── Bookshelf.php │ │ ├── Chapter.php │ │ ├── Deletable.php │ │ ├── Deletion.php │ │ ├── Entity.php │ │ ├── HasCoverImage.php │ │ ├── HasHtmlDescription.php │ │ ├── Page.php │ │ └── PageRevision.php │ ├── Queries │ │ ├── BookQueries.php │ │ ├── BookshelfQueries.php │ │ ├── ChapterQueries.php │ │ ├── EntityQueries.php │ │ ├── PageQueries.php │ │ ├── PageRevisionQueries.php │ │ ├── ProvidesEntityQueries.php │ │ ├── QueryPopular.php │ │ ├── QueryRecentlyViewed.php │ │ └── QueryTopFavourites.php │ ├── Repos │ │ ├── BaseRepo.php │ │ ├── BookRepo.php │ │ ├── BookshelfRepo.php │ │ ├── ChapterRepo.php │ │ ├── DeletionRepo.php │ │ ├── PageRepo.php │ │ └── RevisionRepo.php │ └── Tools │ │ ├── BookContents.php │ │ ├── Cloner.php │ │ ├── HierarchyTransformer.php │ │ ├── Markdown │ │ ├── CheckboxConverter.php │ │ ├── CustomDivConverter.php │ │ ├── CustomImageConverter.php │ │ ├── CustomListItemRenderer.php │ │ ├── CustomParagraphConverter.php │ │ ├── CustomStrikeThroughExtension.php │ │ ├── CustomStrikethroughRenderer.php │ │ ├── HtmlToMarkdown.php │ │ ├── MarkdownToHtml.php │ │ └── SpacedTagFallbackConverter.php │ │ ├── MixedEntityListLoader.php │ │ ├── MixedEntityRequestHelper.php │ │ ├── NextPreviousContentLocator.php │ │ ├── PageContent.php │ │ ├── PageEditActivity.php │ │ ├── PageEditorData.php │ │ ├── PageEditorType.php │ │ ├── PageIncludeContent.php │ │ ├── PageIncludeParser.php │ │ ├── PageIncludeTag.php │ │ ├── PermissionsUpdater.php │ │ ├── ShelfContext.php │ │ ├── SiblingFetcher.php │ │ ├── SlugGenerator.php │ │ └── TrashCan.php ├── Exceptions │ ├── ApiAuthException.php │ ├── BookStackExceptionHandlerPage.php │ ├── ConfirmationEmailException.php │ ├── FileUploadException.php │ ├── Handler.php │ ├── HttpFetchException.php │ ├── ImageUploadException.php │ ├── JsonDebugException.php │ ├── LdapException.php │ ├── LoginAttemptEmailNeededException.php │ ├── LoginAttemptException.php │ ├── LoginAttemptInvalidUserException.php │ ├── MoveOperationException.php │ ├── NotFoundException.php │ ├── NotifyException.php │ ├── PdfExportException.php │ ├── PermissionsException.php │ ├── PrettyException.php │ ├── SamlException.php │ ├── SocialDriverNotConfigured.php │ ├── SocialSignInAccountNotUsed.php │ ├── SocialSignInException.php │ ├── StoppedAuthenticationException.php │ ├── ThemeException.php │ ├── UserRegistrationException.php │ ├── UserTokenExpiredException.php │ ├── UserTokenNotFoundException.php │ ├── UserUpdateException.php │ ├── ZipExportException.php │ ├── ZipImportException.php │ └── ZipValidationException.php ├── Exports │ ├── Controllers │ │ ├── BookExportApiController.php │ │ ├── BookExportController.php │ │ ├── ChapterExportApiController.php │ │ ├── ChapterExportController.php │ │ ├── ImportController.php │ │ ├── PageExportApiController.php │ │ └── PageExportController.php │ ├── ExportFormatter.php │ ├── Import.php │ ├── ImportRepo.php │ ├── PdfGenerator.php │ └── ZipExports │ │ ├── Models │ │ ├── ZipExportAttachment.php │ │ ├── ZipExportBook.php │ │ ├── ZipExportChapter.php │ │ ├── ZipExportImage.php │ │ ├── ZipExportModel.php │ │ ├── ZipExportPage.php │ │ └── ZipExportTag.php │ │ ├── ZipExportBuilder.php │ │ ├── ZipExportFiles.php │ │ ├── ZipExportReader.php │ │ ├── ZipExportReferences.php │ │ ├── ZipExportValidator.php │ │ ├── ZipFileReferenceRule.php │ │ ├── ZipImportReferences.php │ │ ├── ZipImportRunner.php │ │ ├── ZipReferenceParser.php │ │ ├── ZipUniqueIdRule.php │ │ └── ZipValidationHelper.php ├── Facades │ ├── Activity.php │ └── Theme.php ├── Http │ ├── ApiController.php │ ├── Controller.php │ ├── DownloadResponseFactory.php │ ├── HttpClientHistory.php │ ├── HttpRequestService.php │ ├── Kernel.php │ ├── Middleware │ │ ├── ApiAuthenticate.php │ │ ├── ApplyCspRules.php │ │ ├── Authenticate.php │ │ ├── AuthenticatedOrPendingMfa.php │ │ ├── CheckEmailConfirmed.php │ │ ├── CheckGuard.php │ │ ├── CheckUserHasPermission.php │ │ ├── EncryptCookies.php │ │ ├── Localization.php │ │ ├── PreventRequestsDuringMaintenance.php │ │ ├── PreventResponseCaching.php │ │ ├── RedirectIfAuthenticated.php │ │ ├── RunThemeActions.php │ │ ├── StartSessionExtended.php │ │ ├── StartSessionIfCookieExists.php │ │ ├── ThrottleApiRequests.php │ │ ├── TrimStrings.php │ │ ├── TrustHosts.php │ │ ├── TrustProxies.php │ │ └── VerifyCsrfToken.php │ ├── RangeSupportedStream.php │ └── Request.php ├── Permissions │ ├── ContentPermissionApiController.php │ ├── EntityPermissionEvaluator.php │ ├── JointPermissionBuilder.php │ ├── MassEntityPermissionEvaluator.php │ ├── Models │ │ ├── EntityPermission.php │ │ ├── JointPermission.php │ │ └── RolePermission.php │ ├── PermissionApplicator.php │ ├── PermissionFormData.php │ ├── PermissionStatus.php │ ├── PermissionsController.php │ ├── PermissionsRepo.php │ └── SimpleEntityData.php ├── References │ ├── CrossLinkParser.php │ ├── ModelResolvers │ │ ├── AttachmentModelResolver.php │ │ ├── BookLinkModelResolver.php │ │ ├── BookshelfLinkModelResolver.php │ │ ├── ChapterLinkModelResolver.php │ │ ├── CrossLinkModelResolver.php │ │ ├── ImageModelResolver.php │ │ ├── PageLinkModelResolver.php │ │ └── PagePermalinkModelResolver.php │ ├── Reference.php │ ├── ReferenceController.php │ ├── ReferenceFetcher.php │ ├── ReferenceStore.php │ └── ReferenceUpdater.php ├── Search │ ├── Options │ │ ├── ExactSearchOption.php │ │ ├── FilterSearchOption.php │ │ ├── SearchOption.php │ │ ├── TagSearchOption.php │ │ └── TermSearchOption.php │ ├── SearchApiController.php │ ├── SearchController.php │ ├── SearchIndex.php │ ├── SearchOptionSet.php │ ├── SearchOptions.php │ ├── SearchResultsFormatter.php │ ├── SearchRunner.php │ ├── SearchTerm.php │ └── SearchTextTokenizer.php ├── Settings │ ├── AppSettingsStore.php │ ├── MaintenanceController.php │ ├── Setting.php │ ├── SettingController.php │ ├── SettingService.php │ ├── StatusController.php │ ├── TestEmailNotification.php │ ├── UserNotificationPreferences.php │ └── UserShortcutMap.php ├── Sorting │ ├── BookSortController.php │ ├── BookSortMap.php │ ├── BookSortMapItem.php │ ├── BookSorter.php │ ├── SortRule.php │ ├── SortRuleController.php │ ├── SortRuleOperation.php │ ├── SortSetOperationComparisons.php │ └── SortUrl.php ├── Theming │ ├── CustomHtmlHeadContentProvider.php │ ├── ThemeController.php │ ├── ThemeEvents.php │ └── ThemeService.php ├── Translation │ ├── FileLoader.php │ ├── LocaleDefinition.php │ ├── LocaleManager.php │ └── MessageSelector.php ├── Uploads │ ├── Attachment.php │ ├── AttachmentService.php │ ├── Controllers │ │ ├── AttachmentApiController.php │ │ ├── AttachmentController.php │ │ ├── DrawioImageController.php │ │ ├── GalleryImageController.php │ │ ├── ImageController.php │ │ └── ImageGalleryApiController.php │ ├── FaviconHandler.php │ ├── FileStorage.php │ ├── Image.php │ ├── ImageRepo.php │ ├── ImageResizer.php │ ├── ImageService.php │ ├── ImageStorage.php │ ├── ImageStorageDisk.php │ └── UserAvatars.php ├── Users │ ├── Controllers │ │ ├── RoleApiController.php │ │ ├── RoleController.php │ │ ├── UserAccountController.php │ │ ├── UserApiController.php │ │ ├── UserController.php │ │ ├── UserPreferencesController.php │ │ ├── UserProfileController.php │ │ └── UserSearchController.php │ ├── Models │ │ ├── HasCreatorAndUpdater.php │ │ ├── HasOwner.php │ │ ├── Role.php │ │ └── User.php │ ├── Queries │ │ ├── RolesAllPaginatedAndSorted.php │ │ ├── UserContentCounts.php │ │ ├── UserRecentlyCreatedContent.php │ │ └── UsersAllPaginatedAndSorted.php │ └── UserRepo.php └── Util │ ├── CspService.php │ ├── FilePathNormalizer.php │ ├── HtmlContentFilter.php │ ├── HtmlDescriptionFilter.php │ ├── HtmlDocument.php │ ├── HtmlNonceApplicator.php │ ├── OutOfMemoryHandler.php │ ├── SimpleListOptions.php │ ├── SsrUrlValidator.php │ ├── SvgIcon.php │ └── WebSafeMimeSniffer.php ├── artisan ├── bookstack-system-cli ├── bootstrap ├── app.php ├── cache │ └── .gitignore └── phpstan.php ├── composer.json ├── composer.lock ├── crowdin.yml ├── database ├── .gitignore ├── factories │ ├── Activity │ │ └── Models │ │ │ ├── CommentFactory.php │ │ │ ├── TagFactory.php │ │ │ ├── WebhookFactory.php │ │ │ └── WebhookTrackedEventFactory.php │ ├── Api │ │ └── ApiTokenFactory.php │ ├── Entities │ │ └── Models │ │ │ ├── BookFactory.php │ │ │ ├── BookshelfFactory.php │ │ │ ├── ChapterFactory.php │ │ │ └── PageFactory.php │ ├── Exports │ │ └── ImportFactory.php │ ├── Sorting │ │ └── SortRuleFactory.php │ ├── Uploads │ │ ├── AttachmentFactory.php │ │ └── ImageFactory.php │ └── Users │ │ └── Models │ │ ├── RoleFactory.php │ │ └── UserFactory.php ├── migrations │ ├── .gitkeep │ ├── 2014_10_12_000000_create_users_table.php │ ├── 2014_10_12_100000_create_password_resets_table.php │ ├── 2015_07_12_114933_create_books_table.php │ ├── 2015_07_12_190027_create_pages_table.php │ ├── 2015_07_13_172121_create_images_table.php │ ├── 2015_07_27_172342_create_chapters_table.php │ ├── 2015_08_08_200447_add_users_to_entities.php │ ├── 2015_08_09_093534_create_page_revisions_table.php │ ├── 2015_08_16_142133_create_activities_table.php │ ├── 2015_08_29_105422_add_roles_and_permissions.php │ ├── 2015_08_30_125859_create_settings_table.php │ ├── 2015_08_31_175240_add_search_indexes.php │ ├── 2015_09_04_165821_create_social_accounts_table.php │ ├── 2015_09_05_164707_add_email_confirmation_table.php │ ├── 2015_11_21_145609_create_views_table.php │ ├── 2015_11_26_221857_add_entity_indexes.php │ ├── 2015_12_05_145049_fulltext_weighting.php │ ├── 2015_12_07_195238_add_image_upload_types.php │ ├── 2015_12_09_195748_add_user_avatars.php │ ├── 2016_01_11_210908_add_external_auth_to_users.php │ ├── 2016_02_25_184030_add_slug_to_revisions.php │ ├── 2016_02_27_120329_update_permissions_and_roles.php │ ├── 2016_02_28_084200_add_entity_access_controls.php │ ├── 2016_03_09_203143_add_page_revision_types.php │ ├── 2016_03_13_082138_add_page_drafts.php │ ├── 2016_03_25_123157_add_markdown_support.php │ ├── 2016_04_09_100730_add_view_permissions_to_roles.php │ ├── 2016_04_20_192649_create_joint_permissions_table.php │ ├── 2016_05_06_185215_create_tags_table.php │ ├── 2016_07_07_181521_add_summary_to_page_revisions.php │ ├── 2016_09_29_101449_remove_hidden_roles.php │ ├── 2016_10_09_142037_create_attachments_table.php │ ├── 2017_01_21_163556_create_cache_table.php │ ├── 2017_01_21_163602_create_sessions_table.php │ ├── 2017_03_19_091553_create_search_index_table.php │ ├── 2017_04_20_185112_add_revision_counts.php │ ├── 2017_07_02_152834_update_db_encoding_to_ut8mb4.php │ ├── 2017_08_01_130541_create_comments_table.php │ ├── 2017_08_29_102650_add_cover_image_display.php │ ├── 2018_07_15_173514_add_role_external_auth_id.php │ ├── 2018_08_04_115700_create_bookshelves_table.php │ ├── 2019_07_07_112515_add_template_support.php │ ├── 2019_08_17_140214_add_user_invites_table.php │ ├── 2019_12_29_120917_add_api_auth.php │ ├── 2020_08_04_111754_drop_joint_permissions_id.php │ ├── 2020_08_04_131052_remove_role_name_field.php │ ├── 2020_09_19_094251_add_activity_indexes.php │ ├── 2020_09_27_210059_add_entity_soft_deletes.php │ ├── 2020_09_27_210528_create_deletions_table.php │ ├── 2020_11_07_232321_simplify_activities_table.php │ ├── 2020_12_30_173528_add_owned_by_field_to_entities.php │ ├── 2021_01_30_225441_add_settings_type_column.php │ ├── 2021_03_08_215138_add_user_slug.php │ ├── 2021_05_15_173110_create_favourites_table.php │ ├── 2021_06_30_173111_create_mfa_values_table.php │ ├── 2021_07_03_085038_add_mfa_enforced_to_roles_table.php │ ├── 2021_08_28_161743_add_export_role_permission.php │ ├── 2021_09_26_044614_add_activities_ip_column.php │ ├── 2021_11_26_070438_add_index_for_user_ip.php │ ├── 2021_12_07_111343_create_webhooks_table.php │ ├── 2021_12_13_152024_create_jobs_table.php │ ├── 2021_12_13_152120_create_failed_jobs_table.php │ ├── 2022_01_03_154041_add_webhooks_timeout_error_columns.php │ ├── 2022_04_17_101741_add_editor_change_field_and_permission.php │ ├── 2022_04_25_140741_update_polymorphic_types.php │ ├── 2022_07_16_170051_drop_joint_permission_type.php │ ├── 2022_08_17_092941_create_references_table.php │ ├── 2022_09_02_082910_fix_shelf_cover_image_types.php │ ├── 2022_10_07_091406_flatten_entity_permissions_table.php │ ├── 2022_10_08_104202_drop_entity_restricted_field.php │ ├── 2023_01_24_104625_refactor_joint_permissions_storage.php │ ├── 2023_01_28_141230_copy_color_settings_for_dark_mode.php │ ├── 2023_02_20_093655_increase_attachments_path_length.php │ ├── 2023_02_23_200227_add_updated_at_index_to_pages.php │ ├── 2023_06_10_071823_remove_guest_user_secondary_roles.php │ ├── 2023_06_25_181952_remove_bookshelf_create_entity_permissions.php │ ├── 2023_07_25_124945_add_receive_notifications_role_permissions.php │ ├── 2023_07_31_104430_create_watches_table.php │ ├── 2023_08_21_174248_increase_cache_size.php │ ├── 2023_12_02_104541_add_default_template_to_books.php │ ├── 2023_12_17_140913_add_description_html_to_entities.php │ ├── 2024_01_01_104542_add_default_template_to_chapters.php │ ├── 2024_02_04_141358_add_views_updated_index.php │ ├── 2024_05_04_154409_rename_activity_relation_columns.php │ ├── 2024_09_29_140340_ensure_editor_value_set.php │ ├── 2024_10_29_114420_add_import_role_permission.php │ ├── 2024_11_02_160700_create_imports_table.php │ ├── 2024_11_27_171039_add_instance_id_setting.php │ ├── 2025_01_29_180933_create_sort_rules_table.php │ ├── 2025_02_05_150842_add_sort_rule_id_to_books.php │ └── 2025_04_18_215145_add_content_refs_and_archived_to_comments.php └── seeders │ ├── .gitkeep │ ├── DatabaseSeeder.php │ ├── DummyContentSeeder.php │ └── LargeContentSeeder.php ├── dev ├── api │ ├── requests │ │ ├── attachments-create.json │ │ ├── attachments-update.json │ │ ├── books-create.json │ │ ├── books-update.json │ │ ├── chapters-create.json │ │ ├── chapters-update.json │ │ ├── content-permissions-update.json │ │ ├── image-gallery-update.json │ │ ├── pages-create.json │ │ ├── pages-update.json │ │ ├── roles-create.json │ │ ├── roles-update.json │ │ ├── search-all.http │ │ ├── shelves-create.json │ │ ├── shelves-update.json │ │ ├── users-create.json │ │ ├── users-delete.json │ │ └── users-update.json │ └── responses │ │ ├── attachments-create.json │ │ ├── attachments-list.json │ │ ├── attachments-read.json │ │ ├── attachments-update.json │ │ ├── audit-log-list.json │ │ ├── books-create.json │ │ ├── books-list.json │ │ ├── books-read.json │ │ ├── books-update.json │ │ ├── chapters-create.json │ │ ├── chapters-list.json │ │ ├── chapters-read.json │ │ ├── chapters-update.json │ │ ├── content-permissions-read.json │ │ ├── content-permissions-update.json │ │ ├── image-gallery-create.json │ │ ├── image-gallery-list.json │ │ ├── image-gallery-read.json │ │ ├── image-gallery-update.json │ │ ├── pages-create.json │ │ ├── pages-list.json │ │ ├── pages-read.json │ │ ├── pages-update.json │ │ ├── recycle-bin-destroy.json │ │ ├── recycle-bin-list.json │ │ ├── recycle-bin-restore.json │ │ ├── roles-create.json │ │ ├── roles-list.json │ │ ├── roles-read.json │ │ ├── roles-update.json │ │ ├── search-all.json │ │ ├── shelves-create.json │ │ ├── shelves-list.json │ │ ├── shelves-read.json │ │ ├── shelves-update.json │ │ ├── system-read.json │ │ ├── users-create.json │ │ ├── users-list.json │ │ ├── users-read.json │ │ └── users-update.json ├── build │ ├── esbuild.js │ └── svg-blank-transform.js ├── checksums │ ├── .gitignore │ └── vendor ├── docker │ ├── Dockerfile │ ├── entrypoint.app.sh │ ├── entrypoint.node.sh │ ├── init.db │ │ └── 01.sql │ └── php │ │ └── conf.d │ │ └── xdebug.ini ├── docs │ ├── development.md │ ├── javascript-code.md │ ├── javascript-public-events.md │ ├── logical-theme-system.md │ ├── permission-scenario-testing.md │ ├── php-testing.md │ ├── portable-zip-file-format.md │ ├── release-process.md │ └── visual-theme-system.md └── licensing │ ├── gen-js-licenses │ ├── gen-licenses-shared.php │ ├── gen-php-licenses │ ├── js-library-licenses.txt │ └── php-library-licenses.txt ├── docker-compose.yml ├── eslint.config.mjs ├── jest.config.ts ├── lang ├── ar │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── bg │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── bn │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── bs │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── ca │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── cs │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── cy │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── da │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── de │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── de_informal │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── el │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── en │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── es │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── es_AR │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── et │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── eu │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── fa │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── fi │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── fr │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── he │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── hr │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── hu │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── id │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── is │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── it │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── ja │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── ka │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── ko │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── ku │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── lt │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── lv │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── nb │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── nl │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── nn │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── pl │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── pt │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── pt_BR │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── ro │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── ru │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── sk │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── sl │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── sq │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── sr │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── sv │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── tk │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── tr │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── uk │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── uz │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── vi │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── zh_CN │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php └── zh_TW │ ├── activities.php │ ├── auth.php │ ├── common.php │ ├── components.php │ ├── editor.php │ ├── entities.php │ ├── errors.php │ ├── notifications.php │ ├── pagination.php │ ├── passwords.php │ ├── preferences.php │ ├── settings.php │ └── validation.php ├── package-lock.json ├── package.json ├── phpcs.xml ├── phpstan.neon.dist ├── phpunit.xml ├── public ├── .htaccess ├── book_default_cover.png ├── icon-128.png ├── icon-180.png ├── icon-32.png ├── icon-64.png ├── icon.ico ├── icon.png ├── index.php ├── libs │ └── tinymce │ │ ├── icons │ │ └── default │ │ │ └── icons.min.js │ │ ├── langs │ │ └── README.md │ │ ├── license.txt │ │ ├── models │ │ └── dom │ │ │ └── model.min.js │ │ ├── plugins │ │ ├── advlist │ │ │ └── plugin.min.js │ │ ├── anchor │ │ │ └── plugin.min.js │ │ ├── autolink │ │ │ └── plugin.min.js │ │ ├── autoresize │ │ │ └── plugin.min.js │ │ ├── autosave │ │ │ └── plugin.min.js │ │ ├── charmap │ │ │ └── plugin.min.js │ │ ├── code │ │ │ └── plugin.min.js │ │ ├── codesample │ │ │ └── plugin.min.js │ │ ├── directionality │ │ │ └── plugin.min.js │ │ ├── fullscreen │ │ │ └── plugin.min.js │ │ ├── image │ │ │ └── plugin.min.js │ │ ├── importcss │ │ │ └── plugin.min.js │ │ ├── insertdatetime │ │ │ └── plugin.min.js │ │ ├── link │ │ │ └── plugin.min.js │ │ ├── lists │ │ │ └── plugin.min.js │ │ ├── media │ │ │ └── plugin.min.js │ │ ├── nonbreaking │ │ │ └── plugin.min.js │ │ ├── pagebreak │ │ │ └── plugin.min.js │ │ ├── preview │ │ │ └── plugin.min.js │ │ ├── quickbars │ │ │ └── plugin.min.js │ │ ├── save │ │ │ └── plugin.min.js │ │ ├── searchreplace │ │ │ └── plugin.min.js │ │ ├── table │ │ │ └── plugin.min.js │ │ ├── template │ │ │ └── plugin.min.js │ │ ├── visualblocks │ │ │ └── plugin.min.js │ │ ├── visualchars │ │ │ └── plugin.min.js │ │ └── wordcount │ │ │ └── plugin.min.js │ │ ├── skins │ │ ├── content │ │ │ ├── dark │ │ │ │ ├── content.js │ │ │ │ └── content.min.css │ │ │ ├── default │ │ │ │ ├── content.js │ │ │ │ └── content.min.css │ │ │ ├── document │ │ │ │ ├── content.js │ │ │ │ └── content.min.css │ │ │ ├── tinymce-5-dark │ │ │ │ ├── content.js │ │ │ │ └── content.min.css │ │ │ ├── tinymce-5 │ │ │ │ ├── content.js │ │ │ │ └── content.min.css │ │ │ └── writer │ │ │ │ ├── content.js │ │ │ │ └── content.min.css │ │ └── ui │ │ │ ├── tinymce-5-dark │ │ │ ├── content.inline.js │ │ │ ├── content.inline.min.css │ │ │ ├── content.js │ │ │ ├── content.min.css │ │ │ ├── skin.js │ │ │ ├── skin.min.css │ │ │ ├── skin.shadowdom.js │ │ │ └── skin.shadowdom.min.css │ │ │ └── tinymce-5 │ │ │ ├── content.inline.js │ │ │ ├── content.inline.min.css │ │ │ ├── content.js │ │ │ ├── content.min.css │ │ │ ├── skin.js │ │ │ ├── skin.min.css │ │ │ ├── skin.shadowdom.js │ │ │ └── skin.shadowdom.min.css │ │ ├── themes │ │ └── silver │ │ │ └── theme.min.js │ │ ├── tinymce.d.ts │ │ └── tinymce.min.js ├── loading.gif ├── loading_error.png ├── logo.png ├── uploads │ ├── .gitignore │ └── .htaccess ├── user_avatar.png └── web.config ├── readme.md ├── resources ├── icons │ ├── add-circle.svg │ ├── add-small.svg │ ├── add.svg │ ├── archive.svg │ ├── attach.svg │ ├── auth │ │ ├── azure.svg │ │ ├── discord.svg │ │ ├── facebook.svg │ │ ├── github.svg │ │ ├── gitlab.svg │ │ ├── google.svg │ │ ├── okta.svg │ │ ├── slack.svg │ │ ├── twitch.svg │ │ └── twitter.svg │ ├── auto-sort.svg │ ├── back.svg │ ├── book.svg │ ├── bookmark.svg │ ├── books.svg │ ├── bookshelf.svg │ ├── cancel.svg │ ├── caret-down-large.svg │ ├── caret-down.svg │ ├── caret-left-circle.svg │ ├── caret-right-circle.svg │ ├── caret-right.svg │ ├── chapter.svg │ ├── check-circle.svg │ ├── check.svg │ ├── chevron-down.svg │ ├── chevron-right.svg │ ├── chevron-up.svg │ ├── close.svg │ ├── comment.svg │ ├── copy.svg │ ├── danger.svg │ ├── dark-mode.svg │ ├── delete.svg │ ├── download.svg │ ├── drawing.svg │ ├── edit.svg │ ├── editor │ │ ├── about.svg │ │ ├── align-center.svg │ │ ├── align-justify.svg │ │ ├── align-left.svg │ │ ├── align-right.svg │ │ ├── bold.svg │ │ ├── code-block.svg │ │ ├── code.svg │ │ ├── color-clear.svg │ │ ├── color-display.svg │ │ ├── color-select.svg │ │ ├── details-toggle.svg │ │ ├── details.svg │ │ ├── diagram.svg │ │ ├── direction-ltr.svg │ │ ├── direction-rtl.svg │ │ ├── format-clear.svg │ │ ├── fullscreen.svg │ │ ├── highlighter.svg │ │ ├── horizontal-rule.svg │ │ ├── image-search.svg │ │ ├── image.svg │ │ ├── indent-decrease.svg │ │ ├── indent-increase.svg │ │ ├── italic.svg │ │ ├── link.svg │ │ ├── list-bullet.svg │ │ ├── list-check.svg │ │ ├── list-numbered.svg │ │ ├── media.svg │ │ ├── more-horizontal.svg │ │ ├── redo.svg │ │ ├── source-view.svg │ │ ├── strikethrough.svg │ │ ├── subscript.svg │ │ ├── superscript.svg │ │ ├── table-delete-column.svg │ │ ├── table-delete-row.svg │ │ ├── table-delete.svg │ │ ├── table-insert-column-after.svg │ │ ├── table-insert-column-before.svg │ │ ├── table-insert-row-above.svg │ │ ├── table-insert-row-below.svg │ │ ├── table.svg │ │ ├── text-color.svg │ │ ├── underlined.svg │ │ ├── undo.svg │ │ └── unlink.svg │ ├── expand-text.svg │ ├── export.svg │ ├── file.svg │ ├── folder.svg │ ├── fullscreen.svg │ ├── grid.svg │ ├── grip.svg │ ├── groups.svg │ ├── history.svg │ ├── image.svg │ ├── images.svg │ ├── include.svg │ ├── info-filled.svg │ ├── info.svg │ ├── leaderboard.svg │ ├── light-mode.svg │ ├── link.svg │ ├── list.svg │ ├── lock-open.svg │ ├── lock.svg │ ├── login.svg │ ├── logout.svg │ ├── more.svg │ ├── new-user.svg │ ├── notifications.svg │ ├── oidc.svg │ ├── open-book.svg │ ├── page.svg │ ├── palette.svg │ ├── permission.svg │ ├── popular.svg │ ├── reference.svg │ ├── remove.svg │ ├── reply.svg │ ├── role.svg │ ├── saml2.svg │ ├── save.svg │ ├── search.svg │ ├── security.svg │ ├── settings.svg │ ├── shortcuts.svg │ ├── sort-down.svg │ ├── sort-up.svg │ ├── sort.svg │ ├── spanner.svg │ ├── star-circle.svg │ ├── star-outline.svg │ ├── star.svg │ ├── swap-horizontal.svg │ ├── swap-vertical.svg │ ├── tag.svg │ ├── template.svg │ ├── time.svg │ ├── upload.svg │ ├── user-preferences.svg │ ├── user.svg │ ├── users-add.svg │ ├── users.svg │ ├── warning.svg │ ├── watch-ignore.svg │ ├── watch.svg │ └── webhooks.svg ├── js │ ├── app.ts │ ├── code │ │ ├── index.mjs │ │ ├── languages.js │ │ ├── legacy-modes.mjs │ │ ├── setups.js │ │ ├── simple-editor-interface.js │ │ ├── themes.js │ │ └── views.js │ ├── components │ │ ├── add-remove-rows.js │ │ ├── ajax-delete-row.ts │ │ ├── ajax-form.js │ │ ├── attachments-list.js │ │ ├── attachments.js │ │ ├── auto-submit.js │ │ ├── auto-suggest.js │ │ ├── back-to-top.js │ │ ├── book-sort.js │ │ ├── chapter-contents.js │ │ ├── code-editor.js │ │ ├── code-highlighter.js │ │ ├── code-textarea.js │ │ ├── collapsible.js │ │ ├── component.js │ │ ├── confirm-dialog.js │ │ ├── custom-checkbox.js │ │ ├── details-highlighter.js │ │ ├── dropdown-search.js │ │ ├── dropdown.js │ │ ├── dropzone.js │ │ ├── editor-toolbox.ts │ │ ├── entity-permissions.js │ │ ├── entity-search.js │ │ ├── entity-selector-popup.js │ │ ├── entity-selector.js │ │ ├── event-emit-select.js │ │ ├── expand-toggle.js │ │ ├── global-search.js │ │ ├── header-mobile-toggle.js │ │ ├── image-manager.js │ │ ├── image-picker.js │ │ ├── index.ts │ │ ├── list-sort-control.js │ │ ├── loading-button.ts │ │ ├── markdown-editor.js │ │ ├── new-user-password.js │ │ ├── notification.js │ │ ├── optional-input.js │ │ ├── page-comment-reference.ts │ │ ├── page-comment.ts │ │ ├── page-comments.ts │ │ ├── page-display.js │ │ ├── page-editor.js │ │ ├── page-picker.js │ │ ├── permissions-table.js │ │ ├── pointer.ts │ │ ├── popup.js │ │ ├── setting-app-color-scheme.js │ │ ├── setting-color-picker.js │ │ ├── setting-homepage-control.js │ │ ├── shelf-sort.js │ │ ├── shortcut-input.js │ │ ├── shortcuts.js │ │ ├── sort-rule-manager.ts │ │ ├── sortable-list.js │ │ ├── submit-on-change.js │ │ ├── tabs.ts │ │ ├── tag-manager.js │ │ ├── template-manager.js │ │ ├── toggle-switch.js │ │ ├── tri-layout.js │ │ ├── user-select.js │ │ ├── webhook-events.js │ │ ├── wysiwyg-editor-tinymce.js │ │ ├── wysiwyg-editor.js │ │ └── wysiwyg-input.js │ ├── custom.d.ts │ ├── global.d.ts │ ├── markdown │ │ ├── actions.js │ │ ├── codemirror.js │ │ ├── common-events.js │ │ ├── display.js │ │ ├── index.mjs │ │ ├── markdown.js │ │ ├── settings.js │ │ └── shortcuts.js │ ├── services │ │ ├── __tests__ │ │ │ └── translations.test.ts │ │ ├── animations.ts │ │ ├── clipboard.ts │ │ ├── components.ts │ │ ├── dates.ts │ │ ├── dom.ts │ │ ├── drawio.ts │ │ ├── dual-lists.ts │ │ ├── events.ts │ │ ├── http.ts │ │ ├── keyboard-navigation.ts │ │ ├── store.ts │ │ ├── text.ts │ │ ├── translations.ts │ │ ├── util.ts │ │ └── vdom.ts │ ├── wysiwyg-tinymce │ │ ├── common-events.js │ │ ├── config.js │ │ ├── drop-paste-handling.js │ │ ├── filters.js │ │ ├── fixes.js │ │ ├── icons.js │ │ ├── plugin-codeeditor.js │ │ ├── plugin-drawio.js │ │ ├── plugins-about.js │ │ ├── plugins-customhr.js │ │ ├── plugins-details.js │ │ ├── plugins-imagemanager.js │ │ ├── plugins-stub.js │ │ ├── plugins-table-additions.js │ │ ├── plugins-tasklist.js │ │ ├── scrolling.js │ │ ├── shortcuts.js │ │ ├── toolbars.js │ │ └── util.js │ └── wysiwyg │ │ ├── index.ts │ │ ├── lexical │ │ ├── ORIGINAL-LEXICAL-LICENSE │ │ ├── clipboard │ │ │ ├── clipboard.ts │ │ │ └── index.ts │ │ ├── core │ │ │ ├── LexicalCommands.ts │ │ │ ├── LexicalConstants.ts │ │ │ ├── LexicalEditor.ts │ │ │ ├── LexicalEditorState.ts │ │ │ ├── LexicalEvents.ts │ │ │ ├── LexicalGC.ts │ │ │ ├── LexicalMutations.ts │ │ │ ├── LexicalNode.ts │ │ │ ├── LexicalNormalization.ts │ │ │ ├── LexicalReconciler.ts │ │ │ ├── LexicalSelection.ts │ │ │ ├── LexicalUpdates.ts │ │ │ ├── LexicalUtils.ts │ │ │ ├── __tests__ │ │ │ │ ├── unit │ │ │ │ │ ├── HTMLCopyAndPaste.test.ts │ │ │ │ │ ├── LexicalEditor.test.ts │ │ │ │ │ ├── LexicalEditorState.test.ts │ │ │ │ │ ├── LexicalNode.test.ts │ │ │ │ │ ├── LexicalNormalization.test.ts │ │ │ │ │ ├── LexicalSelection.test.ts │ │ │ │ │ ├── LexicalSerialization.test.ts │ │ │ │ │ └── LexicalUtils.test.ts │ │ │ │ └── utils │ │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── nodes │ │ │ │ ├── ArtificialNode.ts │ │ │ │ ├── CommonBlockNode.ts │ │ │ │ ├── LexicalDecoratorNode.ts │ │ │ │ ├── LexicalElementNode.ts │ │ │ │ ├── LexicalLineBreakNode.ts │ │ │ │ ├── LexicalParagraphNode.ts │ │ │ │ ├── LexicalRootNode.ts │ │ │ │ ├── LexicalTabNode.ts │ │ │ │ ├── LexicalTextNode.ts │ │ │ │ ├── __tests__ │ │ │ │ │ └── unit │ │ │ │ │ │ ├── LexicalElementNode.test.ts │ │ │ │ │ │ ├── LexicalGC.test.ts │ │ │ │ │ │ ├── LexicalLineBreakNode.test.ts │ │ │ │ │ │ ├── LexicalParagraphNode.test.ts │ │ │ │ │ │ ├── LexicalRootNode.test.ts │ │ │ │ │ │ ├── LexicalTabNode.test.ts │ │ │ │ │ │ └── LexicalTextNode.test.ts │ │ │ │ └── common.ts │ │ │ └── shared │ │ │ │ ├── __mocks__ │ │ │ │ └── invariant.ts │ │ │ │ ├── canUseDOM.ts │ │ │ │ ├── caretFromPoint.ts │ │ │ │ ├── environment.ts │ │ │ │ ├── invariant.ts │ │ │ │ ├── normalizeClassNames.ts │ │ │ │ ├── simpleDiffWithCursor.ts │ │ │ │ └── warnOnlyOnce.ts │ │ ├── headless │ │ │ ├── __tests__ │ │ │ │ └── unit │ │ │ │ │ └── LexicalHeadlessEditor.test.ts │ │ │ └── index.ts │ │ ├── history │ │ │ └── index.ts │ │ ├── html │ │ │ ├── __tests__ │ │ │ │ └── unit │ │ │ │ │ └── LexicalHtml.test.ts │ │ │ └── index.ts │ │ ├── link │ │ │ ├── __tests__ │ │ │ │ └── unit │ │ │ │ │ ├── LexicalAutoLinkNode.test.ts │ │ │ │ │ └── LexicalLinkNode.test.ts │ │ │ └── index.ts │ │ ├── list │ │ │ ├── LexicalListItemNode.ts │ │ │ ├── LexicalListNode.ts │ │ │ ├── __tests__ │ │ │ │ └── unit │ │ │ │ │ ├── LexicalListItemNode.test.ts │ │ │ │ │ ├── LexicalListNode.test.ts │ │ │ │ │ └── utils.test.ts │ │ │ ├── formatList.ts │ │ │ ├── index.ts │ │ │ └── utils.ts │ │ ├── readme.md │ │ ├── rich-text │ │ │ ├── LexicalCalloutNode.ts │ │ │ ├── LexicalCodeBlockNode.ts │ │ │ ├── LexicalDetailsNode.ts │ │ │ ├── LexicalDiagramNode.ts │ │ │ ├── LexicalHeadingNode.ts │ │ │ ├── LexicalHorizontalRuleNode.ts │ │ │ ├── LexicalImageNode.ts │ │ │ ├── LexicalMediaNode.ts │ │ │ ├── LexicalQuoteNode.ts │ │ │ ├── __tests__ │ │ │ │ └── unit │ │ │ │ │ ├── LexicalDetailsNode.test.ts │ │ │ │ │ ├── LexicalHeadingNode.test.ts │ │ │ │ │ └── LexicalQuoteNode.test.ts │ │ │ └── index.ts │ │ ├── selection │ │ │ ├── __tests__ │ │ │ │ ├── unit │ │ │ │ │ ├── LexicalSelection.test.ts │ │ │ │ │ └── LexicalSelectionHelpers.test.ts │ │ │ │ └── utils │ │ │ │ │ └── index.ts │ │ │ ├── constants.ts │ │ │ ├── index.ts │ │ │ ├── lexical-node.ts │ │ │ ├── range-selection.ts │ │ │ └── utils.ts │ │ ├── table │ │ │ ├── LexicalCaptionNode.ts │ │ │ ├── LexicalTableCellNode.ts │ │ │ ├── LexicalTableCommands.ts │ │ │ ├── LexicalTableNode.ts │ │ │ ├── LexicalTableObserver.ts │ │ │ ├── LexicalTableRowNode.ts │ │ │ ├── LexicalTableSelection.ts │ │ │ ├── LexicalTableSelectionHelpers.ts │ │ │ ├── LexicalTableUtils.ts │ │ │ ├── __tests__ │ │ │ │ └── unit │ │ │ │ │ ├── LexicalTableCellNode.test.ts │ │ │ │ │ ├── LexicalTableNode.test.ts │ │ │ │ │ ├── LexicalTableRowNode.test.ts │ │ │ │ │ └── LexicalTableSelection.test.ts │ │ │ ├── constants.ts │ │ │ └── index.ts │ │ ├── utils │ │ │ ├── __tests__ │ │ │ │ └── unit │ │ │ │ │ ├── LexicalElementHelpers.test.ts │ │ │ │ │ ├── LexicalEventHelpers.test.ts │ │ │ │ │ ├── LexicalNodeHelpers.test.ts │ │ │ │ │ ├── LexicalRootHelpers.test.ts │ │ │ │ │ ├── LexicalUtilsKlassEqual.test.ts │ │ │ │ │ ├── LexicalUtilsSplitNode.test.ts │ │ │ │ │ ├── LexlcaiUtilsInsertNodeToNearestRoot.test.ts │ │ │ │ │ └── mergeRegister.test.ts │ │ │ ├── index.ts │ │ │ ├── markSelection.ts │ │ │ ├── mergeRegister.ts │ │ │ ├── positionNodeOnRange.ts │ │ │ └── px.ts │ │ └── yjs │ │ │ ├── Bindings.ts │ │ │ ├── CollabDecoratorNode.ts │ │ │ ├── CollabElementNode.ts │ │ │ ├── CollabLineBreakNode.ts │ │ │ ├── CollabTextNode.ts │ │ │ ├── SyncCursors.ts │ │ │ ├── SyncEditorStates.ts │ │ │ ├── Utils.ts │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── nodes.ts │ │ ├── services │ │ ├── __tests__ │ │ │ ├── auto-links.test.ts │ │ │ └── keyboard-handling.test.ts │ │ ├── auto-links.ts │ │ ├── common-events.ts │ │ ├── drop-paste-handling.ts │ │ ├── keyboard-handling.ts │ │ └── shortcuts.ts │ │ ├── testing.md │ │ ├── ui │ │ ├── decorators │ │ │ ├── code-block.ts │ │ │ └── diagram.ts │ │ ├── defaults │ │ │ ├── buttons │ │ │ │ ├── alignments.ts │ │ │ │ ├── block-formats.ts │ │ │ │ ├── controls.ts │ │ │ │ ├── inline-formats.ts │ │ │ │ ├── lists.ts │ │ │ │ ├── objects.ts │ │ │ │ └── tables.ts │ │ │ ├── forms │ │ │ │ ├── controls.ts │ │ │ │ ├── objects.ts │ │ │ │ └── tables.ts │ │ │ ├── modals.ts │ │ │ └── toolbars.ts │ │ ├── framework │ │ │ ├── blocks │ │ │ │ ├── action-field.ts │ │ │ │ ├── button-with-menu.ts │ │ │ │ ├── color-button.ts │ │ │ │ ├── color-field.ts │ │ │ │ ├── color-picker.ts │ │ │ │ ├── dropdown-button.ts │ │ │ │ ├── external-content.ts │ │ │ │ ├── format-menu.ts │ │ │ │ ├── format-preview-button.ts │ │ │ │ ├── link-field.ts │ │ │ │ ├── menu-button.ts │ │ │ │ ├── overflow-container.ts │ │ │ │ ├── separator.ts │ │ │ │ └── table-creator.ts │ │ │ ├── buttons.ts │ │ │ ├── core.ts │ │ │ ├── decorator.ts │ │ │ ├── forms.ts │ │ │ ├── helpers │ │ │ │ ├── dropdowns.ts │ │ │ │ ├── mouse-drag-tracker.ts │ │ │ │ ├── node-resizer.ts │ │ │ │ ├── table-resizer.ts │ │ │ │ ├── table-selection-handler.ts │ │ │ │ └── task-list-handler.ts │ │ │ ├── manager.ts │ │ │ ├── modals.ts │ │ │ └── toolbars.ts │ │ └── index.ts │ │ └── utils │ │ ├── __tests__ │ │ └── lists.test.ts │ │ ├── actions.ts │ │ ├── diagrams.ts │ │ ├── dom.ts │ │ ├── formats.ts │ │ ├── images.ts │ │ ├── links.ts │ │ ├── lists.ts │ │ ├── node-clipboard.ts │ │ ├── nodes.ts │ │ ├── selection.ts │ │ ├── table-copy-paste.ts │ │ ├── table-map.ts │ │ └── tables.ts ├── sass │ ├── _animations.scss │ ├── _blocks.scss │ ├── _buttons.scss │ ├── _codemirror.scss │ ├── _colors.scss │ ├── _components.scss │ ├── _content.scss │ ├── _editor.scss │ ├── _footer.scss │ ├── _forms.scss │ ├── _header.scss │ ├── _html.scss │ ├── _layout.scss │ ├── _lists.scss │ ├── _mixins.scss │ ├── _opacity.scss │ ├── _pages.scss │ ├── _print.scss │ ├── _reset.scss │ ├── _spacing.scss │ ├── _tables.scss │ ├── _text.scss │ ├── _tinymce.scss │ ├── _vars.scss │ ├── export-styles.scss │ └── styles.scss └── views │ ├── api-docs │ ├── index.blade.php │ └── parts │ │ ├── endpoint.blade.php │ │ └── getting-started.blade.php │ ├── attachments │ ├── list.blade.php │ ├── manager-edit-form.blade.php │ ├── manager-link-form.blade.php │ ├── manager-list.blade.php │ └── manager.blade.php │ ├── auth │ ├── invite-set-password.blade.php │ ├── login-initiate.blade.php │ ├── login.blade.php │ ├── parts │ │ ├── login-form-ldap.blade.php │ │ ├── login-form-oidc.blade.php │ │ ├── login-form-saml2.blade.php │ │ ├── login-form-standard.blade.php │ │ ├── login-message.blade.php │ │ └── register-message.blade.php │ ├── passwords │ │ ├── email.blade.php │ │ └── reset.blade.php │ ├── register-confirm-accept.blade.php │ ├── register-confirm-awaiting.blade.php │ ├── register-confirm.blade.php │ └── register.blade.php │ ├── books │ ├── copy.blade.php │ ├── create.blade.php │ ├── delete.blade.php │ ├── edit.blade.php │ ├── index.blade.php │ ├── parts │ │ ├── convert-to-shelf.blade.php │ │ ├── form.blade.php │ │ ├── list-item.blade.php │ │ ├── list.blade.php │ │ ├── sort-box-actions.blade.php │ │ └── sort-box.blade.php │ ├── permissions.blade.php │ ├── references.blade.php │ ├── show.blade.php │ └── sort.blade.php │ ├── chapters │ ├── copy.blade.php │ ├── create.blade.php │ ├── delete.blade.php │ ├── edit.blade.php │ ├── move.blade.php │ ├── parts │ │ ├── child-menu.blade.php │ │ ├── convert-to-book.blade.php │ │ ├── form.blade.php │ │ └── list-item.blade.php │ ├── permissions.blade.php │ ├── references.blade.php │ └── show.blade.php │ ├── comments │ ├── comment-branch.blade.php │ ├── comment.blade.php │ ├── comments.blade.php │ └── create.blade.php │ ├── common │ ├── activity-item.blade.php │ ├── activity-list.blade.php │ ├── confirm-dialog.blade.php │ ├── dark-mode-toggle.blade.php │ ├── detailed-listing-paginated.blade.php │ ├── detailed-listing-with-more.blade.php │ ├── loading-icon.blade.php │ ├── sort.blade.php │ └── status-indicator.blade.php │ ├── entities │ ├── body-tag-classes.blade.php │ ├── book-tree.blade.php │ ├── breadcrumb-listing.blade.php │ ├── breadcrumbs.blade.php │ ├── copy-considerations.blade.php │ ├── export-menu.blade.php │ ├── favourite-action.blade.php │ ├── grid-item.blade.php │ ├── icon-link.blade.php │ ├── list-basic.blade.php │ ├── list-item-basic.blade.php │ ├── list-item.blade.php │ ├── list.blade.php │ ├── meta.blade.php │ ├── references.blade.php │ ├── search-form.blade.php │ ├── search-results.blade.php │ ├── selector-popup.blade.php │ ├── selector.blade.php │ ├── sibling-navigation.blade.php │ ├── tag-list.blade.php │ ├── tag-manager-list.blade.php │ ├── tag-manager.blade.php │ ├── tag.blade.php │ ├── template-selector.blade.php │ ├── view-toggle.blade.php │ ├── watch-action.blade.php │ └── watch-controls.blade.php │ ├── errors │ ├── 404.blade.php │ ├── 500.blade.php │ ├── 503.blade.php │ ├── debug.blade.php │ └── parts │ │ └── not-found-text.blade.php │ ├── exports │ ├── book.blade.php │ ├── chapter.blade.php │ ├── import-show.blade.php │ ├── import.blade.php │ ├── page.blade.php │ └── parts │ │ ├── book-contents-menu.blade.php │ │ ├── chapter-contents-menu.blade.php │ │ ├── chapter-item.blade.php │ │ ├── custom-head.blade.php │ │ ├── import-item.blade.php │ │ ├── import.blade.php │ │ ├── meta.blade.php │ │ ├── page-item.blade.php │ │ └── styles.blade.php │ ├── form │ ├── checkbox.blade.php │ ├── custom-checkbox.blade.php │ ├── date.blade.php │ ├── description-html-input.blade.php │ ├── editor-translations.blade.php │ ├── entity-permissions-row.blade.php │ ├── entity-permissions.blade.php │ ├── errors.blade.php │ ├── image-picker.blade.php │ ├── number.blade.php │ ├── page-picker.blade.php │ ├── password.blade.php │ ├── request-query-inputs.blade.php │ ├── role-checkboxes.blade.php │ ├── role-select.blade.php │ ├── simple-dropzone.blade.php │ ├── text.blade.php │ ├── textarea.blade.php │ ├── toggle-switch.blade.php │ ├── user-select-list.blade.php │ └── user-select.blade.php │ ├── help │ ├── licenses.blade.php │ ├── tinymce.blade.php │ └── wysiwyg.blade.php │ ├── home │ ├── books.blade.php │ ├── default.blade.php │ ├── parts │ │ ├── expand-toggle.blade.php │ │ └── sidebar.blade.php │ ├── shelves.blade.php │ └── specific-page.blade.php │ ├── layouts │ ├── base.blade.php │ ├── export.blade.php │ ├── parts │ │ ├── base-body-end.blade.php │ │ ├── base-body-start.blade.php │ │ ├── custom-head.blade.php │ │ ├── custom-styles.blade.php │ │ ├── export-body-end.blade.php │ │ ├── export-body-start.blade.php │ │ ├── footer.blade.php │ │ ├── header-links-start.blade.php │ │ ├── header-links.blade.php │ │ ├── header-logo.blade.php │ │ ├── header-search.blade.php │ │ ├── header-user-menu.blade.php │ │ ├── header.blade.php │ │ ├── notifications.blade.php │ │ └── skip-to-content.blade.php │ ├── plain.blade.php │ ├── simple.blade.php │ └── tri.blade.php │ ├── mfa │ ├── backup-codes-generate.blade.php │ ├── parts │ │ ├── setup-method-row.blade.php │ │ ├── verify-backup_codes.blade.php │ │ └── verify-totp.blade.php │ ├── setup.blade.php │ ├── totp-generate.blade.php │ └── verify.blade.php │ ├── misc │ ├── opensearch.blade.php │ └── robots.blade.php │ ├── pages │ ├── copy.blade.php │ ├── delete.blade.php │ ├── edit.blade.php │ ├── guest-create.blade.php │ ├── move.blade.php │ ├── parts │ │ ├── code-editor.blade.php │ │ ├── editor-toolbar.blade.php │ │ ├── editor-toolbox.blade.php │ │ ├── form.blade.php │ │ ├── image-manager-form.blade.php │ │ ├── image-manager-list.blade.php │ │ ├── image-manager.blade.php │ │ ├── list-item.blade.php │ │ ├── markdown-editor.blade.php │ │ ├── page-display.blade.php │ │ ├── pointer.blade.php │ │ ├── revisions-index-row.blade.php │ │ ├── template-manager-list.blade.php │ │ ├── template-manager.blade.php │ │ ├── toolbox-comments.blade.php │ │ ├── wysiwyg-editor-tinymce.blade.php │ │ └── wysiwyg-editor.blade.php │ ├── permissions.blade.php │ ├── references.blade.php │ ├── revision.blade.php │ ├── revisions.blade.php │ └── show.blade.php │ ├── readme.md │ ├── search │ ├── all.blade.php │ └── parts │ │ ├── boolean-filter.blade.php │ │ ├── date-filter.blade.php │ │ ├── entity-selector-list.blade.php │ │ ├── entity-suggestion-list.blade.php │ │ ├── term-list.blade.php │ │ └── type-filter.blade.php │ ├── settings │ ├── audit.blade.php │ ├── categories │ │ ├── customization.blade.php │ │ ├── features.blade.php │ │ ├── registration.blade.php │ │ └── sorting.blade.php │ ├── layout.blade.php │ ├── maintenance.blade.php │ ├── parts │ │ ├── footer-links.blade.php │ │ ├── navbar.blade.php │ │ ├── setting-color-picker.blade.php │ │ ├── setting-color-scheme.blade.php │ │ └── table-user.blade.php │ ├── recycle-bin │ │ ├── destroy.blade.php │ │ ├── index.blade.php │ │ ├── parts │ │ │ ├── deletable-entity-list.blade.php │ │ │ ├── entity-display-item.blade.php │ │ │ └── recycle-bin-list-item.blade.php │ │ └── restore.blade.php │ ├── roles │ │ ├── create.blade.php │ │ ├── delete.blade.php │ │ ├── edit.blade.php │ │ ├── index.blade.php │ │ └── parts │ │ │ ├── asset-permissions-row.blade.php │ │ │ ├── checkbox.blade.php │ │ │ ├── form.blade.php │ │ │ ├── related-asset-permissions-row.blade.php │ │ │ └── roles-list-item.blade.php │ ├── sort-rules │ │ ├── create.blade.php │ │ ├── edit.blade.php │ │ └── parts │ │ │ ├── form.blade.php │ │ │ ├── operation.blade.php │ │ │ └── sort-rule-list-item.blade.php │ └── webhooks │ │ ├── create.blade.php │ │ ├── delete.blade.php │ │ ├── edit.blade.php │ │ ├── index.blade.php │ │ └── parts │ │ ├── form.blade.php │ │ ├── format-example.blade.php │ │ └── webhooks-list-item.blade.php │ ├── shelves │ ├── create.blade.php │ ├── delete.blade.php │ ├── edit.blade.php │ ├── index.blade.php │ ├── parts │ │ ├── form.blade.php │ │ ├── list-item.blade.php │ │ ├── list.blade.php │ │ └── shelf-sort-book-item.blade.php │ ├── permissions.blade.php │ ├── references.blade.php │ └── show.blade.php │ ├── tags │ ├── index.blade.php │ └── parts │ │ └── tags-list-item.blade.php │ ├── users │ ├── account │ │ ├── auth.blade.php │ │ ├── delete.blade.php │ │ ├── layout.blade.php │ │ ├── notifications.blade.php │ │ ├── parts │ │ │ └── shortcut-control.blade.php │ │ ├── profile.blade.php │ │ └── shortcuts.blade.php │ ├── api-tokens │ │ ├── create.blade.php │ │ ├── delete.blade.php │ │ ├── edit.blade.php │ │ └── parts │ │ │ ├── form.blade.php │ │ │ └── list.blade.php │ ├── create.blade.php │ ├── delete.blade.php │ ├── edit.blade.php │ ├── index.blade.php │ ├── parts │ │ ├── form.blade.php │ │ ├── language-option-row.blade.php │ │ └── users-list-item.blade.php │ └── profile.blade.php │ └── vendor │ ├── notifications │ ├── email-plain.blade.php │ └── email.blade.php │ └── pagination │ └── default.blade.php ├── routes ├── api.php └── web.php ├── storage ├── app │ └── .gitignore ├── backups │ └── .gitignore ├── clockwork │ └── .gitignore ├── fonts │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ └── views │ │ └── .gitignore ├── logs │ └── .gitignore └── uploads │ ├── files │ └── .gitignore │ └── images │ └── .gitignore ├── tests ├── Activity │ ├── AuditLogApiTest.php │ ├── AuditLogTest.php │ ├── WatchTest.php │ ├── WebhookCallTest.php │ ├── WebhookFormatTesting.php │ └── WebhookManagementTest.php ├── Api │ ├── ApiAuthTest.php │ ├── ApiConfigTest.php │ ├── ApiDocsTest.php │ ├── ApiListingTest.php │ ├── AttachmentsApiTest.php │ ├── BooksApiTest.php │ ├── ChaptersApiTest.php │ ├── ContentPermissionsApiTest.php │ ├── ImageGalleryApiTest.php │ ├── PagesApiTest.php │ ├── RecycleBinApiTest.php │ ├── RolesApiTest.php │ ├── SearchApiTest.php │ ├── ShelvesApiTest.php │ ├── SystemApiTest.php │ ├── TestsApi.php │ └── UsersApiTest.php ├── Auth │ ├── AuthTest.php │ ├── GroupSyncServiceTest.php │ ├── LdapTest.php │ ├── LoginAutoInitiateTest.php │ ├── MfaConfigurationTest.php │ ├── MfaVerificationTest.php │ ├── OidcTest.php │ ├── RegistrationTest.php │ ├── ResetPasswordTest.php │ ├── Saml2Test.php │ ├── SocialAuthTest.php │ └── UserInviteTest.php ├── Commands │ ├── AssignSortRuleCommandTest.php │ ├── CleanupImagesCommandTest.php │ ├── ClearActivityCommandTest.php │ ├── ClearRevisionsCommandTest.php │ ├── ClearViewsCommandTest.php │ ├── CopyShelfPermissionsCommandTest.php │ ├── CreateAdminCommandTest.php │ ├── DeleteUsersCommandTest.php │ ├── RefreshAvatarCommandTest.php │ ├── RegeneratePermissionsCommandTest.php │ ├── RegenerateReferencesCommandTest.php │ ├── RegenerateSearchCommandTest.php │ ├── ResetMfaCommandTest.php │ ├── UpdateUrlCommandTest.php │ └── UpgradeDatabaseEncodingCommandTest.php ├── CreatesApplication.php ├── DebugViewTest.php ├── Entity │ ├── BookShelfTest.php │ ├── BookTest.php │ ├── ChapterTest.php │ ├── CommentDisplayTest.php │ ├── CommentSettingTest.php │ ├── CommentStoreTest.php │ ├── ConvertTest.php │ ├── DefaultTemplateTest.php │ ├── EntityAccessTest.php │ ├── MarkdownToHtmlTest.php │ ├── PageContentTest.php │ ├── PageDraftTest.php │ ├── PageEditorTest.php │ ├── PageRevisionTest.php │ ├── PageTemplateTest.php │ ├── PageTest.php │ └── TagTest.php ├── ErrorTest.php ├── Exports │ ├── ExportUiTest.php │ ├── HtmlExportTest.php │ ├── MarkdownExportTest.php │ ├── PdfExportTest.php │ ├── TextExportTest.php │ ├── ZipExportTest.php │ ├── ZipExportValidatorTest.php │ ├── ZipImportRunnerTest.php │ ├── ZipImportTest.php │ ├── ZipResultData.php │ └── ZipTestHelper.php ├── FavouriteTest.php ├── Helpers │ ├── EntityProvider.php │ ├── FileProvider.php │ ├── OidcJwtHelper.php │ ├── PermissionsProvider.php │ ├── TestServiceProvider.php │ └── UserRoleProvider.php ├── HomepageTest.php ├── LanguageTest.php ├── Meta │ ├── HelpTest.php │ ├── LicensesTest.php │ ├── OpenGraphTest.php │ ├── OpensearchTest.php │ ├── PwaManifestTest.php │ └── RobotsTest.php ├── Permissions │ ├── EntityOwnerChangeTest.php │ ├── EntityPermissionsTest.php │ ├── ExportPermissionsTest.php │ ├── RolePermissionsTest.php │ └── Scenarios │ │ ├── EntityRolePermissionsTest.php │ │ ├── PermissionScenarioTestCase.php │ │ └── RoleContentPermissionsTest.php ├── PublicActionTest.php ├── References │ ├── CrossLinkParserTest.php │ └── ReferencesTest.php ├── Search │ ├── EntitySearchTest.php │ ├── SearchIndexingTest.php │ ├── SearchOptionsTest.php │ └── SiblingSearchTest.php ├── SecurityHeaderTest.php ├── Settings │ ├── CustomHeadContentTest.php │ ├── FooterLinksTest.php │ ├── RecycleBinTest.php │ ├── RegenerateReferencesTest.php │ ├── SettingsTest.php │ └── TestEmailTest.php ├── Sorting │ ├── BookSortTest.php │ ├── MoveTest.php │ └── SortRuleTest.php ├── StatusTest.php ├── TestCase.php ├── ThemeTest.php ├── Unit │ ├── ConfigTest.php │ ├── FrameworkAssumptionTest.php │ ├── IpFormatterTest.php │ ├── OidcIdTokenTest.php │ ├── PageIncludeParserTest.php │ └── SsrUrlValidatorTest.php ├── Uploads │ ├── AttachmentTest.php │ ├── AvatarTest.php │ ├── DrawioTest.php │ ├── ImageStorageTest.php │ └── ImageTest.php ├── UrlTest.php ├── User │ ├── RoleManagementTest.php │ ├── UserApiTokenTest.php │ ├── UserManagementTest.php │ ├── UserMyAccountTest.php │ ├── UserPreferencesTest.php │ ├── UserProfileTest.php │ └── UserSearchTest.php └── test-data │ ├── animated.avif │ ├── animated.gif │ ├── animated.png │ ├── bad-php.base64 │ ├── bad-phtml-png.base64 │ ├── bad-phtml.base64 │ ├── compressed.png │ ├── test-file.txt │ ├── test-image.jpg │ └── test-image.png ├── themes └── .gitignore ├── tsconfig.json └── version /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.css linguist-vendored 3 | *.less linguist-vendored 4 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [ssddanbrown] 4 | ko_fi: ssddanbrown -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Discord Chat Support 4 | url: https://discord.gg/ztkBqR2 5 | about: Realtime support & chat with the BookStack community and the team. 6 | 7 | - name: Debugging & Common Issues 8 | url: https://www.bookstackapp.com/docs/admin/debugging/ 9 | about: Find details on how to debug issues and view common issues with their resolutions. 10 | 11 | - name: Official Support Plans 12 | url: https://www.bookstackapp.com/support/ 13 | about: View our official support plans that offer assured support for business. -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/z_blank_request.yml: -------------------------------------------------------------------------------- 1 | name: Blank Request (Maintainers Only) 2 | description: For maintainers only - Start a blank request 3 | body: 4 | - type: markdown 5 | attributes: 6 | value: "**This blank request option is only for existing official maintainers of the project!** Please instead use a different request option. If you use this your issue will be closed off." 7 | - type: textarea 8 | attributes: 9 | label: Description -------------------------------------------------------------------------------- /.github/workflows/lint-js.yml: -------------------------------------------------------------------------------- 1 | name: lint-js 2 | 3 | on: 4 | push: 5 | paths: 6 | - '**.js' 7 | - '**.json' 8 | pull_request: 9 | paths: 10 | - '**.js' 11 | - '**.json' 12 | 13 | jobs: 14 | build: 15 | if: ${{ github.ref != 'refs/heads/l10n_development' }} 16 | runs-on: ubuntu-24.04 17 | steps: 18 | - uses: actions/checkout@v4 19 | 20 | - name: Install NPM deps 21 | run: npm ci 22 | 23 | - name: Run formatting check 24 | run: npm run lint 25 | -------------------------------------------------------------------------------- /.github/workflows/lint-php.yml: -------------------------------------------------------------------------------- 1 | name: lint-php 2 | 3 | on: 4 | push: 5 | paths: 6 | - '**.php' 7 | pull_request: 8 | paths: 9 | - '**.php' 10 | 11 | jobs: 12 | build: 13 | if: ${{ github.ref != 'refs/heads/l10n_development' }} 14 | runs-on: ubuntu-24.04 15 | steps: 16 | - uses: actions/checkout@v4 17 | 18 | - name: Setup PHP 19 | uses: shivammathur/setup-php@v2 20 | with: 21 | php-version: 8.3 22 | tools: phpcs 23 | 24 | - name: Run formatting check 25 | run: composer lint 26 | -------------------------------------------------------------------------------- /.github/workflows/test-js.yml: -------------------------------------------------------------------------------- 1 | name: test-js 2 | 3 | on: 4 | push: 5 | paths: 6 | - '**.js' 7 | - '**.ts' 8 | - '**.json' 9 | pull_request: 10 | paths: 11 | - '**.js' 12 | - '**.ts' 13 | - '**.json' 14 | 15 | jobs: 16 | build: 17 | if: ${{ github.ref != 'refs/heads/l10n_development' }} 18 | runs-on: ubuntu-24.04 19 | steps: 20 | - uses: actions/checkout@v4 21 | 22 | - name: Install NPM deps 23 | run: npm ci 24 | 25 | - name: Run TypeScript type checking 26 | run: npm run ts:lint 27 | 28 | - name: Run JavaScript tests 29 | run: npm run test -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor 2 | /node_modules 3 | /.vscode 4 | /composer 5 | /coverage 6 | Homestead.yaml 7 | .env 8 | .idea 9 | npm-debug.log 10 | yarn-error.log 11 | /public/dist 12 | /public/plugins 13 | /public/css 14 | /public/js 15 | /public/bower 16 | /public/build/ 17 | /public/favicon.ico 18 | /storage/images 19 | _ide_helper.php 20 | /storage/debugbar 21 | .phpstorm.meta.php 22 | yarn.lock 23 | /bin 24 | nbproject 25 | .buildpath 26 | .project 27 | .nvmrc 28 | .settings/ 29 | webpack-stats.json 30 | .phpunit.result.cache 31 | .DS_Store 32 | phpstan.neon 33 | esbuild-meta.json 34 | .phpactor.json 35 | /*.zip 36 | -------------------------------------------------------------------------------- /app/Access/Oidc/OidcException.php: -------------------------------------------------------------------------------- 1 | comment = $comment; 20 | $this->depth = $depth; 21 | $this->children = $children; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/Activity/Tools/WatchedParentDetails.php: -------------------------------------------------------------------------------- 1 | level === WatchLevels::IGNORE; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/App/AppVersion.php: -------------------------------------------------------------------------------- 1 | basePath 17 | . DIRECTORY_SEPARATOR 18 | . 'app' 19 | . DIRECTORY_SEPARATOR 20 | . 'Config' 21 | . ($path ? DIRECTORY_SEPARATOR . $path : $path); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/App/Model.php: -------------------------------------------------------------------------------- 1 | description_html ?: '
' . nl2br(e($this->description)) . '
'; 19 | return HtmlContentFilter::removeScriptsFromHtmlString($html); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Exceptions/ConfirmationEmailException.php: -------------------------------------------------------------------------------- 1 | userId = $userId; 18 | parent::__construct($message); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/Exceptions/UserTokenNotFoundException.php: -------------------------------------------------------------------------------- 1 | errors); 11 | parent::__construct($message); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/Exceptions/ZipValidationException.php: -------------------------------------------------------------------------------- 1 | hasAppAccess()) { 16 | if ($request->ajax()) { 17 | return response('Unauthorized.', 401); 18 | } 19 | 20 | return redirect()->guest(url('/login')); 21 | } 22 | 23 | return $next($request); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | cookies->has($sessionCookieName)) { 17 | return parent::handle($request, $next); 18 | } 19 | 20 | return $next($request); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Http/Middleware/ThrottleApiRequests.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | public function hosts(): array 15 | { 16 | return [ 17 | $this->allSubdomainsOfApplicationUrl(), 18 | ]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/Http/Middleware/VerifyCsrfToken.php: -------------------------------------------------------------------------------- 1 | find($id); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/References/ModelResolvers/CrossLinkModelResolver.php: -------------------------------------------------------------------------------- 1 | value); 10 | $escaped = str_replace('"', '\"', $escaped); 11 | return ($this->negated ? '-' : '') . '"' . $escaped . '"'; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/Search/Options/TermSearchOption.php: -------------------------------------------------------------------------------- 1 | value; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/Search/SearchTerm.php: -------------------------------------------------------------------------------- 1 | morphTo('entity'); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Settings/Setting.php: -------------------------------------------------------------------------------- 1 | newMailMessage() 14 | ->subject(trans('settings.maint_send_test_email_mail_subject')) 15 | ->greeting(trans('settings.maint_send_test_email_mail_greeting')) 16 | ->line(trans('settings.maint_send_test_email_mail_text')); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/Translation/MessageSelector.php: -------------------------------------------------------------------------------- 1 | belongsTo(User::class, 'owned_by'); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Util/FilePathNormalizer.php: -------------------------------------------------------------------------------- 1 | normalizePath($path); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /bookstack-system-cli: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/bookstack-system-cli -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /bootstrap/phpstan.php: -------------------------------------------------------------------------------- 1 | set([ 5 | 'filesystems.default' => 'local', 6 | ]); 7 | -------------------------------------------------------------------------------- /crowdin.yml: -------------------------------------------------------------------------------- 1 | project_identifier: bookstack 2 | base_path: . 3 | preserve_hierarchy: false 4 | pull_request_title: Updated translations with latest Crowdin changes 5 | pull_request_labels: 6 | - ":earth_africa: Translations" 7 | files: 8 | - source: /lang/en/*.php 9 | translation: /lang/%two_letters_code%/%original_file_name% 10 | type: php 11 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | -------------------------------------------------------------------------------- /database/migrations/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/database/migrations/.gitkeep -------------------------------------------------------------------------------- /database/migrations/2017_07_02_152834_update_db_encoding_to_ut8mb4.php: -------------------------------------------------------------------------------- 1 | call(UserTableSeeder::class); 20 | 21 | Model::reguard(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /dev/api/requests/attachments-create.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "My uploaded attachment", 3 | "uploaded_to": 8, 4 | "link": "https://link.example.com" 5 | } -------------------------------------------------------------------------------- /dev/api/requests/attachments-update.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "My updated attachment", 3 | "uploaded_to": 4, 4 | "link": "https://link.example.com/updated" 5 | } -------------------------------------------------------------------------------- /dev/api/requests/books-create.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "My own book", 3 | "description_html": "This is my own little book created via the API
", 4 | "default_template_id": 2427, 5 | "tags": [ 6 | {"name": "Category", "value": "Top Content"}, 7 | {"name": "Rating", "value": "Highest"} 8 | ] 9 | } -------------------------------------------------------------------------------- /dev/api/requests/books-update.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "My updated book", 3 | "description_html": "This is my book with updated details
", 4 | "default_template_id": 2427, 5 | "tags": [ 6 | {"name": "Subject", "value": "Updates"} 7 | ] 8 | } -------------------------------------------------------------------------------- /dev/api/requests/chapters-create.json: -------------------------------------------------------------------------------- 1 | { 2 | "book_id": 1, 3 | "name": "My fantastic new chapter", 4 | "description_html": "This is a great new chapter that I've created via the API
", 5 | "priority": 15, 6 | "default_template_id": 25, 7 | "tags": [ 8 | {"name": "Category", "value": "Top Content"}, 9 | {"name": "Rating", "value": "Highest"} 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /dev/api/requests/chapters-update.json: -------------------------------------------------------------------------------- 1 | { 2 | "book_id": 1, 3 | "name": "My fantastic updated chapter", 4 | "description_html": "This is an updated chapter that I've altered via the API
", 5 | "priority": 16, 6 | "default_template_id": 2428, 7 | "tags": [ 8 | {"name": "Category", "value": "Kinda Good Content"}, 9 | {"name": "Rating", "value": "Medium"} 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /dev/api/requests/content-permissions-update.json: -------------------------------------------------------------------------------- 1 | { 2 | "owner_id": 1, 3 | "role_permissions": [ 4 | { 5 | "role_id": 2, 6 | "view": true, 7 | "create": true, 8 | "update": true, 9 | "delete": false 10 | }, 11 | { 12 | "role_id": 3, 13 | "view": false, 14 | "create": false, 15 | "update": false, 16 | "delete": false 17 | } 18 | ], 19 | "fallback_permissions": { 20 | "inheriting": false, 21 | "view": true, 22 | "create": true, 23 | "update": false, 24 | "delete": false 25 | } 26 | } -------------------------------------------------------------------------------- /dev/api/requests/image-gallery-update.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "My updated image name" 3 | } -------------------------------------------------------------------------------- /dev/api/requests/pages-create.json: -------------------------------------------------------------------------------- 1 | { 2 | "book_id": 1, 3 | "name": "My API Page", 4 | "html": "my new API page
", 5 | "priority": 15, 6 | "tags": [ 7 | {"name": "Category", "value": "Not Bad Content"}, 8 | {"name": "Rating", "value": "Average"} 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /dev/api/requests/pages-update.json: -------------------------------------------------------------------------------- 1 | { 2 | "chapter_id": 1, 3 | "name": "My updated API Page", 4 | "html": "my new API page - Updated
", 5 | "priority": 16, 6 | "tags": [ 7 | {"name": "Category", "value": "API Examples"}, 8 | {"name": "Rating", "value": "Alright"} 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /dev/api/requests/roles-create.json: -------------------------------------------------------------------------------- 1 | { 2 | "display_name": "Book Maintainer", 3 | "description": "People who maintain books", 4 | "mfa_enforced": true, 5 | "permissions": [ 6 | "book-view-all", 7 | "book-update-all", 8 | "book-delete-all", 9 | "restrictions-manage-all" 10 | ] 11 | } -------------------------------------------------------------------------------- /dev/api/requests/roles-update.json: -------------------------------------------------------------------------------- 1 | { 2 | "display_name": "Book & Shelf Maintainers", 3 | "description": "All those who maintain books & shelves", 4 | "mfa_enforced": false, 5 | "permissions": [ 6 | "book-view-all", 7 | "book-update-all", 8 | "book-delete-all", 9 | "bookshelf-view-all", 10 | "bookshelf-update-all", 11 | "bookshelf-delete-all", 12 | "restrictions-manage-all" 13 | ] 14 | } -------------------------------------------------------------------------------- /dev/api/requests/search-all.http: -------------------------------------------------------------------------------- 1 | GET /api/search?query=cats+{created_by:me}&page=1&count=2 2 | -------------------------------------------------------------------------------- /dev/api/requests/shelves-create.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "My shelf", 3 | "description_html": "This is my shelf with some books
", 4 | "books": [5,1,3], 5 | "tags": [ 6 | {"name": "Category", "value": "Learning"} 7 | ] 8 | } -------------------------------------------------------------------------------- /dev/api/requests/shelves-update.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "My updated shelf", 3 | "description_html": "This is my updated shelf with some books
", 4 | "books": [5,1,3] 5 | } -------------------------------------------------------------------------------- /dev/api/requests/users-create.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Dan Brown", 3 | "email": "dannyb@example.com", 4 | "roles": [1], 5 | "language": "fr", 6 | "send_invite": true 7 | } -------------------------------------------------------------------------------- /dev/api/requests/users-delete.json: -------------------------------------------------------------------------------- 1 | { 2 | "migrate_ownership_id": 5 3 | } -------------------------------------------------------------------------------- /dev/api/requests/users-update.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Dan Spaggleforth", 3 | "email": "dspaggles@example.com", 4 | "roles": [2], 5 | "language": "de", 6 | "password": "hunter2000" 7 | } -------------------------------------------------------------------------------- /dev/api/responses/attachments-create.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 5, 3 | "name": "My uploaded attachment", 4 | "extension": "", 5 | "uploaded_to": 8, 6 | "external": true, 7 | "order": 2, 8 | "created_by": 1, 9 | "updated_by": 1, 10 | "created_at": "2021-10-20T06:35:46.000000Z", 11 | "updated_at": "2021-10-20T06:35:46.000000Z" 12 | } -------------------------------------------------------------------------------- /dev/api/responses/attachments-update.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 5, 3 | "name": "My updated attachment", 4 | "extension": "", 5 | "uploaded_to": 4, 6 | "external": true, 7 | "order": 2, 8 | "created_by": 1, 9 | "updated_by": 1, 10 | "created_at": "2021-10-20T06:35:46.000000Z", 11 | "updated_at": "2021-10-20T06:37:11.000000Z" 12 | } -------------------------------------------------------------------------------- /dev/api/responses/books-update.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 226, 3 | "name": "My updated book", 4 | "slug": "my-updated-book", 5 | "description": "This is my book with updated details", 6 | "created_at": "2023-12-22T14:22:28.000000Z", 7 | "updated_at": "2023-12-22T14:24:07.000000Z", 8 | "created_by": 1, 9 | "updated_by": 1, 10 | "owned_by": 1, 11 | "default_template_id": 2427, 12 | "description_html": "This is my book with updated<\/em> details<\/p>",
13 | "tags": [
14 | {
15 | "name": "Subject",
16 | "value": "Updates",
17 | "order": 0
18 | }
19 | ],
20 | "cover": null
21 | }
--------------------------------------------------------------------------------
/dev/api/responses/recycle-bin-destroy.json:
--------------------------------------------------------------------------------
1 | {
2 | "delete_count": 2
3 | }
--------------------------------------------------------------------------------
/dev/api/responses/recycle-bin-restore.json:
--------------------------------------------------------------------------------
1 | {
2 | "restore_count": 2
3 | }
--------------------------------------------------------------------------------
/dev/api/responses/roles-create.json:
--------------------------------------------------------------------------------
1 | {
2 | "display_name": "Book Maintainer",
3 | "description": "People who maintain books",
4 | "mfa_enforced": true,
5 | "updated_at": "2023-02-19T15:38:40.000000Z",
6 | "created_at": "2023-02-19T15:38:40.000000Z",
7 | "id": 26,
8 | "permissions": [
9 | "book-delete-all",
10 | "book-update-all",
11 | "book-view-all",
12 | "restrictions-manage-all"
13 | ],
14 | "users": []
15 | }
--------------------------------------------------------------------------------
/dev/api/responses/roles-read.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": 26,
3 | "display_name": "Book Maintainer",
4 | "description": "People who maintain books",
5 | "created_at": "2023-02-19T15:38:40.000000Z",
6 | "updated_at": "2023-02-19T15:38:40.000000Z",
7 | "system_name": "",
8 | "external_auth_id": "",
9 | "mfa_enforced": true,
10 | "permissions": [
11 | "book-delete-all",
12 | "book-update-all",
13 | "book-view-all",
14 | "restrictions-manage-all"
15 | ],
16 | "users": [
17 | {
18 | "id": 11,
19 | "name": "Barry Scott",
20 | "slug": "barry-scott"
21 | }
22 | ]
23 | }
--------------------------------------------------------------------------------
/dev/api/responses/shelves-create.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": 20,
3 | "name": "My shelf",
4 | "slug": "my-shelf",
5 | "description": "This is my shelf with some books",
6 | "created_by": 1,
7 | "updated_by": 1,
8 | "created_at": "2023-12-22T14:33:52.000000Z",
9 | "updated_at": "2023-12-22T14:33:52.000000Z",
10 | "owned_by": 1,
11 | "description_html": " This is my shelf<\/strong> with some books<\/p>",
12 | "tags": [
13 | {
14 | "name": "Category",
15 | "value": "Learning",
16 | "order": 0
17 | }
18 | ],
19 | "cover": null
20 | }
--------------------------------------------------------------------------------
/dev/api/responses/shelves-update.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": 20,
3 | "name": "My updated shelf",
4 | "slug": "my-updated-shelf",
5 | "description": "This is my updated shelf with some books",
6 | "created_by": 1,
7 | "updated_by": 1,
8 | "created_at": "2023-12-22T14:33:52.000000Z",
9 | "updated_at": "2023-12-22T14:35:00.000000Z",
10 | "owned_by": 1,
11 | "description_html": " This is my updated shelf<\/em> with some books<\/p>",
12 | "tags": [
13 | {
14 | "name": "Category",
15 | "value": "Learning",
16 | "order": 0
17 | }
18 | ],
19 | "cover": null
20 | }
--------------------------------------------------------------------------------
/dev/api/responses/system-read.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "v25.02.4",
3 | "instance_id": "1234abcd-cc12-7808-af0a-264cb0cbd611",
4 | "app_name": "My BookStack Instance",
5 | "app_logo": "https://docs.example.com/uploads/images/system/2025-05/cat-icon.png",
6 | "base_url": "https://docs.example.com"
7 | }
--------------------------------------------------------------------------------
/dev/api/responses/users-create.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": 1,
3 | "name": "Dan Brown",
4 | "email": "dannyb@example.com",
5 | "created_at": "2022-02-03T16:27:55.000000Z",
6 | "updated_at": "2022-02-03T16:27:55.000000Z",
7 | "external_auth_id": "abc123456",
8 | "slug": "dan-brown",
9 | "last_activity_at": "2022-02-03T16:27:55.000000Z",
10 | "profile_url": "https://docs.example.com/user/dan-brown",
11 | "edit_url": "https://docs.example.com/settings/users/1",
12 | "avatar_url": "https://docs.example.com/uploads/images/user/2021-10/thumbs-50-50/profile-2021.jpg",
13 | "roles": [
14 | {
15 | "id": 1,
16 | "display_name": "Admin"
17 | }
18 | ]
19 | }
--------------------------------------------------------------------------------
/dev/api/responses/users-read.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": 1,
3 | "name": "Dan Brown",
4 | "email": "dannyb@example.com",
5 | "created_at": "2022-02-03T16:27:55.000000Z",
6 | "updated_at": "2022-02-03T16:27:55.000000Z",
7 | "external_auth_id": "abc123456",
8 | "slug": "dan-brown",
9 | "last_activity_at": "2022-02-03T16:27:55.000000Z",
10 | "profile_url": "https://docs.example.com/user/dan-brown",
11 | "edit_url": "https://docs.example.com/settings/users/1",
12 | "avatar_url": "https://docs.example.com/uploads/images/user/2021-10/thumbs-50-50/profile-2021.jpg",
13 | "roles": [
14 | {
15 | "id": 1,
16 | "display_name": "Admin"
17 | }
18 | ]
19 | }
--------------------------------------------------------------------------------
/dev/build/svg-blank-transform.js:
--------------------------------------------------------------------------------
1 | // This is a basic transformer stub to help jest handle SVG files.
2 | // Essentially blanks them since we don't really need to involve them
3 | // in our tests (yet).
4 | module.exports = {
5 | process() {
6 | return {
7 | code: 'module.exports = \'\';',
8 | };
9 | },
10 | getCacheKey() {
11 | // The output is always the same.
12 | return 'svgTransform';
13 | },
14 | };
15 |
--------------------------------------------------------------------------------
/dev/checksums/.gitignore:
--------------------------------------------------------------------------------
1 | !.gitignore
--------------------------------------------------------------------------------
/dev/checksums/vendor:
--------------------------------------------------------------------------------
1 | 22e02ee72d21ff719c1073abbec8302f8e2096ba6d072e133051064ed24b45b1
2 |
--------------------------------------------------------------------------------
/dev/docker/entrypoint.app.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | env
6 |
7 | if [[ -n "$1" ]]; then
8 | exec "$@"
9 | else
10 | composer install
11 | wait-for-it db:3306 -t 45
12 | php artisan migrate --database=mysql --force
13 | chown -R www-data storage public/uploads bootstrap/cache
14 | exec apache2-foreground
15 | fi
16 |
--------------------------------------------------------------------------------
/dev/docker/entrypoint.node.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | set -e
4 |
5 | npm install
6 | npm rebuild node-sass
7 |
8 | SHELL=/bin/sh exec npm run watch
9 |
--------------------------------------------------------------------------------
/dev/docker/init.db/01.sql:
--------------------------------------------------------------------------------
1 | # create test database
2 | CREATE DATABASE IF NOT EXISTS `bookstack-test`;
3 |
4 | # grant rights
5 | GRANT ALL PRIVILEGES ON `bookstack-test`.* TO 'bookstack-test'@'%';
6 |
--------------------------------------------------------------------------------
/dev/docker/php/conf.d/xdebug.ini:
--------------------------------------------------------------------------------
1 | zend_extension=xdebug
2 |
3 | [xdebug]
4 | xdebug.mode=debug
5 | xdebug.client_host=host.docker.internal
6 | xdebug.start_with_request=yes
7 | xdebug.client_port=9090
--------------------------------------------------------------------------------
/lang/ar/pagination.php:
--------------------------------------------------------------------------------
1 | '« السابق',
10 | 'next' => 'التالي »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/ar/passwords.php:
--------------------------------------------------------------------------------
1 | 'يجب أن تتكون كلمة السر من ستة أحرف على الأقل وأن تطابق التأكيد.',
10 | 'user' => "لم يتم العثور على مستخدم بعنوان البريد الإلكتروني المعطى.",
11 | 'token' => 'رمز إعادة تعيين كلمة السر غير صالح لعنوان هذا البريد الإلكتروني.',
12 | 'sent' => 'تم إرسال رابط تجديد كلمة السر إلى بريدكم الإلكتروني!',
13 | 'reset' => 'تم تجديد كلمة السر الخاصة بكم!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/bg/pagination.php:
--------------------------------------------------------------------------------
1 | '« Предишна',
10 | 'next' => 'Следваща »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/bg/passwords.php:
--------------------------------------------------------------------------------
1 | 'Паролите трябва да имат поне 8 символа и да съвпадат с потвърждението.',
10 | 'user' => "Не може да се намери потребител с този имейл адрес.",
11 | 'token' => 'Кодът за възстановяване на паролата е невалиден за този емейл адрес.',
12 | 'sent' => 'На имейла ти е изпратена връзка за възстановяване на паролата ти!',
13 | 'reset' => 'Парола ти е възстановена!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/bn/pagination.php:
--------------------------------------------------------------------------------
1 | '« পূর্ববর্তী',
10 | 'next' => 'পরবর্তী »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/bs/pagination.php:
--------------------------------------------------------------------------------
1 | '« Prethodna',
10 | 'next' => 'Sljedeća »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/bs/passwords.php:
--------------------------------------------------------------------------------
1 | 'Lozinke moraju sadržavati najmanje osam karaktera i podudarati se sa potvrdom lozinke.',
10 | 'user' => "Ne možemo naći korisnika sa tom e-mail adresom.",
11 | 'token' => 'Token za poništavanje lozinke nije validan za ovu e-mail adresu.',
12 | 'sent' => 'Poslali smo link za poništavanje vaše lozinke na e-mail!',
13 | 'reset' => 'Vaša lozinka je resetovana!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/ca/pagination.php:
--------------------------------------------------------------------------------
1 | '« Anterior',
10 | 'next' => 'Següent »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/cs/pagination.php:
--------------------------------------------------------------------------------
1 | '« Předchozí',
10 | 'next' => 'Další »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/cs/passwords.php:
--------------------------------------------------------------------------------
1 | 'Heslo musí mít alespoň osm znaků a shodovat se v obou polích.',
10 | 'user' => "Uživatel s touto e-mailovou adresou nebyl nalezen.",
11 | 'token' => 'Token pro obnovení hesla není platný pro tuto e-mailovou adresu.',
12 | 'sent' => 'Poslali jsme Vám e-mail s odkazem pro obnovení hesla!',
13 | 'reset' => 'Vaše heslo bylo obnoveno!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/cy/pagination.php:
--------------------------------------------------------------------------------
1 | '« Cynt',
10 | 'next' => 'Nesa »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/da/pagination.php:
--------------------------------------------------------------------------------
1 | '« Forrige',
10 | 'next' => 'Næste »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/de/pagination.php:
--------------------------------------------------------------------------------
1 | '« Vorherige',
10 | 'next' => 'Nächste »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/de_informal/pagination.php:
--------------------------------------------------------------------------------
1 | '« Vorherige',
10 | 'next' => 'Nächste »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/el/pagination.php:
--------------------------------------------------------------------------------
1 | '« Προηγούμενο',
10 | 'next' => 'Επόμενο »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/en/pagination.php:
--------------------------------------------------------------------------------
1 | '« Previous',
10 | 'next' => 'Next »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/en/passwords.php:
--------------------------------------------------------------------------------
1 | 'Passwords must be at least eight characters and match the confirmation.',
10 | 'user' => "We can't find a user with that e-mail address.",
11 | 'token' => 'The password reset token is invalid for this email address.',
12 | 'sent' => 'We have e-mailed your password reset link!',
13 | 'reset' => 'Your password has been reset!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/es/pagination.php:
--------------------------------------------------------------------------------
1 | '« Anterior',
10 | 'next' => 'Siguiente »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/es_AR/pagination.php:
--------------------------------------------------------------------------------
1 | '« Anterior',
10 | 'next' => 'Siguiente »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/et/pagination.php:
--------------------------------------------------------------------------------
1 | '« Eelmine',
10 | 'next' => 'Järgmine »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/et/passwords.php:
--------------------------------------------------------------------------------
1 | 'Paroolides peab olema vähemalt kaheksa tähemärki ja nad peavad omavahel ühtima.',
10 | 'user' => "Sellise e-posti aadressiga kasutajat ei leitud.",
11 | 'token' => 'Parooli lähtestamise link ei kehti selle e-posti aadressiga.',
12 | 'sent' => 'Parooli lähtestamise link saadeti e-postiga!',
13 | 'reset' => 'Parool on lähtestatud!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/eu/pagination.php:
--------------------------------------------------------------------------------
1 | '« Aurrekoa',
10 | 'next' => 'Hurrengoa »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/fa/pagination.php:
--------------------------------------------------------------------------------
1 | '« قبلی',
10 | 'next' => 'بعدی »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/fa/passwords.php:
--------------------------------------------------------------------------------
1 | 'گذرواژه باید حداقل هشت حرف و با تایید مطابقت داشته باشد.',
10 | 'user' => "ما کاربری با این نشانی ایمیل نداریم.",
11 | 'token' => 'مشخصهی بازگردانی رمز عبور معتبر نیست.',
12 | 'sent' => 'لینک بازگردانی رمز عبور به ایمیل شما ارسال شد!',
13 | 'reset' => 'رمز عبور شما بازگردانی شد!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/fi/pagination.php:
--------------------------------------------------------------------------------
1 | '« Edellinen',
10 | 'next' => 'Seuraava »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/fi/passwords.php:
--------------------------------------------------------------------------------
1 | 'Salasanan on oltava vähintään kahdeksan merkkiä pitkä ja täsmättävä vahvistuksen kanssa.',
10 | 'user' => "Emme löydä käyttäjää, jolla on kyseinen sähköpostiosoite.",
11 | 'token' => 'Salasanan palautuslinkki ei täsmää sähköpostin kanssa.',
12 | 'sent' => 'Olemme lähettäneet salasanasi palautuslinkin sähköpostitse!',
13 | 'reset' => 'Salasanasi on palautettu!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/fr/pagination.php:
--------------------------------------------------------------------------------
1 | '« Précédent',
10 | 'next' => 'Suivant »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/he/pagination.php:
--------------------------------------------------------------------------------
1 | '« הקודם',
10 | 'next' => 'הבא »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/he/passwords.php:
--------------------------------------------------------------------------------
1 | 'הסיסמא חייבת להיות בעלת 8 תווים לפחות ולהתאים לאימות.',
10 | 'user' => "לא נמצא משתמש קיים עם כתובת דוא\"ל זו.",
11 | 'token' => 'הקישור לאיפוס הסיסמה לא תקף עבור כתובת דוא"ל זו.',
12 | 'sent' => 'שלחנו לך דוא"ל עם קישור לאיפוס הסיסמא!',
13 | 'reset' => 'איפוס הסיסמה הושלם בהצלחה!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/hr/pagination.php:
--------------------------------------------------------------------------------
1 | '« Prethodno',
10 | 'next' => 'Sljedeće »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/hr/passwords.php:
--------------------------------------------------------------------------------
1 | 'Lozinka mora imati najmanje 8 znakova i biti potvrđena.',
10 | 'user' => "Ne možemo pronaći korisnika s tom adresom e-pošte.",
11 | 'token' => 'Ponovno postavljanje lozinke nemoguće putem ove adrese.',
12 | 'sent' => 'Na vašu email adresu poslana je poveznica za ponovno postavljanje!',
13 | 'reset' => 'Vaša je lozinka ponovno postavljena!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/hu/pagination.php:
--------------------------------------------------------------------------------
1 | '« Előző',
10 | 'next' => 'Következő »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/id/pagination.php:
--------------------------------------------------------------------------------
1 | '« Sebelumnya',
10 | 'next' => 'Lanjut »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/is/pagination.php:
--------------------------------------------------------------------------------
1 | '« Fyrri',
10 | 'next' => 'Næsta»',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/is/passwords.php:
--------------------------------------------------------------------------------
1 | 'Lykilorð verður að vera að lágmarki 8 stafir og stemma saman.',
10 | 'user' => "Enginn notandi finnst með þetta netfang.",
11 | 'token' => 'Tókinn er ógildur fyrir þetta netfang.',
12 | 'sent' => 'Þér hefur verið sendur hlekkur í tölvupósti!',
13 | 'reset' => 'Lykilorðinu hefur verið breytt!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/it/pagination.php:
--------------------------------------------------------------------------------
1 | '« Precedente',
10 | 'next' => 'Successivo »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/ja/pagination.php:
--------------------------------------------------------------------------------
1 | '« 前',
10 | 'next' => '次 »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/ja/passwords.php:
--------------------------------------------------------------------------------
1 | 'パスワードは6文字以上である必要があります。',
10 | 'user' => "このEメールアドレスに一致するユーザが見つかりませんでした。",
11 | 'token' => 'このメールアドレスのパスワードリセットトークンは無効です。',
12 | 'sent' => 'パスワードリセットリンクを送信しました。',
13 | 'reset' => 'パスワードはリセットされました。',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/ka/pagination.php:
--------------------------------------------------------------------------------
1 | '« Previous',
10 | 'next' => 'Next »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/ka/passwords.php:
--------------------------------------------------------------------------------
1 | 'Passwords must be at least eight characters and match the confirmation.',
10 | 'user' => "We can't find a user with that e-mail address.",
11 | 'token' => 'The password reset token is invalid for this email address.',
12 | 'sent' => 'We have e-mailed your password reset link!',
13 | 'reset' => 'Your password has been reset!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/ko/pagination.php:
--------------------------------------------------------------------------------
1 | '« 이전',
10 | 'next' => '다음 »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/ko/passwords.php:
--------------------------------------------------------------------------------
1 | '최소 8글자 이상이어야 합니다.',
10 | 'user' => "메일 주소를 가진 사용자가 없습니다.",
11 | 'token' => '유효하지 않거나 만료된 토큰입니다.',
12 | 'sent' => '메일을 보냈습니다.',
13 | 'reset' => '패스워드가 초기화되었습니다.',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/ku/pagination.php:
--------------------------------------------------------------------------------
1 | '« Previous',
10 | 'next' => 'Next »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/ku/passwords.php:
--------------------------------------------------------------------------------
1 | 'Passwords must be at least eight characters and match the confirmation.',
10 | 'user' => "We can't find a user with that e-mail address.",
11 | 'token' => 'The password reset token is invalid for this email address.',
12 | 'sent' => 'We have e-mailed your password reset link!',
13 | 'reset' => 'Your password has been reset!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/lt/pagination.php:
--------------------------------------------------------------------------------
1 | '« Ankstesnis',
10 | 'next' => 'Kitas »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/lv/pagination.php:
--------------------------------------------------------------------------------
1 | '« Iepriekšējais',
10 | 'next' => 'Nākamais »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/lv/passwords.php:
--------------------------------------------------------------------------------
1 | 'Parolēm jābūt vismaz astoņu simbolu garām un jāatbilst apstiprinājumam.',
10 | 'user' => "Mēs nevaram atrast lietotāju ar šādu e-pasta adresi.",
11 | 'token' => 'Paroles atiestatīšanas atslēga neatbilst šai e-pasta adresei.',
12 | 'sent' => 'Esam nosūtījuši paroles atiestatīšanas saiti!',
13 | 'reset' => 'Parole ir atiestatīta!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/nb/pagination.php:
--------------------------------------------------------------------------------
1 | '« Forrige',
10 | 'next' => 'Neste »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/nl/pagination.php:
--------------------------------------------------------------------------------
1 | '« Vorige',
10 | 'next' => 'Volgende »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/nn/pagination.php:
--------------------------------------------------------------------------------
1 | '« Førre',
10 | 'next' => 'Neste »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/pl/pagination.php:
--------------------------------------------------------------------------------
1 | '« Poprzednia',
10 | 'next' => 'Następna »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/pl/passwords.php:
--------------------------------------------------------------------------------
1 | 'Hasło musi zawierać co najmniej 6 znaków i być zgodne z powtórzeniem.',
10 | 'user' => "Nie znaleziono użytkownika o takim adresie e-mail.",
11 | 'token' => 'Token resetowania hasła jest nieprawidłowy dla tego adresu e-mail.',
12 | 'sent' => 'Wysłaliśmy Ci link do resetowania hasła!',
13 | 'reset' => 'Twoje hasło zostało zresetowane!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/pt/pagination.php:
--------------------------------------------------------------------------------
1 | '« Anterior',
10 | 'next' => 'Seguinte »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/pt_BR/pagination.php:
--------------------------------------------------------------------------------
1 | '« Anterior',
10 | 'next' => 'Próximo »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/ro/pagination.php:
--------------------------------------------------------------------------------
1 | '« Înapoi',
10 | 'next' => 'Înainte »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/ru/pagination.php:
--------------------------------------------------------------------------------
1 | '« Предыдущая',
10 | 'next' => 'Следующая »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/sk/pagination.php:
--------------------------------------------------------------------------------
1 | '« Predchádzajúca',
10 | 'next' => 'Ďalšia »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/sk/passwords.php:
--------------------------------------------------------------------------------
1 | 'Heslo musí obsahovať aspoň osem znakov a musí byť rovnaké ako potvrdzujúce.',
10 | 'user' => "Nenašli sme používateľa s takou emailovou adresou.",
11 | 'token' => 'Token na obnovenie hesla je pre túto e-mailovú adresu neplatný.',
12 | 'sent' => 'Poslali sme Vám email s odkazom na reset hesla!',
13 | 'reset' => 'Vaše heslo bolo resetované!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/sl/pagination.php:
--------------------------------------------------------------------------------
1 | '« Nazaj',
10 | 'next' => 'Naprej »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/sl/passwords.php:
--------------------------------------------------------------------------------
1 | 'Gesla morajo biti najmanj osem znakov dolga in se morajo ujemati s potrditvijo.',
10 | 'user' => "Ne moremo najti uporabnika s tem e-poštnim naslovom.",
11 | 'token' => 'Žeton za ponastavitev gesla ni veljaven za ta e-poštni naslov.',
12 | 'sent' => 'Poslali smo vam povezavo za ponastavitev gesla!',
13 | 'reset' => 'Vaše geslo je bilo ponastavljeno!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/sq/pagination.php:
--------------------------------------------------------------------------------
1 | '« Previous',
10 | 'next' => 'Next »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/sq/passwords.php:
--------------------------------------------------------------------------------
1 | 'Passwords must be at least eight characters and match the confirmation.',
10 | 'user' => "We can't find a user with that e-mail address.",
11 | 'token' => 'The password reset token is invalid for this email address.',
12 | 'sent' => 'We have e-mailed your password reset link!',
13 | 'reset' => 'Your password has been reset!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/sr/pagination.php:
--------------------------------------------------------------------------------
1 | '« Previous',
10 | 'next' => 'Next »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/sr/passwords.php:
--------------------------------------------------------------------------------
1 | 'Passwords must be at least eight characters and match the confirmation.',
10 | 'user' => "We can't find a user with that e-mail address.",
11 | 'token' => 'The password reset token is invalid for this email address.',
12 | 'sent' => 'We have e-mailed your password reset link!',
13 | 'reset' => 'Your password has been reset!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/sv/pagination.php:
--------------------------------------------------------------------------------
1 | '« Föregående',
10 | 'next' => 'Nästa »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/tk/pagination.php:
--------------------------------------------------------------------------------
1 | '« Previous',
10 | 'next' => 'Next »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/tk/passwords.php:
--------------------------------------------------------------------------------
1 | 'Passwords must be at least eight characters and match the confirmation.',
10 | 'user' => "We can't find a user with that e-mail address.",
11 | 'token' => 'The password reset token is invalid for this email address.',
12 | 'sent' => 'We have e-mailed your password reset link!',
13 | 'reset' => 'Your password has been reset!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/tr/pagination.php:
--------------------------------------------------------------------------------
1 | '« Önceki',
10 | 'next' => 'Sonraki »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/tr/passwords.php:
--------------------------------------------------------------------------------
1 | 'Şifreniz en az 6 karakterden oluşmalı ve her iki şifre de birbiri ile eşleşmelidir.',
10 | 'user' => "Bu e-posta adresine sahip bir kullanıcı bulamadık.",
11 | 'token' => 'Şifre sıfırlama anahtarı, bu e-posta adresi için geçersizdir.',
12 | 'sent' => 'Şifre sıfırlama bağlantısını e-posta adresinize gönderdik!',
13 | 'reset' => 'Şifreniz sıfırlandı!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/uk/pagination.php:
--------------------------------------------------------------------------------
1 | '« Попередня',
10 | 'next' => 'Наступна »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/uz/pagination.php:
--------------------------------------------------------------------------------
1 | '« Oldingi',
10 | 'next' => 'Kegingi »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/vi/pagination.php:
--------------------------------------------------------------------------------
1 | '« Trước',
10 | 'next' => 'Tiếp »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/zh_CN/pagination.php:
--------------------------------------------------------------------------------
1 | '« 上一页',
10 | 'next' => '下一页 »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/zh_CN/passwords.php:
--------------------------------------------------------------------------------
1 | '密码必须至少包含六个字符并与确认相符。',
10 | 'user' => "使用该Email地址的用户不存在。",
11 | 'token' => '重置密码链接无法发送至此邮件地址。',
12 | 'sent' => '我们已经通过Email发送您的密码重置链接!',
13 | 'reset' => '您的密码已被重置!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/lang/zh_TW/pagination.php:
--------------------------------------------------------------------------------
1 | '« 上一頁',
10 | 'next' => '下一頁 »',
11 |
12 | ];
13 |
--------------------------------------------------------------------------------
/lang/zh_TW/passwords.php:
--------------------------------------------------------------------------------
1 | '密碼必須至少八個字元,並與確認密碼相符。',
10 | 'user' => "沒有使用這個電子郵件位址的使用者。",
11 | 'token' => '這個電子郵件地址的密碼重設權杖無效。',
12 | 'sent' => '我們已經透過電子郵件發送您的密碼重設連結。',
13 | 'reset' => '您的密碼已被重設!',
14 |
15 | ];
16 |
--------------------------------------------------------------------------------
/phpstan.neon.dist:
--------------------------------------------------------------------------------
1 | includes:
2 | - ./vendor/larastan/larastan/extension.neon
3 |
4 | parameters:
5 |
6 | paths:
7 | - app
8 |
9 | # The level 8 is the highest level
10 | level: 1
11 |
12 | phpVersion:
13 | min: 80200
14 | max: 80400
15 |
16 | bootstrapFiles:
17 | - bootstrap/phpstan.php
18 |
19 | ignoreErrors:
20 | # - '#PHPDoc tag @throws with type .*?Psr\\SimpleCache\\InvalidArgumentException.*? is not subtype of Throwable#'
21 |
22 | excludePaths:
23 | - ./Config/**/*.php
24 | - ./dev/**/*.php
--------------------------------------------------------------------------------
/public/book_default_cover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/public/book_default_cover.png
--------------------------------------------------------------------------------
/public/icon-128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/public/icon-128.png
--------------------------------------------------------------------------------
/public/icon-180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/public/icon-180.png
--------------------------------------------------------------------------------
/public/icon-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/public/icon-32.png
--------------------------------------------------------------------------------
/public/icon-64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/public/icon-64.png
--------------------------------------------------------------------------------
/public/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/public/icon.ico
--------------------------------------------------------------------------------
/public/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/public/icon.png
--------------------------------------------------------------------------------
/public/libs/tinymce/langs/README.md:
--------------------------------------------------------------------------------
1 | This is where language files should be placed.
2 |
3 | Please DO NOT translate these directly, use this service instead: https://crowdin.com/project/tinymce
4 |
--------------------------------------------------------------------------------
/public/libs/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.js:
--------------------------------------------------------------------------------
1 | tinymce.Resource.add('ui/tinymce-5-dark/skin.shadowdom.css', "body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}")
2 | //# sourceMappingURL=skin.shadowdom.js.map
3 |
--------------------------------------------------------------------------------
/public/libs/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css:
--------------------------------------------------------------------------------
1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}
2 |
--------------------------------------------------------------------------------
/public/libs/tinymce/skins/ui/tinymce-5/skin.shadowdom.js:
--------------------------------------------------------------------------------
1 | tinymce.Resource.add('ui/tinymce-5/skin.shadowdom.css', "body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}")
2 | //# sourceMappingURL=skin.shadowdom.js.map
3 |
--------------------------------------------------------------------------------
/public/libs/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css:
--------------------------------------------------------------------------------
1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}
2 |
--------------------------------------------------------------------------------
/public/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/public/loading.gif
--------------------------------------------------------------------------------
/public/loading_error.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/public/loading_error.png
--------------------------------------------------------------------------------
/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/public/logo.png
--------------------------------------------------------------------------------
/public/uploads/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 | !.htaccess
--------------------------------------------------------------------------------
/public/uploads/.htaccess:
--------------------------------------------------------------------------------
1 | Options -Indexes
--------------------------------------------------------------------------------
/public/user_avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/public/user_avatar.png
--------------------------------------------------------------------------------
/resources/icons/add-circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/add-small.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/add.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/archive.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/attach.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/auth/azure.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/auth/okta.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/auth/twitch.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/auto-sort.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/icons/back.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/book.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/bookmark.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/books.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/bookshelf.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/cancel.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/caret-down-large.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/icons/caret-down.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/caret-left-circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/caret-right-circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/caret-right.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/chapter.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/check-circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/check.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/chevron-down.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/chevron-right.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/chevron-up.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/close.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/comment.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/copy.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/danger.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/dark-mode.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/delete.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/download.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/drawing.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/edit.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/about.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/align-center.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/align-justify.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/align-left.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/align-right.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/bold.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/code-block.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/code.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/color-clear.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/details-toggle.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/icons/editor/details.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/diagram.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/direction-ltr.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/direction-rtl.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/format-clear.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/fullscreen.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/highlighter.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/horizontal-rule.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/image-search.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/image.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/indent-decrease.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/indent-increase.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/italic.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/link.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/list-bullet.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/list-check.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/list-numbered.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/media.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/more-horizontal.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/redo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/source-view.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/strikethrough.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/subscript.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/superscript.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/table-delete-column.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/table-delete-row.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/table-delete.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/table-insert-column-after.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/table-insert-column-before.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/table-insert-row-above.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/table-insert-row-below.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/table.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/text-color.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/icons/editor/underlined.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/undo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/editor/unlink.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/expand-text.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/export.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/file.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/folder.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/fullscreen.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/grid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/grip.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/groups.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/history.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/image.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/images.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/include.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/info-filled.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/info.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/leaderboard.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/light-mode.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/link.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/list.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/lock-open.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/lock.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/login.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/logout.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/more.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/new-user.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/notifications.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/oidc.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/open-book.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/page.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/palette.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/permission.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/popular.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/remove.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/reply.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/role.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/saml2.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/save.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/search.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/security.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/shortcuts.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/sort-down.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/sort-up.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/sort.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/spanner.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/star-circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/star-outline.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/star.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/swap-horizontal.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/swap-vertical.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/tag.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/template.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/time.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/upload.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/user-preferences.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/user.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/users-add.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/users.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/warning.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/watch-ignore.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/icons/watch.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/js/components/auto-submit.js:
--------------------------------------------------------------------------------
1 | import {Component} from './component';
2 |
3 | export class AutoSubmit extends Component {
4 |
5 | setup() {
6 | this.form = this.$el;
7 |
8 | this.form.submit();
9 | }
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/resources/js/components/code-highlighter.js:
--------------------------------------------------------------------------------
1 | import {Component} from './component';
2 |
3 | export class CodeHighlighter extends Component {
4 |
5 | setup() {
6 | const container = this.$el;
7 |
8 | const codeBlocks = container.querySelectorAll('pre');
9 | if (codeBlocks.length > 0) {
10 | window.importVersioned('code').then(Code => {
11 | Code.highlightWithin(container);
12 | });
13 | }
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/resources/js/components/code-textarea.js:
--------------------------------------------------------------------------------
1 | /**
2 | * A simple component to render a code editor within the textarea
3 | * this exists upon.
4 | */
5 | import {Component} from './component';
6 |
7 | export class CodeTextarea extends Component {
8 |
9 | async setup() {
10 | const {mode} = this.$opts;
11 | const Code = await window.importVersioned('code');
12 | Code.inlineEditor(this.$el, mode);
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/resources/js/custom.d.ts:
--------------------------------------------------------------------------------
1 | declare module '*.svg' {
2 | const content: string;
3 | export default content;
4 | }
--------------------------------------------------------------------------------
/resources/js/global.d.ts:
--------------------------------------------------------------------------------
1 | import {ComponentStore} from "./services/components";
2 | import {EventManager} from "./services/events";
3 | import {HttpManager} from "./services/http";
4 | import {Translator} from "./services/translations";
5 |
6 | declare global {
7 | const __DEV__: boolean;
8 |
9 | interface Window {
10 | __DEV__: boolean;
11 | $components: ComponentStore;
12 | $events: EventManager;
13 | $trans: Translator;
14 | $http: HttpManager;
15 | baseUrl: (path: string) => string;
16 | importVersioned: (module: string) => Promise