├── .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; 17 | } 18 | } -------------------------------------------------------------------------------- /resources/js/services/dates.ts: -------------------------------------------------------------------------------- 1 | export function getCurrentDay(): string { 2 | const date = new Date(); 3 | const month = date.getMonth() + 1; 4 | const day = date.getDate(); 5 | 6 | return `${date.getFullYear()}-${(month > 9 ? '' : '0') + month}-${(day > 9 ? '' : '0') + day}`; 7 | } 8 | 9 | export function utcTimeStampToLocalTime(timestamp: number): string { 10 | const date = new Date(timestamp * 1000); 11 | const hours = date.getHours(); 12 | const mins = date.getMinutes(); 13 | return `${(hours > 9 ? '' : '0') + hours}:${(mins > 9 ? '' : '0') + mins}`; 14 | } 15 | -------------------------------------------------------------------------------- /resources/js/services/store.ts: -------------------------------------------------------------------------------- 1 | export {get, set, del} from 'idb-keyval'; 2 | -------------------------------------------------------------------------------- /resources/js/services/text.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Convert a kebab-case string to camelCase 3 | */ 4 | export function kebabToCamel(kebab: string): string { 5 | const ucFirst = (word: string) => word.slice(0, 1).toUpperCase() + word.slice(1); 6 | const words = kebab.split('-'); 7 | return words[0] + words.slice(1).map(ucFirst).join(''); 8 | } 9 | 10 | /** 11 | * Convert a camelCase string to a kebab-case string. 12 | */ 13 | export function camelToKebab(camelStr: string): string { 14 | return camelStr.replace(/[A-Z]/g, (str, offset) => (offset > 0 ? '-' : '') + str.toLowerCase()); 15 | } 16 | -------------------------------------------------------------------------------- /resources/js/wysiwyg-tinymce/plugins-about.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @param {Editor} editor 3 | */ 4 | function register(editor) { 5 | const aboutDialog = { 6 | title: 'About the WYSIWYG Editor', 7 | url: window.baseUrl('/help/tinymce'), 8 | }; 9 | 10 | editor.ui.registry.addButton('about', { 11 | icon: 'help', 12 | tooltip: 'About the editor', 13 | onAction() { 14 | window.tinymce.activeEditor.windowManager.openUrl(aboutDialog); 15 | }, 16 | }); 17 | } 18 | 19 | /** 20 | * @return {register} 21 | */ 22 | export function getPlugin() { 23 | return register; 24 | } 25 | -------------------------------------------------------------------------------- /resources/js/wysiwyg-tinymce/plugins-stub.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @param {Editor} editor 3 | * @param {String} url 4 | */ 5 | function register(editor, url) { 6 | 7 | } 8 | 9 | /** 10 | * @param {WysiwygConfigOptions} options 11 | * @return {register} 12 | */ 13 | export function getPlugin(options) { 14 | return register; 15 | } 16 | -------------------------------------------------------------------------------- /resources/js/wysiwyg-tinymce/util.js: -------------------------------------------------------------------------------- 1 | export const blockElementTypes = [ 2 | 'p', 3 | 'h1', 4 | 'h2', 5 | 'h3', 6 | 'h4', 7 | 'h5', 8 | 'h6', 9 | 'div', 10 | 'blockquote', 11 | 'pre', 12 | 'code-block', 13 | 'details', 14 | 'ul', 15 | 'ol', 16 | 'table', 17 | 'hr', 18 | ]; 19 | -------------------------------------------------------------------------------- /resources/js/wysiwyg/lexical/core/shared/canUseDOM.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Meta Platforms, Inc. and affiliates. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | * 7 | */ 8 | 9 | export const CAN_USE_DOM: boolean = 10 | typeof window !== 'undefined' && 11 | typeof window.document !== 'undefined' && 12 | typeof window.document.createElement !== 'undefined'; 13 | -------------------------------------------------------------------------------- /resources/js/wysiwyg/lexical/core/shared/warnOnlyOnce.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Meta Platforms, Inc. and affiliates. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | * 7 | */ 8 | 9 | export default function warnOnlyOnce(message: string) { 10 | if (!__DEV__) { 11 | return; 12 | } 13 | let run = false; 14 | return () => { 15 | if (!run) { 16 | console.warn(message); 17 | } 18 | run = true; 19 | }; 20 | } 21 | -------------------------------------------------------------------------------- /resources/js/wysiwyg/lexical/selection/constants.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Meta Platforms, Inc. and affiliates. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | * 7 | */ 8 | export const CSS_TO_STYLES: Map> = new Map(); 9 | -------------------------------------------------------------------------------- /resources/js/wysiwyg/lexical/table/constants.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Meta Platforms, Inc. and affiliates. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | * 7 | */ 8 | 9 | export const PIXEL_VALUE_REG_EXP = /^(\d+(?:\.\d+)?)px$/; 10 | 11 | // .PlaygroundEditorTheme__tableCell width value from 12 | // packages/lexical-playground/src/themes/PlaygroundEditorTheme.css 13 | export const COLUMN_WIDTH = 75; 14 | -------------------------------------------------------------------------------- /resources/js/wysiwyg/lexical/utils/px.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Meta Platforms, Inc. and affiliates. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | * 7 | */ 8 | 9 | export default function px(value: number) { 10 | return `${value}px`; 11 | } 12 | -------------------------------------------------------------------------------- /resources/js/wysiwyg/ui/framework/blocks/menu-button.ts: -------------------------------------------------------------------------------- 1 | import {EditorButton} from "../buttons"; 2 | import {el} from "../../../utils/dom"; 3 | import arrowIcon from "@icons/chevron-right.svg" 4 | 5 | export class EditorMenuButton extends EditorButton { 6 | protected buildDOM(): HTMLButtonElement { 7 | const dom = super.buildDOM(); 8 | 9 | const icon = el('div', {class: 'editor-menu-button-icon'}); 10 | icon.innerHTML = arrowIcon; 11 | dom.append(icon); 12 | 13 | return dom; 14 | } 15 | } -------------------------------------------------------------------------------- /resources/js/wysiwyg/ui/framework/blocks/separator.ts: -------------------------------------------------------------------------------- 1 | import {EditorUiElement} from "../core"; 2 | import {el} from "../../../utils/dom"; 3 | 4 | export class EditorSeparator extends EditorUiElement { 5 | buildDOM(): HTMLElement { 6 | return el('div', { 7 | class: 'editor-separator', 8 | }); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /resources/sass/_footer.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Includes the footer links. 3 | */ 4 | 5 | footer { 6 | flex-shrink: 0; 7 | padding: 1rem 1rem 2rem 1rem; 8 | text-align: center; 9 | } 10 | 11 | footer a { 12 | margin: 0 .5em; 13 | } 14 | 15 | body.flexbox footer { 16 | display: none; 17 | } -------------------------------------------------------------------------------- /resources/sass/_opacity.scss: -------------------------------------------------------------------------------- 1 | 2 | .opacity-10 { 3 | opacity: 0.1; 4 | } 5 | .opacity-20 { 6 | opacity: 0.2; 7 | } 8 | .opacity-30 { 9 | opacity: 0.3; 10 | } 11 | .opacity-40 { 12 | opacity: 0.4; 13 | } 14 | .opacity-50 { 15 | opacity: 0.5; 16 | } 17 | .opacity-60 { 18 | opacity: 0.6; 19 | } 20 | .opacity-70 { 21 | opacity: 0.7; 22 | } 23 | .opacity-80 { 24 | opacity: 0.8; 25 | } 26 | .opacity-90 { 27 | opacity: 0.9; 28 | } -------------------------------------------------------------------------------- /resources/sass/_print.scss: -------------------------------------------------------------------------------- 1 | html, body { 2 | font-size: 12px; 3 | background-color: #FFF; 4 | } 5 | 6 | .page-content { 7 | margin: 0 auto; 8 | } 9 | 10 | .print-hidden { 11 | display: none !important; 12 | } 13 | 14 | .tri-layout-container { 15 | grid-template-columns: 1fr; 16 | grid-template-areas: "b"; 17 | margin-inline-start: 0; 18 | margin-inline-end: 0; 19 | display: block; 20 | } 21 | 22 | .card { 23 | box-shadow: none; 24 | } 25 | 26 | .content-wrap.card { 27 | padding-inline-start: 0; 28 | padding-inline-end: 0; 29 | } -------------------------------------------------------------------------------- /resources/views/auth/parts/login-form-oidc.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {!! csrf_field() !!} 3 | 4 |
5 | 9 |
10 | 11 |
12 | -------------------------------------------------------------------------------- /resources/views/auth/parts/login-form-saml2.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {!! csrf_field() !!} 3 | 4 |
5 | 9 |
10 | 11 |
-------------------------------------------------------------------------------- /resources/views/auth/parts/login-message.blade.php: -------------------------------------------------------------------------------- 1 | {{-- This is a placeholder template file provided as a --}} 2 | {{-- convenience to users of the visual theme system. --}} -------------------------------------------------------------------------------- /resources/views/auth/parts/register-message.blade.php: -------------------------------------------------------------------------------- 1 | {{-- This is a placeholder template file provided as a --}} 2 | {{-- convenience to users of the visual theme system. --}} -------------------------------------------------------------------------------- /resources/views/auth/register-confirm.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.simple') 2 | 3 | @section('content') 4 | 5 |
6 |
7 |

{{ trans('auth.register_thanks') }}

8 |

{{ trans('auth.register_confirm', ['appName' => setting('app-name')]) }}

9 |
10 |
11 | 12 | @stop 13 | -------------------------------------------------------------------------------- /resources/views/books/parts/list-item.blade.php: -------------------------------------------------------------------------------- 1 | 2 |
3 | @icon('book') 4 |
5 |
6 |

{{ $book->name }}

7 |
8 |

{{ $book->description }}

9 |
10 |
11 |
-------------------------------------------------------------------------------- /resources/views/books/references.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.simple') 2 | 3 | @section('body') 4 | 5 |
6 | 7 |
8 | @include('entities.breadcrumbs', ['crumbs' => [ 9 | $book, 10 | $book->getUrl('/references') => [ 11 | 'text' => trans('entities.references'), 12 | 'icon' => 'reference', 13 | ] 14 | ]]) 15 |
16 | 17 | @include('entities.references', ['references' => $references]) 18 |
19 | 20 | @stop 21 | -------------------------------------------------------------------------------- /resources/views/chapters/references.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.simple') 2 | 3 | @section('body') 4 | 5 |
6 | 7 |
8 | @include('entities.breadcrumbs', ['crumbs' => [ 9 | $chapter->book, 10 | $chapter, 11 | $chapter->getUrl('/references') => [ 12 | 'text' => trans('entities.references'), 13 | 'icon' => 'reference', 14 | ] 15 | ]]) 16 |
17 | 18 | @include('entities.references', ['references' => $references]) 19 |
20 | 21 | @stop 22 | -------------------------------------------------------------------------------- /resources/views/common/activity-list.blade.php: -------------------------------------------------------------------------------- 1 | 2 | @if(count($activity) > 0) 3 |
4 | @foreach($activity as $activityItem) 5 |
6 | @include('common.activity-item', ['activity' => $activityItem]) 7 |
8 | @endforeach 9 |
10 | @else 11 |

{{ trans('common.no_activity') }}

12 | @endif -------------------------------------------------------------------------------- /resources/views/common/dark-mode-toggle.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {{ csrf_field() }} 3 | {{ method_field('patch') }} 4 | 5 | @if(setting()->getForCurrentUser('dark-mode-enabled')) 6 | 7 | @else 8 | 9 | @endif 10 |
-------------------------------------------------------------------------------- /resources/views/common/detailed-listing-paginated.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.simple') 2 | 3 | @section('body') 4 |
5 |
6 |

{{ $title }}

7 | 8 |
9 | @include('entities.list', ['entities' => $entities, 'style' => 'detailed']) 10 |
11 | 12 |
13 | {!! $entities->links() !!} 14 |
15 |
16 |
17 | @stop -------------------------------------------------------------------------------- /resources/views/common/loading-icon.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | @if(isset($text)) 6 | {{$text}} 7 | @endif 8 |
-------------------------------------------------------------------------------- /resources/views/common/status-indicator.blade.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/views/entities/body-tag-classes.blade.php: -------------------------------------------------------------------------------- 1 | @push('body-class', e((new \BookStack\Activity\Tools\TagClassGenerator($entity->tags->all()))->generateAsString() . ' ')) -------------------------------------------------------------------------------- /resources/views/entities/favourite-action.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $isFavourite = $entity->isFavourite(); 3 | @endphp 4 |
5 | {{ csrf_field() }} 6 | 7 | 8 | 12 |
-------------------------------------------------------------------------------- /resources/views/entities/icon-link.blade.php: -------------------------------------------------------------------------------- 1 | 2 | @icon($entity->getType()) 4 |
5 | {{ $entity->name }} 6 |
7 |
-------------------------------------------------------------------------------- /resources/views/entities/list-basic.blade.php: -------------------------------------------------------------------------------- 1 |
2 | @if(count($entities) > 0) 3 | @foreach($entities as $index => $entity) 4 | @include('entities.list-item-basic', ['entity' => $entity]) 5 | @endforeach 6 | @else 7 |

8 | {{ $emptyText ?? trans('common.no_items') }} 9 |

10 | @endif 11 |
-------------------------------------------------------------------------------- /resources/views/entities/list-item-basic.blade.php: -------------------------------------------------------------------------------- 1 | getType(); ?> 2 | 3 | @icon($type) 4 |
5 |

{{ $entity->preview_name ?? $entity->name }}

6 | {{ $slot ?? '' }} 7 |
8 |
-------------------------------------------------------------------------------- /resources/views/entities/list.blade.php: -------------------------------------------------------------------------------- 1 | @if(count($entities) > 0) 2 |
3 | @foreach($entities as $index => $entity) 4 | @include('entities.list-item', ['entity' => $entity, 'showPath' => $showPath ?? false, 'showTags' => $showTags ?? false]) 5 | @endforeach 6 |
7 | @else 8 |

9 | {{ $emptyText ?? trans('common.no_items') }} 10 |

11 | @endif -------------------------------------------------------------------------------- /resources/views/entities/references.blade.php: -------------------------------------------------------------------------------- 1 |
2 |

{{ trans('entities.references') }}

3 |

{{ trans('entities.references_to_desc') }}

4 | 5 | @if(count($references) > 0) 6 |
7 | @include('entities.list', ['entities' => $references->pluck('from'), 'showPath' => true]) 8 |
9 | @else 10 |

{{ trans('entities.references_none') }}

11 | @endif 12 | 13 |
-------------------------------------------------------------------------------- /resources/views/entities/search-form.blade.php: -------------------------------------------------------------------------------- 1 | {{-- 2 | @label - Placeholder/aria-label text 3 | --}} 4 |
5 | 10 |
-------------------------------------------------------------------------------- /resources/views/entities/search-results.blade.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/views/entities/tag-list.blade.php: -------------------------------------------------------------------------------- 1 | @foreach($entity->tags as $tag) 2 | @include('entities.tag', ['tag' => $tag]) 3 | @endforeach -------------------------------------------------------------------------------- /resources/views/entities/template-selector.blade.php: -------------------------------------------------------------------------------- 1 |
2 |

3 | {{ trans('entities.default_template_explain') }} 4 |

5 | 6 |
7 | @include('form.page-picker', [ 8 | 'name' => 'default_template_id', 9 | 'placeholder' => trans('entities.default_template_select'), 10 | 'value' => $entity->default_template_id ?? null, 11 | 'selectorEndpoint' => '/search/entity-selector-templates', 12 | ]) 13 |
14 |
-------------------------------------------------------------------------------- /resources/views/entities/watch-action.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {{ csrf_field() }} 3 | {{ method_field('PUT') }} 4 | 5 | 6 | 13 |
-------------------------------------------------------------------------------- /resources/views/errors/500.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.base') 2 | 3 | @section('content') 4 | 5 |
6 | 7 |
8 |
9 |

{{ trans('errors.error_occurred') }}

10 |
{{ $message ?? 'An unknown error occurred' }}
11 |

{{ trans('errors.return_home') }}

12 |
13 |
14 | 15 |
16 | 17 | @stop -------------------------------------------------------------------------------- /resources/views/errors/503.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.plain') 2 | 3 | @section('content') 4 |
5 |
6 |
7 |

{{ trans('errors.app_down', ['appName' => setting('app-name')]) }}

8 |

{{ trans('errors.back_soon') }}

9 |
10 |
11 |
12 | @endsection -------------------------------------------------------------------------------- /resources/views/errors/parts/not-found-text.blade.php: -------------------------------------------------------------------------------- 1 | {{--The below text may be dynamic based upon language and scenario.--}} 2 | {{--It's safer to add new text sections here rather than altering existing ones.--}} 3 |

{{ $title }}

4 |
{{ $subtitle }}
5 |

{{ $details }}

-------------------------------------------------------------------------------- /resources/views/exports/chapter.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.export') 2 | 3 | @section('title', $chapter->name) 4 | 5 | @section('content') 6 | 7 |

{{$chapter->name}}

8 |
{!! $chapter->descriptionHtml() !!}
9 | 10 | @include('exports.parts.chapter-contents-menu', ['pages' => $pages]) 11 | 12 | @foreach($pages as $page) 13 | @include('exports.parts.page-item', ['page' => $page, 'chapter' => null]) 14 | @endforeach 15 | 16 | @endsection -------------------------------------------------------------------------------- /resources/views/exports/page.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.export') 2 | 3 | @section('title', $page->name) 4 | 5 | @section('content') 6 | @include('pages.parts.page-display') 7 | 8 |
9 | 10 |
11 | @include('exports.parts.meta', ['entity' => $page]) 12 |
13 | @endsection -------------------------------------------------------------------------------- /resources/views/exports/parts/book-contents-menu.blade.php: -------------------------------------------------------------------------------- 1 | @if(count($children) > 0) 2 |
    3 | @foreach($children as $bookChild) 4 |
  • {{ $bookChild->name }}
  • 5 | @if($bookChild->isA('chapter') && count($bookChild->visible_pages) > 0) 6 | @include('exports.parts.chapter-contents-menu', ['pages' => $bookChild->visible_pages]) 7 | @endif 8 | @endforeach 9 |
10 | @endif -------------------------------------------------------------------------------- /resources/views/exports/parts/chapter-contents-menu.blade.php: -------------------------------------------------------------------------------- 1 | @if (count($pages) > 0) 2 | 7 | @endif -------------------------------------------------------------------------------- /resources/views/exports/parts/chapter-item.blade.php: -------------------------------------------------------------------------------- 1 |
2 |

{{ $chapter->name }}

3 | 4 |
{!! $chapter->descriptionHtml() !!}
5 | 6 | @if(count($chapter->visible_pages) > 0) 7 | @foreach($chapter->visible_pages as $page) 8 | @include('exports.parts.page-item', ['page' => $page, 'chapter' => $chapter]) 9 | @endforeach 10 | @endif -------------------------------------------------------------------------------- /resources/views/exports/parts/custom-head.blade.php: -------------------------------------------------------------------------------- 1 | @inject('headContent', 'BookStack\Theming\CustomHtmlHeadContentProvider') 2 | 3 | @if(setting('app-custom-head')) 4 | 5 | {!! $headContent->forExport() !!} 6 | 7 | @endif -------------------------------------------------------------------------------- /resources/views/exports/parts/page-item.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | @if (isset($chapter)) 4 |
{{$chapter->name}}
5 | @endif 6 | 7 |

{{ $page->name }}

8 | {!! $page->html !!} -------------------------------------------------------------------------------- /resources/views/form/checkbox.blade.php: -------------------------------------------------------------------------------- 1 | {{-- 2 | $name 3 | $label 4 | $errors? 5 | $model? 6 | --}} 7 | @include('form.custom-checkbox', [ 8 | 'name' => $name, 9 | 'label' => $label, 10 | 'value' => 'true', 11 | 'checked' => old($name) || (!old() && isset($model) && $model->$name) 12 | ]) 13 | 14 | @if($errors->has($name)) 15 |
{{ $errors->first($name) }}
16 | @endif -------------------------------------------------------------------------------- /resources/views/form/custom-checkbox.blade.php: -------------------------------------------------------------------------------- 1 | {{-- 2 | $name 3 | $value 4 | $checked 5 | $label 6 | --}} 7 | -------------------------------------------------------------------------------- /resources/views/form/date.blade.php: -------------------------------------------------------------------------------- 1 | has($name)) class="text-neg" @endif 3 | placeholder="{{ $placeholder ?? 'YYYY-MM-DD' }}" 4 | @if($autofocus ?? false) autofocus @endif 5 | @if($disabled ?? false) disabled="disabled" @endif 6 | @if(isset($model) || old($name)) value="{{ old($name) ?? $model->$name->format('Y-m-d') ?? ''}}" @endif> 7 | @if($errors->has($name)) 8 |
{{ $errors->first($name) }}
9 | @endif 10 | -------------------------------------------------------------------------------- /resources/views/form/description-html-input.blade.php: -------------------------------------------------------------------------------- 1 | 6 | @if($errors->has('description_html')) 7 |
{{ $errors->first('description_html') }}
8 | @endif -------------------------------------------------------------------------------- /resources/views/form/editor-translations.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $en = trans('editor', [], 'en'); 3 | $lang = trans('editor'); 4 | $mergedText = []; 5 | foreach ($en as $key => $value) { 6 | $mergedText[$value] = $lang[$key] ?? $value; 7 | } 8 | @endphp 9 | -------------------------------------------------------------------------------- /resources/views/form/errors.blade.php: -------------------------------------------------------------------------------- 1 | {{-- 2 | $name - string 3 | --}} 4 | @if($errors->has($name)) 5 |
{{ $errors->first($name) }}
6 | @endif -------------------------------------------------------------------------------- /resources/views/form/password.blade.php: -------------------------------------------------------------------------------- 1 | has($name)) class="text-neg" @endif 3 | @if(isset($placeholder)) placeholder="{{$placeholder}}" @endif 4 | @if(isset($autocomplete)) autocomplete="{{$autocomplete}}" @endif 5 | @if(old($name)) value="{{ old($name)}}" @endif> 6 | @if($errors->has($name)) 7 |
{{ $errors->first($name) }}
8 | @endif 9 | -------------------------------------------------------------------------------- /resources/views/form/request-query-inputs.blade.php: -------------------------------------------------------------------------------- 1 | {{-- 2 | $params - The query paramters to convert to inputs. 3 | --}} 4 | @foreach(array_intersect_key(request()->query(), array_flip($params)) as $name => $value) 5 | @if ($value) 6 | 7 | @endif 8 | @endforeach -------------------------------------------------------------------------------- /resources/views/form/role-select.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | @if($errors->has($name)) 14 |
{{ $errors->first($name) }}
15 | @endif -------------------------------------------------------------------------------- /resources/views/form/text.blade.php: -------------------------------------------------------------------------------- 1 | has($name)) class="text-neg" @endif 3 | @if(isset($placeholder)) placeholder="{{$placeholder}}" @endif 4 | @if($autofocus ?? false) autofocus @endif 5 | @if($disabled ?? false) disabled="disabled" @endif 6 | @if($readonly ?? false) readonly="readonly" @endif 7 | @if(isset($model) || old($name)) value="{{ old($name) ? old($name) : $model->$name}}" @endif> 8 | @if($errors->has($name)) 9 |
{{ $errors->first($name) }}
10 | @endif 11 | -------------------------------------------------------------------------------- /resources/views/form/textarea.blade.php: -------------------------------------------------------------------------------- 1 | 3 | @if($errors->has($name)) 4 |
{{ $errors->first($name) }}
5 | @endif -------------------------------------------------------------------------------- /resources/views/form/toggle-switch.blade.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/views/form/user-select-list.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{ trans('settings.users_none_selected') }} 3 | 4 | @foreach($users as $user) 5 | 6 | {{ $user->name }} 7 | {{ $user->name }} 8 | 9 | @endforeach -------------------------------------------------------------------------------- /resources/views/layouts/parts/base-body-end.blade.php: -------------------------------------------------------------------------------- 1 | {{-- This is a placeholder template file provided as a --}} 2 | {{-- convenience to users of the visual theme system. --}} -------------------------------------------------------------------------------- /resources/views/layouts/parts/base-body-start.blade.php: -------------------------------------------------------------------------------- 1 | {{-- This is a placeholder template file provided as a --}} 2 | {{-- convenience to users of the visual theme system. --}} -------------------------------------------------------------------------------- /resources/views/layouts/parts/custom-head.blade.php: -------------------------------------------------------------------------------- 1 | @inject('headContent', 'BookStack\Theming\CustomHtmlHeadContentProvider') 2 | 3 | @if(setting('app-custom-head') && !request()->routeIs('settings.category')) 4 | 5 | {!! $headContent->forWeb() !!} 6 | 7 | @endif -------------------------------------------------------------------------------- /resources/views/layouts/parts/export-body-end.blade.php: -------------------------------------------------------------------------------- 1 | {{-- This is a placeholder template file provided as a --}} 2 | {{-- convenience to users of the visual theme system. --}} -------------------------------------------------------------------------------- /resources/views/layouts/parts/export-body-start.blade.php: -------------------------------------------------------------------------------- 1 | {{-- This is a placeholder template file provided as a --}} 2 | {{-- convenience to users of the visual theme system. --}} -------------------------------------------------------------------------------- /resources/views/layouts/parts/footer.blade.php: -------------------------------------------------------------------------------- 1 | @if(count(setting('app-footer-links', [])) > 0) 2 | 7 | @endif -------------------------------------------------------------------------------- /resources/views/layouts/parts/header-links-start.blade.php: -------------------------------------------------------------------------------- 1 | {{-- This is a placeholder template file provided as a --}} 2 | {{-- convenience to users of the visual theme system. --}} -------------------------------------------------------------------------------- /resources/views/layouts/parts/header-logo.blade.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/views/layouts/parts/skip-to-content.blade.php: -------------------------------------------------------------------------------- 1 | {{ trans('common.skip_to_main_content') }} -------------------------------------------------------------------------------- /resources/views/layouts/simple.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.base') 2 | 3 | @section('content') 4 | 5 |
6 |
7 |
8 | @yield('body') 9 |
10 |
11 |
12 | 13 | @stop 14 | -------------------------------------------------------------------------------- /resources/views/mfa/setup.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.simple') 2 | 3 | @section('body') 4 |
5 | 6 |
7 |

{{ trans('auth.mfa_setup') }}

8 |

{{ trans('auth.mfa_setup_desc') }}

9 | 10 |
11 | @foreach(['totp', 'backup_codes'] as $method) 12 | @include('mfa.parts.setup-method-row', ['method' => $method]) 13 | @endforeach 14 |
15 | 16 |
17 |
18 | @stop 19 | -------------------------------------------------------------------------------- /resources/views/misc/robots.blade.php: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | @if($allowRobots) 3 | Disallow: 4 | @else 5 | Disallow: / 6 | @endif -------------------------------------------------------------------------------- /resources/views/pages/parts/list-item.blade.php: -------------------------------------------------------------------------------- 1 | @component('entities.list-item-basic', ['entity' => $page]) 2 |
3 |

{{ $page->getExcerpt() }}

4 |
5 | @endcomponent -------------------------------------------------------------------------------- /resources/views/pages/parts/page-display.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 |

{{$page->name}}

4 | 5 |
6 | 7 | @if (isset($diff) && $diff) 8 | {!! $diff !!} 9 | @else 10 | {!! isset($page->renderedHTML) ? $page->renderedHTML : $page->html !!} 11 | @endif 12 |
-------------------------------------------------------------------------------- /resources/views/search/parts/boolean-filter.blade.php: -------------------------------------------------------------------------------- 1 | {{-- 2 | $filters - Array of search filter values 3 | $name - Name of filter to limit use. 4 | $value - Value of filter to use 5 | --}} 6 | -------------------------------------------------------------------------------- /resources/views/search/parts/entity-suggestion-list.blade.php: -------------------------------------------------------------------------------- 1 |
2 | @if(count($entities) > 0) 3 | @foreach($entities as $index => $entity) 4 | 5 | @include('entities.list-item', [ 6 | 'entity' => $entity, 7 | 'showPath' => true, 8 | 'locked' => false, 9 | ]) 10 | 11 | @if($index !== count($entities) - 1) 12 |
13 | @endif 14 | 15 | @endforeach 16 | @else 17 |
18 | {{ trans('common.no_items') }} 19 |
20 | @endif 21 |
-------------------------------------------------------------------------------- /resources/views/search/parts/type-filter.blade.php: -------------------------------------------------------------------------------- 1 | {{-- 2 | @checked - If the option should be pre-checked 3 | @entity - Entity Name 4 | @transKey - Translation Key 5 | --}} 6 | -------------------------------------------------------------------------------- /resources/views/settings/parts/table-user.blade.php: -------------------------------------------------------------------------------- 1 | {{-- 2 | $user - User mode to display, Can be null. 3 | $user_id - Id of user to show. Must be provided. 4 | --}} 5 | @if($user) 6 | 7 |
{{ $user->name }}
8 |
{{ $user->name }}
9 |
10 | @else 11 | [ID: {{ $user_id }}] {{ trans('common.deleted_user') }} 12 | @endif -------------------------------------------------------------------------------- /resources/views/settings/recycle-bin/parts/deletable-entity-list.blade.php: -------------------------------------------------------------------------------- 1 | @include('settings.recycle-bin.parts.entity-display-item', ['entity' => $entity]) 2 | @if($entity->isA('book')) 3 | @foreach($entity->chapters()->withTrashed()->get() as $chapter) 4 | @include('settings.recycle-bin.parts.entity-display-item', ['entity' => $chapter]) 5 | @endforeach 6 | @endif 7 | @if($entity->isA('book') || $entity->isA('chapter')) 8 | @foreach($entity->pages()->withTrashed()->get() as $page) 9 | @include('settings.recycle-bin.parts.entity-display-item', ['entity' => $page]) 10 | @endforeach 11 | @endif -------------------------------------------------------------------------------- /resources/views/settings/recycle-bin/parts/entity-display-item.blade.php: -------------------------------------------------------------------------------- 1 | getType(); ?> 2 |
3 | @icon($type) 4 |
5 |
{{ $entity->name }}
6 |
7 |
-------------------------------------------------------------------------------- /resources/views/settings/roles/parts/checkbox.blade.php: -------------------------------------------------------------------------------- 1 | 2 | @include('form.custom-checkbox', [ 3 | 'name' => 'permissions[' . $permission . ']', 4 | 'value' => 'true', 5 | 'checked' => old('permissions'.$permission, false)|| (!old('display_name', false) && (isset($role) && $role->hasPermission($permission))), 6 | 'label' => $label 7 | ]) -------------------------------------------------------------------------------- /resources/views/shelves/references.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.simple') 2 | 3 | @section('body') 4 | 5 |
6 | 7 |
8 | @include('entities.breadcrumbs', ['crumbs' => [ 9 | $shelf, 10 | $shelf->getUrl('/references') => [ 11 | 'text' => trans('entities.references'), 12 | 'icon' => 'reference', 13 | ] 14 | ]]) 15 |
16 | 17 | @include('entities.references', ['references' => $references]) 18 |
19 | 20 | @stop 21 | -------------------------------------------------------------------------------- /resources/views/users/account/parts/shortcut-control.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 11 |
12 |
-------------------------------------------------------------------------------- /resources/views/vendor/notifications/email-plain.blade.php: -------------------------------------------------------------------------------- 1 | artisan('bookstack:db-utf8mb4') 12 | ->expectsOutputToContain('ALTER DATABASE') 13 | ->expectsOutputToContain('ALTER TABLE `users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 17 | 18 | return $app; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tests/Exports/ZipResultData.php: -------------------------------------------------------------------------------- 1 | extractedDirPath . DIRECTORY_SEPARATOR . ltrim($relPath, DIRECTORY_SEPARATOR); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tests/test-data/animated.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/tests/test-data/animated.avif -------------------------------------------------------------------------------- /tests/test-data/animated.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/tests/test-data/animated.gif -------------------------------------------------------------------------------- /tests/test-data/animated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/tests/test-data/animated.png -------------------------------------------------------------------------------- /tests/test-data/bad-phtml-png.base64: -------------------------------------------------------------------------------- 1 | iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA 2 | B3RJTUUH4gEcDCo5iYNs+gAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUH 3 | AAAAFElEQVQI12O0jN/KgASYGFABqXwAZtoBV6Sl3hIAAAAASUVORK5CYII= 4 | -------------------------------------------------------------------------------- /tests/test-data/compressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/tests/test-data/compressed.png -------------------------------------------------------------------------------- /tests/test-data/test-file.txt: -------------------------------------------------------------------------------- 1 | Hi, This is a test file for testing the upload process. -------------------------------------------------------------------------------- /tests/test-data/test-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/tests/test-data/test-image.jpg -------------------------------------------------------------------------------- /tests/test-data/test-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BookStackApp/BookStack/5c9b90ea0d9c69e14c2b3a8f1d0e26f3fb61ff81/tests/test-data/test-image.png -------------------------------------------------------------------------------- /themes/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /version: -------------------------------------------------------------------------------- 1 | v25.02-dev 2 | --------------------------------------------------------------------------------