From 1f72193a64ee2203a0e62e8e8359f1a70ecc927e Mon Sep 17 00:00:00 2001 From: avives Date: Fri, 21 Aug 2026 19:29:00 -0600 Subject: [PATCH] =?UTF-8?q?feat:=20VivesPOS=20landing=20on=20Winter=20CMS?= =?UTF-8?q?=201.2=20=E2=80=94=20theme=20+=20plugin=20+=20Dockerfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Base: wintercms/winter branch 1.2 (full framework) - Theme vivespos: Canvas 7 + Bootstrap 5 CDN, custom CSS - Layout: deferred GTM/GA4 tracking, JSON-LD SoftwareApplication - Partials: hero (offline-first), features, modes (offline/nube toggle), screenshots, pricing (3 planes), comparison, FAQ, CTA - Plugin VivesPOS.Site with ContactForm - Dockerfile: PHP 8.2 Apache, port 80, healthcheck - Added winter/wn-pages, blog, sitemap, seo plugins - Active theme set to vivespos --- .devcontainer/.vscode/launch.json | 11 + .devcontainer/README.md | 72 + .devcontainer/devcontainer.json | 60 + .../bootstrap-winter/bootstrap.sh | 51 + .../bootstrap-winter/codespaces.php | 25 + .../devcontainer-feature.json | 6 + .../bootstrap-winter/install.sh | 8 + .../bootstrap-winter/update-composer.php | 27 + .devcontainer/run-frankenphp.sh | 26 + .editorconfig | 15 + .env.example | 13 + .gitattributes | 10 + .github/ISSUE_TEMPLATE/1_BUG_REPORT.yaml | 78 + .github/ISSUE_TEMPLATE/2_PRE_PR.yaml | 32 + .github/ISSUE_TEMPLATE/config.yml | 14 + .github/assets/Github Banner.png | Bin 0 -> 512401 bytes .github/assets/sponsor-route4me.png | Bin 0 -> 13540 bytes .github/workflows/code-quality.yaml | 68 + .github/workflows/docker.yml | 128 + .github/workflows/manifest.yml | 69 + .github/workflows/subsplit.yml | 32 + .github/workflows/tests.yml | 175 + .github/workflows/utilities/library-switcher | 18 + .github/workflows/utilities/phpcs-pr | 87 + .github/workflows/utilities/phpcs-push | 87 + .gitignore | 7 + .htaccess | 60 + .vscode/extensions.json | 5 + .vscode/settings.json | 41 + AGENTS.md | 95 + CHANGELOG.md | 1 + Dockerfile | 45 + LICENSE | 22 + README.md | 115 + artisan | 51 + bootstrap/app.php | 55 + bootstrap/autoload.php | 38 + bootstrap/cache/.gitignore | 2 + composer.json | 92 + config/app.php | 322 + config/auth.php | 41 + config/broadcasting.php | 60 + config/cache.php | 139 + config/cms.php | 476 + config/cookie.php | 20 + config/cors.php | 34 + config/database.php | 133 + config/dev/.gitignore | 2 + config/develop.php | 58 + config/environment.php | 32 + config/filesystems.php | 53 + config/hashing.php | 51 + config/logging.php | 107 + config/mail.php | 92 + config/queue.php | 102 + config/services.php | 30 + config/session.php | 216 + config/testing/cms.php | 182 + config/testing/filesystems.php | 64 + config/view.php | 34 + index.php | 48 + modules/backend/.eslintignore | 17 + modules/backend/.eslintrc.json | 45 + modules/backend/.gitignore | 6 + modules/backend/LICENSE | 22 + modules/backend/README.md | 5 + modules/backend/ServiceProvider.php | 338 + modules/backend/assets/.gitignore | 1 + .../assets/css/dashboard/dashboard.css | 12 + modules/backend/assets/css/winter.css | 1118 + .../backend/assets/images/dashboard-icon.svg | 17 + modules/backend/assets/images/favicon.png | Bin 0 -> 5053 bytes modules/backend/assets/images/logo.svg | 1 + modules/backend/assets/images/media-icon.svg | 22 + .../images/secondary-tab-shape-content.svg | 16 + modules/backend/assets/images/tab-shape.svg | 16 + .../backend/assets/images/treeview-icons.png | Bin 0 -> 1344 bytes .../assets/images/treeview-submenu-tabs.png | Bin 0 -> 2714 bytes .../assets/images/winter-logo-white.svg | 46 + modules/backend/assets/images/winter-logo.svg | 1 + modules/backend/assets/images/wordmark.png | Bin 0 -> 56536 bytes modules/backend/assets/js/auth/auth.js | 5 + modules/backend/assets/js/backend.js | 102 + .../assets/js/preferences/preferences.js | 1 + .../js/vendor/jquery-and-migrate.min.js | 5 + .../assets/js/vendor/jquery-migrate.min.js | 2 + .../assets/js/vendor/jquery.autoellipsis.js | 447 + .../backend/assets/js/vendor/jquery.cookie.js | 117 + .../backend/assets/js/vendor/jquery.min.js | 2 + .../assets/js/vendor/jquery.touchwipe.js | 82 + .../assets/js/vendor/jquery.waterfall.js | 63 + modules/backend/assets/js/winter-min.js | 762 + modules/backend/assets/js/winter.alert.js | 92 + modules/backend/assets/js/winter.datetime.js | 175 + modules/backend/assets/js/winter.filelist.js | 169 + modules/backend/assets/js/winter.flyout.js | 224 + modules/backend/assets/js/winter.js | 35 + modules/backend/assets/js/winter.lang.js | 52 + modules/backend/assets/js/winter.layout.js | 86 + modules/backend/assets/js/winter.navbar.js | 41 + modules/backend/assets/js/winter.scrollbar.js | 409 + modules/backend/assets/js/winter.scrollpad.js | 310 + .../backend/assets/js/winter.sidenav-tree.js | 268 + modules/backend/assets/js/winter.sidenav.js | 142 + .../backend/assets/js/winter.sidepaneltab.js | 258 + .../backend/assets/js/winter.simplelist.js | 81 + .../assets/js/winter.tabformexpandcontrols.js | 163 + modules/backend/assets/js/winter.treelist.js | 133 + modules/backend/assets/js/winter.treeview.js | 437 + .../backend/assets/js/winter.verticalmenu.js | 159 + modules/backend/assets/less/.gitignore | 1 + .../backend/assets/less/controls/alert.less | 37 + .../backend/assets/less/controls/common.less | 66 + .../assets/less/controls/filelist.less | 427 + .../assets/less/controls/global-notice.less | 25 + .../assets/less/controls/namevaluelist.less | 27 + .../backend/assets/less/controls/panels.less | 77 + .../less/controls/record-navigation.less | 69 + .../assets/less/controls/reportwidgets.less | 51 + .../assets/less/controls/scrollbar.less | 125 + .../assets/less/controls/scrollpad.less | 98 + .../assets/less/controls/selector-group.less | 35 + .../assets/less/controls/sidenav-tree.less | 270 + .../assets/less/controls/simplelist.less | 265 + .../assets/less/controls/svg-icons.less | 33 + .../assets/less/controls/tree-path.less | 61 + .../assets/less/controls/treelist.less | 93 + .../assets/less/controls/treeview.less | 630 + .../backend/assets/less/core/animations.less | 363 + modules/backend/assets/less/core/boot.less | 11 + modules/backend/assets/less/core/mixins.less | 165 + .../backend/assets/less/core/variables.less | 153 + .../assets/less/dashboard/dashboard.less | 17 + .../assets/less/layout/fancylayout.less | 733 + .../assets/less/layout/flexlayout.less | 50 + .../backend/assets/less/layout/flyout.less | 48 + .../backend/assets/less/layout/footer.less | 32 + .../backend/assets/less/layout/layout.less | 234 + .../backend/assets/less/layout/mainmenu.less | 680 + .../assets/less/layout/outerlayout.less | 147 + .../backend/assets/less/layout/sidenav.less | 116 + .../backend/assets/less/layout/sidepanel.less | 97 + modules/backend/assets/less/winter.less | 56 + modules/backend/assets/ui/js/ajax/Handler.js | 130 + modules/backend/assets/ui/js/build/backend.js | 1 + .../backend/assets/ui/js/build/manifest.js | 1 + modules/backend/assets/ui/js/build/vendor.js | 24 + modules/backend/assets/ui/js/index.js | 34 + .../backend/assets/ui/js/pages/Preferences.js | 100 + .../backend/assets/ui/js/ui/EventHandler.js | 116 + .../backend/assets/ui/js/ui/WidgetHandler.js | 181 + .../assets/vendor/ace-codeeditor/build-min.js | 2314 ++ .../assets/vendor/ace-codeeditor/build.js | 30 + .../vendor/ace-codeeditor/codeeditor.js | 468 + modules/backend/assets/vendor/ace/ace.js | 19069 ++++++++++++++++ .../backend/assets/vendor/ace/ext-emmet.js | 1223 + .../assets/vendor/ace/ext-language_tools.js | 1946 ++ .../assets/vendor/ace/ext-searchbox.js | 417 + modules/backend/assets/vendor/ace/mode-css.js | 651 + .../backend/assets/vendor/ace/mode-html.js | 2426 ++ .../assets/vendor/ace/mode-javascript.js | 782 + .../backend/assets/vendor/ace/mode-less.js | 772 + .../assets/vendor/ace/mode-markdown.js | 2812 +++ modules/backend/assets/vendor/ace/mode-php.js | 13328 +++++++++++ .../assets/vendor/ace/mode-plain_text.js | 25 + .../backend/assets/vendor/ace/mode-sass.js | 412 + .../backend/assets/vendor/ace/mode-scss.js | 922 + .../backend/assets/vendor/ace/mode-twig.js | 2964 +++ .../backend/assets/vendor/ace/mode-yaml.js | 256 + .../backend/assets/vendor/ace/snippets/css.js | 974 + .../assets/vendor/ace/snippets/html.js | 835 + .../assets/vendor/ace/snippets/javascript.js | 202 + .../assets/vendor/ace/snippets/markdown.js | 95 + .../assets/vendor/ace/snippets/php-inline.js | 384 + .../backend/assets/vendor/ace/snippets/php.js | 384 + .../assets/vendor/ace/snippets/plain_text.js | 7 + .../assets/vendor/ace/snippets/sass.js | 7 + .../assets/vendor/ace/snippets/scss.js | 7 + .../assets/vendor/ace/snippets/text.js | 7 + .../assets/vendor/ace/snippets/twig.js | 7 + .../assets/vendor/ace/snippets/yaml.js | 7 + .../assets/vendor/ace/theme-ambiance.js | 182 + .../backend/assets/vendor/ace/theme-chaos.js | 156 + .../backend/assets/vendor/ace/theme-chrome.js | 128 + .../backend/assets/vendor/ace/theme-clouds.js | 95 + .../vendor/ace/theme-clouds_midnight.js | 96 + .../backend/assets/vendor/ace/theme-cobalt.js | 113 + .../assets/vendor/ace/theme-crimson_editor.js | 118 + .../backend/assets/vendor/ace/theme-dawn.js | 108 + .../assets/vendor/ace/theme-dreamweaver.js | 141 + .../assets/vendor/ace/theme-eclipse.js | 98 + .../backend/assets/vendor/ace/theme-github.js | 103 + .../assets/vendor/ace/theme-idle_fingers.js | 96 + .../assets/vendor/ace/theme-iplastic.js | 121 + .../assets/vendor/ace/theme-katzenmilch.js | 121 + .../assets/vendor/ace/theme-kr_theme.js | 104 + .../backend/assets/vendor/ace/theme-kuroir.js | 61 + .../assets/vendor/ace/theme-merbivore.js | 95 + .../assets/vendor/ace/theme-merbivore_soft.js | 96 + .../vendor/ace/theme-mono_industrial.js | 107 + .../assets/vendor/ace/theme-monokai.js | 105 + .../assets/vendor/ace/theme-pastel_on_dark.js | 108 + .../assets/vendor/ace/theme-solarized_dark.js | 88 + .../vendor/ace/theme-solarized_light.js | 91 + .../assets/vendor/ace/theme-sqlserver.js | 138 + .../assets/vendor/ace/theme-terminal.js | 114 + .../assets/vendor/ace/theme-textmate.js | 129 + .../assets/vendor/ace/theme-tomorrow.js | 108 + .../assets/vendor/ace/theme-tomorrow_night.js | 108 + .../vendor/ace/theme-tomorrow_night_blue.js | 106 + .../vendor/ace/theme-tomorrow_night_bright.js | 121 + .../ace/theme-tomorrow_night_eighties.js | 108 + .../assets/vendor/ace/theme-twilight.js | 109 + .../assets/vendor/ace/theme-vibrant_ink.js | 94 + .../backend/assets/vendor/ace/theme-xcode.js | 88 + .../backend/assets/vendor/ace/worker-css.js | 8762 +++++++ .../backend/assets/vendor/ace/worker-html.js | 11607 ++++++++++ .../assets/vendor/ace/worker-javascript.js | 12530 ++++++++++ .../backend/assets/vendor/ace/worker-php.js | 7021 ++++++ .../css-browser-selector.js | 8 + .../assets/vendor/dropzone/dropzone.js | 3535 +++ modules/backend/assets/vendor/emmet/emmet.js | 13789 +++++++++++ .../assets/vendor/jcrop/MIT-LICENSE.txt | 22 + modules/backend/assets/vendor/jcrop/README.md | 66 + .../assets/vendor/jcrop/WINTER-README.md | 1 + .../backend/assets/vendor/jcrop/css/Jcrop.gif | Bin 0 -> 329 bytes .../vendor/jcrop/css/jquery.Jcrop.min.css | 29 + .../assets/vendor/jcrop/js/jquery.Jcrop.js | 1699 ++ .../sweet-alert/sweet-alert-animations.less | 255 + .../sweet-alert/sweet-alert-combine.less | 7 + .../assets/vendor/sweet-alert/sweet-alert.css | 564 + .../vendor/sweet-alert/sweet-alert.html | 39 + .../assets/vendor/sweet-alert/sweet-alert.js | 751 + .../vendor/sweet-alert/sweet-alert.less | 254 + modules/backend/behaviors/FormController.php | 998 + .../behaviors/ImportExportController.php | 873 + modules/backend/behaviors/ListController.php | 652 + .../backend/behaviors/RelationController.php | 2018 ++ .../backend/behaviors/ReorderController.php | 315 + .../behaviors/UserPreferencesModel.php | 117 + .../partials/_record_navigation.php | 28 + .../formcontroller/partials/_toolbar.php | 81 + .../behaviors/formcontroller/views/create.php | 20 + .../formcontroller/views/create/_fancy.php | 21 + .../formcontroller/views/create/_sidebar.php | 41 + .../formcontroller/views/create/_standard.php | 23 + .../views/create/fancy/_toolbar.php | 36 + .../formcontroller/views/preview.php | 21 + .../formcontroller/views/preview/_fancy.php | 18 + .../formcontroller/views/preview/_sidebar.php | 36 + .../views/preview/_standard.php | 13 + .../views/preview/fancy/_toolbar.php | 1 + .../behaviors/formcontroller/views/update.php | 20 + .../formcontroller/views/update/_fancy.php | 22 + .../formcontroller/views/update/_sidebar.php | 42 + .../formcontroller/views/update/_standard.php | 24 + .../views/update/fancy/_toolbar.php | 53 + .../TranscodeFilter.php | 77 + .../assets/css/export.css | 7 + .../assets/css/import.css | 164 + .../assets/js/winter.export.js | 22 + .../assets/js/winter.import.js | 149 + .../assets/less/export.less | 13 + .../assets/less/import.less | 201 + .../partials/_button_export.php | 0 .../partials/_button_import.php | 0 .../partials/_column_sample_form.php | 29 + .../partials/_container_export.php | 9 + .../partials/_container_import.php | 9 + .../partials/_export_columns.php | 27 + .../partials/_export_form.php | 50 + .../partials/_export_result_form.php | 34 + .../partials/_import_db_columns.php | 23 + .../partials/_import_file_columns.php | 44 + .../partials/_import_form.php | 50 + .../partials/_import_result_form.php | 107 + .../partials/_import_toolbar.php | 16 + .../partials/fields_export.yaml | 58 + .../partials/fields_import.yaml | 95 + .../importexportcontroller/views/export.php | 24 + .../importexportcontroller/views/import.php | 24 + .../listcontroller/partials/_container.php | 9 + .../listcontroller/views/_list_toolbar.php | 59 + .../behaviors/listcontroller/views/index.php | 1 + .../assets/css/relation.css | 39 + .../assets/js/winter.relation.js | 100 + .../assets/less/relation.less | 60 + .../partials/_button_add.php | 8 + .../partials/_button_create.php | 8 + .../partials/_button_delete.php | 26 + .../partials/_button_link.php | 8 + .../partials/_button_refresh.php | 6 + .../partials/_button_remove.php | 24 + .../partials/_button_unlink.php | 9 + .../partials/_button_update.php | 9 + .../partials/_container.php | 18 + .../partials/_manage_form.php | 71 + .../partials/_manage_form_footer_create.php | 11 + .../partials/_manage_form_footer_update.php | 20 + .../partials/_manage_list.php | 24 + .../partials/_manage_list_footer.php | 17 + .../partials/_manage_pivot.php | 32 + .../partials/_manage_pivot_footer.php | 18 + .../partials/_pivot_form.php | 53 + .../partials/_pivot_form_footer.php | 20 + .../relationcontroller/partials/_toolbar.php | 18 + .../relationcontroller/partials/_view.php | 5 + .../assets/js/winter.reorder.js | 82 + .../reordercontroller/partials/_container.php | 29 + .../reordercontroller/partials/_records.php | 23 + .../views/_reorder_toolbar.php | 5 + .../reordercontroller/views/reorder.php | 5 + modules/backend/classes/AuthManager.php | 289 + modules/backend/classes/BackendController.php | 347 + modules/backend/classes/Controller.php | 823 + .../backend/classes/ControllerBehavior.php | 168 + modules/backend/classes/FilterScope.php | 168 + modules/backend/classes/FormField.php | 764 + modules/backend/classes/FormTabs.php | 279 + modules/backend/classes/FormWidgetBase.php | 152 + modules/backend/classes/ListColumn.php | 291 + modules/backend/classes/MainMenuItem.php | 131 + modules/backend/classes/NavigationManager.php | 796 + modules/backend/classes/QuickActionItem.php | 105 + modules/backend/classes/ReportWidgetBase.php | 28 + modules/backend/classes/SideMenuItem.php | 123 + modules/backend/classes/Skin.php | 111 + modules/backend/classes/WidgetBase.php | 216 + modules/backend/classes/WidgetManager.php | 268 + modules/backend/composer.json | 39 + modules/backend/console/CreateController.php | 119 + modules/backend/console/CreateFormWidget.php | 56 + .../backend/console/CreateReportWidget.php | 54 + modules/backend/console/UserCreate.php | 87 + modules/backend/console/WinterPasswd.php | 135 + .../scaffold/controller/_list_toolbar.stub | 21 + .../scaffold/controller/config_form.stub | 31 + .../scaffold/controller/config_list.stub | 50 + .../scaffold/controller/controller.stub | 54 + .../scaffold/controller/fancy/_toolbar.stub | 95 + .../scaffold/controller/fancy/create.stub | 21 + .../scaffold/controller/fancy/preview.stub | 17 + .../scaffold/controller/fancy/update.stub | 21 + .../console/scaffold/controller/index.stub | 1 + .../scaffold/controller/sidebar/create.stub | 39 + .../scaffold/controller/sidebar/preview.stub | 39 + .../scaffold/controller/sidebar/update.stub | 38 + .../scaffold/controller/standard/create.stub | 21 + .../scaffold/controller/standard/preview.stub | 16 + .../scaffold/controller/standard/update.stub | 20 + .../scaffold/formwidget/formwidget.stub | 59 + .../scaffold/formwidget/javascript.stub | 5 + .../console/scaffold/formwidget/partial.stub | 17 + .../scaffold/formwidget/stylesheet.stub | 5 + .../scaffold/reportwidget/reportwidget.stub | 65 + .../console/scaffold/reportwidget/widget.stub | 9 + modules/backend/controllers/AccessLogs.php | 43 + modules/backend/controllers/Auth.php | 241 + modules/backend/controllers/Files.php | 196 + modules/backend/controllers/Index.php | 81 + modules/backend/controllers/Media.php | 38 + modules/backend/controllers/MyAccount.php | 92 + modules/backend/controllers/Preferences.php | 79 + modules/backend/controllers/UserGroups.php | 39 + modules/backend/controllers/UserRoles.php | 51 + modules/backend/controllers/Users.php | 258 + .../backend/controllers/accesslogs/_hint.php | 4 + .../controllers/accesslogs/_list_toolbar.php | 9 + .../controllers/accesslogs/config_filter.yaml | 16 + .../controllers/accesslogs/config_list.yaml | 17 + .../backend/controllers/accesslogs/index.php | 5 + modules/backend/controllers/auth/reset.php | 33 + modules/backend/controllers/auth/restore.php | 31 + modules/backend/controllers/auth/signin.php | 60 + .../controllers/index/config_dashboard.yaml | 23 + modules/backend/controllers/index/index.php | 23 + modules/backend/controllers/media/index.php | 5 + .../controllers/myaccount/config_form.yaml | 12 + .../backend/controllers/myaccount/index.php | 56 + .../controllers/preferences/_example_code.php | 24 + .../_field_editor_preview_lang.php | 122 + .../controllers/preferences/config_form.yaml | 8 + .../backend/controllers/preferences/index.php | 41 + .../controllers/usergroups/_list_toolbar.php | 8 + .../controllers/usergroups/config_form.yaml | 16 + .../controllers/usergroups/config_list.yaml | 16 + .../backend/controllers/usergroups/create.php | 46 + .../backend/controllers/usergroups/update.php | 54 + .../backend/controllers/userroles/__users.php | 1 + .../controllers/userroles/_list_toolbar.php | 8 + .../controllers/userroles/config_form.yaml | 16 + .../controllers/userroles/config_list.yaml | 16 + .../userroles/config_relation.yaml | 10 + .../backend/controllers/userroles/create.php | 46 + .../backend/controllers/userroles/update.php | 54 + .../controllers/users/_btn_impersonate.php | 14 + .../controllers/users/_btn_password_reset.php | 12 + .../controllers/users/_btn_unsuspend.php | 14 + .../controllers/users/_hint_trashed.php | 9 + .../controllers/users/_list_toolbar.php | 29 + .../controllers/users/config_filter.yaml | 30 + .../controllers/users/config_form.yaml | 16 + .../controllers/users/config_list.yaml | 19 + .../controllers/users/config_relation.yaml | 31 + .../backend/controllers/users/myaccount.php | 68 + modules/backend/controllers/users/update.php | 88 + .../2013_10_01_000001_Db_Backend_Users.php | 35 + ...13_10_01_000002_Db_Backend_User_Groups.php | 22 + ...3_10_01_000003_Db_Backend_Users_Groups.php | 22 + ..._10_01_000004_Db_Backend_User_Throttle.php | 28 + ..._04_000005_Db_Backend_User_Preferences.php | 26 + ...014_10_01_000006_Db_Backend_Access_Log.php | 23 + ...00007_Db_Backend_Add_Description_Field.php | 25 + ...1_000008_Db_Backend_Add_Superuser_Flag.php | 29 + ..._10_01_000009_Db_Backend_Timestamp_Fix.php | 39 + ...017_10_01_000010_Db_Backend_User_Roles.php | 165 + ...12_16_000011_Db_Backend_Add_Deleted_At.php | 25 + ...16_000012_Db_Backend_Add_User_Metadata.php | 25 + ..._Db_Backend_Add_Users_Groups_Delete_At.php | 25 + .../backend/database/seeds/DatabaseSeeder.php | 33 + .../backend/database/seeds/SeedSetupAdmin.php | 62 + modules/backend/facades/Backend.php | 29 + modules/backend/facades/BackendAuth.php | 27 + modules/backend/facades/BackendMenu.php | 41 + modules/backend/formwidgets/CodeEditor.php | 233 + modules/backend/formwidgets/ColorPicker.php | 286 + modules/backend/formwidgets/DataTable.php | 205 + modules/backend/formwidgets/DatePicker.php | 207 + modules/backend/formwidgets/FieldSet.php | 102 + modules/backend/formwidgets/FileUpload.php | 561 + modules/backend/formwidgets/IconPicker.php | 59 + .../backend/formwidgets/MarkdownEditor.php | 142 + modules/backend/formwidgets/MediaFinder.php | 126 + modules/backend/formwidgets/NestedForm.php | 85 + .../backend/formwidgets/PermissionEditor.php | 171 + modules/backend/formwidgets/RecordFinder.php | 380 + modules/backend/formwidgets/Relation.php | 198 + .../backend/formwidgets/RelationManager.php | 84 + modules/backend/formwidgets/Repeater.php | 535 + modules/backend/formwidgets/RichEditor.php | 315 + modules/backend/formwidgets/Sensitive.php | 116 + modules/backend/formwidgets/TagList.php | 242 + .../backend/formwidgets/codeeditor/README.md | 586 + .../codeeditor/assets/css/codeeditor.css | 1 + .../codeeditor/assets/fonts/codicon.ttf | Bin 0 -> 72860 bytes .../assets/js/build/codeeditor.bundle.js | 142 + .../assets/js/build/codeeditor.bundle/114.js | 7 + .../assets/js/build/codeeditor.bundle/133.js | 7 + .../assets/js/build/codeeditor.bundle/134.js | 7 + .../assets/js/build/codeeditor.bundle/2.js | 8 + .../assets/js/build/codeeditor.bundle/202.js | 8 + .../assets/js/build/codeeditor.bundle/257.js | 7 + .../assets/js/build/codeeditor.bundle/294.js | 7 + .../assets/js/build/codeeditor.bundle/326.js | 8 + .../assets/js/build/codeeditor.bundle/342.js | 8 + .../assets/js/build/codeeditor.bundle/39.js | 7 + .../assets/js/build/codeeditor.bundle/54.js | 13 + .../assets/js/build/codeeditor.bundle/70.js | 8 + .../assets/js/build/codeeditor.bundle/726.js | 8 + .../assets/js/build/codeeditor.bundle/832.js | 8 + .../assets/js/build/codeeditor.bundle/851.js | 1 + .../assets/js/build/codeeditor.bundle/910.js | 7 + .../codeeditor/assets/js/build/css.worker.js | 7 + .../assets/js/build/editor.worker.js | 1 + .../codeeditor/assets/js/build/html.worker.js | 7 + .../codeeditor/assets/js/build/json.worker.js | 7 + .../codeeditor/assets/js/build/ts.worker.js | 7 + .../codeeditor/assets/js/codeeditor.js | 1727 ++ .../codeeditor/assets/less/codeeditor.less | 665 + .../codeeditor/assets/themes/ambiance.tmTheme | 557 + .../codeeditor/assets/themes/behave.tmTheme | 563 + .../codeeditor/assets/themes/chaos.tmTheme | 387 + .../codeeditor/assets/themes/chrome.tmTheme | 203 + .../codeeditor/assets/themes/clouds.tmTheme | 348 + .../assets/themes/clouds_midnight.tmTheme | 361 + .../codeeditor/assets/themes/cobalt.tmTheme | 574 + .../codeeditor/assets/themes/dawn.tmTheme | 437 + .../assets/themes/dreamweaver.tmTheme | 439 + .../codeeditor/assets/themes/eclipse.tmTheme | 313 + .../codeeditor/assets/themes/github.tmTheme | 653 + .../assets/themes/idle_fingers.tmTheme | 380 + .../codeeditor/assets/themes/iplastic.tmTheme | 286 + .../assets/themes/katzenmilch.tmTheme | 450 + .../codeeditor/assets/themes/kr_theme.tmTheme | 551 + .../codeeditor/assets/themes/kuroir.tmTheme | 235 + .../assets/themes/merbivore.tmTheme | 285 + .../assets/themes/merbivore_soft.tmTheme | 285 + .../assets/themes/mono_industrial.tmTheme | 451 + .../codeeditor/assets/themes/monokai.tmTheme | 289 + .../assets/themes/one-dark-pro.json | 2277 ++ .../assets/themes/pastel_on_dark.tmTheme | 701 + .../assets/themes/solarized_dark.tmTheme | 1151 + .../assets/themes/solarized_light.tmTheme | 1776 ++ .../assets/themes/sqlserver.tmTheme | 437 + .../codeeditor/assets/themes/terminal.tmTheme | 514 + .../codeeditor/assets/themes/textmate.tmTheme | 792 + .../codeeditor/assets/themes/tomorrow.tmTheme | 186 + .../assets/themes/tomorrow_night.tmTheme | 647 + .../assets/themes/tomorrow_night_blue.tmTheme | 186 + .../themes/tomorrow_night_bright.tmTheme | 186 + .../themes/tomorrow_night_eighties.tmTheme | 186 + .../codeeditor/assets/themes/twilight.tmTheme | 610 + .../assets/themes/vibrant_ink.tmTheme | 447 + .../codeeditor/assets/themes/winter.json | 918 + .../codeeditor/assets/themes/xcode.tmTheme | 267 + .../codeeditor/assets/winter.mix.js | 122 + .../codeeditor/partials/_codeeditor.php | 48 + .../colorpicker/assets/js/dist/colorpicker.js | 1 + .../colorpicker/assets/js/src/ColorPicker.js | 512 + .../colorpicker/assets/less/colorpicker.less | 109 + .../colorpicker/partials/_colorpicker.php | 57 + .../datatable/partials/_datatable.php | 8 + .../datepicker/partials/_datepicker.php | 79 + .../datepicker/partials/_picker_date.php | 11 + .../datepicker/partials/_picker_time.php | 11 + .../fieldset/assets/css/fieldset.css | 6 + .../fieldset/assets/less/fieldset.less | 41 + .../fieldset/partials/_fieldset.php | 9 + .../fileupload/assets/css/fileupload.css | 157 + .../fileupload/assets/js/fileupload.js | 495 + .../assets/less/fileupload.base.less | 414 + .../assets/less/fileupload.filemulti.less | 176 + .../assets/less/fileupload.filesingle.less | 120 + .../assets/less/fileupload.imagemulti.less | 139 + .../assets/less/fileupload.imagesingle.less | 78 + .../fileupload/assets/less/fileupload.less | 15 + .../fileupload/partials/_config_form.php | 45 + .../fileupload/partials/_file_multi.php | 77 + .../fileupload/partials/_file_single.php | 80 + .../fileupload/partials/_fileupload.php | 37 + .../fileupload/partials/_image_multi.php | 76 + .../fileupload/partials/_image_single.php | 78 + .../iconpicker/assets/js/dist/iconpicker.js | 1 + .../assets/js/src/components/IconPicker.vue | 564 + .../iconpicker/assets/js/src/iconpicker.js | 65 + .../iconpicker/meta/libraries.yaml | 1567 ++ .../iconpicker/partials/_iconpicker.php | 27 + .../assets/css/markdowneditor.css | 73 + .../assets/js/markdowneditor.js | 869 + .../assets/less/markdowneditor.less | 264 + .../partials/_markdowneditor.php | 37 + .../mediafinder/assets/css/mediafinder.css | 219 + .../mediafinder/assets/js/mediafinder.js | 177 + .../assets/less/mediafinder.base.less | 143 + .../assets/less/mediafinder.filesingle.less | 90 + .../assets/less/mediafinder.imagesingle.less | 47 + .../mediafinder/assets/less/mediafinder.less | 5 + .../mediafinder/partials/_file_single.php | 53 + .../mediafinder/partials/_image_single.php | 56 + .../mediafinder/partials/_mediafinder.php | 24 + .../nestedform/assets/css/nestedform.css | 6 + .../nestedform/assets/less/nestedform.less | 39 + .../nestedform/partials/_nestedform.php | 3 + .../assets/css/permissioneditor.css | 41 + .../assets/js/permissioneditor.js | 105 + .../assets/less/permissioneditor.less | 148 + .../partials/_permissioneditor.php | 153 + .../recordfinder/assets/js/recordfinder.js | 119 + .../recordfinder/partials/_container.php | 11 + .../recordfinder/partials/_recordfinder.php | 63 + .../partials/_recordfinder_form.php | 29 + .../relation/partials/_relation.php | 3 + .../repeater/assets/css/repeater.css | 85 + .../repeater/assets/js/repeater.js | 424 + .../repeater/assets/less/repeater.less | 442 + .../repeater/partials/_repeater.php | 87 + .../repeater/partials/_repeater_add_item.php | 26 + .../repeater/partials/_repeater_item.php | 56 + .../richeditor/assets/css/richeditor.css | 584 + .../richeditor/assets/js/build-min.js | 2151 ++ .../richeditor/assets/js/build-plugins-min.js | 217 + .../richeditor/assets/js/build-plugins.js | 14 + .../formwidgets/richeditor/assets/js/build.js | 46 + .../richeditor/assets/js/plugins/figures.js | 250 + .../assets/js/plugins/mediamanager.js | 287 + .../richeditor/assets/js/plugins/pagelinks.js | 109 + .../richeditor/assets/js/richeditor.js | 498 + .../richeditor/assets/less/_base_styles.less | 175 + .../richeditor/assets/less/_froala.less | 183 + .../richeditor/assets/less/richeditor.less | 287 + .../richeditor/assets/vendor/.gitignore | 1 + .../assets/vendor/froala/js/languages/ar.js | 336 + .../assets/vendor/froala/js/languages/bs.js | 336 + .../assets/vendor/froala/js/languages/cs.js | 336 + .../assets/vendor/froala/js/languages/da.js | 333 + .../assets/vendor/froala/js/languages/de.js | 337 + .../assets/vendor/froala/js/languages/el.js | 342 + .../vendor/froala/js/languages/en_ca.js | 280 + .../vendor/froala/js/languages/en_gb.js | 280 + .../assets/vendor/froala/js/languages/es.js | 336 + .../assets/vendor/froala/js/languages/et.js | 336 + .../assets/vendor/froala/js/languages/fa.js | 336 + .../assets/vendor/froala/js/languages/fi.js | 336 + .../assets/vendor/froala/js/languages/fr.js | 336 + .../assets/vendor/froala/js/languages/he.js | 336 + .../assets/vendor/froala/js/languages/hr.js | 336 + .../assets/vendor/froala/js/languages/hu.js | 340 + .../assets/vendor/froala/js/languages/id.js | 337 + .../assets/vendor/froala/js/languages/it.js | 336 + .../assets/vendor/froala/js/languages/ja.js | 336 + .../assets/vendor/froala/js/languages/ko.js | 336 + .../assets/vendor/froala/js/languages/ku.js | 329 + .../assets/vendor/froala/js/languages/me.js | 336 + .../assets/vendor/froala/js/languages/nb.js | 336 + .../assets/vendor/froala/js/languages/nl.js | 336 + .../assets/vendor/froala/js/languages/pl.js | 336 + .../vendor/froala/js/languages/pt_br.js | 336 + .../vendor/froala/js/languages/pt_pt.js | 336 + .../assets/vendor/froala/js/languages/ro.js | 336 + .../assets/vendor/froala/js/languages/ru.js | 336 + .../assets/vendor/froala/js/languages/sk.js | 338 + .../assets/vendor/froala/js/languages/sl.js | 280 + .../assets/vendor/froala/js/languages/sr.js | 336 + .../assets/vendor/froala/js/languages/sv.js | 336 + .../assets/vendor/froala/js/languages/th.js | 336 + .../assets/vendor/froala/js/languages/tr.js | 336 + .../assets/vendor/froala/js/languages/uk.js | 336 + .../assets/vendor/froala/js/languages/vi.js | 276 + .../vendor/froala/js/languages/zh_cn.js | 336 + .../vendor/froala/js/languages/zh_tw.js | 336 + .../richeditor/partials/_page_links_form.php | 33 + .../richeditor/partials/_richeditor.php | 74 + .../sensitive/assets/js/dist/sensitive.js | 1 + .../sensitive/assets/js/src/Sensitive.js | 234 + .../sensitive/assets/less/sensitive.less | 10 + .../sensitive/partials/_sensitive.php | 44 + .../formwidgets/taglist/partials/_taglist.php | 60 + modules/backend/helpers/Backend.php | 284 + .../helpers/exception/DecompileException.php | 7 + modules/backend/lang/ar/lang.php | 166 + modules/backend/lang/be/lang.php | 537 + modules/backend/lang/bg/lang.php | 441 + modules/backend/lang/ca/lang.php | 599 + modules/backend/lang/cs/lang.php | 563 + modules/backend/lang/da/lang.php | 548 + modules/backend/lang/de/lang.php | 658 + modules/backend/lang/el/lang.php | 554 + modules/backend/lang/en/lang.php | 696 + modules/backend/lang/es-ar/lang.php | 260 + modules/backend/lang/es/lang.php | 546 + modules/backend/lang/et/lang.php | 564 + modules/backend/lang/fa/lang.php | 657 + modules/backend/lang/fi/lang.php | 587 + modules/backend/lang/fr/lang.php | 664 + modules/backend/lang/hu/lang.php | 662 + modules/backend/lang/id/lang.php | 306 + modules/backend/lang/it/lang.php | 600 + modules/backend/lang/ja/lang.php | 660 + modules/backend/lang/kr/lang.php | 563 + modules/backend/lang/lt/lang.php | 561 + modules/backend/lang/lv/lang.php | 665 + modules/backend/lang/nb-no/lang.php | 551 + modules/backend/lang/nl/lang.php | 650 + modules/backend/lang/pl/lang.php | 631 + modules/backend/lang/pt-br/lang.php | 649 + modules/backend/lang/pt-pt/lang.php | 630 + modules/backend/lang/ro/lang.php | 651 + modules/backend/lang/rs/lang.php | 642 + modules/backend/lang/ru/lang.php | 671 + modules/backend/lang/sk/lang.php | 662 + modules/backend/lang/sl/lang.php | 648 + modules/backend/lang/sv/lang.php | 383 + modules/backend/lang/th/lang.php | 516 + modules/backend/lang/tr/lang.php | 664 + modules/backend/lang/uk/lang.php | 696 + modules/backend/lang/vn/lang.php | 588 + modules/backend/lang/zh-cn/lang.php | 619 + modules/backend/lang/zh-tw/lang.php | 382 + modules/backend/layouts/_breadcrumb.php | 22 + modules/backend/layouts/_browser_detector.php | 74 + modules/backend/layouts/_custom_styles.php | 14 + modules/backend/layouts/_flash_messages.php | 3 + modules/backend/layouts/_footer.php | 9 + modules/backend/layouts/_head.php | 86 + modules/backend/layouts/_hint.php | 46 + modules/backend/layouts/_mainmenu.php | 108 + modules/backend/layouts/_sidenav.php | 53 + modules/backend/layouts/auth.php | 92 + modules/backend/layouts/default.php | 88 + modules/backend/layouts/form-with-sidebar.php | 32 + modules/backend/models/AccessLog.php | 61 + modules/backend/models/BrandSetting.php | 262 + modules/backend/models/EditorSetting.php | 281 + modules/backend/models/ExportModel.php | 206 + modules/backend/models/ImportModel.php | 292 + modules/backend/models/Preference.php | 328 + modules/backend/models/User.php | 456 + modules/backend/models/UserGroup.php | 46 + modules/backend/models/UserPreference.php | 35 + modules/backend/models/UserRole.php | 101 + modules/backend/models/UserThrottle.php | 36 + modules/backend/models/accesslog/columns.yaml | 53 + .../backend/models/brandsetting/custom.less | 234 + .../backend/models/brandsetting/fields.yaml | 112 + .../models/editorsetting/_toolbar_presets.php | 10 + .../models/editorsetting/default_styles.less | 77 + .../backend/models/editorsetting/fields.yaml | 139 + modules/backend/models/preference/fields.yaml | 136 + modules/backend/models/user/columns.yaml | 76 + modules/backend/models/user/fields.yaml | 109 + modules/backend/models/usergroup/columns.yaml | 36 + modules/backend/models/usergroup/fields.yaml | 24 + modules/backend/models/userrole/columns.yaml | 36 + modules/backend/models/userrole/fields.yaml | 34 + modules/backend/package.json | 47 + modules/backend/phpunit.xml | 17 + modules/backend/reportwidgets/Welcome.php | 64 + .../welcome/assets/css/welcome.css | 33 + .../welcome/partials/_widget.php | 41 + modules/backend/routes.php | 44 + modules/backend/skins/Standard.php | 57 + .../FormControllerRecordNavigationTest.php | 94 + .../ImportExportControllerPermissionsTest.php | 330 + .../behaviors/RelationControllerPivotTest.php | 286 + .../backend/tests/classes/AuthManagerTest.php | 221 + .../tests/classes/ControllerPostbackTest.php | 159 + .../classes/HandlerDispatchSecurityTest.php | 494 + .../tests/classes/NavigationManagerTest.php | 302 + .../tests/classes/WidgetManagerTest.php | 49 + .../concerns/InteractsWithAuthentication.php | 149 + .../tests/controllers/AuthResetTest.php | 33 + .../controllers/MyAccountSecurityTest.php | 106 + .../tests/controllers/MyAccountTest.php | 29 + .../tests/fixtures/assets/compilation.js | 5 + .../backend/tests/fixtures/assets/js/file1.js | 1 + .../backend/tests/fixtures/assets/js/file2.js | 1 + .../fixtures/models/PivotRelationFixture.php | 63 + .../tests/fixtures/models/SortableFixture.php | 48 + .../tests/fixtures/models/UserFixture.php | 66 + .../tests/fixtures/reference/file1.txt | 1 + .../tests/fixtures/reference/file2.txt | 1 + .../tests/formwidgets/CheckboxTest.php | 52 + .../tests/formwidgets/ColorPickerTest.php | 128 + .../formwidgets/FileUploadScopingTest.php | 255 + .../tests/helpers/BackendHelperTest.php | 28 + .../backend/tests/models/BrandSettingTest.php | 138 + .../tests/models/EditorSettingTest.php | 138 + .../backend/tests/models/ExportModelTest.php | 94 + .../backend/tests/models/ImportModelTest.php | 70 + .../tests/models/UserAuthorizationTest.php | 480 + modules/backend/tests/models/UserTest.php | 224 + .../backend/tests/traits/WidgetMakerTest.php | 64 + .../tests/widgets/FilterWidgetTest.php | 552 + .../tests/widgets/FormFieldSetSaveTest.php | 196 + modules/backend/tests/widgets/FormTest.php | 252 + .../tests/widgets/ListColumnEscapingTest.php | 126 + .../tests/widgets/ListsSortableTest.php | 136 + modules/backend/tests/widgets/ListsTest.php | 143 + .../tests/widgets/TableSearchEscapingTest.php | 189 + modules/backend/traits/CollapsableWidget.php | 129 + modules/backend/traits/ErrorMaker.php | 54 + modules/backend/traits/FormModelSaver.php | 124 + modules/backend/traits/FormModelWidget.php | 98 + .../backend/traits/InspectableContainer.php | 89 + modules/backend/traits/PreferenceMaker.php | 139 + modules/backend/traits/SearchableWidget.php | 43 + modules/backend/traits/SelectableWidget.php | 69 + modules/backend/traits/SessionMaker.php | 91 + modules/backend/traits/UploadableWidget.php | 249 + modules/backend/traits/WidgetMaker.php | 75 + modules/backend/views/404.php | 19 + modules/backend/views/access_denied.php | 17 + modules/backend/views/mail/invite.php | 20 + modules/backend/views/mail/restore.php | 13 + modules/backend/views/no_database.php | 15 + modules/backend/widgets/Filter.php | 1169 + modules/backend/widgets/Form.php | 1492 ++ modules/backend/widgets/Lists.php | 2156 ++ modules/backend/widgets/MediaManager.php | 1379 ++ modules/backend/widgets/ReportContainer.php | 513 + modules/backend/widgets/Search.php | 174 + modules/backend/widgets/Table.php | 322 + modules/backend/widgets/Toolbar.php | 106 + .../widgets/filter/partials/_filter.php | 10 + .../filter/partials/_filter_scopes.php | 3 + .../filter/partials/_scope_button-group.php | 14 + .../filter/partials/_scope_checkbox.php | 7 + .../widgets/filter/partials/_scope_date.php | 17 + .../filter/partials/_scope_daterange.php | 17 + .../filter/partials/_scope_dropdown.php | 31 + .../widgets/filter/partials/_scope_group.php | 12 + .../widgets/filter/partials/_scope_number.php | 15 + .../filter/partials/_scope_numberrange.php | 15 + .../widgets/filter/partials/_scope_switch.php | 7 + .../widgets/filter/partials/_scope_text.php | 15 + .../widgets/form/assets/js/winter.form.js | 391 + .../form/partials/_field-container.php | 11 + .../backend/widgets/form/partials/_field.php | 30 + .../form/partials/_field_balloon-selector.php | 22 + .../widgets/form/partials/_field_button.php | 74 + .../widgets/form/partials/_field_checkbox.php | 23 + .../form/partials/_field_checkboxlist.php | 120 + .../widgets/form/partials/_field_dropdown.php | 43 + .../widgets/form/partials/_field_email.php | 30 + .../widgets/form/partials/_field_hint.php | 8 + .../widgets/form/partials/_field_number.php | 26 + .../widgets/form/partials/_field_partial.php | 9 + .../widgets/form/partials/_field_password.php | 16 + .../widgets/form/partials/_field_radio.php | 43 + .../widgets/form/partials/_field_range.php | 40 + .../widgets/form/partials/_field_section.php | 10 + .../widgets/form/partials/_field_switch.php | 38 + .../widgets/form/partials/_field_tel.php | 49 + .../widgets/form/partials/_field_text.php | 15 + .../widgets/form/partials/_field_textarea.php | 12 + .../widgets/form/partials/_field_url.php | 49 + .../widgets/form/partials/_field_widget.php | 5 + .../widgets/form/partials/_form-container.php | 10 + .../backend/widgets/form/partials/_form.php | 12 + .../widgets/form/partials/_form_fields.php | 3 + .../widgets/form/partials/_form_tabs.php | 62 + .../widgets/form/partials/_form_tabs_lazy.php | 37 + .../form/partials/_section-container.php | 20 + .../widgets/form/partials/_section.php | 30 + .../lists/assets/css/winter.list.sortable.css | 50 + .../assets/js/dist/winter.list.sortable.js | 1 + .../assets/js/src/winter.list.sortable.js | 99 + .../widgets/lists/assets/js/winter.list.js | 166 + .../lists/partials/_list-container.php | 3 + .../backend/widgets/lists/partials/_list.php | 42 + .../lists/partials/_list_body_checkbox.php | 11 + .../widgets/lists/partials/_list_body_row.php | 47 + .../lists/partials/_list_body_rows.php | 3 + .../lists/partials/_list_body_tree.php | 16 + .../widgets/lists/partials/_list_head_row.php | 58 + .../lists/partials/_list_pagination.php | 74 + .../partials/_list_pagination_simple.php | 50 + .../widgets/lists/partials/_list_totals.php | 26 + .../widgets/lists/partials/_setup_form.php | 74 + .../mediamanager/assets/css/mediamanager.css | 169 + .../assets/images/video-poster.png | Bin 0 -> 8894 bytes .../assets/js/mediamanager-browser-min.js | 543 + .../assets/js/mediamanager-browser.js | 12 + .../assets/js/mediamanager-global.js | 6 + .../assets/js/mediamanager.imagecroppopup.js | 478 + .../mediamanager/assets/js/mediamanager.js | 1350 ++ .../assets/js/mediamanager.popup.js | 141 + .../assets/less/mediamanager.less | 803 + .../widgets/mediamanager/partials/_body.php | 70 + .../mediamanager/partials/_bottom-toolbar.php | 30 + .../partials/_crop-tool-image-area.php | 33 + .../mediamanager/partials/_crop-toolbar.php | 40 + .../mediamanager/partials/_filters.php | 64 + .../mediamanager/partials/_folder-path.php | 13 + .../mediamanager/partials/_folder-toolbar.php | 16 + .../mediamanager/partials/_generic-list.php | 63 + .../partials/_image-crop-popup-body.php | 42 + .../mediamanager/partials/_item-icon.php | 45 + .../mediamanager/partials/_item-list.php | 17 + .../partials/_item-sidebar-preview.php | 50 + .../mediamanager/partials/_left-sidebar.php | 7 + .../mediamanager/partials/_list-grid.php | 70 + .../mediamanager/partials/_list-list.php | 1 + .../mediamanager/partials/_list-tiles.php | 1 + .../mediamanager/partials/_move-form.php | 35 + .../partials/_new-folder-form.php | 32 + .../mediamanager/partials/_popup-body.php | 3 + .../mediamanager/partials/_rename-form.php | 56 + .../partials/_resize-image-form.php | 31 + .../mediamanager/partials/_right-sidebar.php | 26 + .../mediamanager/partials/_sorting.php | 46 + .../partials/_thumbnail-image.php | 6 + .../mediamanager/partials/_toolbar.php | 42 + .../partials/_upload-progress.php | 24 + .../partials/_view-mode-buttons.php | 18 + .../assets/css/reportcontainer.css | 46 + .../assets/js/reportcontainer.js | 202 + .../assets/less/reportcontainer.less | 196 + .../assets/vendor/isotope/jquery.isotope.js | 3562 +++ .../vendor/isotope/jquery.isotope.min.js | 12 + .../reportcontainer/partials/_container.php | 16 + .../partials/_new_widget_popup.php | 43 + .../reportcontainer/partials/_widget.php | 33 + .../reportcontainer/partials/_widget_list.php | 7 + .../partials/_widget_toolbar.php | 48 + .../widgets/search/partials/_search.php | 23 + .../widgets/table/ClientMemoryDataSource.php | 62 + .../backend/widgets/table/DataSourceBase.php | 86 + modules/backend/widgets/table/README.md | 412 + .../widgets/table/ServerEventDataSource.php | 91 + .../widgets/table/assets/css/table.css | 77 + .../table/assets/images/table-icons.gif | Bin 0 -> 1489 bytes .../widgets/table/assets/js/build-min.js | 773 + .../backend/widgets/table/assets/js/build.js | 28 + .../table/assets/js/table.datasource.base.js | 92 + .../assets/js/table.datasource.client.js | 184 + .../assets/js/table.datasource.server.js | 146 + .../assets/js/table.helper.navigation.js | 424 + .../table/assets/js/table.helper.search.js | 134 + .../backend/widgets/table/assets/js/table.js | 1170 + .../assets/js/table.processor.autocomplete.js | 213 + .../table/assets/js/table.processor.base.js | 210 + .../assets/js/table.processor.checkbox.js | 140 + .../assets/js/table.processor.dropdown.js | 538 + .../table/assets/js/table.processor.string.js | 187 + .../table/assets/js/table.validator.base.js | 77 + .../assets/js/table.validator.basenumber.js | 57 + .../table/assets/js/table.validator.float.js | 59 + .../assets/js/table.validator.integer.js | 59 + .../table/assets/js/table.validator.length.js | 68 + .../table/assets/js/table.validator.regex.js | 52 + .../assets/js/table.validator.required.js | 44 + .../widgets/table/assets/less/table.less | 509 + .../backend/widgets/table/partials/_table.php | 50 + .../widgets/toolbar/partials/_toolbar.php | 21 + modules/backend/winter.mix.js | 69 + modules/cms/LICENSE | 22 + modules/cms/README.md | 5 + modules/cms/ServiceProvider.php | 493 + .../assets/css/themelogs/template-diff.css | 10 + modules/cms/assets/css/winter.components.css | 104 + .../cms/assets/css/winter.theme-selector.css | 33 + modules/cms/assets/images/cms-icon.svg | 27 + .../assets/images/default-theme-preview.png | Bin 0 -> 1831 bytes .../cms/assets/js/themelogs/template-diff.js | 113 + modules/cms/assets/js/winter.cmspage.js | 701 + .../cms/assets/js/winter.dragcomponents.js | 260 + modules/cms/assets/js/winter.tokenexpander.js | 183 + .../cms/assets/less/winter.components.less | 406 + .../assets/less/winter.theme-selector.less | 160 + modules/cms/assets/vendor/jsdiff/diff.js | 1407 ++ modules/cms/classes/Asset.php | 313 + modules/cms/classes/AutoDatasource.php | 581 + modules/cms/classes/CmsCompoundObject.php | 493 + modules/cms/classes/CmsController.php | 71 + modules/cms/classes/CmsException.php | 236 + modules/cms/classes/CmsObject.php | 365 + modules/cms/classes/CmsObjectCollection.php | 119 + modules/cms/classes/CodeBase.php | 168 + modules/cms/classes/CodeParser.php | 382 + modules/cms/classes/ComponentBase.php | 336 + modules/cms/classes/ComponentHelpers.php | 129 + modules/cms/classes/ComponentManager.php | 239 + modules/cms/classes/ComponentPartial.php | 262 + modules/cms/classes/Content.php | 73 + modules/cms/classes/Controller.php | 1650 ++ modules/cms/classes/Layout.php | 51 + modules/cms/classes/LayoutCode.php | 18 + modules/cms/classes/MediaLibrary.php | 23 + modules/cms/classes/MediaLibraryItem.php | 19 + modules/cms/classes/MediaViewHelper.php | 111 + modules/cms/classes/Meta.php | 85 + modules/cms/classes/ObjectMemoryCache.php | 12 + modules/cms/classes/Page.php | 238 + modules/cms/classes/PageCode.php | 11 + modules/cms/classes/Partial.php | 24 + modules/cms/classes/PartialCode.php | 11 + modules/cms/classes/PartialStack.php | 93 + modules/cms/classes/Router.php | 358 + modules/cms/classes/Theme.php | 735 + modules/cms/classes/ThemeManager.php | 127 + modules/cms/classes/asset/fields.yaml | 26 + modules/cms/classes/content/fields.yaml | 28 + modules/cms/classes/layout/fields.yaml | 45 + modules/cms/classes/page/fields.yaml | 87 + modules/cms/classes/partial/fields.yaml | 45 + modules/cms/classes/theme/fields.yaml | 58 + modules/cms/components/Resources.php | 190 + modules/cms/components/SoftComponent.php | 33 + modules/cms/components/UnknownComponent.php | 34 + modules/cms/components/ViewBag.php | 83 + modules/cms/composer.json | 39 + modules/cms/console/CreateComponent.php | 54 + modules/cms/console/CreateTheme.php | 217 + modules/cms/console/ThemeInstall.php | 130 + modules/cms/console/ThemeList.php | 66 + modules/cms/console/ThemeRemove.php | 70 + modules/cms/console/ThemeSync.php | 234 + modules/cms/console/ThemeUse.php | 66 + .../console/scaffold/component/component.stub | 25 + .../console/scaffold/component/default.stub | 3 + .../scaffold/theme/less/assets/js/app.stub | 33 + .../theme/less/assets/less/theme.stub | 5 + .../scaffold/theme/less/layouts/default.stub | 7 + .../scaffold/theme/less/pages/404.stub | 8 + .../scaffold/theme/less/pages/error.stub | 8 + .../scaffold/theme/less/pages/home.stub | 7 + .../theme/less/partials/meta/seo.stub | 11 + .../theme/less/partials/meta/styles.stub | 4 + .../theme/less/partials/site/footer.stub | 17 + .../theme/less/partials/site/header.stub | 20 + .../console/scaffold/theme/less/theme.stub | 9 + .../console/scaffold/theme/less/version.stub | 1 + .../scaffold/theme/tailwind/.gitignore.stub | 2 + .../scaffold/theme/tailwind/README.stub | 9 + .../scaffold/theme/tailwind/lang/en/lang.stub | 9 + .../theme/tailwind/layouts/default.stub | 8 + .../scaffold/theme/tailwind/pages/404.stub | 8 + .../scaffold/theme/tailwind/pages/error.stub | 8 + .../scaffold/theme/tailwind/pages/home.stub | 7 + .../theme/tailwind/partials/meta/seo.stub | 11 + .../theme/tailwind/partials/meta/styles.stub | 12 + .../theme/tailwind/partials/site/footer.stub | 21 + .../theme/tailwind/partials/site/header.stub | 20 + .../scaffold/theme/tailwind/theme.stub | 21 + .../scaffold/theme/tailwind/version.stub | 1 + modules/cms/contracts/CmsObject.php | 61 + modules/cms/controllers/Index.php | 922 + modules/cms/controllers/Media.php | 22 + modules/cms/controllers/ThemeLogs.php | 81 + modules/cms/controllers/ThemeOptions.php | 144 + modules/cms/controllers/Themes.php | 359 + .../cms/controllers/index/_button_commit.php | 14 + .../index/_button_lastmodified.php | 8 + .../cms/controllers/index/_button_reset.php | 14 + .../index/_common_toolbar_actions.php | 19 + .../index/_concurrency_resolve_form.php | 29 + .../controllers/index/_content_toolbar.php | 12 + modules/cms/controllers/index/_form_page.php | 16 + .../cms/controllers/index/_layout_toolbar.php | 12 + .../cms/controllers/index/_page_toolbar.php | 28 + .../controllers/index/_partial_toolbar.php | 12 + .../controllers/index/_safemode_notice.php | 6 + modules/cms/controllers/index/_sidepanel.php | 80 + .../index/config_content_list.yaml | 7 + .../controllers/index/config_layout_list.yaml | 8 + .../controllers/index/config_page_list.yaml | 15 + .../index/config_partial_list.yaml | 8 + modules/cms/controllers/index/index.php | 31 + modules/cms/controllers/media/index.php | 7 + .../controllers/themelogs/_field_content.php | 3 + .../themelogs/_field_diff_content.php | 7 + .../themelogs/_field_diff_template.php | 7 + .../controllers/themelogs/_field_template.php | 1 + modules/cms/controllers/themelogs/_hint.php | 4 + .../controllers/themelogs/_hint_preview.php | 22 + .../controllers/themelogs/_list_toolbar.php | 31 + .../themelogs/_preview_scoreboard.php | 18 + .../controllers/themelogs/config_filter.yaml | 16 + .../controllers/themelogs/config_form.yaml | 19 + .../controllers/themelogs/config_list.yaml | 22 + modules/cms/controllers/themelogs/index.php | 5 + modules/cms/controllers/themelogs/preview.php | 34 + .../controllers/themeoptions/config_form.yaml | 21 + .../cms/controllers/themeoptions/update.php | 70 + .../controllers/themes/_theme_create_form.php | 54 + .../themes/_theme_duplicate_form.php | 75 + .../controllers/themes/_theme_export_form.php | 63 + .../controllers/themes/_theme_fields_form.php | 56 + .../controllers/themes/_theme_import_form.php | 57 + .../cms/controllers/themes/_theme_list.php | 31 + .../controllers/themes/_theme_list_item.php | 121 + modules/cms/controllers/themes/download.php | 13 + modules/cms/controllers/themes/index.php | 11 + .../2014_10_01_000001_Db_Cms_Theme_Data.php | 23 + ...2016_10_01_000002_Db_Cms_Timestamp_Fix.php | 24 + .../2017_10_01_000003_Db_Cms_Theme_Logs.php | 28 + ...18_11_01_000001_Db_Cms_Theme_Templates.php | 26 + ..._000004_Db_Cms_Theme_Templates_Indexes.php | 22 + modules/cms/facades/Cms.php | 21 + modules/cms/formwidgets/Components.php | 97 + modules/cms/formwidgets/MediaFinder.php | 32 + .../components/partials/_component.php | 20 + .../components/partials/_formcomponents.php | 17 + modules/cms/helpers/Cms.php | 48 + modules/cms/helpers/File.php | 74 + modules/cms/lang/ar/lang.php | 40 + modules/cms/lang/be/lang.php | 251 + modules/cms/lang/bg/lang.php | 231 + modules/cms/lang/ca/lang.php | 289 + modules/cms/lang/cs/lang.php | 291 + modules/cms/lang/da/lang.php | 245 + modules/cms/lang/de/lang.php | 307 + modules/cms/lang/el/lang.php | 245 + modules/cms/lang/en/lang.php | 321 + modules/cms/lang/es-ar/lang.php | 166 + modules/cms/lang/es/lang.php | 287 + modules/cms/lang/et/lang.php | 288 + modules/cms/lang/fa/lang.php | 306 + modules/cms/lang/fi/lang.php | 289 + modules/cms/lang/fr/lang.php | 307 + modules/cms/lang/hu/lang.php | 307 + modules/cms/lang/id/lang.php | 185 + modules/cms/lang/it/lang.php | 274 + modules/cms/lang/ja/lang.php | 306 + modules/cms/lang/kr/lang.php | 288 + modules/cms/lang/lt/lang.php | 257 + modules/cms/lang/lv/lang.php | 314 + modules/cms/lang/nb-no/lang.php | 246 + modules/cms/lang/nl/lang.php | 300 + modules/cms/lang/pl/lang.php | 246 + modules/cms/lang/pt-br/lang.php | 300 + modules/cms/lang/pt-pt/lang.php | 287 + modules/cms/lang/ro/lang.php | 300 + modules/cms/lang/rs/lang.php | 299 + modules/cms/lang/ru/lang.php | 314 + modules/cms/lang/sk/lang.php | 288 + modules/cms/lang/sl/lang.php | 299 + modules/cms/lang/sv/lang.php | 238 + modules/cms/lang/th/lang.php | 292 + modules/cms/lang/tr/lang.php | 314 + modules/cms/lang/uk/lang.php | 321 + modules/cms/lang/vn/lang.php | 289 + modules/cms/lang/zh-cn/lang.php | 297 + modules/cms/lang/zh-tw/lang.php | 241 + modules/cms/models/MaintenanceSetting.php | 105 + modules/cms/models/ThemeData.php | 309 + modules/cms/models/ThemeExport.php | 155 + modules/cms/models/ThemeImport.php | 200 + modules/cms/models/ThemeLog.php | 129 + .../cms/models/maintenancesetting/_hint.php | 4 + .../cms/models/maintenancesetting/fields.yaml | 35 + modules/cms/models/themeexport/fields.yaml | 14 + modules/cms/models/themeimport/fields.yaml | 25 + modules/cms/models/themelog/columns.yaml | 49 + modules/cms/models/themelog/fields.yaml | 36 + modules/cms/phpunit.xml | 17 + modules/cms/reportwidgets/ActiveTheme.php | 71 + .../activetheme/assets/css/activetheme.css | 4 + .../activetheme/partials/_widget.php | 48 + modules/cms/routes.php | 41 + modules/cms/tests/classes/AssetTest.php | 121 + .../cms/tests/classes/AutoDatasourceTest.php | 217 + .../tests/classes/CmsCompoundObjectTest.php | 333 + .../cms/tests/classes/CmsExceptionTest.php | 46 + .../cms/tests/classes/CmsObjectQueryTest.php | 122 + modules/cms/tests/classes/CmsObjectTest.php | 343 + modules/cms/tests/classes/CodeParserTest.php | 322 + .../tests/classes/ComponentManagerTest.php | 142 + modules/cms/tests/classes/ContentTest.php | 38 + .../tests/classes/ControllerPostbackTest.php | 175 + modules/cms/tests/classes/ControllerTest.php | 752 + modules/cms/tests/classes/PageTest.php | 33 + .../cms/tests/classes/PartialStackTest.php | 61 + modules/cms/tests/classes/RouterTest.php | 183 + modules/cms/tests/classes/ThemeTest.php | 177 + .../cms/tests/classes/TwigExtensionTest.php | 165 + .../tests/controllers/IndexPermissionTest.php | 253 + .../fixtures/reference/compound-full.htm | 7 + .../reference/compound-markup-settings.htm | 3 + .../fixtures/reference/compound-markup.htm | 1 + .../reference/namespaces-aliases.php.stub | 9 + .../fixtures/reference/namespaces.php.stub | 9 + .../tests/fixtures/themes/apitest/.gitignore | 2 + .../themes/childtest/assets/css/style2.css | 0 .../themes/childtest/content/a/a-content.htm | 1 + .../themes/childtest/partials/a/a-partial.htm | 1 + .../fixtures/themes/childtest/theme.yaml | 2 + .../themes/test/assets/css/style1.css | 0 .../themes/test/assets/css/style2.css | 0 .../themes/test/assets/images/winter.png | Bin 0 -> 7491 bytes .../fixtures/themes/test/assets/js/script1.js | 1 + .../fixtures/themes/test/assets/js/script2.js | 1 + .../themes/test/assets/js/subdir/script1.js | 1 + .../themes/test/content/a/a-content.htm | 1 + .../themes/test/content/html-content.htm | 1 + .../themes/test/content/layout-content.txt | 1 + .../themes/test/content/markdown-content.md | 1 + .../themes/test/content/page-content.htm | 1 + .../themes/test/content/text-content.txt | 1 + .../themes/test/layouts/a/a-layout.htm | 1 + .../themes/test/layouts/ajax-test.htm | 10 + .../fixtures/themes/test/layouts/content.htm | 1 + .../themes/test/layouts/cycle-test.htm | 15 + .../fixtures/themes/test/layouts/no-php.htm | 1 + .../fixtures/themes/test/layouts/partials.htm | 1 + .../themes/test/layouts/php-parser-test.htm | 10 + .../themes/test/layouts/placeholder.htm | 1 + .../fixtures/themes/test/layouts/sidebar.htm | 1 + .../tests/fixtures/themes/test/pages/404.htm | 3 + .../fixtures/themes/test/pages/a/a-page.htm | 4 + .../fixtures/themes/test/pages/ajax-test.htm | 8 + .../fixtures/themes/test/pages/authors.htm | 4 + .../fixtures/themes/test/pages/b/b-page.htm | 3 + .../fixtures/themes/test/pages/b/c/c-page.htm | 3 + .../themes/test/pages/blog-archive.htm | 4 + .../themes/test/pages/blog-category.htm | 4 + .../fixtures/themes/test/pages/blog-post.htm | 4 + .../test/pages/code-namespaces-aliases.htm | 13 + .../themes/test/pages/code-namespaces.htm | 13 + .../test/pages/component-custom-render.htm | 10 + .../component-partial-alias-override.htm | 5 + .../test/pages/component-partial-nesting.htm | 3 + .../test/pages/component-partial-override.htm | 5 + .../themes/test/pages/component-partial.htm | 5 + .../fixtures/themes/test/pages/cycle-test.htm | 12 + .../themes/test/pages/filters-test.htm | 13 + .../fixtures/themes/test/pages/index.htm | 3 + .../themes/test/pages/no-component-class.htm | 5 + .../themes/test/pages/no-component.htm | 3 + .../fixtures/themes/test/pages/no-layout.htm | 4 + .../fixtures/themes/test/pages/no-partial.htm | 4 + .../test/pages/no-soft-component-class.htm | 5 + .../test/pages/optional-full-php-tags.htm | 14 + .../test/pages/optional-short-php-tags.htm | 14 + .../test/pages/shared-variable-override.htm | 10 + .../themes/test/pages/shared-variable.htm | 5 + .../fixtures/themes/test/pages/throw-php.htm | 7 + .../themes/test/pages/with-component.htm | 11 + .../themes/test/pages/with-components.htm | 14 + .../themes/test/pages/with-content.htm | 4 + .../themes/test/pages/with-layout.htm | 4 + .../fixtures/themes/test/pages/with-macro.htm | 6 + .../themes/test/pages/with-partials.htm | 4 + .../themes/test/pages/with-placeholder.htm | 11 + .../pages/with-soft-component-class-alias.htm | 11 + .../test/pages/with-soft-component-class.htm | 11 + .../themes/test/partials/a/a-partial.htm | 1 + .../themes/test/partials/ajax-result.htm | 1 + .../test/partials/ajax-second-result.htm | 1 + .../themes/test/partials/layout-partial.htm | 1 + .../themes/test/partials/nesting/level1.htm | 6 + .../themes/test/partials/nesting/level2.htm | 6 + .../themes/test/partials/nesting/level3.htm | 4 + .../test/partials/override1/default.htm | 1 + .../test/partials/override2/default.htm | 7 + .../themes/test/partials/override2/items.htm | 3 + .../test/partials/override3/default.htm | 1 + .../test/partials/override4/default.htm | 3 + .../themes/test/partials/page-partial.htm | 1 + .../themes/test/partials/testpost/default.htm | 1 + .../fixtures/themes/test/temporary/.gitignore | 2 + .../themes/test/testobjects/component.htm | 5 + .../themes/test/testobjects/components.htm | 8 + .../themes/test/testobjects/compound.htm | 10 + .../themes/test/testobjects/plain.html | 1 + .../themes/test/testobjects/subdir/obj.html | 1 + .../themes/test/testobjects/viewbag.htm | 5 + .../fixtures/themes/themedata/theme.yaml | 9 + modules/cms/tests/helpers/FileTest.php | 21 + modules/cms/tests/models/ThemeDataTest.php | 154 + .../tests/widgets/AssetListPermissionTest.php | 28 + modules/cms/traits/UrlMaker.php | 210 + modules/cms/twig/ComponentNode.php | 45 + modules/cms/twig/ComponentTokenParser.php | 70 + modules/cms/twig/ContentNode.php | 48 + modules/cms/twig/ContentTokenParser.php | 74 + modules/cms/twig/DebugExtension.php | 597 + modules/cms/twig/DefaultNode.php | 31 + modules/cms/twig/DefaultTokenParser.php | 41 + modules/cms/twig/Extension.php | 233 + modules/cms/twig/FlashNode.php | 67 + modules/cms/twig/FlashTokenParser.php | 55 + modules/cms/twig/FrameworkNode.php | 62 + modules/cms/twig/FrameworkTokenParser.php | 45 + modules/cms/twig/Loader.php | 165 + modules/cms/twig/PageNode.php | 31 + modules/cms/twig/PageTokenParser.php | 38 + modules/cms/twig/PartialNode.php | 46 + modules/cms/twig/PartialTokenParser.php | 74 + modules/cms/twig/PlaceholderNode.php | 83 + modules/cms/twig/PlaceholderTokenParser.php | 98 + modules/cms/twig/PutNode.php | 44 + modules/cms/twig/PutTokenParser.php | 63 + modules/cms/twig/ScriptsNode.php | 32 + modules/cms/twig/ScriptsTokenParser.php | 38 + modules/cms/twig/SnowboardNode.php | 79 + modules/cms/twig/SnowboardTokenParser.php | 60 + modules/cms/twig/StylesNode.php | 32 + modules/cms/twig/StylesTokenParser.php | 38 + modules/cms/views/404.php | 14 + modules/cms/views/error.php | 14 + modules/cms/widgets/AssetList.php | 777 + modules/cms/widgets/ComponentList.php | 247 + modules/cms/widgets/MediaManager.php | 26 + modules/cms/widgets/TemplateList.php | 415 + .../assetlist/assets/css/assetlist.css | 63 + .../widgets/assetlist/assets/js/assetlist.js | 184 + .../assetlist/assets/less/assetlist.less | 236 + .../cms/widgets/assetlist/partials/_body.php | 9 + .../cms/widgets/assetlist/partials/_files.php | 7 + .../cms/widgets/assetlist/partials/_items.php | 69 + .../widgets/assetlist/partials/_move_form.php | 41 + .../assetlist/partials/_new_dir_form.php | 43 + .../assetlist/partials/_rename_form.php | 43 + .../widgets/assetlist/partials/_toolbar.php | 78 + .../widgets/componentlist/partials/_body.php | 8 + .../partials/_component_list.php | 39 + .../componentlist/partials/_components.php | 11 + .../widgets/componentlist/partials/_items.php | 16 + .../componentlist/partials/_toolbar.php | 16 + .../widgets/templatelist/partials/_body.php | 8 + .../widgets/templatelist/partials/_items.php | 59 + .../partials/_sorting-options.php | 12 + .../templatelist/partials/_templates.php | 11 + .../templatelist/partials/_toolbar.php | 51 + modules/system/.babelrc | 17 + modules/system/.eslintignore | 18 + modules/system/.eslintrc.json | 49 + modules/system/.gitignore | 6 + modules/system/LICENSE | 22 + modules/system/README.md | 5 + modules/system/ServiceProvider.php | 690 + modules/system/aliases.php | 114 + .../css/eventlogs/exception-beautifier.css | 135 + .../assets/css/framework.extras-min.css | 52 + .../system/assets/css/framework.extras.css | 1 + .../system/assets/css/settings/settings.css | 72 + .../system/assets/css/snowboard.extras.css | 1 + modules/system/assets/css/styles.css | 1 + modules/system/assets/css/updates/details.css | 84 + modules/system/assets/css/updates/install.css | 297 + modules/system/assets/css/updates/updates.css | 116 + modules/system/assets/images/cog-icon.svg | 13 + modules/system/assets/js/build/manifest.js | 1 + .../system/assets/js/build/system.debug.js | 1 + modules/system/assets/js/build/system.js | 1 + .../js/eventlogs/exception-beautifier.js | 393 + .../eventlogs/exception-beautifier.links.js | 137 + modules/system/assets/js/framework-min.js | 115 + .../assets/js/framework.combined-min.js | 165 + .../system/assets/js/framework.combined.js | 4 + modules/system/assets/js/framework.extras.js | 260 + modules/system/assets/js/framework.js | 1103 + modules/system/assets/js/lang/lang.ar.js | 134 + modules/system/assets/js/lang/lang.be.js | 143 + modules/system/assets/js/lang/lang.bg.js | 101 + modules/system/assets/js/lang/lang.ca.js | 99 + modules/system/assets/js/lang/lang.cs.js | 190 + modules/system/assets/js/lang/lang.da.js | 71 + modules/system/assets/js/lang/lang.de.js | 87 + modules/system/assets/js/lang/lang.el.js | 111 + modules/system/assets/js/lang/lang.en-au.js | 78 + modules/system/assets/js/lang/lang.en-ca.js | 74 + modules/system/assets/js/lang/lang.en-gb.js | 78 + modules/system/assets/js/lang/lang.en.js | 10 + modules/system/assets/js/lang/lang.es-ar.js | 10 + modules/system/assets/js/lang/lang.es.js | 103 + modules/system/assets/js/lang/lang.et.js | 89 + modules/system/assets/js/lang/lang.fa.js | 117 + modules/system/assets/js/lang/lang.fi.js | 120 + modules/system/assets/js/lang/lang.fr-ca.js | 85 + modules/system/assets/js/lang/lang.fr.js | 94 + modules/system/assets/js/lang/lang.hu.js | 121 + modules/system/assets/js/lang/lang.id.js | 93 + modules/system/assets/js/lang/lang.it.js | 80 + modules/system/assets/js/lang/lang.ja.js | 103 + modules/system/assets/js/lang/lang.kr.js | 10 + modules/system/assets/js/lang/lang.lt.js | 129 + modules/system/assets/js/lang/lang.lv.js | 108 + modules/system/assets/js/lang/lang.nb-no.js | 10 + modules/system/assets/js/lang/lang.nl.js | 98 + modules/system/assets/js/lang/lang.pl.js | 137 + modules/system/assets/js/lang/lang.pt-br.js | 72 + modules/system/assets/js/lang/lang.pt-pt.js | 10 + modules/system/assets/js/lang/lang.ro.js | 86 + modules/system/assets/js/lang/lang.rs.js | 10 + modules/system/assets/js/lang/lang.ru.js | 193 + modules/system/assets/js/lang/lang.sk.js | 167 + modules/system/assets/js/lang/lang.sl.js | 184 + modules/system/assets/js/lang/lang.stub | 10 + modules/system/assets/js/lang/lang.sv.js | 80 + modules/system/assets/js/lang/lang.th.js | 78 + modules/system/assets/js/lang/lang.tr.js | 106 + modules/system/assets/js/lang/lang.uk.js | 162 + modules/system/assets/js/lang/lang.vn.js | 10 + modules/system/assets/js/lang/lang.zh-cn.js | 121 + modules/system/assets/js/lang/lang.zh-tw.js | 114 + .../js/mailbrandsettings/mailbrandsettings.js | 37 + .../js/snowboard/abstracts/PluginBase.js | 68 + .../js/snowboard/abstracts/Singleton.js | 15 + .../assets/js/snowboard/ajax/Request.js | 889 + .../ajax/handlers/AttributeRequest.js | 332 + .../snowboard/build/snowboard.base.debug.js | 1 + .../js/snowboard/build/snowboard.base.js | 1 + .../js/snowboard/build/snowboard.data-attr.js | 1 + .../js/snowboard/build/snowboard.extras.js | 1 + .../js/snowboard/build/snowboard.request.js | 1 + .../js/snowboard/build/snowboard.vendor.js | 3 + .../assets/js/snowboard/extras/AssetLoader.js | 196 + .../js/snowboard/extras/AttachLoading.js | 70 + .../assets/js/snowboard/extras/DataConfig.js | 222 + .../assets/js/snowboard/extras/Flash.js | 150 + .../js/snowboard/extras/FlashListener.js | 72 + .../js/snowboard/extras/FormValidation.js | 215 + .../js/snowboard/extras/StripeLoader.js | 94 + .../js/snowboard/extras/StylesheetLoader.js | 38 + .../assets/js/snowboard/extras/Transition.js | 206 + .../js/snowboard/main/InnerProxyHandler.js | 43 + .../assets/js/snowboard/main/PluginLoader.js | 293 + .../assets/js/snowboard/main/ProxyHandler.js | 25 + .../assets/js/snowboard/main/Snowboard.js | 595 + .../js/snowboard/snowboard.backend.extras.js | 21 + .../js/snowboard/snowboard.base.debug.js | 14 + .../assets/js/snowboard/snowboard.base.js | 14 + .../js/snowboard/snowboard.data-attr.js | 9 + .../assets/js/snowboard/snowboard.extras.js | 25 + .../assets/js/snowboard/snowboard.request.js | 9 + .../assets/js/snowboard/utilities/Cookie.js | 134 + .../js/snowboard/utilities/JsonParser.js | 395 + .../js/snowboard/utilities/Sanitizer.js | 64 + .../assets/js/snowboard/utilities/Url.js | 165 + modules/system/assets/js/updates/details.js | 27 + modules/system/assets/js/updates/install.js | 192 + modules/system/assets/js/updates/updates.js | 159 + .../system/assets/less/framework.extras.less | 235 + .../system/assets/less/settings/settings.less | 80 + .../system/assets/less/snowboard.extras.less | 236 + modules/system/assets/less/styles.less | 247 + .../system/assets/less/updates/details.less | 89 + .../system/assets/less/updates/install.less | 311 + .../system/assets/less/updates/updates.less | 121 + modules/system/assets/ui/README.md | 34 + modules/system/assets/ui/docs/autocomplete.md | 19 + modules/system/assets/ui/docs/breadcrumb.md | 13 + modules/system/assets/ui/docs/button.md | 63 + modules/system/assets/ui/docs/callout.md | 66 + modules/system/assets/ui/docs/chart.md | 127 + modules/system/assets/ui/docs/checkbox.md | 102 + modules/system/assets/ui/docs/datepicker.md | 102 + modules/system/assets/ui/docs/drag-scroll.md | 27 + modules/system/assets/ui/docs/drag-sort.md | 108 + modules/system/assets/ui/docs/drag-value.md | 52 + modules/system/assets/ui/docs/dropdown.md | 43 + modules/system/assets/ui/docs/filter.md | 54 + modules/system/assets/ui/docs/flag.md | 269 + modules/system/assets/ui/docs/flashmessage.md | 70 + modules/system/assets/ui/docs/form.md | 180 + modules/system/assets/ui/docs/foundation.md | 235 + modules/system/assets/ui/docs/icon.md | 146 + modules/system/assets/ui/docs/input-hotkey.md | 29 + .../system/assets/ui/docs/input-monitor.md | 60 + modules/system/assets/ui/docs/input-preset.md | 11 + .../system/assets/ui/docs/input-trigger.md | 85 + modules/system/assets/ui/docs/inspector.md | 724 + modules/system/assets/ui/docs/list.md | 336 + modules/system/assets/ui/docs/loader.md | 91 + modules/system/assets/ui/docs/pagination.md | 23 + modules/system/assets/ui/docs/popover.md | 131 + modules/system/assets/ui/docs/popup.md | 152 + modules/system/assets/ui/docs/progressbar.md | 9 + modules/system/assets/ui/docs/scoreboard.md | 84 + modules/system/assets/ui/docs/select.md | 156 + modules/system/assets/ui/docs/site.md | 7 + modules/system/assets/ui/docs/tab.md | 155 + modules/system/assets/ui/docs/toolbar.md | 162 + modules/system/assets/ui/docs/tooltip.md | 30 + modules/system/assets/ui/docs/utilities.md | 129 + .../system/assets/ui/font/fa-brands-400.ttf | Bin 0 -> 210792 bytes .../system/assets/ui/font/fa-brands-400.woff2 | Bin 0 -> 118684 bytes .../system/assets/ui/font/fa-regular-400.ttf | Bin 0 -> 68064 bytes .../assets/ui/font/fa-regular-400.woff2 | Bin 0 -> 25472 bytes .../system/assets/ui/font/fa-solid-900.ttf | Bin 0 -> 426112 bytes .../system/assets/ui/font/fa-solid-900.woff2 | Bin 0 -> 158220 bytes .../assets/ui/font/fa-v4compatibility.ttf | Bin 0 -> 10836 bytes .../assets/ui/font/fa-v4compatibility.woff2 | Bin 0 -> 4796 bytes modules/system/assets/ui/icons.css | 1 + modules/system/assets/ui/icons.less | 6 + .../system/assets/ui/images/bitmap-icons.png | Bin 0 -> 3598 bytes .../assets/ui/images/loader-transparent.svg | 20 + .../system/assets/ui/images/loader-white.svg | 20 + modules/system/assets/ui/images/loader.gif | Bin 0 -> 3783 bytes modules/system/assets/ui/images/loader.svg | 19 + .../assets/ui/images/primary-tab-shape.png | Bin 0 -> 1636 bytes modules/system/assets/ui/js/autocomplete.js | 421 + modules/system/assets/ui/js/callout.js | 81 + modules/system/assets/ui/js/chart.bar.js | 138 + modules/system/assets/ui/js/chart.line.js | 235 + modules/system/assets/ui/js/chart.meter.js | 77 + modules/system/assets/ui/js/chart.pie.js | 141 + modules/system/assets/ui/js/chart.utils.js | 114 + .../system/assets/ui/js/checkbox.balloon.js | 67 + modules/system/assets/ui/js/checkbox.js | 86 + modules/system/assets/ui/js/datepicker.js | 369 + modules/system/assets/ui/js/drag.scroll.js | 445 + modules/system/assets/ui/js/drag.sort.js | 217 + modules/system/assets/ui/js/drag.value.js | 192 + modules/system/assets/ui/js/dropdown.js | 144 + modules/system/assets/ui/js/filter.dates.js | 414 + modules/system/assets/ui/js/filter.js | 713 + modules/system/assets/ui/js/filter.numbers.js | 317 + modules/system/assets/ui/js/flashmessage.js | 77 + .../assets/ui/js/foundation.baseclass.js | 81 + .../assets/ui/js/foundation.controlutils.js | 52 + .../system/assets/ui/js/foundation.element.js | 149 + .../system/assets/ui/js/foundation.event.js | 83 + modules/system/assets/ui/js/input.hotkey.js | 223 + modules/system/assets/ui/js/input.monitor.js | 160 + modules/system/assets/ui/js/input.preset.js | 362 + modules/system/assets/ui/js/input.trigger.js | 195 + .../assets/ui/js/inspector.datainteraction.js | 163 + .../ui/js/inspector.editor.autocomplete.js | 256 + .../assets/ui/js/inspector.editor.base.js | 217 + .../assets/ui/js/inspector.editor.checkbox.js | 109 + .../ui/js/inspector.editor.dictionary.js | 450 + .../assets/ui/js/inspector.editor.dropdown.js | 455 + .../assets/ui/js/inspector.editor.object.js | 140 + .../ui/js/inspector.editor.objectlist.js | 700 + .../ui/js/inspector.editor.popupbase.js | 137 + .../assets/ui/js/inspector.editor.set.js | 375 + .../assets/ui/js/inspector.editor.string.js | 88 + .../ui/js/inspector.editor.stringlist.js | 96 + ...inspector.editor.stringlistautocomplete.js | 549 + .../assets/ui/js/inspector.editor.text.js | 97 + .../system/assets/ui/js/inspector.engine.js | 103 + .../js/inspector.externalparametereditor.js | 336 + .../system/assets/ui/js/inspector.groups.js | 268 + .../system/assets/ui/js/inspector.helpers.js | 35 + .../system/assets/ui/js/inspector.manager.js | 178 + .../system/assets/ui/js/inspector.surface.js | 975 + .../assets/ui/js/inspector.validationset.js | 119 + .../assets/ui/js/inspector.validator.base.js | 59 + .../ui/js/inspector.validator.basenumber.js | 45 + .../assets/ui/js/inspector.validator.float.js | 47 + .../ui/js/inspector.validator.integer.js | 47 + .../ui/js/inspector.validator.length.js | 72 + .../assets/ui/js/inspector.validator.regex.js | 41 + .../ui/js/inspector.validator.required.js | 35 + .../assets/ui/js/inspector.wrapper.base.js | 412 + .../ui/js/inspector.wrapper.container.js | 245 + .../assets/ui/js/inspector.wrapper.popup.js | 217 + modules/system/assets/ui/js/list.rowlink.js | 127 + modules/system/assets/ui/js/list.sortable.js | 464 + modules/system/assets/ui/js/loader.base.js | 140 + modules/system/assets/ui/js/loader.cursor.js | 90 + modules/system/assets/ui/js/loader.stripe.js | 100 + modules/system/assets/ui/js/popover.js | 389 + modules/system/assets/ui/js/popup.js | 429 + modules/system/assets/ui/js/select.js | 186 + modules/system/assets/ui/js/tab.js | 432 + modules/system/assets/ui/js/toolbar.js | 117 + modules/system/assets/ui/js/tooltip.js | 25 + .../system/assets/ui/less/autocomplete.less | 7 + modules/system/assets/ui/less/breadcrumb.less | 99 + .../system/assets/ui/less/button.base.less | 185 + .../system/assets/ui/less/button.groups.less | 225 + modules/system/assets/ui/less/button.less | 191 + .../system/assets/ui/less/button.mixins.less | 100 + .../assets/ui/less/button.variables.less | 34 + modules/system/assets/ui/less/callout.less | 183 + modules/system/assets/ui/less/chart.less | 392 + .../assets/ui/less/checkbox.balloon.less | 53 + modules/system/assets/ui/less/checkbox.less | 330 + .../assets/ui/less/datepicker.date.less | 168 + modules/system/assets/ui/less/datepicker.less | 117 + .../assets/ui/less/datepicker.time.less | 299 + .../assets/ui/less/datepicker.variables.less | 8 + .../system/assets/ui/less/dropdown.base.less | 189 + modules/system/assets/ui/less/dropdown.less | 305 + .../assets/ui/less/dropdown.variables.less | 22 + modules/system/assets/ui/less/filter.less | 395 + modules/system/assets/ui/less/flag.less | 49 + .../system/assets/ui/less/flashmessage.less | 84 + modules/system/assets/ui/less/form.base.less | 445 + .../system/assets/ui/less/form.groups.less | 162 + modules/system/assets/ui/less/form.less | 554 + .../system/assets/ui/less/form.mixins.less | 79 + .../system/assets/ui/less/form.variables.less | 53 + modules/system/assets/ui/less/global.less | 25 + .../assets/ui/less/global.mixins.css3.less | 221 + .../ui/less/global.mixins.gradient.less | 60 + .../ui/less/global.mixins.triangle.less | 34 + .../assets/ui/less/global.mixins.utility.less | 134 + .../assets/ui/less/global.variables.less | 190 + modules/system/assets/ui/less/icon.close.less | 33 + modules/system/assets/ui/less/icon.icons.less | 15 + modules/system/assets/ui/less/icon.less | 207 + .../system/assets/ui/less/icon.mixins.less | 104 + modules/system/assets/ui/less/icon.shims.less | 3250 +++ .../system/assets/ui/less/icon.variables.less | 807 + modules/system/assets/ui/less/inspector.less | 689 + modules/system/assets/ui/less/list.base.less | 233 + modules/system/assets/ui/less/list.less | 634 + .../system/assets/ui/less/list.mixins.less | 27 + .../system/assets/ui/less/list.rowlink.less | 20 + .../system/assets/ui/less/list.variables.less | 42 + modules/system/assets/ui/less/loader.less | 338 + modules/system/assets/ui/less/pagination.less | 117 + modules/system/assets/ui/less/popover.less | 317 + modules/system/assets/ui/less/popup.base.less | 138 + modules/system/assets/ui/less/popup.less | 204 + .../assets/ui/less/popup.variables.less | 23 + .../system/assets/ui/less/progressbar.less | 84 + modules/system/assets/ui/less/scoreboard.less | 67 + modules/system/assets/ui/less/select.less | 594 + .../system/assets/ui/less/select.mixins.less | 45 + .../assets/ui/less/select.variables.less | 21 + modules/system/assets/ui/less/site.grid.less | 94 + modules/system/assets/ui/less/site.less | 16 + .../system/assets/ui/less/site.mixins.less | 227 + .../system/assets/ui/less/site.normalize.less | 460 + modules/system/assets/ui/less/site.print.less | 101 + modules/system/assets/ui/less/site.reset.less | 115 + .../assets/ui/less/site.typography.less | 293 + .../system/assets/ui/less/site.utility.less | 145 + .../system/assets/ui/less/site.variables.less | 26 + modules/system/assets/ui/less/tab.base.less | 226 + modules/system/assets/ui/less/tab.less | 535 + modules/system/assets/ui/less/taglist.less | 28 + modules/system/assets/ui/less/toolbar.less | 274 + .../assets/ui/less/toolbar.variables.less | 11 + modules/system/assets/ui/less/tooltip.less | 101 + .../assets/ui/less/tooltip.variables.less | 12 + modules/system/assets/ui/less/utilities.less | 131 + .../assets/ui/less/windex.variables.less | 53 + modules/system/assets/ui/storm-min.js | 4681 ++++ modules/system/assets/ui/storm.css | 1 + modules/system/assets/ui/storm.js | 96 + modules/system/assets/ui/storm.less | 34 + .../assets/ui/vendor/bootstrap/js/dropdown.js | 147 + .../assets/ui/vendor/bootstrap/js/modal.js | 255 + .../assets/ui/vendor/bootstrap/js/tab.js | 125 + .../assets/ui/vendor/bootstrap/js/tooltip.js | 399 + .../ui/vendor/bootstrap/js/transition.js | 48 + .../clockpicker/css/jquery-clockpicker.css | 318 + .../clockpicker/js/jquery-clockpicker.js | 758 + .../ui/vendor/flag-icon/flags/1x1/ad.svg | 148 + .../ui/vendor/flag-icon/flags/1x1/ae.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/af.svg | 81 + .../ui/vendor/flag-icon/flags/1x1/ag.svg | 14 + .../ui/vendor/flag-icon/flags/1x1/ai.svg | 767 + .../ui/vendor/flag-icon/flags/1x1/al.svg | 5 + .../ui/vendor/flag-icon/flags/1x1/am.svg | 5 + .../ui/vendor/flag-icon/flags/1x1/ao.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/aq.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/ar.svg | 31 + .../ui/vendor/flag-icon/flags/1x1/as.svg | 33 + .../ui/vendor/flag-icon/flags/1x1/at.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/au.svg | 9 + .../ui/vendor/flag-icon/flags/1x1/aw.svg | 186 + .../ui/vendor/flag-icon/flags/1x1/ax.svg | 18 + .../ui/vendor/flag-icon/flags/1x1/az.svg | 8 + .../ui/vendor/flag-icon/flags/1x1/ba.svg | 12 + .../ui/vendor/flag-icon/flags/1x1/bb.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/bd.svg | 4 + .../ui/vendor/flag-icon/flags/1x1/be.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/bf.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/bg.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/bh.svg | 11 + .../ui/vendor/flag-icon/flags/1x1/bi.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/bj.svg | 14 + .../ui/vendor/flag-icon/flags/1x1/bl.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/bm.svg | 98 + .../ui/vendor/flag-icon/flags/1x1/bn.svg | 36 + .../ui/vendor/flag-icon/flags/1x1/bo.svg | 678 + .../ui/vendor/flag-icon/flags/1x1/bq.svg | 5 + .../ui/vendor/flag-icon/flags/1x1/br.svg | 45 + .../ui/vendor/flag-icon/flags/1x1/bs.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/bt.svg | 89 + .../ui/vendor/flag-icon/flags/1x1/bv.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/bw.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/by.svg | 22 + .../ui/vendor/flag-icon/flags/1x1/bz.svg | 145 + .../ui/vendor/flag-icon/flags/1x1/ca.svg | 4 + .../ui/vendor/flag-icon/flags/1x1/cc.svg | 19 + .../ui/vendor/flag-icon/flags/1x1/cd.svg | 12 + .../ui/vendor/flag-icon/flags/1x1/cf.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/cg.svg | 12 + .../ui/vendor/flag-icon/flags/1x1/ch.svg | 9 + .../ui/vendor/flag-icon/flags/1x1/ci.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/ck.svg | 9 + .../ui/vendor/flag-icon/flags/1x1/cl.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/cm.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/cn.svg | 11 + .../ui/vendor/flag-icon/flags/1x1/co.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/cr.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/cu.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/cv.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/cw.svg | 14 + .../ui/vendor/flag-icon/flags/1x1/cx.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/cy.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/cz.svg | 12 + .../ui/vendor/flag-icon/flags/1x1/de.svg | 5 + .../ui/vendor/flag-icon/flags/1x1/dj.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/dk.svg | 5 + .../ui/vendor/flag-icon/flags/1x1/dm.svg | 152 + .../ui/vendor/flag-icon/flags/1x1/do.svg | 6745 ++++++ .../ui/vendor/flag-icon/flags/1x1/dz.svg | 5 + .../ui/vendor/flag-icon/flags/1x1/ec.svg | 138 + .../ui/vendor/flag-icon/flags/1x1/ee.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/eg.svg | 38 + .../ui/vendor/flag-icon/flags/1x1/eh.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/er.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/es-ct.svg | 4 + .../ui/vendor/flag-icon/flags/1x1/es.svg | 547 + .../ui/vendor/flag-icon/flags/1x1/et.svg | 14 + .../ui/vendor/flag-icon/flags/1x1/eu.svg | 28 + .../ui/vendor/flag-icon/flags/1x1/fi.svg | 5 + .../ui/vendor/flag-icon/flags/1x1/fj.svg | 123 + .../ui/vendor/flag-icon/flags/1x1/fk.svg | 89 + .../ui/vendor/flag-icon/flags/1x1/fm.svg | 11 + .../ui/vendor/flag-icon/flags/1x1/fo.svg | 12 + .../ui/vendor/flag-icon/flags/1x1/fr.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/ga.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/gb-eng.svg | 5 + .../ui/vendor/flag-icon/flags/1x1/gb-nir.svg | 130 + .../ui/vendor/flag-icon/flags/1x1/gb-sct.svg | 4 + .../ui/vendor/flag-icon/flags/1x1/gb-wls.svg | 9 + .../ui/vendor/flag-icon/flags/1x1/gb.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/gd.svg | 27 + .../ui/vendor/flag-icon/flags/1x1/ge.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/gf.svg | 5 + .../ui/vendor/flag-icon/flags/1x1/gg.svg | 9 + .../ui/vendor/flag-icon/flags/1x1/gh.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/gi.svg | 32 + .../ui/vendor/flag-icon/flags/1x1/gl.svg | 4 + .../ui/vendor/flag-icon/flags/1x1/gm.svg | 9 + .../ui/vendor/flag-icon/flags/1x1/gn.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/gp.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/gq.svg | 23 + .../ui/vendor/flag-icon/flags/1x1/gr.svg | 24 + .../ui/vendor/flag-icon/flags/1x1/gs.svg | 206 + .../ui/vendor/flag-icon/flags/1x1/gt.svg | 204 + .../ui/vendor/flag-icon/flags/1x1/gu.svg | 39 + .../ui/vendor/flag-icon/flags/1x1/gw.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/gy.svg | 9 + .../ui/vendor/flag-icon/flags/1x1/hk.svg | 30 + .../ui/vendor/flag-icon/flags/1x1/hm.svg | 9 + .../ui/vendor/flag-icon/flags/1x1/hn.svg | 18 + .../ui/vendor/flag-icon/flags/1x1/hr.svg | 56 + .../ui/vendor/flag-icon/flags/1x1/ht.svg | 116 + .../ui/vendor/flag-icon/flags/1x1/hu.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/id.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/ie.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/il.svg | 14 + .../ui/vendor/flag-icon/flags/1x1/im.svg | 36 + .../ui/vendor/flag-icon/flags/1x1/in.svg | 25 + .../ui/vendor/flag-icon/flags/1x1/io.svg | 140 + .../ui/vendor/flag-icon/flags/1x1/iq.svg | 10 + .../ui/vendor/flag-icon/flags/1x1/ir.svg | 219 + .../ui/vendor/flag-icon/flags/1x1/is.svg | 12 + .../ui/vendor/flag-icon/flags/1x1/it.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/je.svg | 29 + .../ui/vendor/flag-icon/flags/1x1/jm.svg | 8 + .../ui/vendor/flag-icon/flags/1x1/jo.svg | 16 + .../ui/vendor/flag-icon/flags/1x1/jp.svg | 11 + .../ui/vendor/flag-icon/flags/1x1/ke.svg | 23 + .../ui/vendor/flag-icon/flags/1x1/kg.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/kh.svg | 61 + .../ui/vendor/flag-icon/flags/1x1/ki.svg | 36 + .../ui/vendor/flag-icon/flags/1x1/km.svg | 16 + .../ui/vendor/flag-icon/flags/1x1/kn.svg | 14 + .../ui/vendor/flag-icon/flags/1x1/kp.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/kr.svg | 24 + .../ui/vendor/flag-icon/flags/1x1/kw.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/ky.svg | 70 + .../ui/vendor/flag-icon/flags/1x1/kz.svg | 23 + .../ui/vendor/flag-icon/flags/1x1/la.svg | 12 + .../ui/vendor/flag-icon/flags/1x1/lb.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/lc.svg | 8 + .../ui/vendor/flag-icon/flags/1x1/li.svg | 43 + .../ui/vendor/flag-icon/flags/1x1/lk.svg | 22 + .../ui/vendor/flag-icon/flags/1x1/lr.svg | 14 + .../ui/vendor/flag-icon/flags/1x1/ls.svg | 8 + .../ui/vendor/flag-icon/flags/1x1/lt.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/lu.svg | 5 + .../ui/vendor/flag-icon/flags/1x1/lv.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/ly.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/ma.svg | 4 + .../ui/vendor/flag-icon/flags/1x1/mc.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/md.svg | 71 + .../ui/vendor/flag-icon/flags/1x1/me.svg | 118 + .../ui/vendor/flag-icon/flags/1x1/mf.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/mg.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/mh.svg | 8 + .../ui/vendor/flag-icon/flags/1x1/mk.svg | 5 + .../ui/vendor/flag-icon/flags/1x1/ml.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/mm.svg | 16 + .../ui/vendor/flag-icon/flags/1x1/mn.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/mo.svg | 9 + .../ui/vendor/flag-icon/flags/1x1/mp.svg | 86 + .../ui/vendor/flag-icon/flags/1x1/mq.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/mr.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/ms.svg | 39 + .../ui/vendor/flag-icon/flags/1x1/mt.svg | 50 + .../ui/vendor/flag-icon/flags/1x1/mu.svg | 8 + .../ui/vendor/flag-icon/flags/1x1/mv.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/mw.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/mx.svg | 378 + .../ui/vendor/flag-icon/flags/1x1/my.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/mz.svg | 21 + .../ui/vendor/flag-icon/flags/1x1/na.svg | 16 + .../ui/vendor/flag-icon/flags/1x1/nc.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/ne.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/nf.svg | 11 + .../ui/vendor/flag-icon/flags/1x1/ng.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/ni.svg | 129 + .../ui/vendor/flag-icon/flags/1x1/nl.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/no.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/np.svg | 19 + .../ui/vendor/flag-icon/flags/1x1/nr.svg | 12 + .../ui/vendor/flag-icon/flags/1x1/nu.svg | 26 + .../ui/vendor/flag-icon/flags/1x1/nz.svg | 41 + .../ui/vendor/flag-icon/flags/1x1/om.svg | 115 + .../ui/vendor/flag-icon/flags/1x1/pa.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/pe.svg | 244 + .../ui/vendor/flag-icon/flags/1x1/pf.svg | 18 + .../ui/vendor/flag-icon/flags/1x1/pg.svg | 16 + .../ui/vendor/flag-icon/flags/1x1/ph.svg | 11 + .../ui/vendor/flag-icon/flags/1x1/pk.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/pl.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/pm.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/pn.svg | 67 + .../ui/vendor/flag-icon/flags/1x1/pr.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/ps.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/pt.svg | 57 + .../ui/vendor/flag-icon/flags/1x1/pw.svg | 11 + .../ui/vendor/flag-icon/flags/1x1/py.svg | 156 + .../ui/vendor/flag-icon/flags/1x1/qa.svg | 4 + .../ui/vendor/flag-icon/flags/1x1/re.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/ro.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/rs.svg | 296 + .../ui/vendor/flag-icon/flags/1x1/ru.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/rw.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/sa.svg | 26 + .../ui/vendor/flag-icon/flags/1x1/sb.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/sc.svg | 14 + .../ui/vendor/flag-icon/flags/1x1/sd.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/se.svg | 16 + .../ui/vendor/flag-icon/flags/1x1/sg.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/sh.svg | 81 + .../ui/vendor/flag-icon/flags/1x1/si.svg | 18 + .../ui/vendor/flag-icon/flags/1x1/sj.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/sk.svg | 9 + .../ui/vendor/flag-icon/flags/1x1/sl.svg | 12 + .../ui/vendor/flag-icon/flags/1x1/sm.svg | 89 + .../ui/vendor/flag-icon/flags/1x1/sn.svg | 8 + .../ui/vendor/flag-icon/flags/1x1/so.svg | 11 + .../ui/vendor/flag-icon/flags/1x1/sr.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/ss.svg | 8 + .../ui/vendor/flag-icon/flags/1x1/st.svg | 16 + .../ui/vendor/flag-icon/flags/1x1/sv.svg | 606 + .../ui/vendor/flag-icon/flags/1x1/sx.svg | 56 + .../ui/vendor/flag-icon/flags/1x1/sy.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/sz.svg | 45 + .../ui/vendor/flag-icon/flags/1x1/tc.svg | 74 + .../ui/vendor/flag-icon/flags/1x1/td.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/tf.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/tg.svg | 14 + .../ui/vendor/flag-icon/flags/1x1/th.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/tj.svg | 26 + .../ui/vendor/flag-icon/flags/1x1/tk.svg | 5 + .../ui/vendor/flag-icon/flags/1x1/tl.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/tm.svg | 203 + .../ui/vendor/flag-icon/flags/1x1/tn.svg | 13 + .../ui/vendor/flag-icon/flags/1x1/to.svg | 10 + .../ui/vendor/flag-icon/flags/1x1/tr.svg | 8 + .../ui/vendor/flag-icon/flags/1x1/tt.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/tv.svg | 27 + .../ui/vendor/flag-icon/flags/1x1/tw.svg | 14 + .../ui/vendor/flag-icon/flags/1x1/tz.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/ua.svg | 6 + .../ui/vendor/flag-icon/flags/1x1/ug.svg | 30 + .../ui/vendor/flag-icon/flags/1x1/um.svg | 15 + .../ui/vendor/flag-icon/flags/1x1/un.svg | 16 + .../ui/vendor/flag-icon/flags/1x1/us.svg | 10 + .../ui/vendor/flag-icon/flags/1x1/uy.svg | 28 + .../ui/vendor/flag-icon/flags/1x1/uz.svg | 30 + .../ui/vendor/flag-icon/flags/1x1/va.svg | 479 + .../ui/vendor/flag-icon/flags/1x1/vc.svg | 8 + .../ui/vendor/flag-icon/flags/1x1/ve.svg | 26 + .../ui/vendor/flag-icon/flags/1x1/vg.svg | 128 + .../ui/vendor/flag-icon/flags/1x1/vi.svg | 28 + .../ui/vendor/flag-icon/flags/1x1/vn.svg | 11 + .../ui/vendor/flag-icon/flags/1x1/vu.svg | 18 + .../ui/vendor/flag-icon/flags/1x1/wf.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/ws.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/ye.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/yt.svg | 7 + .../ui/vendor/flag-icon/flags/1x1/za.svg | 17 + .../ui/vendor/flag-icon/flags/1x1/zm.svg | 27 + .../ui/vendor/flag-icon/flags/1x1/zw.svg | 21 + .../ui/vendor/flag-icon/flags/4x3/ad.svg | 150 + .../ui/vendor/flag-icon/flags/4x3/ae.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/af.svg | 81 + .../ui/vendor/flag-icon/flags/4x3/ag.svg | 14 + .../ui/vendor/flag-icon/flags/4x3/ai.svg | 767 + .../ui/vendor/flag-icon/flags/4x3/al.svg | 5 + .../ui/vendor/flag-icon/flags/4x3/am.svg | 5 + .../ui/vendor/flag-icon/flags/4x3/ao.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/aq.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/ar.svg | 31 + .../ui/vendor/flag-icon/flags/4x3/as.svg | 33 + .../ui/vendor/flag-icon/flags/4x3/at.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/au.svg | 9 + .../ui/vendor/flag-icon/flags/4x3/aw.svg | 186 + .../ui/vendor/flag-icon/flags/4x3/ax.svg | 18 + .../ui/vendor/flag-icon/flags/4x3/az.svg | 8 + .../ui/vendor/flag-icon/flags/4x3/ba.svg | 12 + .../ui/vendor/flag-icon/flags/4x3/bb.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/bd.svg | 4 + .../ui/vendor/flag-icon/flags/4x3/be.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/bf.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/bg.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/bh.svg | 11 + .../ui/vendor/flag-icon/flags/4x3/bi.svg | 15 + .../ui/vendor/flag-icon/flags/4x3/bj.svg | 14 + .../ui/vendor/flag-icon/flags/4x3/bl.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/bm.svg | 98 + .../ui/vendor/flag-icon/flags/4x3/bn.svg | 36 + .../ui/vendor/flag-icon/flags/4x3/bo.svg | 676 + .../ui/vendor/flag-icon/flags/4x3/bq.svg | 5 + .../ui/vendor/flag-icon/flags/4x3/br.svg | 45 + .../ui/vendor/flag-icon/flags/4x3/bs.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/bt.svg | 89 + .../ui/vendor/flag-icon/flags/4x3/bv.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/bw.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/by.svg | 20 + .../ui/vendor/flag-icon/flags/4x3/bz.svg | 145 + .../ui/vendor/flag-icon/flags/4x3/ca.svg | 4 + .../ui/vendor/flag-icon/flags/4x3/cc.svg | 19 + .../ui/vendor/flag-icon/flags/4x3/cd.svg | 5 + .../ui/vendor/flag-icon/flags/4x3/cf.svg | 15 + .../ui/vendor/flag-icon/flags/4x3/cg.svg | 12 + .../ui/vendor/flag-icon/flags/4x3/ch.svg | 9 + .../ui/vendor/flag-icon/flags/4x3/ci.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/ck.svg | 9 + .../ui/vendor/flag-icon/flags/4x3/cl.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/cm.svg | 15 + .../ui/vendor/flag-icon/flags/4x3/cn.svg | 11 + .../ui/vendor/flag-icon/flags/4x3/co.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/cr.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/cu.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/cv.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/cw.svg | 14 + .../ui/vendor/flag-icon/flags/4x3/cx.svg | 15 + .../ui/vendor/flag-icon/flags/4x3/cy.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/cz.svg | 12 + .../ui/vendor/flag-icon/flags/4x3/de.svg | 5 + .../ui/vendor/flag-icon/flags/4x3/dj.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/dk.svg | 5 + .../ui/vendor/flag-icon/flags/4x3/dm.svg | 152 + .../ui/vendor/flag-icon/flags/4x3/do.svg | 6745 ++++++ .../ui/vendor/flag-icon/flags/4x3/dz.svg | 5 + .../ui/vendor/flag-icon/flags/4x3/ec.svg | 138 + .../ui/vendor/flag-icon/flags/4x3/ee.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/eg.svg | 38 + .../ui/vendor/flag-icon/flags/4x3/eh.svg | 15 + .../ui/vendor/flag-icon/flags/4x3/er.svg | 8 + .../ui/vendor/flag-icon/flags/4x3/es-ct.svg | 4 + .../ui/vendor/flag-icon/flags/4x3/es.svg | 544 + .../ui/vendor/flag-icon/flags/4x3/et.svg | 14 + .../ui/vendor/flag-icon/flags/4x3/eu.svg | 28 + .../ui/vendor/flag-icon/flags/4x3/fi.svg | 5 + .../ui/vendor/flag-icon/flags/4x3/fj.svg | 120 + .../ui/vendor/flag-icon/flags/4x3/fk.svg | 89 + .../ui/vendor/flag-icon/flags/4x3/fm.svg | 11 + .../ui/vendor/flag-icon/flags/4x3/fo.svg | 12 + .../ui/vendor/flag-icon/flags/4x3/fr.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/ga.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/gb-eng.svg | 5 + .../ui/vendor/flag-icon/flags/4x3/gb-nir.svg | 131 + .../ui/vendor/flag-icon/flags/4x3/gb-sct.svg | 4 + .../ui/vendor/flag-icon/flags/4x3/gb-wls.svg | 9 + .../ui/vendor/flag-icon/flags/4x3/gb.svg | 15 + .../ui/vendor/flag-icon/flags/4x3/gd.svg | 27 + .../ui/vendor/flag-icon/flags/4x3/ge.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/gf.svg | 5 + .../ui/vendor/flag-icon/flags/4x3/gg.svg | 9 + .../ui/vendor/flag-icon/flags/4x3/gh.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/gi.svg | 32 + .../ui/vendor/flag-icon/flags/4x3/gl.svg | 4 + .../ui/vendor/flag-icon/flags/4x3/gm.svg | 14 + .../ui/vendor/flag-icon/flags/4x3/gn.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/gp.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/gq.svg | 23 + .../ui/vendor/flag-icon/flags/4x3/gr.svg | 22 + .../ui/vendor/flag-icon/flags/4x3/gs.svg | 201 + .../ui/vendor/flag-icon/flags/4x3/gt.svg | 204 + .../ui/vendor/flag-icon/flags/4x3/gu.svg | 39 + .../ui/vendor/flag-icon/flags/4x3/gw.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/gy.svg | 9 + .../ui/vendor/flag-icon/flags/4x3/hk.svg | 30 + .../ui/vendor/flag-icon/flags/4x3/hm.svg | 9 + .../ui/vendor/flag-icon/flags/4x3/hn.svg | 18 + .../ui/vendor/flag-icon/flags/4x3/hr.svg | 58 + .../ui/vendor/flag-icon/flags/4x3/ht.svg | 116 + .../ui/vendor/flag-icon/flags/4x3/hu.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/id.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/ie.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/il.svg | 14 + .../ui/vendor/flag-icon/flags/4x3/im.svg | 36 + .../ui/vendor/flag-icon/flags/4x3/in.svg | 25 + .../ui/vendor/flag-icon/flags/4x3/io.svg | 138 + .../ui/vendor/flag-icon/flags/4x3/iq.svg | 10 + .../ui/vendor/flag-icon/flags/4x3/ir.svg | 219 + .../ui/vendor/flag-icon/flags/4x3/is.svg | 12 + .../ui/vendor/flag-icon/flags/4x3/it.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/je.svg | 31 + .../ui/vendor/flag-icon/flags/4x3/jm.svg | 8 + .../ui/vendor/flag-icon/flags/4x3/jo.svg | 16 + .../ui/vendor/flag-icon/flags/4x3/jp.svg | 11 + .../ui/vendor/flag-icon/flags/4x3/ke.svg | 23 + .../ui/vendor/flag-icon/flags/4x3/kg.svg | 15 + .../ui/vendor/flag-icon/flags/4x3/kh.svg | 61 + .../ui/vendor/flag-icon/flags/4x3/ki.svg | 36 + .../ui/vendor/flag-icon/flags/4x3/km.svg | 16 + .../ui/vendor/flag-icon/flags/4x3/kn.svg | 14 + .../ui/vendor/flag-icon/flags/4x3/kp.svg | 15 + .../ui/vendor/flag-icon/flags/4x3/kr.svg | 24 + .../ui/vendor/flag-icon/flags/4x3/kw.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/ky.svg | 63 + .../ui/vendor/flag-icon/flags/4x3/kz.svg | 23 + .../ui/vendor/flag-icon/flags/4x3/la.svg | 12 + .../ui/vendor/flag-icon/flags/4x3/lb.svg | 15 + .../ui/vendor/flag-icon/flags/4x3/lc.svg | 8 + .../ui/vendor/flag-icon/flags/4x3/li.svg | 43 + .../ui/vendor/flag-icon/flags/4x3/lk.svg | 22 + .../ui/vendor/flag-icon/flags/4x3/lr.svg | 14 + .../ui/vendor/flag-icon/flags/4x3/ls.svg | 8 + .../ui/vendor/flag-icon/flags/4x3/lt.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/lu.svg | 5 + .../ui/vendor/flag-icon/flags/4x3/lv.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/ly.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/ma.svg | 4 + .../ui/vendor/flag-icon/flags/4x3/mc.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/md.svg | 70 + .../ui/vendor/flag-icon/flags/4x3/me.svg | 116 + .../ui/vendor/flag-icon/flags/4x3/mf.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/mg.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/mh.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/mk.svg | 5 + .../ui/vendor/flag-icon/flags/4x3/ml.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/mm.svg | 16 + .../ui/vendor/flag-icon/flags/4x3/mn.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/mo.svg | 9 + .../ui/vendor/flag-icon/flags/4x3/mp.svg | 86 + .../ui/vendor/flag-icon/flags/4x3/mq.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/mr.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/ms.svg | 39 + .../ui/vendor/flag-icon/flags/4x3/mt.svg | 49 + .../ui/vendor/flag-icon/flags/4x3/mu.svg | 8 + .../ui/vendor/flag-icon/flags/4x3/mv.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/mw.svg | 10 + .../ui/vendor/flag-icon/flags/4x3/mx.svg | 382 + .../ui/vendor/flag-icon/flags/4x3/my.svg | 15 + .../ui/vendor/flag-icon/flags/4x3/mz.svg | 21 + .../ui/vendor/flag-icon/flags/4x3/na.svg | 16 + .../ui/vendor/flag-icon/flags/4x3/nc.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/ne.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/nf.svg | 9 + .../ui/vendor/flag-icon/flags/4x3/ng.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/ni.svg | 129 + .../ui/vendor/flag-icon/flags/4x3/nl.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/no.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/np.svg | 14 + .../ui/vendor/flag-icon/flags/4x3/nr.svg | 12 + .../ui/vendor/flag-icon/flags/4x3/nu.svg | 26 + .../ui/vendor/flag-icon/flags/4x3/nz.svg | 41 + .../ui/vendor/flag-icon/flags/4x3/om.svg | 115 + .../ui/vendor/flag-icon/flags/4x3/pa.svg | 14 + .../ui/vendor/flag-icon/flags/4x3/pe.svg | 244 + .../ui/vendor/flag-icon/flags/4x3/pf.svg | 19 + .../ui/vendor/flag-icon/flags/4x3/pg.svg | 9 + .../ui/vendor/flag-icon/flags/4x3/ph.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/pk.svg | 15 + .../ui/vendor/flag-icon/flags/4x3/pl.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/pm.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/pn.svg | 62 + .../ui/vendor/flag-icon/flags/4x3/pr.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/ps.svg | 15 + .../ui/vendor/flag-icon/flags/4x3/pt.svg | 57 + .../ui/vendor/flag-icon/flags/4x3/pw.svg | 11 + .../ui/vendor/flag-icon/flags/4x3/py.svg | 157 + .../ui/vendor/flag-icon/flags/4x3/qa.svg | 4 + .../ui/vendor/flag-icon/flags/4x3/re.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/ro.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/rs.svg | 292 + .../ui/vendor/flag-icon/flags/4x3/ru.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/rw.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/sa.svg | 26 + .../ui/vendor/flag-icon/flags/4x3/sb.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/sc.svg | 14 + .../ui/vendor/flag-icon/flags/4x3/sd.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/se.svg | 16 + .../ui/vendor/flag-icon/flags/4x3/sg.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/sh.svg | 74 + .../ui/vendor/flag-icon/flags/4x3/si.svg | 18 + .../ui/vendor/flag-icon/flags/4x3/sj.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/sk.svg | 9 + .../ui/vendor/flag-icon/flags/4x3/sl.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/sm.svg | 91 + .../ui/vendor/flag-icon/flags/4x3/sn.svg | 8 + .../ui/vendor/flag-icon/flags/4x3/so.svg | 11 + .../ui/vendor/flag-icon/flags/4x3/sr.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/ss.svg | 8 + .../ui/vendor/flag-icon/flags/4x3/st.svg | 16 + .../ui/vendor/flag-icon/flags/4x3/sv.svg | 606 + .../ui/vendor/flag-icon/flags/4x3/sx.svg | 56 + .../ui/vendor/flag-icon/flags/4x3/sy.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/sz.svg | 45 + .../ui/vendor/flag-icon/flags/4x3/tc.svg | 67 + .../ui/vendor/flag-icon/flags/4x3/td.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/tf.svg | 15 + .../ui/vendor/flag-icon/flags/4x3/tg.svg | 14 + .../ui/vendor/flag-icon/flags/4x3/th.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/tj.svg | 22 + .../ui/vendor/flag-icon/flags/4x3/tk.svg | 5 + .../ui/vendor/flag-icon/flags/4x3/tl.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/tm.svg | 206 + .../ui/vendor/flag-icon/flags/4x3/tn.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/to.svg | 10 + .../ui/vendor/flag-icon/flags/4x3/tr.svg | 8 + .../ui/vendor/flag-icon/flags/4x3/tt.svg | 5 + .../ui/vendor/flag-icon/flags/4x3/tv.svg | 27 + .../ui/vendor/flag-icon/flags/4x3/tw.svg | 14 + .../ui/vendor/flag-icon/flags/4x3/tz.svg | 13 + .../ui/vendor/flag-icon/flags/4x3/ua.svg | 6 + .../ui/vendor/flag-icon/flags/4x3/ug.svg | 30 + .../ui/vendor/flag-icon/flags/4x3/um.svg | 15 + .../ui/vendor/flag-icon/flags/4x3/un.svg | 16 + .../ui/vendor/flag-icon/flags/4x3/us.svg | 10 + .../ui/vendor/flag-icon/flags/4x3/uy.svg | 28 + .../ui/vendor/flag-icon/flags/4x3/uz.svg | 30 + .../ui/vendor/flag-icon/flags/4x3/va.svg | 479 + .../ui/vendor/flag-icon/flags/4x3/vc.svg | 8 + .../ui/vendor/flag-icon/flags/4x3/ve.svg | 26 + .../ui/vendor/flag-icon/flags/4x3/vg.svg | 127 + .../ui/vendor/flag-icon/flags/4x3/vi.svg | 28 + .../ui/vendor/flag-icon/flags/4x3/vn.svg | 11 + .../ui/vendor/flag-icon/flags/4x3/vu.svg | 18 + .../ui/vendor/flag-icon/flags/4x3/wf.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/ws.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/ye.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/yt.svg | 7 + .../ui/vendor/flag-icon/flags/4x3/za.svg | 17 + .../ui/vendor/flag-icon/flags/4x3/zm.svg | 27 + .../ui/vendor/flag-icon/flags/4x3/zw.svg | 21 + .../vendor/flag-icon/less/flag-icon-base.less | 28 + .../vendor/flag-icon/less/flag-icon-list.less | 249 + .../vendor/flag-icon/less/flag-icon-more.less | 7 + .../ui/vendor/flag-icon/less/flag-icon.less | 4 + .../ui/vendor/flag-icon/less/variables.less | 3 + .../system/assets/ui/vendor/flot/LICENSE.txt | 22 + modules/system/assets/ui/vendor/flot/Makefile | 12 + .../system/assets/ui/vendor/flot/excanvas.js | 1428 ++ .../assets/ui/vendor/flot/excanvas.min.js | 1 + .../ui/vendor/flot/jquery.colorhelpers.js | 179 + .../ui/vendor/flot/jquery.flot.canvas.js | 345 + .../ui/vendor/flot/jquery.flot.categories.js | 190 + .../ui/vendor/flot/jquery.flot.crosshair.js | 176 + .../ui/vendor/flot/jquery.flot.errorbars.js | 353 + .../ui/vendor/flot/jquery.flot.fillbetween.js | 226 + .../ui/vendor/flot/jquery.flot.image.js | 241 + .../assets/ui/vendor/flot/jquery.flot.js | 3061 +++ .../ui/vendor/flot/jquery.flot.navigate.js | 346 + .../assets/ui/vendor/flot/jquery.flot.pie.js | 817 + .../ui/vendor/flot/jquery.flot.resize.js | 70 + .../ui/vendor/flot/jquery.flot.selection.js | 360 + .../ui/vendor/flot/jquery.flot.stack.js | 188 + .../ui/vendor/flot/jquery.flot.symbol.js | 71 + .../ui/vendor/flot/jquery.flot.threshold.js | 142 + .../assets/ui/vendor/flot/jquery.flot.time.js | 431 + .../ui/vendor/flot/jquery.flot.tooltip.js | 251 + .../assets/ui/vendor/modernizr/modernizr.js | 3 + .../assets/ui/vendor/moment/locale/af.js | 72 + .../assets/ui/vendor/moment/locale/ar-dz.js | 58 + .../assets/ui/vendor/moment/locale/ar-kw.js | 58 + .../assets/ui/vendor/moment/locale/ar-ly.js | 121 + .../assets/ui/vendor/moment/locale/ar-ma.js | 58 + .../assets/ui/vendor/moment/locale/ar-sa.js | 103 + .../assets/ui/vendor/moment/locale/ar-tn.js | 58 + .../assets/ui/vendor/moment/locale/ar.js | 122 + .../assets/ui/vendor/moment/locale/az.js | 104 + .../assets/ui/vendor/moment/locale/be.js | 131 + .../assets/ui/vendor/moment/locale/bg.js | 89 + .../assets/ui/vendor/moment/locale/bm.js | 57 + .../assets/ui/vendor/moment/locale/bn.js | 118 + .../assets/ui/vendor/moment/locale/bo.js | 118 + .../assets/ui/vendor/moment/locale/br.js | 107 + .../assets/ui/vendor/moment/locale/bs.js | 150 + .../assets/ui/vendor/moment/locale/ca.js | 87 + .../assets/ui/vendor/moment/locale/cs.js | 178 + .../assets/ui/vendor/moment/locale/cv.js | 62 + .../assets/ui/vendor/moment/locale/cy.js | 79 + .../assets/ui/vendor/moment/locale/da.js | 59 + .../assets/ui/vendor/moment/locale/de-at.js | 75 + .../assets/ui/vendor/moment/locale/de-ch.js | 75 + .../assets/ui/vendor/moment/locale/de.js | 75 + .../assets/ui/vendor/moment/locale/dv.js | 98 + .../assets/ui/vendor/moment/locale/el.js | 99 + .../assets/ui/vendor/moment/locale/en-au.js | 66 + .../assets/ui/vendor/moment/locale/en-ca.js | 62 + .../assets/ui/vendor/moment/locale/en-gb.js | 66 + .../assets/ui/vendor/moment/locale/en-ie.js | 66 + .../assets/ui/vendor/moment/locale/en-il.js | 61 + .../assets/ui/vendor/moment/locale/en-nz.js | 66 + .../assets/ui/vendor/moment/locale/eo.js | 70 + .../assets/ui/vendor/moment/locale/es-do.js | 91 + .../assets/ui/vendor/moment/locale/es-us.js | 82 + .../assets/ui/vendor/moment/locale/es.js | 91 + .../assets/ui/vendor/moment/locale/et.js | 77 + .../assets/ui/vendor/moment/locale/eu.js | 65 + .../assets/ui/vendor/moment/locale/fa.js | 105 + .../assets/ui/vendor/moment/locale/fi.js | 108 + .../assets/ui/vendor/moment/locale/fo.js | 59 + .../assets/ui/vendor/moment/locale/fr-ca.js | 73 + .../assets/ui/vendor/moment/locale/fr-ch.js | 77 + .../assets/ui/vendor/moment/locale/fr.js | 82 + .../assets/ui/vendor/moment/locale/fy.js | 74 + .../assets/ui/vendor/moment/locale/gd.js | 75 + .../assets/ui/vendor/moment/locale/gl.js | 76 + .../ui/vendor/moment/locale/gom-latn.js | 122 + .../assets/ui/vendor/moment/locale/gu.js | 123 + .../assets/ui/vendor/moment/locale/he.js | 96 + .../assets/ui/vendor/moment/locale/hi.js | 123 + .../assets/ui/vendor/moment/locale/hr.js | 153 + .../assets/ui/vendor/moment/locale/hu.js | 109 + .../assets/ui/vendor/moment/locale/hy-am.js | 94 + .../assets/ui/vendor/moment/locale/id.js | 81 + .../assets/ui/vendor/moment/locale/is.js | 131 + .../assets/ui/vendor/moment/locale/it.js | 68 + .../assets/ui/vendor/moment/locale/ja.js | 91 + .../assets/ui/vendor/moment/locale/jv.js | 81 + .../assets/ui/vendor/moment/locale/ka.js | 88 + .../assets/ui/vendor/moment/locale/kk.js | 86 + .../assets/ui/vendor/moment/locale/km.js | 109 + .../assets/ui/vendor/moment/locale/kn.js | 125 + .../assets/ui/vendor/moment/locale/ko.js | 80 + .../assets/ui/vendor/moment/locale/ky.js | 86 + .../assets/ui/vendor/moment/locale/lb.js | 135 + .../assets/ui/vendor/moment/locale/lo.js | 69 + .../assets/ui/vendor/moment/locale/lt.js | 117 + .../assets/ui/vendor/moment/locale/lv.js | 96 + .../assets/ui/vendor/moment/locale/me.js | 111 + .../assets/ui/vendor/moment/locale/mi.js | 63 + .../assets/ui/vendor/moment/locale/mk.js | 89 + .../assets/ui/vendor/moment/locale/ml.js | 80 + .../assets/ui/vendor/moment/locale/mn.js | 103 + .../assets/ui/vendor/moment/locale/mr.js | 159 + .../assets/ui/vendor/moment/locale/ms-my.js | 81 + .../assets/ui/vendor/moment/locale/ms.js | 81 + .../assets/ui/vendor/moment/locale/mt.js | 59 + .../assets/ui/vendor/moment/locale/my.js | 92 + .../assets/ui/vendor/moment/locale/nb.js | 61 + .../assets/ui/vendor/moment/locale/ne.js | 122 + .../assets/ui/vendor/moment/locale/nl-be.js | 86 + .../assets/ui/vendor/moment/locale/nl.js | 86 + .../assets/ui/vendor/moment/locale/nn.js | 59 + .../assets/ui/vendor/moment/locale/pa-in.js | 123 + .../assets/ui/vendor/moment/locale/pl.js | 125 + .../assets/ui/vendor/moment/locale/pt-br.js | 60 + .../assets/ui/vendor/moment/locale/pt.js | 64 + .../assets/ui/vendor/moment/locale/ro.js | 74 + .../assets/ui/vendor/moment/locale/ru.js | 181 + .../assets/ui/vendor/moment/locale/sd.js | 97 + .../assets/ui/vendor/moment/locale/se.js | 59 + .../assets/ui/vendor/moment/locale/si.js | 70 + .../assets/ui/vendor/moment/locale/sk.js | 155 + .../assets/ui/vendor/moment/locale/sl.js | 172 + .../assets/ui/vendor/moment/locale/sq.js | 67 + .../assets/ui/vendor/moment/locale/sr-cyrl.js | 110 + .../assets/ui/vendor/moment/locale/sr.js | 110 + .../assets/ui/vendor/moment/locale/ss.js | 87 + .../assets/ui/vendor/moment/locale/sv.js | 68 + .../assets/ui/vendor/moment/locale/sw.js | 58 + .../assets/ui/vendor/moment/locale/ta.js | 128 + .../assets/ui/vendor/moment/locale/te.js | 88 + .../assets/ui/vendor/moment/locale/tet.js | 66 + .../assets/ui/vendor/moment/locale/tg.js | 115 + .../assets/ui/vendor/moment/locale/th.js | 66 + .../assets/ui/vendor/moment/locale/tl-ph.js | 61 + .../assets/ui/vendor/moment/locale/tlh.js | 121 + .../assets/ui/vendor/moment/locale/tr.js | 94 + .../assets/ui/vendor/moment/locale/tzl.js | 90 + .../ui/vendor/moment/locale/tzm-latn.js | 57 + .../assets/ui/vendor/moment/locale/tzm.js | 57 + .../assets/ui/vendor/moment/locale/ug-cn.js | 118 + .../assets/ui/vendor/moment/locale/uk.js | 150 + .../assets/ui/vendor/moment/locale/ur.js | 97 + .../assets/ui/vendor/moment/locale/uz-latn.js | 57 + .../assets/ui/vendor/moment/locale/uz.js | 57 + .../assets/ui/vendor/moment/locale/vi.js | 78 + .../ui/vendor/moment/locale/x-pseudo.js | 67 + .../assets/ui/vendor/moment/locale/yo.js | 59 + .../assets/ui/vendor/moment/locale/zh-cn.js | 109 + .../assets/ui/vendor/moment/locale/zh-hk.js | 102 + .../assets/ui/vendor/moment/locale/zh-tw.js | 102 + .../moment/moment-timezone-with-data.js | 1212 + .../system/assets/ui/vendor/moment/moment.js | 4508 ++++ .../assets/ui/vendor/mousewheel/mousewheel.js | 238 + .../assets/ui/vendor/mustache/mustache.js | 631 + .../system/assets/ui/vendor/pikaday/README.md | 437 + .../assets/ui/vendor/pikaday/css/pikaday.css | 231 + .../ui/vendor/pikaday/js/pikaday.jquery.js | 56 + .../assets/ui/vendor/pikaday/js/pikaday.js | 1298 ++ .../assets/ui/vendor/raphael/raphael.js | 8806 +++++++ .../assets/ui/vendor/select2/WINTER-README.md | 18 + .../assets/ui/vendor/select2/css/select2.css | 1 + .../assets/ui/vendor/select2/css/select2.less | 123 + .../assets/ui/vendor/select2/js/i18n/ar.js | 3 + .../assets/ui/vendor/select2/js/i18n/az.js | 3 + .../assets/ui/vendor/select2/js/i18n/bg.js | 3 + .../assets/ui/vendor/select2/js/i18n/ca.js | 3 + .../assets/ui/vendor/select2/js/i18n/cs.js | 3 + .../assets/ui/vendor/select2/js/i18n/da.js | 3 + .../assets/ui/vendor/select2/js/i18n/de.js | 3 + .../assets/ui/vendor/select2/js/i18n/el.js | 3 + .../assets/ui/vendor/select2/js/i18n/en.js | 3 + .../assets/ui/vendor/select2/js/i18n/es.js | 3 + .../assets/ui/vendor/select2/js/i18n/et.js | 3 + .../assets/ui/vendor/select2/js/i18n/eu.js | 3 + .../assets/ui/vendor/select2/js/i18n/fa.js | 3 + .../assets/ui/vendor/select2/js/i18n/fi.js | 3 + .../assets/ui/vendor/select2/js/i18n/fr.js | 3 + .../assets/ui/vendor/select2/js/i18n/gl.js | 3 + .../assets/ui/vendor/select2/js/i18n/he.js | 3 + .../assets/ui/vendor/select2/js/i18n/hi.js | 3 + .../assets/ui/vendor/select2/js/i18n/hr.js | 3 + .../assets/ui/vendor/select2/js/i18n/hu.js | 3 + .../assets/ui/vendor/select2/js/i18n/id.js | 3 + .../assets/ui/vendor/select2/js/i18n/is.js | 3 + .../assets/ui/vendor/select2/js/i18n/it.js | 3 + .../assets/ui/vendor/select2/js/i18n/ja.js | 3 + .../assets/ui/vendor/select2/js/i18n/km.js | 3 + .../assets/ui/vendor/select2/js/i18n/ko.js | 3 + .../assets/ui/vendor/select2/js/i18n/lt.js | 3 + .../assets/ui/vendor/select2/js/i18n/lv.js | 3 + .../assets/ui/vendor/select2/js/i18n/mk.js | 3 + .../assets/ui/vendor/select2/js/i18n/ms.js | 3 + .../assets/ui/vendor/select2/js/i18n/nb.js | 3 + .../assets/ui/vendor/select2/js/i18n/nl.js | 3 + .../assets/ui/vendor/select2/js/i18n/pl.js | 3 + .../assets/ui/vendor/select2/js/i18n/pt-BR.js | 3 + .../assets/ui/vendor/select2/js/i18n/pt.js | 3 + .../assets/ui/vendor/select2/js/i18n/ro.js | 3 + .../assets/ui/vendor/select2/js/i18n/ru.js | 3 + .../assets/ui/vendor/select2/js/i18n/sk.js | 3 + .../ui/vendor/select2/js/i18n/sr-Cyrl.js | 3 + .../assets/ui/vendor/select2/js/i18n/sr.js | 3 + .../assets/ui/vendor/select2/js/i18n/sv.js | 3 + .../assets/ui/vendor/select2/js/i18n/th.js | 3 + .../assets/ui/vendor/select2/js/i18n/tr.js | 3 + .../assets/ui/vendor/select2/js/i18n/uk.js | 3 + .../assets/ui/vendor/select2/js/i18n/vi.js | 3 + .../assets/ui/vendor/select2/js/i18n/zh-CN.js | 3 + .../assets/ui/vendor/select2/js/i18n/zh-TW.js | 3 + .../ui/vendor/select2/js/select2.full.js | 6436 ++++++ .../ui/vendor/sortable/jquery-sortable.js | 695 + .../assets/vendor/prettify/lang-apollo.js | 2 + .../assets/vendor/prettify/lang-basic.js | 3 + .../system/assets/vendor/prettify/lang-clj.js | 18 + .../system/assets/vendor/prettify/lang-css.js | 2 + .../assets/vendor/prettify/lang-dart.js | 3 + .../assets/vendor/prettify/lang-erlang.js | 2 + .../system/assets/vendor/prettify/lang-go.js | 1 + .../system/assets/vendor/prettify/lang-hs.js | 2 + .../assets/vendor/prettify/lang-lisp.js | 3 + .../assets/vendor/prettify/lang-llvm.js | 1 + .../system/assets/vendor/prettify/lang-lua.js | 2 + .../assets/vendor/prettify/lang-matlab.js | 6 + .../system/assets/vendor/prettify/lang-ml.js | 2 + .../assets/vendor/prettify/lang-mumps.js | 2 + .../system/assets/vendor/prettify/lang-n.js | 4 + .../assets/vendor/prettify/lang-pascal.js | 3 + .../assets/vendor/prettify/lang-proto.js | 1 + .../system/assets/vendor/prettify/lang-r.js | 2 + .../system/assets/vendor/prettify/lang-rd.js | 1 + .../assets/vendor/prettify/lang-scala.js | 2 + .../system/assets/vendor/prettify/lang-sql.js | 2 + .../system/assets/vendor/prettify/lang-tcl.js | 3 + .../system/assets/vendor/prettify/lang-tex.js | 1 + .../system/assets/vendor/prettify/lang-vb.js | 2 + .../assets/vendor/prettify/lang-vhdl.js | 3 + .../assets/vendor/prettify/lang-wiki.js | 2 + .../system/assets/vendor/prettify/lang-xq.js | 3 + .../assets/vendor/prettify/lang-yaml.js | 2 + .../assets/vendor/prettify/prettify.css | 1 + .../system/assets/vendor/prettify/prettify.js | 30 + .../assets/vendor/prettify/run_prettify.js | 34 + .../assets/vendor/prettify/theme-desert.css | 34 + .../vendor/syntaxhighlighter/LGPL-LICENSE | 165 + .../vendor/syntaxhighlighter/MIT-LICENSE | 20 + .../syntaxhighlighter/scripts/shAutoloader.js | 17 + .../syntaxhighlighter/scripts/shBrushPhp.js | 88 + .../syntaxhighlighter/scripts/shBrushPlain.js | 33 + .../syntaxhighlighter/scripts/shBrushXml.js | 69 + .../syntaxhighlighter/scripts/shCore.js | 17 + .../syntaxhighlighter/styles/shCore.css | 226 + .../styles/shCoreDefault.css | 328 + modules/system/behaviors/SettingsModel.php | 297 + modules/system/classes/CombineAssets.php | 928 + modules/system/classes/ComposerManager.php | 130 + modules/system/classes/ErrorHandler.php | 83 + modules/system/classes/FileManifest.php | 193 + modules/system/classes/ImageResizer.php | 938 + modules/system/classes/MailManager.php | 403 + modules/system/classes/MarkupManager.php | 379 + modules/system/classes/MediaLibrary.php | 837 + modules/system/classes/MediaLibraryItem.php | 155 + modules/system/classes/ModelBehavior.php | 41 + modules/system/classes/PluginBase.php | 500 + modules/system/classes/PluginManager.php | 1089 + modules/system/classes/SettingsManager.php | 417 + modules/system/classes/SourceManifest.php | 491 + modules/system/classes/SystemController.php | 88 + modules/system/classes/UpdateManager.php | 1152 + modules/system/classes/VersionManager.php | 723 + .../system/classes/VersionYamlProcessor.php | 67 + .../system/classes/asset/BundleManager.php | 297 + modules/system/classes/asset/PackageJson.php | 278 + .../system/classes/asset/PackageManager.php | 414 + modules/system/classes/asset/Vite.php | 80 + modules/system/composer.json | 40 + .../system/console/BaseScaffoldCommand.php | 115 + modules/system/console/CreateCommand.php | 77 + modules/system/console/CreateFactory.php | 61 + modules/system/console/CreateJob.php | 71 + modules/system/console/CreateMigration.php | 358 + modules/system/console/CreateModel.php | 177 + modules/system/console/CreatePlugin.php | 69 + modules/system/console/CreateSettings.php | 52 + modules/system/console/CreateTest.php | 119 + modules/system/console/PluginDisable.php | 47 + modules/system/console/PluginEnable.php | 52 + modules/system/console/PluginInstall.php | 67 + modules/system/console/PluginList.php | 57 + modules/system/console/PluginRefresh.php | 63 + modules/system/console/PluginRemove.php | 92 + modules/system/console/PluginRollback.php | 95 + modules/system/console/WinterDown.php | 63 + modules/system/console/WinterEnv.php | 278 + modules/system/console/WinterFresh.php | 86 + modules/system/console/WinterInstall.php | 463 + modules/system/console/WinterManifest.php | 240 + modules/system/console/WinterMirror.php | 272 + modules/system/console/WinterTest.php | 275 + modules/system/console/WinterUp.php | 52 + modules/system/console/WinterUpdate.php | 127 + modules/system/console/WinterUtil.php | 560 + modules/system/console/WinterVersion.php | 110 + modules/system/console/asset/AssetCompile.php | 272 + modules/system/console/asset/AssetCreate.php | 263 + modules/system/console/asset/AssetInstall.php | 409 + modules/system/console/asset/AssetList.php | 62 + .../fixtures/config/css/default.css.fixture | 3 + .../fixtures/config/css/tailwind.css.fixture | 3 + .../fixtures/config/js/default.js.fixture | 1 + .../asset/fixtures/config/js/vue.js.fixture | 8 + .../fixtures/config/mix/winter.mix.js.fixture | 4 + .../fixtures/config/react/App.jsx.fixture | 7 + .../fixtures/config/react/package.js.fixture | 1 + .../fixtures/config/react/package.jsx.fixture | 5 + .../config/tailwind/postcss.config.js.fixture | 5 + .../tailwind.plugin.config.js.fixture | 15 + .../tailwind/tailwind.theme.config.js.fixture | 15 + .../config/vite/vite.config.mjs.fixture | 30 + .../asset/fixtures/mix.webpack.js.fixture | 87 + .../asset/fixtures/winter.mix.js.fixture | 4 + .../system/console/asset/mix/MixCompile.php | 103 + .../system/console/asset/mix/MixCreate.php | 37 + .../system/console/asset/mix/MixInstall.php | 44 + modules/system/console/asset/mix/MixList.php | 29 + modules/system/console/asset/mix/MixWatch.php | 66 + .../system/console/asset/npm/NpmCommand.php | 87 + .../system/console/asset/npm/NpmInstall.php | 55 + modules/system/console/asset/npm/NpmRun.php | 66 + .../system/console/asset/npm/NpmUpdate.php | 68 + .../system/console/asset/npm/NpmVersion.php | 74 + .../system/console/asset/vite/ViteCompile.php | 79 + .../system/console/asset/vite/ViteCreate.php | 64 + .../system/console/asset/vite/ViteInstall.php | 47 + .../system/console/asset/vite/ViteList.php | 29 + .../system/console/asset/vite/ViteWatch.php | 72 + .../console/scaffold/command/command.stub | 42 + .../console/scaffold/factory/factory.stub | 27 + .../console/scaffold/job/job.batched.stub | 46 + .../console/scaffold/job/job.queued.stub | 30 + modules/system/console/scaffold/job/job.stub | 26 + .../scaffold/migration/migration.create.stub | 46 + .../console/scaffold/migration/migration.stub | 28 + .../scaffold/migration/migration.update.stub | 48 + .../console/scaffold/model/columns.stub | 19 + .../console/scaffold/model/create_table.stub | 21 + .../system/console/scaffold/model/fields.stub | 8 + .../system/console/scaffold/model/model.stub | 76 + .../console/scaffold/plugin/plugin.stub | 88 + .../console/scaffold/plugin/version.stub | 2 + .../console/scaffold/settings/fields.stub | 7 + .../console/scaffold/settings/model.stub | 33 + .../console/scaffold/test/pest.class.stub | 13 + .../console/scaffold/test/pest.init.stub | 45 + .../system/console/scaffold/test/pest.stub | 7 + .../console/scaffold/test/pest.unit.stub | 5 + .../system/console/scaffold/test/phpunit.stub | 25 + .../console/scaffold/test/test.class.stub | 34 + .../console/scaffold/test/test.plugin.stub | 37 + .../system/console/scaffold/test/test.stub | 18 + .../console/scaffold/test/test.unit.stub | 16 + .../console/traits/HasPluginArgument.php | 79 + modules/system/controllers/EventLogs.php | 89 + .../system/controllers/MailBrandSettings.php | 115 + modules/system/controllers/MailLayouts.php | 52 + modules/system/controllers/MailPartials.php | 42 + modules/system/controllers/MailTemplates.php | 80 + modules/system/controllers/RequestLogs.php | 72 + modules/system/controllers/Settings.php | 262 + modules/system/controllers/Updates.php | 1043 + .../controllers/eventlogs/_field_details.php | 529 + .../controllers/eventlogs/_field_message.php | 1 + .../system/controllers/eventlogs/_hint.php | 4 + .../controllers/eventlogs/_list_toolbar.php | 31 + .../controllers/eventlogs/_message_column.php | 1 + .../controllers/eventlogs/config_filter.yaml | 10 + .../controllers/eventlogs/config_form.yaml | 19 + .../controllers/eventlogs/config_list.yaml | 19 + .../system/controllers/eventlogs/index.php | 5 + .../system/controllers/eventlogs/preview.php | 41 + .../mailbrandsettings/_field_mail_preview.php | 11 + .../mailbrandsettings/config_form.yaml | 15 + .../controllers/mailbrandsettings/index.php | 61 + .../controllers/maillayouts/config_form.yaml | 16 + .../system/controllers/maillayouts/update.php | 80 + .../controllers/mailpartials/config_form.yaml | 16 + .../controllers/mailpartials/update.php | 69 + .../mailtemplates/_list_layouts_toolbar.php | 7 + .../mailtemplates/_list_partials_toolbar.php | 7 + .../mailtemplates/_list_templates_toolbar.php | 7 + .../mailtemplates/config_form.yaml | 16 + .../mailtemplates/config_layouts_list.yaml | 16 + .../mailtemplates/config_partials_list.yaml | 16 + .../mailtemplates/config_templates_list.yaml | 16 + .../controllers/mailtemplates/index.php | 30 + .../controllers/mailtemplates/update.php | 77 + .../system/controllers/requestlogs/_hint.php | 4 + .../controllers/requestlogs/_list_toolbar.php | 31 + .../requestlogs/_referer_field.php | 11 + .../controllers/requestlogs/config_form.yaml | 19 + .../controllers/requestlogs/config_list.yaml | 20 + .../system/controllers/requestlogs/index.php | 5 + .../controllers/requestlogs/preview.php | 45 + modules/system/controllers/settings/index.php | 16 + .../controllers/settings/mysettings.php | 24 + .../system/controllers/settings/update.php | 48 + .../controllers/updates/_changelog_list.php | 48 + .../controllers/updates/_column_code.php | 16 + .../system/controllers/updates/_execute.php | 70 + .../controllers/updates/_install_plugins.php | 104 + .../controllers/updates/_install_themes.php | 106 + .../controllers/updates/_is_enabled.php | 20 + .../controllers/updates/_is_unfrozen.php | 20 + .../updates/_list_manage_toolbar.php | 112 + .../controllers/updates/_list_toolbar.php | 24 + .../controllers/updates/_plugin_form.php | 47 + .../controllers/updates/_project_form.php | 50 + .../controllers/updates/_theme_form.php | 47 + .../controllers/updates/_update_form.php | 37 + .../controllers/updates/_update_list.php | 206 + .../controllers/updates/config_list.yaml | 12 + .../updates/config_manage_list.yaml | 13 + .../system/controllers/updates/details.php | 117 + modules/system/controllers/updates/index.php | 76 + .../system/controllers/updates/install.php | 49 + modules/system/controllers/updates/manage.php | 28 + ...2013_10_01_000001_Db_Deferred_Bindings.php | 27 + .../2013_10_01_000002_Db_System_Files.php | 32 + ...10_01_000003_Db_System_Plugin_Versions.php | 23 + ..._10_01_000004_Db_System_Plugin_History.php | 25 + .../2013_10_01_000005_Db_System_Settings.php | 22 + ...2013_10_01_000006_Db_System_Parameters.php | 25 + ..._01_000007_Db_System_Add_Disabled_Flag.php | 21 + ..._10_01_000008_Db_System_Mail_Templates.php | 28 + ...13_10_01_000009_Db_System_Mail_Layouts.php | 27 + .../migrations/2014_10_01_000010_Db_Jobs.php | 32 + ...2014_10_01_000011_Db_System_Event_Logs.php | 24 + ...14_10_01_000012_Db_System_Request_Logs.php | 25 + .../2014_10_01_000013_Db_System_Sessions.php | 31 + ...01_000014_Db_System_Mail_Layout_Rename.php | 24 + ...10_01_000015_Db_System_Add_Frozen_Flag.php | 21 + .../migrations/2015_10_01_000016_Db_Cache.php | 21 + .../2015_10_01_000017_Db_System_Revisions.php | 29 + .../2015_10_01_000018_Db_FailedJobs.php | 29 + ...9_Db_System_Plugin_History_Detail_Text.php | 24 + ...6_10_01_000020_Db_System_Timestamp_Fix.php | 54 + ...Db_Deferred_Bindings_Add_Index_Session.php | 31 + ...10_01_000021_Db_System_Sessions_Update.php | 31 + ...10_01_000022_Db_Jobs_FailedJobs_Update.php | 51 + ...7_10_01_000023_Db_System_Mail_Partials.php | 26 + ..._System_Mail_Layouts_Add_Options_Field.php | 21 + ...Db_Add_Pivot_Data_To_Deferred_Bindings.php | 21 + ...000026_Db_System_Add_App_Birthday_Date.php | 30 + ...10_14_000027_Db_Jobs_FailedJobs_Update.php | 44 + ...9_24_000028_Db_System_Sessions_Indexes.php | 23 + .../2023_10_20_000029_Db_Jobs_Batches.php | 33 + ...10_000031_Db_Add_System_Files_Metadata.php | 23 + ..._000032_Db_System_Request_Logs_Indexes.php | 18 + .../system/database/seeds/DatabaseSeeder.php | 20 + .../database/seeds/SeedSetupMailLayouts.php | 12 + modules/system/helpers/Cache.php | 84 + modules/system/helpers/DateTime.php | 136 + modules/system/helpers/View.php | 50 + modules/system/lang/ar/client.php | 18 + modules/system/lang/ar/lang.php | 57 + modules/system/lang/ar/validation.php | 36 + modules/system/lang/be/client.php | 88 + modules/system/lang/be/lang.php | 306 + modules/system/lang/be/validation.php | 99 + modules/system/lang/bg/client.php | 48 + modules/system/lang/bg/lang.php | 300 + modules/system/lang/bg/validation.php | 91 + modules/system/lang/ca/client.php | 99 + modules/system/lang/ca/lang.php | 383 + modules/system/lang/ca/validation.php | 121 + modules/system/lang/cs/client.php | 102 + modules/system/lang/cs/lang.php | 328 + modules/system/lang/cs/validation.php | 99 + modules/system/lang/da/client.php | 92 + modules/system/lang/da/lang.php | 303 + modules/system/lang/da/validation.php | 99 + modules/system/lang/de/client.php | 105 + modules/system/lang/de/lang.php | 422 + modules/system/lang/de/validation.php | 150 + modules/system/lang/el/client.php | 85 + modules/system/lang/el/lang.php | 307 + modules/system/lang/el/validation.php | 99 + modules/system/lang/en/client.php | 105 + modules/system/lang/en/lang.php | 504 + modules/system/lang/en/validation.php | 150 + modules/system/lang/es-ar/lang.php | 222 + modules/system/lang/es-ar/validation.php | 98 + modules/system/lang/es/client.php | 99 + modules/system/lang/es/lang.php | 374 + modules/system/lang/es/validation.php | 99 + modules/system/lang/et/client.php | 88 + modules/system/lang/et/lang.php | 358 + modules/system/lang/et/validation.php | 99 + modules/system/lang/fa/client.php | 101 + modules/system/lang/fa/lang.php | 464 + modules/system/lang/fa/validation.php | 150 + modules/system/lang/fi/client.php | 101 + modules/system/lang/fi/lang.php | 418 + modules/system/lang/fi/validation.php | 98 + modules/system/lang/fr/client.php | 105 + modules/system/lang/fr/lang.php | 421 + modules/system/lang/fr/validation.php | 150 + modules/system/lang/hu/client.php | 102 + modules/system/lang/hu/lang.php | 421 + modules/system/lang/hu/validation.php | 156 + modules/system/lang/id/lang.php | 229 + modules/system/lang/id/validation.php | 101 + modules/system/lang/it/client.php | 102 + modules/system/lang/it/lang.php | 372 + modules/system/lang/it/validation.php | 101 + modules/system/lang/ja/lang.php | 380 + modules/system/lang/ja/validation.php | 110 + modules/system/lang/kr/client.php | 88 + modules/system/lang/kr/lang.php | 319 + modules/system/lang/kr/validation.php | 101 + modules/system/lang/lt/client.php | 88 + modules/system/lang/lt/lang.php | 344 + modules/system/lang/lt/validation.php | 99 + modules/system/lang/lv/client.php | 105 + modules/system/lang/lv/lang.php | 474 + modules/system/lang/lv/validation.php | 150 + modules/system/lang/nb-no/client.php | 93 + modules/system/lang/nb-no/lang.php | 303 + modules/system/lang/nb-no/validation.php | 99 + modules/system/lang/nl/client.php | 102 + modules/system/lang/nl/lang.php | 459 + modules/system/lang/nl/validation.php | 150 + modules/system/lang/pl/client.php | 92 + modules/system/lang/pl/lang.php | 387 + modules/system/lang/pl/validation.php | 111 + modules/system/lang/pt-br/client.php | 102 + modules/system/lang/pt-br/lang.php | 459 + modules/system/lang/pt-br/validation.php | 147 + modules/system/lang/pt-pt/client.php | 88 + modules/system/lang/pt-pt/lang.php | 356 + modules/system/lang/pt-pt/validation.php | 99 + modules/system/lang/ro/client.php | 54 + modules/system/lang/ro/lang.php | 463 + modules/system/lang/ro/validation.php | 150 + modules/system/lang/rs/client.php | 102 + modules/system/lang/rs/lang.php | 455 + modules/system/lang/rs/validation.php | 125 + modules/system/lang/ru/client.php | 105 + modules/system/lang/ru/lang.php | 474 + modules/system/lang/ru/validation.php | 150 + modules/system/lang/sk/client.php | 95 + modules/system/lang/sk/lang.php | 430 + modules/system/lang/sk/validation.php | 91 + modules/system/lang/sl/client.php | 115 + modules/system/lang/sl/lang.php | 458 + modules/system/lang/sl/validation.php | 150 + modules/system/lang/sv/client.php | 54 + modules/system/lang/sv/lang.php | 294 + modules/system/lang/sv/validation.php | 99 + modules/system/lang/th/client.php | 101 + modules/system/lang/th/lang.php | 409 + modules/system/lang/tr/client.php | 105 + modules/system/lang/tr/lang.php | 468 + modules/system/lang/tr/validation.php | 150 + modules/system/lang/uk/client.php | 105 + modules/system/lang/uk/lang.php | 504 + modules/system/lang/uk/validation.php | 150 + modules/system/lang/vn/client.php | 99 + modules/system/lang/vn/lang.php | 420 + modules/system/lang/vn/validation.php | 117 + modules/system/lang/zh-cn/client.php | 92 + modules/system/lang/zh-cn/lang.php | 370 + modules/system/lang/zh-cn/validation.php | 99 + modules/system/lang/zh-tw/client.php | 86 + modules/system/lang/zh-tw/lang.php | 259 + modules/system/lang/zh-tw/validation.php | 98 + modules/system/models/EventLog.php | 262 + modules/system/models/File.php | 98 + modules/system/models/LogSetting.php | 69 + modules/system/models/MailBrandSetting.php | 179 + modules/system/models/MailLayout.php | 204 + modules/system/models/MailPartial.php | 163 + modules/system/models/MailSetting.php | 147 + modules/system/models/MailTemplate.php | 218 + modules/system/models/Parameter.php | 164 + modules/system/models/PluginVersion.php | 168 + modules/system/models/RequestLog.php | 65 + modules/system/models/Revision.php | 17 + modules/system/models/eventlog/columns.yaml | 22 + modules/system/models/eventlog/fields.yaml | 15 + modules/system/models/file/fields.yaml | 14 + modules/system/models/logsetting/fields.yaml | 25 + .../models/mailbrandsetting/custom.less | 304 + .../models/mailbrandsetting/fields.yaml | 122 + .../mailbrandsetting/sample_template.php | 45 + modules/system/models/maillayout/columns.yaml | 13 + modules/system/models/maillayout/fields.yaml | 47 + .../system/models/mailpartial/columns.yaml | 13 + modules/system/models/mailpartial/fields.yaml | 34 + .../models/mailsetting/_drivers_hint.php | 1 + .../models/mailsetting/_send_test_button.php | 9 + modules/system/models/mailsetting/fields.yaml | 98 + .../system/models/mailtemplate/columns.yaml | 23 + .../system/models/mailtemplate/fields.yaml | 45 + .../system/models/pluginversion/columns.yaml | 21 + .../models/pluginversion/columns_manage.yaml | 27 + modules/system/models/requestlog/columns.yaml | 18 + modules/system/models/requestlog/fields.yaml | 13 + modules/system/package.json | 49 + modules/system/partials/_settings_menu.php | 4 + .../system/partials/_settings_menu_items.php | 33 + .../partials/_settings_menu_toolbar.php | 14 + modules/system/partials/_system_sidebar.php | 23 + modules/system/phpunit.xml | 17 + modules/system/providers.php | 39 + modules/system/reportwidgets/Status.php | 182 + .../status/partials/_warnings_form.php | 29 + .../reportwidgets/status/partials/_widget.php | 87 + modules/system/routes.php | 41 + modules/system/tests/AliasesTest.php | 26 + modules/system/tests/README.md | 110 + modules/system/tests/ServiceProviderTest.php | 28 + .../tests/bootstrap/PluginManagerTestCase.php | 117 + .../system/tests/bootstrap/PluginTestCase.php | 261 + modules/system/tests/bootstrap/TestCase.php | 94 + modules/system/tests/bootstrap/app.php | 59 + .../tests/classes/CombineAssetsTest.php | 297 + modules/system/tests/classes/CoreLangTest.php | 52 + .../system/tests/classes/FileManifestTest.php | 78 + .../system/tests/classes/ImageResizerTest.php | 482 + .../tests/classes/MarkupManagerTest.php | 86 + .../system/tests/classes/MediaLibraryTest.php | 172 + .../system/tests/classes/PluginBaseTest.php | 67 + .../tests/classes/PluginManagerTest.php | 498 + .../tests/classes/SourceManifestTest.php | 341 + .../tests/classes/VersionManagerTest.php | 258 + .../tests/classes/asset/BundleManagerTest.php | 232 + .../tests/classes/asset/PackageJsonTest.php | 469 + .../tests/console/CreateCommandTest.php | 44 + .../tests/console/CreateMigrationTest.php | 90 + .../system/tests/console/WinterEnvTest.php | 126 + .../system/tests/console/WinterUtilTest.php | 98 + .../tests/console/asset/NpmTestTrait.php | 19 + .../console/asset/mix/MixCompileTest.php | 100 + .../tests/console/asset/mix/MixCreateTest.php | 234 + .../console/asset/mix/MixInstallTest.php | 213 + .../console/asset/npm/NpmInstallTest.php | 209 + .../tests/console/asset/npm/NpmRunTest.php | 55 + .../tests/console/asset/npm/NpmUpdateTest.php | 104 + .../console/asset/vite/ViteCompileTest.php | 118 + .../console/asset/vite/ViteCreateTest.php | 234 + .../console/asset/vite/ViteInstallTest.php | 223 + modules/system/tests/fixtures/config/app.php | 9 + .../system/tests/fixtures/config/cache.php | 6 + modules/system/tests/fixtures/config/cms.php | 10 + .../system/tests/fixtures/config/database.php | 16 + modules/system/tests/fixtures/config/mail.php | 11 + .../system/tests/fixtures/config/queue.php | 6 + .../system/tests/fixtures/config/session.php | 6 + .../manifest/1_0_0/modules/test/file1.php | 2 + .../manifest/1_0_1/modules/test/file1.php | 2 + .../manifest/1_0_1/modules/test/file2.php | 2 + .../manifest/1_0_1/modules/test2/file1.php | 2 + .../manifest/1_0_2/modules/test/file2.php | 2 + .../manifest/1_0_2/modules/test/file3.php | 2 + .../manifest/1_0_2/modules/test2/file1.php | 2 + .../manifest/1_0_3/modules/test/file2.php | 2 + .../manifest/1_0_3/modules/test2/file1.php | 2 + .../manifest/1_1_0/modules/test/file3.php | 2 + .../manifest/1_1_0/modules/test/file4.php | 2 + .../manifest/1_1_0/modules/test2/file1.php | 2 + .../manifest/1_1_0/modules/test3/file1.php | 2 + .../manifest/1_1_1/modules/test/file3.php | 2 + .../manifest/1_1_1/modules/test/file4.php | 2 + .../manifest/1_1_1/modules/test2/file1.php | 2 + .../manifest/1_1_1/modules/test3/file1.php | 2 + .../manifest/1_1_1/modules/test3/file2.php | 2 + .../system/tests/fixtures/manifest/forks.json | 5 + modules/system/tests/fixtures/media/text.txt | 1 + .../tests/fixtures/media/winter space.png | Bin 0 -> 7491 bytes .../system/tests/fixtures/media/winter.png | Bin 0 -> 7491 bytes .../tests/fixtures/npm/package-abc.json | 12 + .../system/tests/fixtures/npm/package-ac.json | 11 + .../tests/fixtures/npm/package-corrupt.json | 8 + .../tests/fixtures/npm/package-test.json | 24 + .../tests/fixtures/npm/package-vitetheme.json | 12 + .../plugins/database/tester/Plugin.php | 15 + .../database/tester/assets/images/avatar.png | Bin 0 -> 1505 bytes .../plugins/database/tester/models/Author.php | 68 + .../database/tester/models/Category.php | 40 + .../database/tester/models/Country.php | 35 + .../database/tester/models/EventLog.php | 30 + .../plugins/database/tester/models/Meta.php | 24 + .../plugins/database/tester/models/Phone.php | 29 + .../plugins/database/tester/models/Post.php | 151 + .../plugins/database/tester/models/Role.php | 34 + .../plugins/database/tester/models/Tag.php | 36 + .../plugins/database/tester/models/User.php | 69 + .../tester/updates/create_authors_table.php | 26 + .../updates/create_categories_table.php | 46 + .../tester/updates/create_countries_table.php | 23 + .../tester/updates/create_event_log_table.php | 26 + .../tester/updates/create_meta_table.php | 30 + .../tester/updates/create_phones_table.php | 24 + .../tester/updates/create_posts_table.php | 41 + .../tester/updates/create_roles_table.php | 34 + .../tester/updates/create_tags_table.php | 31 + .../tester/updates/create_users_table.php | 25 + .../database/tester/updates/version.yaml | 13 + .../plugins/dependencytest/acme/Plugin.php | 28 + .../dependencytest/acme/updates/version.yaml | 2 + .../dependencytest/dependency/Plugin.php | 16 + .../dependency/updates/version.yaml | 1 + .../plugins/dependencytest/found/Plugin.php | 19 + .../dependencytest/found/updates/version.yaml | 1 + .../dependencytest/notfound/Plugin.php | 19 + .../notfound/updates/version.yaml | 1 + .../dependencytest/wrongcase/Plugin.php | 19 + .../wrongcase/updates/version.yaml | 1 + .../fixtures/plugins/mix/testa/Plugin.php | 15 + .../plugins/mix/testa/assets/.gitignore | 1 + .../plugins/mix/testa/assets/src/app.js | 8 + .../fixtures/plugins/mix/testa/winter.mix.js | 5 + .../fixtures/plugins/mix/testb/Plugin.php | 15 + .../plugins/mix/testb/assets/.gitignore | 1 + .../plugins/mix/testb/assets/src/app.js | 10 + .../fixtures/plugins/mix/testb/winter.mix.js | 5 + .../fixtures/plugins/mix/testc/Plugin.php | 15 + .../plugins/mix/testc/assets/.gitignore | 1 + .../plugins/mix/testc/assets/src/app.js | 8 + .../fixtures/plugins/mix/testc/winter.mix.js | 5 + .../plugins/testvendor/goto/Plugin.php | 15 + .../plugins/testvendor/test/Plugin.php | 25 + .../testvendor/test/formwidgets/Sample.php | 7 + .../winter/invalidreplacement/Plugin.php | 18 + .../invalidreplacement/updates/version.yaml | 3 + .../plugins/winter/noupdates/Plugin.php | 15 + .../winter/noupdates/updates/version.yaml | 0 .../plugins/winter/original/Plugin.php | 15 + .../winter/original/updates/version.yaml | 1 + .../plugins/winter/replacement/Plugin.php | 18 + .../winter/replacement/updates/version.yaml | 2 + .../winter/replacenotinstalled/Plugin.php | 20 + .../replacenotinstalled/updates/version.yaml | 2 + .../fixtures/plugins/winter/sample/Plugin.php | 15 + .../winter/sample/updates/version.yaml | 11 + .../fixtures/plugins/winter/tester/Plugin.php | 74 + .../plugins/winter/tester/classes/Users.php | 12 + .../winter/tester/components/Archive.php | 41 + .../winter/tester/components/Categories.php | 33 + .../winter/tester/components/Comments.php | 42 + .../winter/tester/components/ContentBlock.php | 23 + .../winter/tester/components/MainMenu.php | 19 + .../plugins/winter/tester/components/Post.php | 24 + .../tester/components/mainmenu/default.htm | 4 + .../tester/components/mainmenu/items.htm | 3 + .../winter/tester/components/post/default.htm | 1 + .../winter/tester/formwidgets/Preview.php | 7 + .../winter/tester/models/TestModel.php | 39 + .../tester/models/testmodel/fields.yaml | 57 + .../winter/tester/rules/BeLikeBobRule.php | 41 + .../updates/create_blog_settings_table.php | 0 .../updates/drop_blog_settings_table.php | 0 .../winter/tester/updates/fix_database.php | 0 .../tester/updates/some_upgrade_file.php | 0 .../winter/tester/updates/version.yaml | 32 + .../tests/fixtures/themes/apitest/.gitignore | 2 + .../themes/assettest/assets/css/theme.css | 3 + .../assettest/assets/javascript/theme.js | 1 + .../fixtures/themes/assettest/vite.config.mjs | 20 + .../fixtures/themes/assettest/winter.mix.js | 4 + .../fixtures/themes/npmtest/package.json | 11 + .../fixtures/themes/npmtest/vite.config.mjs | 2 + .../fixtures/themes/npmtest/winter.mix.js | 2 + .../themes/test/assets/css/style1.css | 0 .../themes/test/assets/css/style2.css | 0 .../themes/test/assets/images/winter.png | Bin 0 -> 7491 bytes .../fixtures/themes/test/assets/js/script1.js | 1 + .../fixtures/themes/test/assets/js/script2.js | 1 + .../themes/test/assets/js/subdir/script1.js | 1 + .../themes/test/content/a/a-content.htm | 1 + .../themes/test/content/html-content.htm | 1 + .../themes/test/content/layout-content.txt | 1 + .../themes/test/content/markdown-content.md | 1 + .../themes/test/content/page-content.htm | 1 + .../themes/test/content/text-content.txt | 1 + .../themes/test/layouts/a/a-layout.htm | 1 + .../themes/test/layouts/ajax-test.htm | 10 + .../fixtures/themes/test/layouts/content.htm | 1 + .../themes/test/layouts/cycle-test.htm | 15 + .../fixtures/themes/test/layouts/no-php.htm | 1 + .../fixtures/themes/test/layouts/partials.htm | 1 + .../themes/test/layouts/php-parser-test.htm | 10 + .../themes/test/layouts/placeholder.htm | 1 + .../fixtures/themes/test/layouts/sidebar.htm | 1 + .../tests/fixtures/themes/test/pages/404.htm | 3 + .../fixtures/themes/test/pages/a/a-page.htm | 4 + .../fixtures/themes/test/pages/ajax-test.htm | 8 + .../fixtures/themes/test/pages/authors.htm | 4 + .../fixtures/themes/test/pages/b/b-page.htm | 3 + .../fixtures/themes/test/pages/b/c/c-page.htm | 3 + .../themes/test/pages/blog-archive.htm | 4 + .../themes/test/pages/blog-category.htm | 4 + .../fixtures/themes/test/pages/blog-post.htm | 4 + .../test/pages/code-namespaces-aliases.htm | 13 + .../themes/test/pages/code-namespaces.htm | 13 + .../test/pages/component-custom-render.htm | 10 + .../component-partial-alias-override.htm | 5 + .../test/pages/component-partial-nesting.htm | 3 + .../test/pages/component-partial-override.htm | 5 + .../themes/test/pages/component-partial.htm | 5 + .../fixtures/themes/test/pages/cycle-test.htm | 12 + .../themes/test/pages/filters-test.htm | 13 + .../fixtures/themes/test/pages/index.htm | 3 + .../themes/test/pages/no-component-class.htm | 5 + .../themes/test/pages/no-component.htm | 3 + .../fixtures/themes/test/pages/no-layout.htm | 4 + .../fixtures/themes/test/pages/no-partial.htm | 4 + .../test/pages/no-soft-component-class.htm | 5 + .../test/pages/optional-full-php-tags.htm | 14 + .../test/pages/optional-short-php-tags.htm | 14 + .../fixtures/themes/test/pages/throw-php.htm | 7 + .../themes/test/pages/with-component.htm | 11 + .../themes/test/pages/with-components.htm | 14 + .../themes/test/pages/with-content.htm | 4 + .../themes/test/pages/with-layout.htm | 4 + .../themes/test/pages/with-partials.htm | 4 + .../themes/test/pages/with-placeholder.htm | 11 + .../pages/with-soft-component-class-alias.htm | 11 + .../test/pages/with-soft-component-class.htm | 11 + .../themes/test/partials/a/a-partial.htm | 1 + .../themes/test/partials/ajax-result.htm | 1 + .../test/partials/ajax-second-result.htm | 1 + .../themes/test/partials/layout-partial.htm | 1 + .../themes/test/partials/nesting/level1.htm | 6 + .../themes/test/partials/nesting/level2.htm | 6 + .../themes/test/partials/nesting/level3.htm | 4 + .../test/partials/override1/default.htm | 1 + .../test/partials/override2/default.htm | 7 + .../themes/test/partials/override2/items.htm | 3 + .../test/partials/override3/default.htm | 1 + .../test/partials/override4/default.htm | 3 + .../themes/test/partials/page-partial.htm | 1 + .../themes/test/partials/testpost/default.htm | 1 + .../fixtures/themes/test/temporary/.gitignore | 2 + .../themes/test/testobjects/component.htm | 5 + .../themes/test/testobjects/components.htm | 8 + .../themes/test/testobjects/compound.htm | 10 + .../themes/test/testobjects/plain.html | 1 + .../themes/test/testobjects/subdir/obj.html | 1 + .../themes/test/testobjects/viewbag.htm | 5 + .../js/cases/framework/FormParent.test.js | 58 + .../framework/FormWidgetDependants.test.js | 149 + .../snowboard/ajax/DataAttribute.test.js | 42 + .../js/cases/snowboard/ajax/Request.test.js | 706 + .../cases/snowboard/extras/DataConfig.test.js | 316 + .../cases/snowboard/main/PluginLoader.test.js | 134 + .../js/cases/snowboard/main/Snowboard.test.js | 620 + .../fixtures/dataConfig/DataConfigFixture.js | 26 + .../js/fixtures/formWidget/FormWidgetStubs.js | 39 + .../fixtures/framework/TestClosureListener.js | 18 + .../fixtures/framework/TestDependencyOne.js | 11 + .../fixtures/framework/TestDependencyTwo.js | 11 + .../fixtures/framework/TestHasDependencies.js | 15 + .../js/fixtures/framework/TestListener.js | 18 + .../tests/js/fixtures/framework/TestPlugin.js | 11 + .../framework/TestPromiseClosureListener.js | 24 + .../fixtures/framework/TestPromiseListener.js | 28 + .../js/fixtures/framework/TestSingleton.js | 11 + .../framework/TestSingletonWithDependency.js | 29 + modules/system/tests/js/helpers/FakeDom.js | 189 + modules/system/tests/js/helpers/FetchMock.js | 23 + modules/system/tests/js/jest.config.js | 194 + .../tests/models/MailBrandSettingTest.php | 57 + .../system/tests/models/RequestLogTest.php | 91 + modules/system/tests/package-testing.json | 3 + .../plugins/database/AttachManyModelTest.php | 57 + .../plugins/database/AttachOneModelTest.php | 112 + .../database/BelongsToManyModelTest.php | 218 + .../plugins/database/BelongsToModelTest.php | 103 + .../plugins/database/DeferredBindingTest.php | 112 + .../plugins/database/HasManyModelTest.php | 126 + .../database/HasManyThroughModelTest.php | 58 + .../plugins/database/HasOneModelTest.php | 138 + .../database/HasOneThroughModelTest.php | 43 + .../plugins/database/MorphManyModelTest.php | 174 + .../plugins/database/MorphOneModelTest.php | 192 + .../plugins/database/MorphToModelTest.php | 66 + .../plugins/database/NestedTreeModelTest.php | 158 + .../plugins/database/NullableModelTest.php | 61 + .../plugins/database/PluginModelTest.php | 36 + .../database/RevisionableModelTest.php | 145 + .../plugins/database/SimpleTreeModelTest.php | 245 + .../plugins/database/SluggableModelTest.php | 101 + .../plugins/database/SoftDeleteModelTest.php | 101 + .../plugins/database/ValidationModelTest.php | 37 + .../system/CustomValidatorRulesTest.php | 62 + .../system/tests/traits/AssetMakerTest.php | 286 + modules/system/tests/traits/ViewMakerTest.php | 144 + .../_can_override_php_with_htm.php | 1 + .../traits/viewmakerstub/_overridden.php | 1 + .../traits/viewmakerstub/_relative_no_ext.php | 1 + .../traits/viewmakerstub/folder/_no_ext.php | 1 + .../viewmakerstub/layouts/_layout_partial.php | 1 + .../traits/viewmakerstub/layouts/default.php | 1 + .../tests/traits/viewmakerstub/specific.php | 1 + .../tests/traits/viewmakerstub/symbols.php | 1 + .../tests/traits/viewmakerstub/view.php | 1 + .../_can_override_php_with_htm.htm | 1 + .../viewmakerstuboverride/_overridden.php | 1 + modules/system/tests/twig/FilterTest.php | 155 + .../system/tests/twig/SecurityPolicyTest.php | 532 + modules/system/tests/twig/SpacelessTest.php | 37 + modules/system/traits/AssetMaker.php | 495 + modules/system/traits/ConfigMaker.php | 212 + modules/system/traits/EventEmitter.php | 92 + modules/system/traits/LazyOwnerAlias.php | 28 + modules/system/traits/PropertyContainer.php | 121 + modules/system/traits/ResponseMaker.php | 136 + modules/system/traits/SecurityController.php | 82 + modules/system/traits/ViewMaker.php | 322 + modules/system/twig/Engine.php | 40 + modules/system/twig/Extension.php | 175 + modules/system/twig/FilterTokenParser.php | 49 + modules/system/twig/GetAttrAdjuster.php | 70 + modules/system/twig/Loader.php | 103 + modules/system/twig/MailPartialNode.php | 59 + .../system/twig/MailPartialTokenParser.php | 94 + modules/system/twig/SecurityPolicy.php | 491 + modules/system/twig/SpacelessNode.php | 38 + modules/system/twig/SpacelessTokenParser.php | 29 + modules/system/twig/node/GetAttrNode.php | 165 + .../twig/securitypolicy/SafeCollection.php | 165 + .../twig/securitypolicy/SafePaginator.php | 100 + modules/system/views/error.php | 14 + modules/system/views/exception.php | 72 + modules/system/views/mail/layout-default.php | 51 + modules/system/views/mail/layout-system.php | 48 + modules/system/views/mail/partial-button.php | 23 + modules/system/views/mail/partial-footer.php | 16 + modules/system/views/mail/partial-header.php | 17 + modules/system/views/mail/partial-panel.php | 17 + .../system/views/mail/partial-promotion.php | 11 + modules/system/views/mail/partial-subcopy.php | 12 + modules/system/views/mail/partial-table.php | 7 + modules/system/views/maintenance.php | 21 + .../views/pagination/simple-default.blade.php | 20 + modules/system/winter.mix.js | 86 + package.json | 13 + phpcs.xml | 137 + phpunit.xml | 39 + plugins/vivespos/site/Plugin.php | 25 + .../vivespos/site/components/ContactForm.php | 45 + plugins/vivespos/site/composer.json | 8 + plugins/winter/demo/Plugin.php | 28 + plugins/winter/demo/components/Todo.php | 50 + .../winter/demo/components/todo/default.htm | 22 + plugins/winter/demo/components/todo/list.htm | 12 + plugins/winter/demo/composer.json | 33 + plugins/winter/demo/updates/version.yaml | 1 + robots.txt | 3 + storage/.gitignore | 4 + storage/app/.gitignore | 5 + storage/app/media/.gitignore | 2 + storage/app/resized/.gitignore | 2 + storage/app/uploads/.gitignore | 3 + storage/app/uploads/public/.gitignore | 2 + storage/cms/.gitignore | 1 + storage/cms/cache/.gitignore | 2 + storage/cms/combiner/.gitignore | 2 + storage/cms/twig/.gitignore | 2 + storage/framework/.gitignore | 8 + storage/framework/cache/.gitignore | 2 + storage/framework/sessions/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/logs/.gitignore | 2 + storage/temp/.gitignore | 3 + storage/temp/public/.gitignore | 2 + themes/demo/README.md | 55 + themes/demo/assets/css/theme.css | 464 + themes/demo/assets/css/vendor.css | 7345 ++++++ .../demo/assets/fonts/lato-black-webfont.eot | Bin 0 -> 25625 bytes .../demo/assets/fonts/lato-black-webfont.svg | 244 + .../demo/assets/fonts/lato-black-webfont.ttf | Bin 0 -> 52440 bytes .../demo/assets/fonts/lato-black-webfont.woff | Bin 0 -> 28876 bytes .../demo/assets/fonts/lato-italic-webfont.eot | Bin 0 -> 24431 bytes .../demo/assets/fonts/lato-italic-webfont.svg | 253 + .../demo/assets/fonts/lato-italic-webfont.ttf | Bin 0 -> 45368 bytes .../assets/fonts/lato-italic-webfont.woff | Bin 0 -> 27188 bytes .../demo/assets/fonts/lato-light-webfont.eot | Bin 0 -> 24834 bytes .../demo/assets/fonts/lato-light-webfont.svg | 244 + .../demo/assets/fonts/lato-light-webfont.ttf | Bin 0 -> 51940 bytes .../demo/assets/fonts/lato-light-webfont.woff | Bin 0 -> 28272 bytes .../assets/fonts/lato-regular-webfont.eot | Bin 0 -> 25660 bytes .../assets/fonts/lato-regular-webfont.svg | 244 + .../assets/fonts/lato-regular-webfont.ttf | Bin 0 -> 52776 bytes .../assets/fonts/lato-regular-webfont.woff | Bin 0 -> 29104 bytes themes/demo/assets/images/theme-preview.png | Bin 0 -> 39985 bytes themes/demo/assets/images/winter.png | Bin 0 -> 7491 bytes themes/demo/assets/javascript/app.js | 48 + themes/demo/assets/less/controls/example.less | 5 + .../demo/assets/less/elements/callouts.less | 50 + themes/demo/assets/less/elements/navbar.less | 89 + .../demo/assets/less/elements/utilities.less | 138 + themes/demo/assets/less/layouts/default.less | 10 + themes/demo/assets/less/pages/ajax.less | 5 + themes/demo/assets/less/pages/plugins.less | 5 + themes/demo/assets/less/theme.less | 46 + themes/demo/assets/less/theme/boot.less | 12 + themes/demo/assets/less/theme/fonts.less | 59 + themes/demo/assets/less/theme/mixins.less | 5 + themes/demo/assets/less/theme/variables.less | 67 + themes/demo/assets/less/vendor.less | 66 + themes/demo/assets/vendor/bootstrap.js | 7 + .../demo/assets/vendor/bootstrap/js/affix.js | 162 + .../demo/assets/vendor/bootstrap/js/alert.js | 94 + .../demo/assets/vendor/bootstrap/js/button.js | 125 + .../assets/vendor/bootstrap/js/carousel.js | 237 + .../assets/vendor/bootstrap/js/collapse.js | 212 + .../assets/vendor/bootstrap/js/dropdown.js | 165 + .../demo/assets/vendor/bootstrap/js/modal.js | 339 + .../assets/vendor/bootstrap/js/popover.js | 108 + .../assets/vendor/bootstrap/js/scrollspy.js | 172 + themes/demo/assets/vendor/bootstrap/js/tab.js | 155 + .../assets/vendor/bootstrap/js/tooltip.js | 520 + .../assets/vendor/bootstrap/js/transition.js | 59 + .../assets/vendor/bootstrap/less/alerts.less | 73 + .../assets/vendor/bootstrap/less/badges.less | 66 + .../vendor/bootstrap/less/bootstrap.less | 56 + .../vendor/bootstrap/less/breadcrumbs.less | 26 + .../vendor/bootstrap/less/button-groups.less | 244 + .../assets/vendor/bootstrap/less/buttons.less | 166 + .../vendor/bootstrap/less/carousel.less | 270 + .../assets/vendor/bootstrap/less/close.less | 34 + .../assets/vendor/bootstrap/less/code.less | 69 + .../bootstrap/less/component-animations.less | 33 + .../vendor/bootstrap/less/dropdowns.less | 216 + .../assets/vendor/bootstrap/less/forms.less | 613 + .../vendor/bootstrap/less/glyphicons.less | 305 + .../assets/vendor/bootstrap/less/grid.less | 84 + .../vendor/bootstrap/less/input-groups.less | 171 + .../vendor/bootstrap/less/jumbotron.less | 54 + .../assets/vendor/bootstrap/less/labels.less | 64 + .../vendor/bootstrap/less/list-group.less | 130 + .../assets/vendor/bootstrap/less/media.less | 66 + .../assets/vendor/bootstrap/less/mixins.less | 40 + .../vendor/bootstrap/less/mixins/alerts.less | 14 + .../less/mixins/background-variant.less | 9 + .../bootstrap/less/mixins/border-radius.less | 18 + .../vendor/bootstrap/less/mixins/buttons.less | 65 + .../bootstrap/less/mixins/center-block.less | 7 + .../bootstrap/less/mixins/clearfix.less | 22 + .../vendor/bootstrap/less/mixins/forms.less | 85 + .../bootstrap/less/mixins/gradients.less | 59 + .../bootstrap/less/mixins/grid-framework.less | 91 + .../vendor/bootstrap/less/mixins/grid.less | 122 + .../bootstrap/less/mixins/hide-text.less | 21 + .../vendor/bootstrap/less/mixins/image.less | 33 + .../vendor/bootstrap/less/mixins/labels.less | 12 + .../bootstrap/less/mixins/list-group.less | 30 + .../bootstrap/less/mixins/nav-divider.less | 10 + .../less/mixins/nav-vertical-align.less | 9 + .../vendor/bootstrap/less/mixins/opacity.less | 8 + .../bootstrap/less/mixins/pagination.less | 24 + .../vendor/bootstrap/less/mixins/panels.less | 24 + .../bootstrap/less/mixins/progress-bar.less | 10 + .../bootstrap/less/mixins/reset-filter.less | 8 + .../bootstrap/less/mixins/reset-text.less | 18 + .../vendor/bootstrap/less/mixins/resize.less | 6 + .../less/mixins/responsive-visibility.less | 15 + .../vendor/bootstrap/less/mixins/size.less | 10 + .../bootstrap/less/mixins/tab-focus.less | 9 + .../bootstrap/less/mixins/table-row.less | 28 + .../bootstrap/less/mixins/text-emphasis.less | 9 + .../bootstrap/less/mixins/text-overflow.less | 8 + .../less/mixins/vendor-prefixes.less | 227 + .../assets/vendor/bootstrap/less/modals.less | 150 + .../assets/vendor/bootstrap/less/navbar.less | 660 + .../assets/vendor/bootstrap/less/navs.less | 242 + .../vendor/bootstrap/less/normalize.less | 424 + .../assets/vendor/bootstrap/less/pager.less | 54 + .../vendor/bootstrap/less/pagination.less | 89 + .../assets/vendor/bootstrap/less/panels.less | 271 + .../vendor/bootstrap/less/popovers.less | 131 + .../assets/vendor/bootstrap/less/print.less | 101 + .../vendor/bootstrap/less/progress-bars.less | 87 + .../bootstrap/less/responsive-embed.less | 35 + .../bootstrap/less/responsive-utilities.less | 194 + .../vendor/bootstrap/less/scaffolding.less | 161 + .../assets/vendor/bootstrap/less/tables.less | 234 + .../assets/vendor/bootstrap/less/theme.less | 291 + .../vendor/bootstrap/less/thumbnails.less | 36 + .../assets/vendor/bootstrap/less/tooltip.less | 101 + .../assets/vendor/bootstrap/less/type.less | 302 + .../vendor/bootstrap/less/utilities.less | 55 + .../vendor/bootstrap/less/variables.less | 869 + .../assets/vendor/bootstrap/less/wells.less | 29 + .../vendor/font-awesome/css/font-awesome.css | 1478 ++ .../vendor/font-awesome/font/FontAwesome.otf | Bin 0 -> 61896 bytes .../font-awesome/font/fontawesome-webfont.eot | Bin 0 -> 37405 bytes .../font-awesome/font/fontawesome-webfont.svg | 399 + .../font-awesome/font/fontawesome-webfont.ttf | Bin 0 -> 79076 bytes .../font/fontawesome-webfont.woff | Bin 0 -> 43572 bytes .../vendor/font-awesome/less/bootstrap.less | 84 + .../assets/vendor/font-awesome/less/core.less | 129 + .../vendor/font-awesome/less/extras.less | 93 + .../font-awesome/less/font-awesome-ie7.less | 1953 ++ .../font-awesome/less/font-awesome.less | 33 + .../vendor/font-awesome/less/icons.less | 381 + .../vendor/font-awesome/less/mixins.less | 47 + .../assets/vendor/font-awesome/less/path.less | 14 + .../vendor/font-awesome/less/variables.less | 735 + themes/demo/assets/vendor/jquery.js | 2 + themes/demo/composer.json | 28 + themes/demo/content/placeholder/layout.txt | 4 + themes/demo/content/placeholder/page.txt | 4 + themes/demo/content/welcome.htm | 2 + themes/demo/layouts/default.htm | 43 + themes/demo/meta/static-pages.yaml | 1 + themes/demo/pages/404.htm | 10 + themes/demo/pages/ajax.htm | 78 + themes/demo/pages/error.htm | 10 + themes/demo/pages/home.htm | 120 + themes/demo/pages/plugins.htm | 30 + themes/demo/partials/.gitkeep | 0 themes/demo/partials/calcresult.htm | 9 + themes/demo/partials/explain/ajax.htm | 65 + themes/demo/partials/explain/plugins.htm | 17 + themes/demo/partials/site/footer.htm | 6 + themes/demo/partials/site/header.htm | 29 + themes/demo/theme.yaml | 5 + themes/vivespos/assets/css/custom.css | 141 + themes/vivespos/content/home-cta-lead.htm | 1 + themes/vivespos/content/home-cta-title.htm | 1 + themes/vivespos/content/home-hero-eyebrow.htm | 1 + themes/vivespos/content/home-hero-lead.htm | 1 + themes/vivespos/content/home-hero-title.htm | 1 + themes/vivespos/layouts/default.htm | 40 + themes/vivespos/meta/menus/footer.yaml | 13 + themes/vivespos/meta/menus/header.yaml | 9 + themes/vivespos/pages/blog.htm | 39 + themes/vivespos/pages/blog/post.htm | 25 + themes/vivespos/pages/contacto.htm | 39 + themes/vivespos/pages/home.htm | 20 + themes/vivespos/partials/home/comparison.htm | 85 + themes/vivespos/partials/home/cta.htm | 19 + themes/vivespos/partials/home/faq.htm | 132 + themes/vivespos/partials/home/features.htm | 85 + themes/vivespos/partials/home/hero.htm | 53 + themes/vivespos/partials/home/modes.htm | 73 + themes/vivespos/partials/home/pricing.htm | 79 + themes/vivespos/partials/home/screenshots.htm | 90 + themes/vivespos/partials/site/footer.htm | 47 + themes/vivespos/partials/site/header.htm | 30 + .../partials/site/jsonld-software.htm | 75 + themes/vivespos/partials/site/tracking.htm | 52 + .../vivespos/partials/site/whatsapp-float.htm | 7 + themes/vivespos/theme.yaml | 5 + 3266 files changed, 531480 insertions(+) create mode 100644 .devcontainer/.vscode/launch.json create mode 100644 .devcontainer/README.md create mode 100644 .devcontainer/devcontainer.json create mode 100755 .devcontainer/local-features/bootstrap-winter/bootstrap.sh create mode 100644 .devcontainer/local-features/bootstrap-winter/codespaces.php create mode 100644 .devcontainer/local-features/bootstrap-winter/devcontainer-feature.json create mode 100755 .devcontainer/local-features/bootstrap-winter/install.sh create mode 100644 .devcontainer/local-features/bootstrap-winter/update-composer.php create mode 100755 .devcontainer/run-frankenphp.sh create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/1_BUG_REPORT.yaml create mode 100644 .github/ISSUE_TEMPLATE/2_PRE_PR.yaml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/assets/Github Banner.png create mode 100644 .github/assets/sponsor-route4me.png create mode 100644 .github/workflows/code-quality.yaml create mode 100644 .github/workflows/docker.yml create mode 100644 .github/workflows/manifest.yml create mode 100644 .github/workflows/subsplit.yml create mode 100644 .github/workflows/tests.yml create mode 100755 .github/workflows/utilities/library-switcher create mode 100755 .github/workflows/utilities/phpcs-pr create mode 100755 .github/workflows/utilities/phpcs-push create mode 100644 .gitignore create mode 100644 .htaccess create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 AGENTS.md create mode 100644 CHANGELOG.md create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100755 artisan create mode 100644 bootstrap/app.php create mode 100644 bootstrap/autoload.php create mode 100644 bootstrap/cache/.gitignore create mode 100644 composer.json create mode 100644 config/app.php create mode 100644 config/auth.php create mode 100644 config/broadcasting.php create mode 100644 config/cache.php create mode 100644 config/cms.php create mode 100644 config/cookie.php create mode 100644 config/cors.php create mode 100644 config/database.php create mode 100644 config/dev/.gitignore create mode 100644 config/develop.php create mode 100644 config/environment.php create mode 100644 config/filesystems.php create mode 100644 config/hashing.php create mode 100644 config/logging.php create mode 100644 config/mail.php create mode 100644 config/queue.php create mode 100644 config/services.php create mode 100644 config/session.php create mode 100644 config/testing/cms.php create mode 100644 config/testing/filesystems.php create mode 100644 config/view.php create mode 100644 index.php create mode 100644 modules/backend/.eslintignore create mode 100644 modules/backend/.eslintrc.json create mode 100644 modules/backend/.gitignore create mode 100644 modules/backend/LICENSE create mode 100644 modules/backend/README.md create mode 100644 modules/backend/ServiceProvider.php create mode 100644 modules/backend/assets/.gitignore create mode 100644 modules/backend/assets/css/dashboard/dashboard.css create mode 100644 modules/backend/assets/css/winter.css create mode 100644 modules/backend/assets/images/dashboard-icon.svg create mode 100644 modules/backend/assets/images/favicon.png create mode 100644 modules/backend/assets/images/logo.svg create mode 100644 modules/backend/assets/images/media-icon.svg create mode 100644 modules/backend/assets/images/secondary-tab-shape-content.svg create mode 100644 modules/backend/assets/images/tab-shape.svg create mode 100644 modules/backend/assets/images/treeview-icons.png create mode 100644 modules/backend/assets/images/treeview-submenu-tabs.png create mode 100644 modules/backend/assets/images/winter-logo-white.svg create mode 100644 modules/backend/assets/images/winter-logo.svg create mode 100644 modules/backend/assets/images/wordmark.png create mode 100644 modules/backend/assets/js/auth/auth.js create mode 100644 modules/backend/assets/js/backend.js create mode 100644 modules/backend/assets/js/preferences/preferences.js create mode 100644 modules/backend/assets/js/vendor/jquery-and-migrate.min.js create mode 100644 modules/backend/assets/js/vendor/jquery-migrate.min.js create mode 100644 modules/backend/assets/js/vendor/jquery.autoellipsis.js create mode 100644 modules/backend/assets/js/vendor/jquery.cookie.js create mode 100644 modules/backend/assets/js/vendor/jquery.min.js create mode 100644 modules/backend/assets/js/vendor/jquery.touchwipe.js create mode 100644 modules/backend/assets/js/vendor/jquery.waterfall.js create mode 100644 modules/backend/assets/js/winter-min.js create mode 100644 modules/backend/assets/js/winter.alert.js create mode 100644 modules/backend/assets/js/winter.datetime.js create mode 100644 modules/backend/assets/js/winter.filelist.js create mode 100644 modules/backend/assets/js/winter.flyout.js create mode 100644 modules/backend/assets/js/winter.js create mode 100644 modules/backend/assets/js/winter.lang.js create mode 100644 modules/backend/assets/js/winter.layout.js create mode 100644 modules/backend/assets/js/winter.navbar.js create mode 100644 modules/backend/assets/js/winter.scrollbar.js create mode 100644 modules/backend/assets/js/winter.scrollpad.js create mode 100644 modules/backend/assets/js/winter.sidenav-tree.js create mode 100644 modules/backend/assets/js/winter.sidenav.js create mode 100644 modules/backend/assets/js/winter.sidepaneltab.js create mode 100644 modules/backend/assets/js/winter.simplelist.js create mode 100644 modules/backend/assets/js/winter.tabformexpandcontrols.js create mode 100644 modules/backend/assets/js/winter.treelist.js create mode 100644 modules/backend/assets/js/winter.treeview.js create mode 100644 modules/backend/assets/js/winter.verticalmenu.js create mode 100644 modules/backend/assets/less/.gitignore create mode 100644 modules/backend/assets/less/controls/alert.less create mode 100644 modules/backend/assets/less/controls/common.less create mode 100644 modules/backend/assets/less/controls/filelist.less create mode 100644 modules/backend/assets/less/controls/global-notice.less create mode 100644 modules/backend/assets/less/controls/namevaluelist.less create mode 100644 modules/backend/assets/less/controls/panels.less create mode 100644 modules/backend/assets/less/controls/record-navigation.less create mode 100644 modules/backend/assets/less/controls/reportwidgets.less create mode 100644 modules/backend/assets/less/controls/scrollbar.less create mode 100644 modules/backend/assets/less/controls/scrollpad.less create mode 100644 modules/backend/assets/less/controls/selector-group.less create mode 100644 modules/backend/assets/less/controls/sidenav-tree.less create mode 100644 modules/backend/assets/less/controls/simplelist.less create mode 100644 modules/backend/assets/less/controls/svg-icons.less create mode 100644 modules/backend/assets/less/controls/tree-path.less create mode 100644 modules/backend/assets/less/controls/treelist.less create mode 100644 modules/backend/assets/less/controls/treeview.less create mode 100644 modules/backend/assets/less/core/animations.less create mode 100644 modules/backend/assets/less/core/boot.less create mode 100644 modules/backend/assets/less/core/mixins.less create mode 100644 modules/backend/assets/less/core/variables.less create mode 100644 modules/backend/assets/less/dashboard/dashboard.less create mode 100644 modules/backend/assets/less/layout/fancylayout.less create mode 100644 modules/backend/assets/less/layout/flexlayout.less create mode 100644 modules/backend/assets/less/layout/flyout.less create mode 100644 modules/backend/assets/less/layout/footer.less create mode 100644 modules/backend/assets/less/layout/layout.less create mode 100644 modules/backend/assets/less/layout/mainmenu.less create mode 100644 modules/backend/assets/less/layout/outerlayout.less create mode 100644 modules/backend/assets/less/layout/sidenav.less create mode 100644 modules/backend/assets/less/layout/sidepanel.less create mode 100644 modules/backend/assets/less/winter.less create mode 100644 modules/backend/assets/ui/js/ajax/Handler.js create mode 100644 modules/backend/assets/ui/js/build/backend.js create mode 100644 modules/backend/assets/ui/js/build/manifest.js create mode 100644 modules/backend/assets/ui/js/build/vendor.js create mode 100644 modules/backend/assets/ui/js/index.js create mode 100644 modules/backend/assets/ui/js/pages/Preferences.js create mode 100644 modules/backend/assets/ui/js/ui/EventHandler.js create mode 100644 modules/backend/assets/ui/js/ui/WidgetHandler.js create mode 100644 modules/backend/assets/vendor/ace-codeeditor/build-min.js create mode 100644 modules/backend/assets/vendor/ace-codeeditor/build.js create mode 100644 modules/backend/assets/vendor/ace-codeeditor/codeeditor.js create mode 100755 modules/backend/assets/vendor/ace/ace.js create mode 100755 modules/backend/assets/vendor/ace/ext-emmet.js create mode 100644 modules/backend/assets/vendor/ace/ext-language_tools.js create mode 100755 modules/backend/assets/vendor/ace/ext-searchbox.js create mode 100755 modules/backend/assets/vendor/ace/mode-css.js create mode 100755 modules/backend/assets/vendor/ace/mode-html.js create mode 100755 modules/backend/assets/vendor/ace/mode-javascript.js create mode 100755 modules/backend/assets/vendor/ace/mode-less.js create mode 100755 modules/backend/assets/vendor/ace/mode-markdown.js create mode 100755 modules/backend/assets/vendor/ace/mode-php.js create mode 100755 modules/backend/assets/vendor/ace/mode-plain_text.js create mode 100755 modules/backend/assets/vendor/ace/mode-sass.js create mode 100755 modules/backend/assets/vendor/ace/mode-scss.js create mode 100755 modules/backend/assets/vendor/ace/mode-twig.js create mode 100644 modules/backend/assets/vendor/ace/mode-yaml.js create mode 100644 modules/backend/assets/vendor/ace/snippets/css.js create mode 100644 modules/backend/assets/vendor/ace/snippets/html.js create mode 100644 modules/backend/assets/vendor/ace/snippets/javascript.js create mode 100644 modules/backend/assets/vendor/ace/snippets/markdown.js create mode 100644 modules/backend/assets/vendor/ace/snippets/php-inline.js create mode 100644 modules/backend/assets/vendor/ace/snippets/php.js create mode 100644 modules/backend/assets/vendor/ace/snippets/plain_text.js create mode 100644 modules/backend/assets/vendor/ace/snippets/sass.js create mode 100644 modules/backend/assets/vendor/ace/snippets/scss.js create mode 100644 modules/backend/assets/vendor/ace/snippets/text.js create mode 100644 modules/backend/assets/vendor/ace/snippets/twig.js create mode 100644 modules/backend/assets/vendor/ace/snippets/yaml.js create mode 100755 modules/backend/assets/vendor/ace/theme-ambiance.js create mode 100755 modules/backend/assets/vendor/ace/theme-chaos.js create mode 100755 modules/backend/assets/vendor/ace/theme-chrome.js create mode 100755 modules/backend/assets/vendor/ace/theme-clouds.js create mode 100755 modules/backend/assets/vendor/ace/theme-clouds_midnight.js create mode 100755 modules/backend/assets/vendor/ace/theme-cobalt.js create mode 100755 modules/backend/assets/vendor/ace/theme-crimson_editor.js create mode 100755 modules/backend/assets/vendor/ace/theme-dawn.js create mode 100755 modules/backend/assets/vendor/ace/theme-dreamweaver.js create mode 100755 modules/backend/assets/vendor/ace/theme-eclipse.js create mode 100755 modules/backend/assets/vendor/ace/theme-github.js create mode 100755 modules/backend/assets/vendor/ace/theme-idle_fingers.js create mode 100755 modules/backend/assets/vendor/ace/theme-iplastic.js create mode 100755 modules/backend/assets/vendor/ace/theme-katzenmilch.js create mode 100755 modules/backend/assets/vendor/ace/theme-kr_theme.js create mode 100755 modules/backend/assets/vendor/ace/theme-kuroir.js create mode 100755 modules/backend/assets/vendor/ace/theme-merbivore.js create mode 100755 modules/backend/assets/vendor/ace/theme-merbivore_soft.js create mode 100755 modules/backend/assets/vendor/ace/theme-mono_industrial.js create mode 100755 modules/backend/assets/vendor/ace/theme-monokai.js create mode 100755 modules/backend/assets/vendor/ace/theme-pastel_on_dark.js create mode 100755 modules/backend/assets/vendor/ace/theme-solarized_dark.js create mode 100755 modules/backend/assets/vendor/ace/theme-solarized_light.js create mode 100755 modules/backend/assets/vendor/ace/theme-sqlserver.js create mode 100755 modules/backend/assets/vendor/ace/theme-terminal.js create mode 100755 modules/backend/assets/vendor/ace/theme-textmate.js create mode 100755 modules/backend/assets/vendor/ace/theme-tomorrow.js create mode 100755 modules/backend/assets/vendor/ace/theme-tomorrow_night.js create mode 100755 modules/backend/assets/vendor/ace/theme-tomorrow_night_blue.js create mode 100755 modules/backend/assets/vendor/ace/theme-tomorrow_night_bright.js create mode 100755 modules/backend/assets/vendor/ace/theme-tomorrow_night_eighties.js create mode 100755 modules/backend/assets/vendor/ace/theme-twilight.js create mode 100755 modules/backend/assets/vendor/ace/theme-vibrant_ink.js create mode 100755 modules/backend/assets/vendor/ace/theme-xcode.js create mode 100755 modules/backend/assets/vendor/ace/worker-css.js create mode 100755 modules/backend/assets/vendor/ace/worker-html.js create mode 100755 modules/backend/assets/vendor/ace/worker-javascript.js create mode 100755 modules/backend/assets/vendor/ace/worker-php.js create mode 100644 modules/backend/assets/vendor/css-browser-selector/css-browser-selector.js create mode 100644 modules/backend/assets/vendor/dropzone/dropzone.js create mode 100644 modules/backend/assets/vendor/emmet/emmet.js create mode 100755 modules/backend/assets/vendor/jcrop/MIT-LICENSE.txt create mode 100755 modules/backend/assets/vendor/jcrop/README.md create mode 100644 modules/backend/assets/vendor/jcrop/WINTER-README.md create mode 100755 modules/backend/assets/vendor/jcrop/css/Jcrop.gif create mode 100755 modules/backend/assets/vendor/jcrop/css/jquery.Jcrop.min.css create mode 100755 modules/backend/assets/vendor/jcrop/js/jquery.Jcrop.js create mode 100644 modules/backend/assets/vendor/sweet-alert/sweet-alert-animations.less create mode 100644 modules/backend/assets/vendor/sweet-alert/sweet-alert-combine.less create mode 100644 modules/backend/assets/vendor/sweet-alert/sweet-alert.css create mode 100644 modules/backend/assets/vendor/sweet-alert/sweet-alert.html create mode 100644 modules/backend/assets/vendor/sweet-alert/sweet-alert.js create mode 100644 modules/backend/assets/vendor/sweet-alert/sweet-alert.less create mode 100644 modules/backend/behaviors/FormController.php create mode 100644 modules/backend/behaviors/ImportExportController.php create mode 100644 modules/backend/behaviors/ListController.php create mode 100644 modules/backend/behaviors/RelationController.php create mode 100644 modules/backend/behaviors/ReorderController.php create mode 100644 modules/backend/behaviors/UserPreferencesModel.php create mode 100644 modules/backend/behaviors/formcontroller/partials/_record_navigation.php create mode 100644 modules/backend/behaviors/formcontroller/partials/_toolbar.php create mode 100644 modules/backend/behaviors/formcontroller/views/create.php create mode 100644 modules/backend/behaviors/formcontroller/views/create/_fancy.php create mode 100644 modules/backend/behaviors/formcontroller/views/create/_sidebar.php create mode 100644 modules/backend/behaviors/formcontroller/views/create/_standard.php create mode 100644 modules/backend/behaviors/formcontroller/views/create/fancy/_toolbar.php create mode 100644 modules/backend/behaviors/formcontroller/views/preview.php create mode 100644 modules/backend/behaviors/formcontroller/views/preview/_fancy.php create mode 100644 modules/backend/behaviors/formcontroller/views/preview/_sidebar.php create mode 100644 modules/backend/behaviors/formcontroller/views/preview/_standard.php create mode 100644 modules/backend/behaviors/formcontroller/views/preview/fancy/_toolbar.php create mode 100644 modules/backend/behaviors/formcontroller/views/update.php create mode 100644 modules/backend/behaviors/formcontroller/views/update/_fancy.php create mode 100644 modules/backend/behaviors/formcontroller/views/update/_sidebar.php create mode 100644 modules/backend/behaviors/formcontroller/views/update/_standard.php create mode 100644 modules/backend/behaviors/formcontroller/views/update/fancy/_toolbar.php create mode 100644 modules/backend/behaviors/importexportcontroller/TranscodeFilter.php create mode 100644 modules/backend/behaviors/importexportcontroller/assets/css/export.css create mode 100644 modules/backend/behaviors/importexportcontroller/assets/css/import.css create mode 100644 modules/backend/behaviors/importexportcontroller/assets/js/winter.export.js create mode 100644 modules/backend/behaviors/importexportcontroller/assets/js/winter.import.js create mode 100644 modules/backend/behaviors/importexportcontroller/assets/less/export.less create mode 100644 modules/backend/behaviors/importexportcontroller/assets/less/import.less create mode 100644 modules/backend/behaviors/importexportcontroller/partials/_button_export.php create mode 100644 modules/backend/behaviors/importexportcontroller/partials/_button_import.php create mode 100644 modules/backend/behaviors/importexportcontroller/partials/_column_sample_form.php create mode 100644 modules/backend/behaviors/importexportcontroller/partials/_container_export.php create mode 100644 modules/backend/behaviors/importexportcontroller/partials/_container_import.php create mode 100644 modules/backend/behaviors/importexportcontroller/partials/_export_columns.php create mode 100644 modules/backend/behaviors/importexportcontroller/partials/_export_form.php create mode 100644 modules/backend/behaviors/importexportcontroller/partials/_export_result_form.php create mode 100644 modules/backend/behaviors/importexportcontroller/partials/_import_db_columns.php create mode 100644 modules/backend/behaviors/importexportcontroller/partials/_import_file_columns.php create mode 100644 modules/backend/behaviors/importexportcontroller/partials/_import_form.php create mode 100644 modules/backend/behaviors/importexportcontroller/partials/_import_result_form.php create mode 100644 modules/backend/behaviors/importexportcontroller/partials/_import_toolbar.php create mode 100644 modules/backend/behaviors/importexportcontroller/partials/fields_export.yaml create mode 100644 modules/backend/behaviors/importexportcontroller/partials/fields_import.yaml create mode 100644 modules/backend/behaviors/importexportcontroller/views/export.php create mode 100644 modules/backend/behaviors/importexportcontroller/views/import.php create mode 100644 modules/backend/behaviors/listcontroller/partials/_container.php create mode 100644 modules/backend/behaviors/listcontroller/views/_list_toolbar.php create mode 100644 modules/backend/behaviors/listcontroller/views/index.php create mode 100644 modules/backend/behaviors/relationcontroller/assets/css/relation.css create mode 100644 modules/backend/behaviors/relationcontroller/assets/js/winter.relation.js create mode 100644 modules/backend/behaviors/relationcontroller/assets/less/relation.less create mode 100644 modules/backend/behaviors/relationcontroller/partials/_button_add.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_button_create.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_button_delete.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_button_link.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_button_refresh.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_button_remove.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_button_unlink.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_button_update.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_container.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_manage_form.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_manage_form_footer_create.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_manage_form_footer_update.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_manage_list.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_manage_list_footer.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_manage_pivot.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_manage_pivot_footer.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_pivot_form.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_pivot_form_footer.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_toolbar.php create mode 100644 modules/backend/behaviors/relationcontroller/partials/_view.php create mode 100644 modules/backend/behaviors/reordercontroller/assets/js/winter.reorder.js create mode 100644 modules/backend/behaviors/reordercontroller/partials/_container.php create mode 100644 modules/backend/behaviors/reordercontroller/partials/_records.php create mode 100644 modules/backend/behaviors/reordercontroller/views/_reorder_toolbar.php create mode 100644 modules/backend/behaviors/reordercontroller/views/reorder.php create mode 100644 modules/backend/classes/AuthManager.php create mode 100644 modules/backend/classes/BackendController.php create mode 100644 modules/backend/classes/Controller.php create mode 100644 modules/backend/classes/ControllerBehavior.php create mode 100644 modules/backend/classes/FilterScope.php create mode 100644 modules/backend/classes/FormField.php create mode 100644 modules/backend/classes/FormTabs.php create mode 100644 modules/backend/classes/FormWidgetBase.php create mode 100644 modules/backend/classes/ListColumn.php create mode 100644 modules/backend/classes/MainMenuItem.php create mode 100644 modules/backend/classes/NavigationManager.php create mode 100644 modules/backend/classes/QuickActionItem.php create mode 100644 modules/backend/classes/ReportWidgetBase.php create mode 100644 modules/backend/classes/SideMenuItem.php create mode 100644 modules/backend/classes/Skin.php create mode 100644 modules/backend/classes/WidgetBase.php create mode 100644 modules/backend/classes/WidgetManager.php create mode 100644 modules/backend/composer.json create mode 100644 modules/backend/console/CreateController.php create mode 100644 modules/backend/console/CreateFormWidget.php create mode 100644 modules/backend/console/CreateReportWidget.php create mode 100644 modules/backend/console/UserCreate.php create mode 100644 modules/backend/console/WinterPasswd.php create mode 100644 modules/backend/console/scaffold/controller/_list_toolbar.stub create mode 100644 modules/backend/console/scaffold/controller/config_form.stub create mode 100644 modules/backend/console/scaffold/controller/config_list.stub create mode 100644 modules/backend/console/scaffold/controller/controller.stub create mode 100644 modules/backend/console/scaffold/controller/fancy/_toolbar.stub create mode 100644 modules/backend/console/scaffold/controller/fancy/create.stub create mode 100644 modules/backend/console/scaffold/controller/fancy/preview.stub create mode 100644 modules/backend/console/scaffold/controller/fancy/update.stub create mode 100644 modules/backend/console/scaffold/controller/index.stub create mode 100644 modules/backend/console/scaffold/controller/sidebar/create.stub create mode 100644 modules/backend/console/scaffold/controller/sidebar/preview.stub create mode 100644 modules/backend/console/scaffold/controller/sidebar/update.stub create mode 100644 modules/backend/console/scaffold/controller/standard/create.stub create mode 100644 modules/backend/console/scaffold/controller/standard/preview.stub create mode 100644 modules/backend/console/scaffold/controller/standard/update.stub create mode 100644 modules/backend/console/scaffold/formwidget/formwidget.stub create mode 100644 modules/backend/console/scaffold/formwidget/javascript.stub create mode 100644 modules/backend/console/scaffold/formwidget/partial.stub create mode 100644 modules/backend/console/scaffold/formwidget/stylesheet.stub create mode 100644 modules/backend/console/scaffold/reportwidget/reportwidget.stub create mode 100644 modules/backend/console/scaffold/reportwidget/widget.stub create mode 100644 modules/backend/controllers/AccessLogs.php create mode 100644 modules/backend/controllers/Auth.php create mode 100644 modules/backend/controllers/Files.php create mode 100644 modules/backend/controllers/Index.php create mode 100644 modules/backend/controllers/Media.php create mode 100644 modules/backend/controllers/MyAccount.php create mode 100644 modules/backend/controllers/Preferences.php create mode 100644 modules/backend/controllers/UserGroups.php create mode 100644 modules/backend/controllers/UserRoles.php create mode 100644 modules/backend/controllers/Users.php create mode 100644 modules/backend/controllers/accesslogs/_hint.php create mode 100644 modules/backend/controllers/accesslogs/_list_toolbar.php create mode 100644 modules/backend/controllers/accesslogs/config_filter.yaml create mode 100644 modules/backend/controllers/accesslogs/config_list.yaml create mode 100644 modules/backend/controllers/accesslogs/index.php create mode 100644 modules/backend/controllers/auth/reset.php create mode 100644 modules/backend/controllers/auth/restore.php create mode 100644 modules/backend/controllers/auth/signin.php create mode 100644 modules/backend/controllers/index/config_dashboard.yaml create mode 100644 modules/backend/controllers/index/index.php create mode 100644 modules/backend/controllers/media/index.php create mode 100644 modules/backend/controllers/myaccount/config_form.yaml create mode 100644 modules/backend/controllers/myaccount/index.php create mode 100644 modules/backend/controllers/preferences/_example_code.php create mode 100644 modules/backend/controllers/preferences/_field_editor_preview_lang.php create mode 100644 modules/backend/controllers/preferences/config_form.yaml create mode 100644 modules/backend/controllers/preferences/index.php create mode 100644 modules/backend/controllers/usergroups/_list_toolbar.php create mode 100644 modules/backend/controllers/usergroups/config_form.yaml create mode 100644 modules/backend/controllers/usergroups/config_list.yaml create mode 100644 modules/backend/controllers/usergroups/create.php create mode 100644 modules/backend/controllers/usergroups/update.php create mode 100644 modules/backend/controllers/userroles/__users.php create mode 100644 modules/backend/controllers/userroles/_list_toolbar.php create mode 100644 modules/backend/controllers/userroles/config_form.yaml create mode 100644 modules/backend/controllers/userroles/config_list.yaml create mode 100644 modules/backend/controllers/userroles/config_relation.yaml create mode 100644 modules/backend/controllers/userroles/create.php create mode 100644 modules/backend/controllers/userroles/update.php create mode 100644 modules/backend/controllers/users/_btn_impersonate.php create mode 100644 modules/backend/controllers/users/_btn_password_reset.php create mode 100644 modules/backend/controllers/users/_btn_unsuspend.php create mode 100644 modules/backend/controllers/users/_hint_trashed.php create mode 100644 modules/backend/controllers/users/_list_toolbar.php create mode 100644 modules/backend/controllers/users/config_filter.yaml create mode 100644 modules/backend/controllers/users/config_form.yaml create mode 100644 modules/backend/controllers/users/config_list.yaml create mode 100644 modules/backend/controllers/users/config_relation.yaml create mode 100644 modules/backend/controllers/users/myaccount.php create mode 100644 modules/backend/controllers/users/update.php create mode 100644 modules/backend/database/migrations/2013_10_01_000001_Db_Backend_Users.php create mode 100644 modules/backend/database/migrations/2013_10_01_000002_Db_Backend_User_Groups.php create mode 100644 modules/backend/database/migrations/2013_10_01_000003_Db_Backend_Users_Groups.php create mode 100644 modules/backend/database/migrations/2013_10_01_000004_Db_Backend_User_Throttle.php create mode 100644 modules/backend/database/migrations/2014_01_04_000005_Db_Backend_User_Preferences.php create mode 100644 modules/backend/database/migrations/2014_10_01_000006_Db_Backend_Access_Log.php create mode 100644 modules/backend/database/migrations/2014_10_01_000007_Db_Backend_Add_Description_Field.php create mode 100644 modules/backend/database/migrations/2015_10_01_000008_Db_Backend_Add_Superuser_Flag.php create mode 100644 modules/backend/database/migrations/2016_10_01_000009_Db_Backend_Timestamp_Fix.php create mode 100644 modules/backend/database/migrations/2017_10_01_000010_Db_Backend_User_Roles.php create mode 100644 modules/backend/database/migrations/2018_12_16_000011_Db_Backend_Add_Deleted_At.php create mode 100644 modules/backend/database/migrations/2023_02_16_000012_Db_Backend_Add_User_Metadata.php create mode 100644 modules/backend/database/migrations/2023_09_09_000013_Db_Backend_Add_Users_Groups_Delete_At.php create mode 100644 modules/backend/database/seeds/DatabaseSeeder.php create mode 100644 modules/backend/database/seeds/SeedSetupAdmin.php create mode 100644 modules/backend/facades/Backend.php create mode 100644 modules/backend/facades/BackendAuth.php create mode 100644 modules/backend/facades/BackendMenu.php create mode 100644 modules/backend/formwidgets/CodeEditor.php create mode 100644 modules/backend/formwidgets/ColorPicker.php create mode 100644 modules/backend/formwidgets/DataTable.php create mode 100644 modules/backend/formwidgets/DatePicker.php create mode 100644 modules/backend/formwidgets/FieldSet.php create mode 100644 modules/backend/formwidgets/FileUpload.php create mode 100644 modules/backend/formwidgets/IconPicker.php create mode 100644 modules/backend/formwidgets/MarkdownEditor.php create mode 100644 modules/backend/formwidgets/MediaFinder.php create mode 100644 modules/backend/formwidgets/NestedForm.php create mode 100644 modules/backend/formwidgets/PermissionEditor.php create mode 100644 modules/backend/formwidgets/RecordFinder.php create mode 100644 modules/backend/formwidgets/Relation.php create mode 100644 modules/backend/formwidgets/RelationManager.php create mode 100644 modules/backend/formwidgets/Repeater.php create mode 100644 modules/backend/formwidgets/RichEditor.php create mode 100644 modules/backend/formwidgets/Sensitive.php create mode 100644 modules/backend/formwidgets/TagList.php create mode 100644 modules/backend/formwidgets/codeeditor/README.md create mode 100644 modules/backend/formwidgets/codeeditor/assets/css/codeeditor.css create mode 100644 modules/backend/formwidgets/codeeditor/assets/fonts/codicon.ttf create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/114.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/133.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/134.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/2.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/202.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/257.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/294.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/326.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/342.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/39.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/54.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/70.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/726.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/832.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/851.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/codeeditor.bundle/910.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/css.worker.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/editor.worker.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/html.worker.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/json.worker.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/build/ts.worker.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/js/codeeditor.js create mode 100644 modules/backend/formwidgets/codeeditor/assets/less/codeeditor.less create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/ambiance.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/behave.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/chaos.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/chrome.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/clouds.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/clouds_midnight.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/cobalt.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/dawn.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/dreamweaver.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/eclipse.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/github.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/idle_fingers.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/iplastic.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/katzenmilch.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/kr_theme.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/kuroir.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/merbivore.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/merbivore_soft.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/mono_industrial.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/monokai.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/one-dark-pro.json create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/pastel_on_dark.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/solarized_dark.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/solarized_light.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/sqlserver.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/terminal.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/textmate.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/tomorrow.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/tomorrow_night.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/tomorrow_night_blue.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/tomorrow_night_bright.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/tomorrow_night_eighties.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/twilight.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/vibrant_ink.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/winter.json create mode 100644 modules/backend/formwidgets/codeeditor/assets/themes/xcode.tmTheme create mode 100644 modules/backend/formwidgets/codeeditor/assets/winter.mix.js create mode 100644 modules/backend/formwidgets/codeeditor/partials/_codeeditor.php create mode 100644 modules/backend/formwidgets/colorpicker/assets/js/dist/colorpicker.js create mode 100644 modules/backend/formwidgets/colorpicker/assets/js/src/ColorPicker.js create mode 100644 modules/backend/formwidgets/colorpicker/assets/less/colorpicker.less create mode 100644 modules/backend/formwidgets/colorpicker/partials/_colorpicker.php create mode 100644 modules/backend/formwidgets/datatable/partials/_datatable.php create mode 100644 modules/backend/formwidgets/datepicker/partials/_datepicker.php create mode 100644 modules/backend/formwidgets/datepicker/partials/_picker_date.php create mode 100644 modules/backend/formwidgets/datepicker/partials/_picker_time.php create mode 100644 modules/backend/formwidgets/fieldset/assets/css/fieldset.css create mode 100644 modules/backend/formwidgets/fieldset/assets/less/fieldset.less create mode 100644 modules/backend/formwidgets/fieldset/partials/_fieldset.php create mode 100644 modules/backend/formwidgets/fileupload/assets/css/fileupload.css create mode 100644 modules/backend/formwidgets/fileupload/assets/js/fileupload.js create mode 100644 modules/backend/formwidgets/fileupload/assets/less/fileupload.base.less create mode 100644 modules/backend/formwidgets/fileupload/assets/less/fileupload.filemulti.less create mode 100644 modules/backend/formwidgets/fileupload/assets/less/fileupload.filesingle.less create mode 100644 modules/backend/formwidgets/fileupload/assets/less/fileupload.imagemulti.less create mode 100644 modules/backend/formwidgets/fileupload/assets/less/fileupload.imagesingle.less create mode 100644 modules/backend/formwidgets/fileupload/assets/less/fileupload.less create mode 100644 modules/backend/formwidgets/fileupload/partials/_config_form.php create mode 100644 modules/backend/formwidgets/fileupload/partials/_file_multi.php create mode 100644 modules/backend/formwidgets/fileupload/partials/_file_single.php create mode 100644 modules/backend/formwidgets/fileupload/partials/_fileupload.php create mode 100644 modules/backend/formwidgets/fileupload/partials/_image_multi.php create mode 100644 modules/backend/formwidgets/fileupload/partials/_image_single.php create mode 100644 modules/backend/formwidgets/iconpicker/assets/js/dist/iconpicker.js create mode 100644 modules/backend/formwidgets/iconpicker/assets/js/src/components/IconPicker.vue create mode 100644 modules/backend/formwidgets/iconpicker/assets/js/src/iconpicker.js create mode 100644 modules/backend/formwidgets/iconpicker/meta/libraries.yaml create mode 100644 modules/backend/formwidgets/iconpicker/partials/_iconpicker.php create mode 100644 modules/backend/formwidgets/markdowneditor/assets/css/markdowneditor.css create mode 100644 modules/backend/formwidgets/markdowneditor/assets/js/markdowneditor.js create mode 100644 modules/backend/formwidgets/markdowneditor/assets/less/markdowneditor.less create mode 100644 modules/backend/formwidgets/markdowneditor/partials/_markdowneditor.php create mode 100644 modules/backend/formwidgets/mediafinder/assets/css/mediafinder.css create mode 100644 modules/backend/formwidgets/mediafinder/assets/js/mediafinder.js create mode 100644 modules/backend/formwidgets/mediafinder/assets/less/mediafinder.base.less create mode 100644 modules/backend/formwidgets/mediafinder/assets/less/mediafinder.filesingle.less create mode 100644 modules/backend/formwidgets/mediafinder/assets/less/mediafinder.imagesingle.less create mode 100644 modules/backend/formwidgets/mediafinder/assets/less/mediafinder.less create mode 100644 modules/backend/formwidgets/mediafinder/partials/_file_single.php create mode 100644 modules/backend/formwidgets/mediafinder/partials/_image_single.php create mode 100644 modules/backend/formwidgets/mediafinder/partials/_mediafinder.php create mode 100644 modules/backend/formwidgets/nestedform/assets/css/nestedform.css create mode 100644 modules/backend/formwidgets/nestedform/assets/less/nestedform.less create mode 100644 modules/backend/formwidgets/nestedform/partials/_nestedform.php create mode 100644 modules/backend/formwidgets/permissioneditor/assets/css/permissioneditor.css create mode 100644 modules/backend/formwidgets/permissioneditor/assets/js/permissioneditor.js create mode 100644 modules/backend/formwidgets/permissioneditor/assets/less/permissioneditor.less create mode 100644 modules/backend/formwidgets/permissioneditor/partials/_permissioneditor.php create mode 100644 modules/backend/formwidgets/recordfinder/assets/js/recordfinder.js create mode 100644 modules/backend/formwidgets/recordfinder/partials/_container.php create mode 100644 modules/backend/formwidgets/recordfinder/partials/_recordfinder.php create mode 100644 modules/backend/formwidgets/recordfinder/partials/_recordfinder_form.php create mode 100644 modules/backend/formwidgets/relation/partials/_relation.php create mode 100644 modules/backend/formwidgets/repeater/assets/css/repeater.css create mode 100644 modules/backend/formwidgets/repeater/assets/js/repeater.js create mode 100644 modules/backend/formwidgets/repeater/assets/less/repeater.less create mode 100644 modules/backend/formwidgets/repeater/partials/_repeater.php create mode 100644 modules/backend/formwidgets/repeater/partials/_repeater_add_item.php create mode 100644 modules/backend/formwidgets/repeater/partials/_repeater_item.php create mode 100755 modules/backend/formwidgets/richeditor/assets/css/richeditor.css create mode 100755 modules/backend/formwidgets/richeditor/assets/js/build-min.js create mode 100644 modules/backend/formwidgets/richeditor/assets/js/build-plugins-min.js create mode 100644 modules/backend/formwidgets/richeditor/assets/js/build-plugins.js create mode 100644 modules/backend/formwidgets/richeditor/assets/js/build.js create mode 100644 modules/backend/formwidgets/richeditor/assets/js/plugins/figures.js create mode 100644 modules/backend/formwidgets/richeditor/assets/js/plugins/mediamanager.js create mode 100644 modules/backend/formwidgets/richeditor/assets/js/plugins/pagelinks.js create mode 100755 modules/backend/formwidgets/richeditor/assets/js/richeditor.js create mode 100644 modules/backend/formwidgets/richeditor/assets/less/_base_styles.less create mode 100644 modules/backend/formwidgets/richeditor/assets/less/_froala.less create mode 100755 modules/backend/formwidgets/richeditor/assets/less/richeditor.less create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/.gitignore create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/ar.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/bs.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/cs.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/da.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/de.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/el.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/en_ca.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/en_gb.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/es.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/et.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/fa.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/fi.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/fr.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/he.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/hr.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/hu.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/id.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/it.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/ja.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/ko.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/ku.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/me.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/nb.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/nl.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/pl.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/pt_br.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/pt_pt.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/ro.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/ru.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/sk.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/sl.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/sr.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/sv.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/th.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/tr.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/uk.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/vi.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/zh_cn.js create mode 100644 modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/zh_tw.js create mode 100644 modules/backend/formwidgets/richeditor/partials/_page_links_form.php create mode 100755 modules/backend/formwidgets/richeditor/partials/_richeditor.php create mode 100644 modules/backend/formwidgets/sensitive/assets/js/dist/sensitive.js create mode 100644 modules/backend/formwidgets/sensitive/assets/js/src/Sensitive.js create mode 100644 modules/backend/formwidgets/sensitive/assets/less/sensitive.less create mode 100644 modules/backend/formwidgets/sensitive/partials/_sensitive.php create mode 100644 modules/backend/formwidgets/taglist/partials/_taglist.php create mode 100644 modules/backend/helpers/Backend.php create mode 100644 modules/backend/helpers/exception/DecompileException.php create mode 100644 modules/backend/lang/ar/lang.php create mode 100644 modules/backend/lang/be/lang.php create mode 100644 modules/backend/lang/bg/lang.php create mode 100644 modules/backend/lang/ca/lang.php create mode 100644 modules/backend/lang/cs/lang.php create mode 100644 modules/backend/lang/da/lang.php create mode 100644 modules/backend/lang/de/lang.php create mode 100644 modules/backend/lang/el/lang.php create mode 100644 modules/backend/lang/en/lang.php create mode 100644 modules/backend/lang/es-ar/lang.php create mode 100644 modules/backend/lang/es/lang.php create mode 100644 modules/backend/lang/et/lang.php create mode 100644 modules/backend/lang/fa/lang.php create mode 100644 modules/backend/lang/fi/lang.php create mode 100644 modules/backend/lang/fr/lang.php create mode 100644 modules/backend/lang/hu/lang.php create mode 100644 modules/backend/lang/id/lang.php create mode 100644 modules/backend/lang/it/lang.php create mode 100644 modules/backend/lang/ja/lang.php create mode 100644 modules/backend/lang/kr/lang.php create mode 100644 modules/backend/lang/lt/lang.php create mode 100644 modules/backend/lang/lv/lang.php create mode 100644 modules/backend/lang/nb-no/lang.php create mode 100644 modules/backend/lang/nl/lang.php create mode 100644 modules/backend/lang/pl/lang.php create mode 100644 modules/backend/lang/pt-br/lang.php create mode 100644 modules/backend/lang/pt-pt/lang.php create mode 100644 modules/backend/lang/ro/lang.php create mode 100644 modules/backend/lang/rs/lang.php create mode 100644 modules/backend/lang/ru/lang.php create mode 100644 modules/backend/lang/sk/lang.php create mode 100644 modules/backend/lang/sl/lang.php create mode 100644 modules/backend/lang/sv/lang.php create mode 100644 modules/backend/lang/th/lang.php create mode 100644 modules/backend/lang/tr/lang.php create mode 100644 modules/backend/lang/uk/lang.php create mode 100644 modules/backend/lang/vn/lang.php create mode 100644 modules/backend/lang/zh-cn/lang.php create mode 100644 modules/backend/lang/zh-tw/lang.php create mode 100644 modules/backend/layouts/_breadcrumb.php create mode 100644 modules/backend/layouts/_browser_detector.php create mode 100644 modules/backend/layouts/_custom_styles.php create mode 100644 modules/backend/layouts/_flash_messages.php create mode 100644 modules/backend/layouts/_footer.php create mode 100644 modules/backend/layouts/_head.php create mode 100644 modules/backend/layouts/_hint.php create mode 100644 modules/backend/layouts/_mainmenu.php create mode 100644 modules/backend/layouts/_sidenav.php create mode 100644 modules/backend/layouts/auth.php create mode 100644 modules/backend/layouts/default.php create mode 100644 modules/backend/layouts/form-with-sidebar.php create mode 100644 modules/backend/models/AccessLog.php create mode 100644 modules/backend/models/BrandSetting.php create mode 100644 modules/backend/models/EditorSetting.php create mode 100644 modules/backend/models/ExportModel.php create mode 100644 modules/backend/models/ImportModel.php create mode 100644 modules/backend/models/Preference.php create mode 100644 modules/backend/models/User.php create mode 100644 modules/backend/models/UserGroup.php create mode 100644 modules/backend/models/UserPreference.php create mode 100644 modules/backend/models/UserRole.php create mode 100644 modules/backend/models/UserThrottle.php create mode 100644 modules/backend/models/accesslog/columns.yaml create mode 100644 modules/backend/models/brandsetting/custom.less create mode 100644 modules/backend/models/brandsetting/fields.yaml create mode 100644 modules/backend/models/editorsetting/_toolbar_presets.php create mode 100644 modules/backend/models/editorsetting/default_styles.less create mode 100644 modules/backend/models/editorsetting/fields.yaml create mode 100644 modules/backend/models/preference/fields.yaml create mode 100644 modules/backend/models/user/columns.yaml create mode 100644 modules/backend/models/user/fields.yaml create mode 100644 modules/backend/models/usergroup/columns.yaml create mode 100644 modules/backend/models/usergroup/fields.yaml create mode 100644 modules/backend/models/userrole/columns.yaml create mode 100644 modules/backend/models/userrole/fields.yaml create mode 100644 modules/backend/package.json create mode 100644 modules/backend/phpunit.xml create mode 100644 modules/backend/reportwidgets/Welcome.php create mode 100644 modules/backend/reportwidgets/welcome/assets/css/welcome.css create mode 100644 modules/backend/reportwidgets/welcome/partials/_widget.php create mode 100644 modules/backend/routes.php create mode 100644 modules/backend/skins/Standard.php create mode 100644 modules/backend/tests/behaviors/FormControllerRecordNavigationTest.php create mode 100644 modules/backend/tests/behaviors/ImportExportControllerPermissionsTest.php create mode 100644 modules/backend/tests/behaviors/RelationControllerPivotTest.php create mode 100644 modules/backend/tests/classes/AuthManagerTest.php create mode 100644 modules/backend/tests/classes/ControllerPostbackTest.php create mode 100644 modules/backend/tests/classes/HandlerDispatchSecurityTest.php create mode 100644 modules/backend/tests/classes/NavigationManagerTest.php create mode 100644 modules/backend/tests/classes/WidgetManagerTest.php create mode 100644 modules/backend/tests/concerns/InteractsWithAuthentication.php create mode 100644 modules/backend/tests/controllers/AuthResetTest.php create mode 100644 modules/backend/tests/controllers/MyAccountSecurityTest.php create mode 100644 modules/backend/tests/controllers/MyAccountTest.php create mode 100644 modules/backend/tests/fixtures/assets/compilation.js create mode 100644 modules/backend/tests/fixtures/assets/js/file1.js create mode 100644 modules/backend/tests/fixtures/assets/js/file2.js create mode 100644 modules/backend/tests/fixtures/models/PivotRelationFixture.php create mode 100644 modules/backend/tests/fixtures/models/SortableFixture.php create mode 100644 modules/backend/tests/fixtures/models/UserFixture.php create mode 100644 modules/backend/tests/fixtures/reference/file1.txt create mode 100644 modules/backend/tests/fixtures/reference/file2.txt create mode 100644 modules/backend/tests/formwidgets/CheckboxTest.php create mode 100644 modules/backend/tests/formwidgets/ColorPickerTest.php create mode 100644 modules/backend/tests/formwidgets/FileUploadScopingTest.php create mode 100644 modules/backend/tests/helpers/BackendHelperTest.php create mode 100644 modules/backend/tests/models/BrandSettingTest.php create mode 100644 modules/backend/tests/models/EditorSettingTest.php create mode 100644 modules/backend/tests/models/ExportModelTest.php create mode 100644 modules/backend/tests/models/ImportModelTest.php create mode 100644 modules/backend/tests/models/UserAuthorizationTest.php create mode 100644 modules/backend/tests/models/UserTest.php create mode 100644 modules/backend/tests/traits/WidgetMakerTest.php create mode 100644 modules/backend/tests/widgets/FilterWidgetTest.php create mode 100644 modules/backend/tests/widgets/FormFieldSetSaveTest.php create mode 100644 modules/backend/tests/widgets/FormTest.php create mode 100644 modules/backend/tests/widgets/ListColumnEscapingTest.php create mode 100644 modules/backend/tests/widgets/ListsSortableTest.php create mode 100644 modules/backend/tests/widgets/ListsTest.php create mode 100644 modules/backend/tests/widgets/TableSearchEscapingTest.php create mode 100644 modules/backend/traits/CollapsableWidget.php create mode 100644 modules/backend/traits/ErrorMaker.php create mode 100644 modules/backend/traits/FormModelSaver.php create mode 100644 modules/backend/traits/FormModelWidget.php create mode 100644 modules/backend/traits/InspectableContainer.php create mode 100644 modules/backend/traits/PreferenceMaker.php create mode 100644 modules/backend/traits/SearchableWidget.php create mode 100644 modules/backend/traits/SelectableWidget.php create mode 100644 modules/backend/traits/SessionMaker.php create mode 100644 modules/backend/traits/UploadableWidget.php create mode 100644 modules/backend/traits/WidgetMaker.php create mode 100644 modules/backend/views/404.php create mode 100644 modules/backend/views/access_denied.php create mode 100644 modules/backend/views/mail/invite.php create mode 100644 modules/backend/views/mail/restore.php create mode 100644 modules/backend/views/no_database.php create mode 100644 modules/backend/widgets/Filter.php create mode 100644 modules/backend/widgets/Form.php create mode 100644 modules/backend/widgets/Lists.php create mode 100644 modules/backend/widgets/MediaManager.php create mode 100644 modules/backend/widgets/ReportContainer.php create mode 100644 modules/backend/widgets/Search.php create mode 100644 modules/backend/widgets/Table.php create mode 100644 modules/backend/widgets/Toolbar.php create mode 100644 modules/backend/widgets/filter/partials/_filter.php create mode 100644 modules/backend/widgets/filter/partials/_filter_scopes.php create mode 100644 modules/backend/widgets/filter/partials/_scope_button-group.php create mode 100644 modules/backend/widgets/filter/partials/_scope_checkbox.php create mode 100644 modules/backend/widgets/filter/partials/_scope_date.php create mode 100644 modules/backend/widgets/filter/partials/_scope_daterange.php create mode 100644 modules/backend/widgets/filter/partials/_scope_dropdown.php create mode 100644 modules/backend/widgets/filter/partials/_scope_group.php create mode 100644 modules/backend/widgets/filter/partials/_scope_number.php create mode 100644 modules/backend/widgets/filter/partials/_scope_numberrange.php create mode 100644 modules/backend/widgets/filter/partials/_scope_switch.php create mode 100644 modules/backend/widgets/filter/partials/_scope_text.php create mode 100644 modules/backend/widgets/form/assets/js/winter.form.js create mode 100644 modules/backend/widgets/form/partials/_field-container.php create mode 100644 modules/backend/widgets/form/partials/_field.php create mode 100644 modules/backend/widgets/form/partials/_field_balloon-selector.php create mode 100644 modules/backend/widgets/form/partials/_field_button.php create mode 100644 modules/backend/widgets/form/partials/_field_checkbox.php create mode 100644 modules/backend/widgets/form/partials/_field_checkboxlist.php create mode 100644 modules/backend/widgets/form/partials/_field_dropdown.php create mode 100644 modules/backend/widgets/form/partials/_field_email.php create mode 100644 modules/backend/widgets/form/partials/_field_hint.php create mode 100644 modules/backend/widgets/form/partials/_field_number.php create mode 100644 modules/backend/widgets/form/partials/_field_partial.php create mode 100644 modules/backend/widgets/form/partials/_field_password.php create mode 100644 modules/backend/widgets/form/partials/_field_radio.php create mode 100644 modules/backend/widgets/form/partials/_field_range.php create mode 100644 modules/backend/widgets/form/partials/_field_section.php create mode 100644 modules/backend/widgets/form/partials/_field_switch.php create mode 100644 modules/backend/widgets/form/partials/_field_tel.php create mode 100644 modules/backend/widgets/form/partials/_field_text.php create mode 100644 modules/backend/widgets/form/partials/_field_textarea.php create mode 100644 modules/backend/widgets/form/partials/_field_url.php create mode 100644 modules/backend/widgets/form/partials/_field_widget.php create mode 100644 modules/backend/widgets/form/partials/_form-container.php create mode 100644 modules/backend/widgets/form/partials/_form.php create mode 100644 modules/backend/widgets/form/partials/_form_fields.php create mode 100644 modules/backend/widgets/form/partials/_form_tabs.php create mode 100644 modules/backend/widgets/form/partials/_form_tabs_lazy.php create mode 100644 modules/backend/widgets/form/partials/_section-container.php create mode 100644 modules/backend/widgets/form/partials/_section.php create mode 100644 modules/backend/widgets/lists/assets/css/winter.list.sortable.css create mode 100644 modules/backend/widgets/lists/assets/js/dist/winter.list.sortable.js create mode 100644 modules/backend/widgets/lists/assets/js/src/winter.list.sortable.js create mode 100644 modules/backend/widgets/lists/assets/js/winter.list.js create mode 100644 modules/backend/widgets/lists/partials/_list-container.php create mode 100644 modules/backend/widgets/lists/partials/_list.php create mode 100644 modules/backend/widgets/lists/partials/_list_body_checkbox.php create mode 100644 modules/backend/widgets/lists/partials/_list_body_row.php create mode 100644 modules/backend/widgets/lists/partials/_list_body_rows.php create mode 100644 modules/backend/widgets/lists/partials/_list_body_tree.php create mode 100644 modules/backend/widgets/lists/partials/_list_head_row.php create mode 100644 modules/backend/widgets/lists/partials/_list_pagination.php create mode 100644 modules/backend/widgets/lists/partials/_list_pagination_simple.php create mode 100644 modules/backend/widgets/lists/partials/_list_totals.php create mode 100644 modules/backend/widgets/lists/partials/_setup_form.php create mode 100644 modules/backend/widgets/mediamanager/assets/css/mediamanager.css create mode 100644 modules/backend/widgets/mediamanager/assets/images/video-poster.png create mode 100644 modules/backend/widgets/mediamanager/assets/js/mediamanager-browser-min.js create mode 100644 modules/backend/widgets/mediamanager/assets/js/mediamanager-browser.js create mode 100644 modules/backend/widgets/mediamanager/assets/js/mediamanager-global.js create mode 100644 modules/backend/widgets/mediamanager/assets/js/mediamanager.imagecroppopup.js create mode 100644 modules/backend/widgets/mediamanager/assets/js/mediamanager.js create mode 100644 modules/backend/widgets/mediamanager/assets/js/mediamanager.popup.js create mode 100644 modules/backend/widgets/mediamanager/assets/less/mediamanager.less create mode 100644 modules/backend/widgets/mediamanager/partials/_body.php create mode 100644 modules/backend/widgets/mediamanager/partials/_bottom-toolbar.php create mode 100644 modules/backend/widgets/mediamanager/partials/_crop-tool-image-area.php create mode 100644 modules/backend/widgets/mediamanager/partials/_crop-toolbar.php create mode 100644 modules/backend/widgets/mediamanager/partials/_filters.php create mode 100644 modules/backend/widgets/mediamanager/partials/_folder-path.php create mode 100644 modules/backend/widgets/mediamanager/partials/_folder-toolbar.php create mode 100644 modules/backend/widgets/mediamanager/partials/_generic-list.php create mode 100644 modules/backend/widgets/mediamanager/partials/_image-crop-popup-body.php create mode 100644 modules/backend/widgets/mediamanager/partials/_item-icon.php create mode 100644 modules/backend/widgets/mediamanager/partials/_item-list.php create mode 100644 modules/backend/widgets/mediamanager/partials/_item-sidebar-preview.php create mode 100644 modules/backend/widgets/mediamanager/partials/_left-sidebar.php create mode 100644 modules/backend/widgets/mediamanager/partials/_list-grid.php create mode 100644 modules/backend/widgets/mediamanager/partials/_list-list.php create mode 100644 modules/backend/widgets/mediamanager/partials/_list-tiles.php create mode 100644 modules/backend/widgets/mediamanager/partials/_move-form.php create mode 100644 modules/backend/widgets/mediamanager/partials/_new-folder-form.php create mode 100644 modules/backend/widgets/mediamanager/partials/_popup-body.php create mode 100644 modules/backend/widgets/mediamanager/partials/_rename-form.php create mode 100644 modules/backend/widgets/mediamanager/partials/_resize-image-form.php create mode 100644 modules/backend/widgets/mediamanager/partials/_right-sidebar.php create mode 100644 modules/backend/widgets/mediamanager/partials/_sorting.php create mode 100644 modules/backend/widgets/mediamanager/partials/_thumbnail-image.php create mode 100644 modules/backend/widgets/mediamanager/partials/_toolbar.php create mode 100644 modules/backend/widgets/mediamanager/partials/_upload-progress.php create mode 100644 modules/backend/widgets/mediamanager/partials/_view-mode-buttons.php create mode 100644 modules/backend/widgets/reportcontainer/assets/css/reportcontainer.css create mode 100644 modules/backend/widgets/reportcontainer/assets/js/reportcontainer.js create mode 100644 modules/backend/widgets/reportcontainer/assets/less/reportcontainer.less create mode 100644 modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.js create mode 100644 modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.min.js create mode 100644 modules/backend/widgets/reportcontainer/partials/_container.php create mode 100644 modules/backend/widgets/reportcontainer/partials/_new_widget_popup.php create mode 100644 modules/backend/widgets/reportcontainer/partials/_widget.php create mode 100644 modules/backend/widgets/reportcontainer/partials/_widget_list.php create mode 100644 modules/backend/widgets/reportcontainer/partials/_widget_toolbar.php create mode 100644 modules/backend/widgets/search/partials/_search.php create mode 100644 modules/backend/widgets/table/ClientMemoryDataSource.php create mode 100644 modules/backend/widgets/table/DataSourceBase.php create mode 100644 modules/backend/widgets/table/README.md create mode 100644 modules/backend/widgets/table/ServerEventDataSource.php create mode 100644 modules/backend/widgets/table/assets/css/table.css create mode 100644 modules/backend/widgets/table/assets/images/table-icons.gif create mode 100644 modules/backend/widgets/table/assets/js/build-min.js create mode 100644 modules/backend/widgets/table/assets/js/build.js create mode 100644 modules/backend/widgets/table/assets/js/table.datasource.base.js create mode 100644 modules/backend/widgets/table/assets/js/table.datasource.client.js create mode 100644 modules/backend/widgets/table/assets/js/table.datasource.server.js create mode 100644 modules/backend/widgets/table/assets/js/table.helper.navigation.js create mode 100644 modules/backend/widgets/table/assets/js/table.helper.search.js create mode 100644 modules/backend/widgets/table/assets/js/table.js create mode 100644 modules/backend/widgets/table/assets/js/table.processor.autocomplete.js create mode 100644 modules/backend/widgets/table/assets/js/table.processor.base.js create mode 100644 modules/backend/widgets/table/assets/js/table.processor.checkbox.js create mode 100644 modules/backend/widgets/table/assets/js/table.processor.dropdown.js create mode 100644 modules/backend/widgets/table/assets/js/table.processor.string.js create mode 100644 modules/backend/widgets/table/assets/js/table.validator.base.js create mode 100644 modules/backend/widgets/table/assets/js/table.validator.basenumber.js create mode 100644 modules/backend/widgets/table/assets/js/table.validator.float.js create mode 100644 modules/backend/widgets/table/assets/js/table.validator.integer.js create mode 100644 modules/backend/widgets/table/assets/js/table.validator.length.js create mode 100644 modules/backend/widgets/table/assets/js/table.validator.regex.js create mode 100644 modules/backend/widgets/table/assets/js/table.validator.required.js create mode 100644 modules/backend/widgets/table/assets/less/table.less create mode 100644 modules/backend/widgets/table/partials/_table.php create mode 100644 modules/backend/widgets/toolbar/partials/_toolbar.php create mode 100644 modules/backend/winter.mix.js create mode 100644 modules/cms/LICENSE create mode 100644 modules/cms/README.md create mode 100644 modules/cms/ServiceProvider.php create mode 100644 modules/cms/assets/css/themelogs/template-diff.css create mode 100644 modules/cms/assets/css/winter.components.css create mode 100644 modules/cms/assets/css/winter.theme-selector.css create mode 100644 modules/cms/assets/images/cms-icon.svg create mode 100644 modules/cms/assets/images/default-theme-preview.png create mode 100644 modules/cms/assets/js/themelogs/template-diff.js create mode 100644 modules/cms/assets/js/winter.cmspage.js create mode 100644 modules/cms/assets/js/winter.dragcomponents.js create mode 100644 modules/cms/assets/js/winter.tokenexpander.js create mode 100644 modules/cms/assets/less/winter.components.less create mode 100644 modules/cms/assets/less/winter.theme-selector.less create mode 100644 modules/cms/assets/vendor/jsdiff/diff.js create mode 100644 modules/cms/classes/Asset.php create mode 100644 modules/cms/classes/AutoDatasource.php create mode 100644 modules/cms/classes/CmsCompoundObject.php create mode 100644 modules/cms/classes/CmsController.php create mode 100644 modules/cms/classes/CmsException.php create mode 100644 modules/cms/classes/CmsObject.php create mode 100644 modules/cms/classes/CmsObjectCollection.php create mode 100644 modules/cms/classes/CodeBase.php create mode 100644 modules/cms/classes/CodeParser.php create mode 100644 modules/cms/classes/ComponentBase.php create mode 100644 modules/cms/classes/ComponentHelpers.php create mode 100644 modules/cms/classes/ComponentManager.php create mode 100644 modules/cms/classes/ComponentPartial.php create mode 100644 modules/cms/classes/Content.php create mode 100644 modules/cms/classes/Controller.php create mode 100644 modules/cms/classes/Layout.php create mode 100644 modules/cms/classes/LayoutCode.php create mode 100644 modules/cms/classes/MediaLibrary.php create mode 100644 modules/cms/classes/MediaLibraryItem.php create mode 100644 modules/cms/classes/MediaViewHelper.php create mode 100644 modules/cms/classes/Meta.php create mode 100644 modules/cms/classes/ObjectMemoryCache.php create mode 100644 modules/cms/classes/Page.php create mode 100644 modules/cms/classes/PageCode.php create mode 100644 modules/cms/classes/Partial.php create mode 100644 modules/cms/classes/PartialCode.php create mode 100644 modules/cms/classes/PartialStack.php create mode 100644 modules/cms/classes/Router.php create mode 100644 modules/cms/classes/Theme.php create mode 100644 modules/cms/classes/ThemeManager.php create mode 100644 modules/cms/classes/asset/fields.yaml create mode 100644 modules/cms/classes/content/fields.yaml create mode 100644 modules/cms/classes/layout/fields.yaml create mode 100644 modules/cms/classes/page/fields.yaml create mode 100644 modules/cms/classes/partial/fields.yaml create mode 100644 modules/cms/classes/theme/fields.yaml create mode 100644 modules/cms/components/Resources.php create mode 100644 modules/cms/components/SoftComponent.php create mode 100644 modules/cms/components/UnknownComponent.php create mode 100644 modules/cms/components/ViewBag.php create mode 100644 modules/cms/composer.json create mode 100644 modules/cms/console/CreateComponent.php create mode 100644 modules/cms/console/CreateTheme.php create mode 100644 modules/cms/console/ThemeInstall.php create mode 100644 modules/cms/console/ThemeList.php create mode 100644 modules/cms/console/ThemeRemove.php create mode 100644 modules/cms/console/ThemeSync.php create mode 100644 modules/cms/console/ThemeUse.php create mode 100644 modules/cms/console/scaffold/component/component.stub create mode 100644 modules/cms/console/scaffold/component/default.stub create mode 100644 modules/cms/console/scaffold/theme/less/assets/js/app.stub create mode 100644 modules/cms/console/scaffold/theme/less/assets/less/theme.stub create mode 100644 modules/cms/console/scaffold/theme/less/layouts/default.stub create mode 100644 modules/cms/console/scaffold/theme/less/pages/404.stub create mode 100644 modules/cms/console/scaffold/theme/less/pages/error.stub create mode 100644 modules/cms/console/scaffold/theme/less/pages/home.stub create mode 100644 modules/cms/console/scaffold/theme/less/partials/meta/seo.stub create mode 100644 modules/cms/console/scaffold/theme/less/partials/meta/styles.stub create mode 100644 modules/cms/console/scaffold/theme/less/partials/site/footer.stub create mode 100644 modules/cms/console/scaffold/theme/less/partials/site/header.stub create mode 100644 modules/cms/console/scaffold/theme/less/theme.stub create mode 100644 modules/cms/console/scaffold/theme/less/version.stub create mode 100644 modules/cms/console/scaffold/theme/tailwind/.gitignore.stub create mode 100644 modules/cms/console/scaffold/theme/tailwind/README.stub create mode 100644 modules/cms/console/scaffold/theme/tailwind/lang/en/lang.stub create mode 100644 modules/cms/console/scaffold/theme/tailwind/layouts/default.stub create mode 100644 modules/cms/console/scaffold/theme/tailwind/pages/404.stub create mode 100644 modules/cms/console/scaffold/theme/tailwind/pages/error.stub create mode 100644 modules/cms/console/scaffold/theme/tailwind/pages/home.stub create mode 100644 modules/cms/console/scaffold/theme/tailwind/partials/meta/seo.stub create mode 100644 modules/cms/console/scaffold/theme/tailwind/partials/meta/styles.stub create mode 100644 modules/cms/console/scaffold/theme/tailwind/partials/site/footer.stub create mode 100644 modules/cms/console/scaffold/theme/tailwind/partials/site/header.stub create mode 100644 modules/cms/console/scaffold/theme/tailwind/theme.stub create mode 100644 modules/cms/console/scaffold/theme/tailwind/version.stub create mode 100644 modules/cms/contracts/CmsObject.php create mode 100644 modules/cms/controllers/Index.php create mode 100644 modules/cms/controllers/Media.php create mode 100644 modules/cms/controllers/ThemeLogs.php create mode 100644 modules/cms/controllers/ThemeOptions.php create mode 100644 modules/cms/controllers/Themes.php create mode 100644 modules/cms/controllers/index/_button_commit.php create mode 100644 modules/cms/controllers/index/_button_lastmodified.php create mode 100644 modules/cms/controllers/index/_button_reset.php create mode 100644 modules/cms/controllers/index/_common_toolbar_actions.php create mode 100644 modules/cms/controllers/index/_concurrency_resolve_form.php create mode 100644 modules/cms/controllers/index/_content_toolbar.php create mode 100644 modules/cms/controllers/index/_form_page.php create mode 100644 modules/cms/controllers/index/_layout_toolbar.php create mode 100644 modules/cms/controllers/index/_page_toolbar.php create mode 100644 modules/cms/controllers/index/_partial_toolbar.php create mode 100644 modules/cms/controllers/index/_safemode_notice.php create mode 100644 modules/cms/controllers/index/_sidepanel.php create mode 100644 modules/cms/controllers/index/config_content_list.yaml create mode 100644 modules/cms/controllers/index/config_layout_list.yaml create mode 100644 modules/cms/controllers/index/config_page_list.yaml create mode 100644 modules/cms/controllers/index/config_partial_list.yaml create mode 100644 modules/cms/controllers/index/index.php create mode 100644 modules/cms/controllers/media/index.php create mode 100644 modules/cms/controllers/themelogs/_field_content.php create mode 100644 modules/cms/controllers/themelogs/_field_diff_content.php create mode 100644 modules/cms/controllers/themelogs/_field_diff_template.php create mode 100644 modules/cms/controllers/themelogs/_field_template.php create mode 100644 modules/cms/controllers/themelogs/_hint.php create mode 100644 modules/cms/controllers/themelogs/_hint_preview.php create mode 100644 modules/cms/controllers/themelogs/_list_toolbar.php create mode 100644 modules/cms/controllers/themelogs/_preview_scoreboard.php create mode 100644 modules/cms/controllers/themelogs/config_filter.yaml create mode 100644 modules/cms/controllers/themelogs/config_form.yaml create mode 100644 modules/cms/controllers/themelogs/config_list.yaml create mode 100644 modules/cms/controllers/themelogs/index.php create mode 100644 modules/cms/controllers/themelogs/preview.php create mode 100644 modules/cms/controllers/themeoptions/config_form.yaml create mode 100644 modules/cms/controllers/themeoptions/update.php create mode 100644 modules/cms/controllers/themes/_theme_create_form.php create mode 100644 modules/cms/controllers/themes/_theme_duplicate_form.php create mode 100644 modules/cms/controllers/themes/_theme_export_form.php create mode 100644 modules/cms/controllers/themes/_theme_fields_form.php create mode 100644 modules/cms/controllers/themes/_theme_import_form.php create mode 100644 modules/cms/controllers/themes/_theme_list.php create mode 100644 modules/cms/controllers/themes/_theme_list_item.php create mode 100644 modules/cms/controllers/themes/download.php create mode 100644 modules/cms/controllers/themes/index.php create mode 100644 modules/cms/database/migrations/2014_10_01_000001_Db_Cms_Theme_Data.php create mode 100644 modules/cms/database/migrations/2016_10_01_000002_Db_Cms_Timestamp_Fix.php create mode 100644 modules/cms/database/migrations/2017_10_01_000003_Db_Cms_Theme_Logs.php create mode 100644 modules/cms/database/migrations/2018_11_01_000001_Db_Cms_Theme_Templates.php create mode 100644 modules/cms/database/migrations/2026_08_09_000004_Db_Cms_Theme_Templates_Indexes.php create mode 100644 modules/cms/facades/Cms.php create mode 100644 modules/cms/formwidgets/Components.php create mode 100644 modules/cms/formwidgets/MediaFinder.php create mode 100644 modules/cms/formwidgets/components/partials/_component.php create mode 100644 modules/cms/formwidgets/components/partials/_formcomponents.php create mode 100644 modules/cms/helpers/Cms.php create mode 100644 modules/cms/helpers/File.php create mode 100644 modules/cms/lang/ar/lang.php create mode 100644 modules/cms/lang/be/lang.php create mode 100644 modules/cms/lang/bg/lang.php create mode 100644 modules/cms/lang/ca/lang.php create mode 100644 modules/cms/lang/cs/lang.php create mode 100644 modules/cms/lang/da/lang.php create mode 100644 modules/cms/lang/de/lang.php create mode 100644 modules/cms/lang/el/lang.php create mode 100644 modules/cms/lang/en/lang.php create mode 100644 modules/cms/lang/es-ar/lang.php create mode 100644 modules/cms/lang/es/lang.php create mode 100644 modules/cms/lang/et/lang.php create mode 100644 modules/cms/lang/fa/lang.php create mode 100644 modules/cms/lang/fi/lang.php create mode 100644 modules/cms/lang/fr/lang.php create mode 100644 modules/cms/lang/hu/lang.php create mode 100644 modules/cms/lang/id/lang.php create mode 100644 modules/cms/lang/it/lang.php create mode 100644 modules/cms/lang/ja/lang.php create mode 100644 modules/cms/lang/kr/lang.php create mode 100644 modules/cms/lang/lt/lang.php create mode 100644 modules/cms/lang/lv/lang.php create mode 100644 modules/cms/lang/nb-no/lang.php create mode 100644 modules/cms/lang/nl/lang.php create mode 100644 modules/cms/lang/pl/lang.php create mode 100644 modules/cms/lang/pt-br/lang.php create mode 100644 modules/cms/lang/pt-pt/lang.php create mode 100644 modules/cms/lang/ro/lang.php create mode 100644 modules/cms/lang/rs/lang.php create mode 100644 modules/cms/lang/ru/lang.php create mode 100644 modules/cms/lang/sk/lang.php create mode 100644 modules/cms/lang/sl/lang.php create mode 100644 modules/cms/lang/sv/lang.php create mode 100644 modules/cms/lang/th/lang.php create mode 100644 modules/cms/lang/tr/lang.php create mode 100644 modules/cms/lang/uk/lang.php create mode 100644 modules/cms/lang/vn/lang.php create mode 100644 modules/cms/lang/zh-cn/lang.php create mode 100644 modules/cms/lang/zh-tw/lang.php create mode 100644 modules/cms/models/MaintenanceSetting.php create mode 100644 modules/cms/models/ThemeData.php create mode 100644 modules/cms/models/ThemeExport.php create mode 100644 modules/cms/models/ThemeImport.php create mode 100644 modules/cms/models/ThemeLog.php create mode 100644 modules/cms/models/maintenancesetting/_hint.php create mode 100644 modules/cms/models/maintenancesetting/fields.yaml create mode 100644 modules/cms/models/themeexport/fields.yaml create mode 100644 modules/cms/models/themeimport/fields.yaml create mode 100644 modules/cms/models/themelog/columns.yaml create mode 100644 modules/cms/models/themelog/fields.yaml create mode 100644 modules/cms/phpunit.xml create mode 100644 modules/cms/reportwidgets/ActiveTheme.php create mode 100644 modules/cms/reportwidgets/activetheme/assets/css/activetheme.css create mode 100644 modules/cms/reportwidgets/activetheme/partials/_widget.php create mode 100644 modules/cms/routes.php create mode 100644 modules/cms/tests/classes/AssetTest.php create mode 100644 modules/cms/tests/classes/AutoDatasourceTest.php create mode 100644 modules/cms/tests/classes/CmsCompoundObjectTest.php create mode 100644 modules/cms/tests/classes/CmsExceptionTest.php create mode 100644 modules/cms/tests/classes/CmsObjectQueryTest.php create mode 100644 modules/cms/tests/classes/CmsObjectTest.php create mode 100644 modules/cms/tests/classes/CodeParserTest.php create mode 100644 modules/cms/tests/classes/ComponentManagerTest.php create mode 100644 modules/cms/tests/classes/ContentTest.php create mode 100644 modules/cms/tests/classes/ControllerPostbackTest.php create mode 100644 modules/cms/tests/classes/ControllerTest.php create mode 100644 modules/cms/tests/classes/PageTest.php create mode 100644 modules/cms/tests/classes/PartialStackTest.php create mode 100644 modules/cms/tests/classes/RouterTest.php create mode 100644 modules/cms/tests/classes/ThemeTest.php create mode 100644 modules/cms/tests/classes/TwigExtensionTest.php create mode 100644 modules/cms/tests/controllers/IndexPermissionTest.php create mode 100644 modules/cms/tests/fixtures/reference/compound-full.htm create mode 100644 modules/cms/tests/fixtures/reference/compound-markup-settings.htm create mode 100644 modules/cms/tests/fixtures/reference/compound-markup.htm create mode 100644 modules/cms/tests/fixtures/reference/namespaces-aliases.php.stub create mode 100644 modules/cms/tests/fixtures/reference/namespaces.php.stub create mode 100644 modules/cms/tests/fixtures/themes/apitest/.gitignore create mode 100644 modules/cms/tests/fixtures/themes/childtest/assets/css/style2.css create mode 100644 modules/cms/tests/fixtures/themes/childtest/content/a/a-content.htm create mode 100644 modules/cms/tests/fixtures/themes/childtest/partials/a/a-partial.htm create mode 100644 modules/cms/tests/fixtures/themes/childtest/theme.yaml create mode 100644 modules/cms/tests/fixtures/themes/test/assets/css/style1.css create mode 100644 modules/cms/tests/fixtures/themes/test/assets/css/style2.css create mode 100644 modules/cms/tests/fixtures/themes/test/assets/images/winter.png create mode 100644 modules/cms/tests/fixtures/themes/test/assets/js/script1.js create mode 100644 modules/cms/tests/fixtures/themes/test/assets/js/script2.js create mode 100644 modules/cms/tests/fixtures/themes/test/assets/js/subdir/script1.js create mode 100644 modules/cms/tests/fixtures/themes/test/content/a/a-content.htm create mode 100644 modules/cms/tests/fixtures/themes/test/content/html-content.htm create mode 100644 modules/cms/tests/fixtures/themes/test/content/layout-content.txt create mode 100644 modules/cms/tests/fixtures/themes/test/content/markdown-content.md create mode 100644 modules/cms/tests/fixtures/themes/test/content/page-content.htm create mode 100644 modules/cms/tests/fixtures/themes/test/content/text-content.txt create mode 100644 modules/cms/tests/fixtures/themes/test/layouts/a/a-layout.htm create mode 100644 modules/cms/tests/fixtures/themes/test/layouts/ajax-test.htm create mode 100644 modules/cms/tests/fixtures/themes/test/layouts/content.htm create mode 100644 modules/cms/tests/fixtures/themes/test/layouts/cycle-test.htm create mode 100644 modules/cms/tests/fixtures/themes/test/layouts/no-php.htm create mode 100644 modules/cms/tests/fixtures/themes/test/layouts/partials.htm create mode 100644 modules/cms/tests/fixtures/themes/test/layouts/php-parser-test.htm create mode 100644 modules/cms/tests/fixtures/themes/test/layouts/placeholder.htm create mode 100644 modules/cms/tests/fixtures/themes/test/layouts/sidebar.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/404.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/a/a-page.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/ajax-test.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/authors.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/b/b-page.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/b/c/c-page.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/blog-archive.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/blog-category.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/blog-post.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/code-namespaces-aliases.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/code-namespaces.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/component-custom-render.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/component-partial-alias-override.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/component-partial-nesting.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/component-partial-override.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/component-partial.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/cycle-test.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/filters-test.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/index.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/no-component-class.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/no-component.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/no-layout.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/no-partial.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/no-soft-component-class.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/optional-full-php-tags.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/optional-short-php-tags.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/shared-variable-override.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/shared-variable.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/throw-php.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/with-component.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/with-components.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/with-content.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/with-layout.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/with-macro.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/with-partials.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/with-placeholder.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/with-soft-component-class-alias.htm create mode 100644 modules/cms/tests/fixtures/themes/test/pages/with-soft-component-class.htm create mode 100644 modules/cms/tests/fixtures/themes/test/partials/a/a-partial.htm create mode 100644 modules/cms/tests/fixtures/themes/test/partials/ajax-result.htm create mode 100644 modules/cms/tests/fixtures/themes/test/partials/ajax-second-result.htm create mode 100644 modules/cms/tests/fixtures/themes/test/partials/layout-partial.htm create mode 100644 modules/cms/tests/fixtures/themes/test/partials/nesting/level1.htm create mode 100644 modules/cms/tests/fixtures/themes/test/partials/nesting/level2.htm create mode 100644 modules/cms/tests/fixtures/themes/test/partials/nesting/level3.htm create mode 100644 modules/cms/tests/fixtures/themes/test/partials/override1/default.htm create mode 100644 modules/cms/tests/fixtures/themes/test/partials/override2/default.htm create mode 100644 modules/cms/tests/fixtures/themes/test/partials/override2/items.htm create mode 100644 modules/cms/tests/fixtures/themes/test/partials/override3/default.htm create mode 100644 modules/cms/tests/fixtures/themes/test/partials/override4/default.htm create mode 100644 modules/cms/tests/fixtures/themes/test/partials/page-partial.htm create mode 100644 modules/cms/tests/fixtures/themes/test/partials/testpost/default.htm create mode 100644 modules/cms/tests/fixtures/themes/test/temporary/.gitignore create mode 100644 modules/cms/tests/fixtures/themes/test/testobjects/component.htm create mode 100644 modules/cms/tests/fixtures/themes/test/testobjects/components.htm create mode 100644 modules/cms/tests/fixtures/themes/test/testobjects/compound.htm create mode 100644 modules/cms/tests/fixtures/themes/test/testobjects/plain.html create mode 100644 modules/cms/tests/fixtures/themes/test/testobjects/subdir/obj.html create mode 100644 modules/cms/tests/fixtures/themes/test/testobjects/viewbag.htm create mode 100644 modules/cms/tests/fixtures/themes/themedata/theme.yaml create mode 100644 modules/cms/tests/helpers/FileTest.php create mode 100644 modules/cms/tests/models/ThemeDataTest.php create mode 100644 modules/cms/tests/widgets/AssetListPermissionTest.php create mode 100644 modules/cms/traits/UrlMaker.php create mode 100644 modules/cms/twig/ComponentNode.php create mode 100644 modules/cms/twig/ComponentTokenParser.php create mode 100644 modules/cms/twig/ContentNode.php create mode 100644 modules/cms/twig/ContentTokenParser.php create mode 100644 modules/cms/twig/DebugExtension.php create mode 100644 modules/cms/twig/DefaultNode.php create mode 100644 modules/cms/twig/DefaultTokenParser.php create mode 100644 modules/cms/twig/Extension.php create mode 100644 modules/cms/twig/FlashNode.php create mode 100644 modules/cms/twig/FlashTokenParser.php create mode 100644 modules/cms/twig/FrameworkNode.php create mode 100644 modules/cms/twig/FrameworkTokenParser.php create mode 100644 modules/cms/twig/Loader.php create mode 100644 modules/cms/twig/PageNode.php create mode 100644 modules/cms/twig/PageTokenParser.php create mode 100644 modules/cms/twig/PartialNode.php create mode 100644 modules/cms/twig/PartialTokenParser.php create mode 100644 modules/cms/twig/PlaceholderNode.php create mode 100644 modules/cms/twig/PlaceholderTokenParser.php create mode 100644 modules/cms/twig/PutNode.php create mode 100644 modules/cms/twig/PutTokenParser.php create mode 100644 modules/cms/twig/ScriptsNode.php create mode 100644 modules/cms/twig/ScriptsTokenParser.php create mode 100644 modules/cms/twig/SnowboardNode.php create mode 100644 modules/cms/twig/SnowboardTokenParser.php create mode 100644 modules/cms/twig/StylesNode.php create mode 100644 modules/cms/twig/StylesTokenParser.php create mode 100644 modules/cms/views/404.php create mode 100644 modules/cms/views/error.php create mode 100644 modules/cms/widgets/AssetList.php create mode 100644 modules/cms/widgets/ComponentList.php create mode 100644 modules/cms/widgets/MediaManager.php create mode 100644 modules/cms/widgets/TemplateList.php create mode 100644 modules/cms/widgets/assetlist/assets/css/assetlist.css create mode 100644 modules/cms/widgets/assetlist/assets/js/assetlist.js create mode 100644 modules/cms/widgets/assetlist/assets/less/assetlist.less create mode 100644 modules/cms/widgets/assetlist/partials/_body.php create mode 100644 modules/cms/widgets/assetlist/partials/_files.php create mode 100644 modules/cms/widgets/assetlist/partials/_items.php create mode 100644 modules/cms/widgets/assetlist/partials/_move_form.php create mode 100644 modules/cms/widgets/assetlist/partials/_new_dir_form.php create mode 100644 modules/cms/widgets/assetlist/partials/_rename_form.php create mode 100644 modules/cms/widgets/assetlist/partials/_toolbar.php create mode 100644 modules/cms/widgets/componentlist/partials/_body.php create mode 100644 modules/cms/widgets/componentlist/partials/_component_list.php create mode 100644 modules/cms/widgets/componentlist/partials/_components.php create mode 100644 modules/cms/widgets/componentlist/partials/_items.php create mode 100644 modules/cms/widgets/componentlist/partials/_toolbar.php create mode 100644 modules/cms/widgets/templatelist/partials/_body.php create mode 100644 modules/cms/widgets/templatelist/partials/_items.php create mode 100644 modules/cms/widgets/templatelist/partials/_sorting-options.php create mode 100644 modules/cms/widgets/templatelist/partials/_templates.php create mode 100644 modules/cms/widgets/templatelist/partials/_toolbar.php create mode 100644 modules/system/.babelrc create mode 100644 modules/system/.eslintignore create mode 100644 modules/system/.eslintrc.json create mode 100644 modules/system/.gitignore create mode 100644 modules/system/LICENSE create mode 100644 modules/system/README.md create mode 100644 modules/system/ServiceProvider.php create mode 100644 modules/system/aliases.php create mode 100644 modules/system/assets/css/eventlogs/exception-beautifier.css create mode 100644 modules/system/assets/css/framework.extras-min.css create mode 100644 modules/system/assets/css/framework.extras.css create mode 100644 modules/system/assets/css/settings/settings.css create mode 100644 modules/system/assets/css/snowboard.extras.css create mode 100644 modules/system/assets/css/styles.css create mode 100644 modules/system/assets/css/updates/details.css create mode 100644 modules/system/assets/css/updates/install.css create mode 100644 modules/system/assets/css/updates/updates.css create mode 100644 modules/system/assets/images/cog-icon.svg create mode 100644 modules/system/assets/js/build/manifest.js create mode 100644 modules/system/assets/js/build/system.debug.js create mode 100644 modules/system/assets/js/build/system.js create mode 100644 modules/system/assets/js/eventlogs/exception-beautifier.js create mode 100644 modules/system/assets/js/eventlogs/exception-beautifier.links.js create mode 100644 modules/system/assets/js/framework-min.js create mode 100644 modules/system/assets/js/framework.combined-min.js create mode 100644 modules/system/assets/js/framework.combined.js create mode 100644 modules/system/assets/js/framework.extras.js create mode 100644 modules/system/assets/js/framework.js create mode 100644 modules/system/assets/js/lang/lang.ar.js create mode 100644 modules/system/assets/js/lang/lang.be.js create mode 100644 modules/system/assets/js/lang/lang.bg.js create mode 100644 modules/system/assets/js/lang/lang.ca.js create mode 100644 modules/system/assets/js/lang/lang.cs.js create mode 100644 modules/system/assets/js/lang/lang.da.js create mode 100644 modules/system/assets/js/lang/lang.de.js create mode 100644 modules/system/assets/js/lang/lang.el.js create mode 100644 modules/system/assets/js/lang/lang.en-au.js create mode 100644 modules/system/assets/js/lang/lang.en-ca.js create mode 100644 modules/system/assets/js/lang/lang.en-gb.js create mode 100644 modules/system/assets/js/lang/lang.en.js create mode 100644 modules/system/assets/js/lang/lang.es-ar.js create mode 100644 modules/system/assets/js/lang/lang.es.js create mode 100644 modules/system/assets/js/lang/lang.et.js create mode 100644 modules/system/assets/js/lang/lang.fa.js create mode 100644 modules/system/assets/js/lang/lang.fi.js create mode 100644 modules/system/assets/js/lang/lang.fr-ca.js create mode 100644 modules/system/assets/js/lang/lang.fr.js create mode 100644 modules/system/assets/js/lang/lang.hu.js create mode 100644 modules/system/assets/js/lang/lang.id.js create mode 100644 modules/system/assets/js/lang/lang.it.js create mode 100644 modules/system/assets/js/lang/lang.ja.js create mode 100644 modules/system/assets/js/lang/lang.kr.js create mode 100644 modules/system/assets/js/lang/lang.lt.js create mode 100644 modules/system/assets/js/lang/lang.lv.js create mode 100644 modules/system/assets/js/lang/lang.nb-no.js create mode 100644 modules/system/assets/js/lang/lang.nl.js create mode 100644 modules/system/assets/js/lang/lang.pl.js create mode 100644 modules/system/assets/js/lang/lang.pt-br.js create mode 100644 modules/system/assets/js/lang/lang.pt-pt.js create mode 100644 modules/system/assets/js/lang/lang.ro.js create mode 100644 modules/system/assets/js/lang/lang.rs.js create mode 100644 modules/system/assets/js/lang/lang.ru.js create mode 100644 modules/system/assets/js/lang/lang.sk.js create mode 100644 modules/system/assets/js/lang/lang.sl.js create mode 100644 modules/system/assets/js/lang/lang.stub create mode 100644 modules/system/assets/js/lang/lang.sv.js create mode 100644 modules/system/assets/js/lang/lang.th.js create mode 100644 modules/system/assets/js/lang/lang.tr.js create mode 100644 modules/system/assets/js/lang/lang.uk.js create mode 100644 modules/system/assets/js/lang/lang.vn.js create mode 100644 modules/system/assets/js/lang/lang.zh-cn.js create mode 100644 modules/system/assets/js/lang/lang.zh-tw.js create mode 100644 modules/system/assets/js/mailbrandsettings/mailbrandsettings.js create mode 100644 modules/system/assets/js/snowboard/abstracts/PluginBase.js create mode 100644 modules/system/assets/js/snowboard/abstracts/Singleton.js create mode 100644 modules/system/assets/js/snowboard/ajax/Request.js create mode 100644 modules/system/assets/js/snowboard/ajax/handlers/AttributeRequest.js create mode 100644 modules/system/assets/js/snowboard/build/snowboard.base.debug.js create mode 100644 modules/system/assets/js/snowboard/build/snowboard.base.js create mode 100644 modules/system/assets/js/snowboard/build/snowboard.data-attr.js create mode 100644 modules/system/assets/js/snowboard/build/snowboard.extras.js create mode 100644 modules/system/assets/js/snowboard/build/snowboard.request.js create mode 100644 modules/system/assets/js/snowboard/build/snowboard.vendor.js create mode 100644 modules/system/assets/js/snowboard/extras/AssetLoader.js create mode 100644 modules/system/assets/js/snowboard/extras/AttachLoading.js create mode 100644 modules/system/assets/js/snowboard/extras/DataConfig.js create mode 100644 modules/system/assets/js/snowboard/extras/Flash.js create mode 100644 modules/system/assets/js/snowboard/extras/FlashListener.js create mode 100644 modules/system/assets/js/snowboard/extras/FormValidation.js create mode 100644 modules/system/assets/js/snowboard/extras/StripeLoader.js create mode 100644 modules/system/assets/js/snowboard/extras/StylesheetLoader.js create mode 100644 modules/system/assets/js/snowboard/extras/Transition.js create mode 100644 modules/system/assets/js/snowboard/main/InnerProxyHandler.js create mode 100644 modules/system/assets/js/snowboard/main/PluginLoader.js create mode 100644 modules/system/assets/js/snowboard/main/ProxyHandler.js create mode 100644 modules/system/assets/js/snowboard/main/Snowboard.js create mode 100644 modules/system/assets/js/snowboard/snowboard.backend.extras.js create mode 100644 modules/system/assets/js/snowboard/snowboard.base.debug.js create mode 100644 modules/system/assets/js/snowboard/snowboard.base.js create mode 100644 modules/system/assets/js/snowboard/snowboard.data-attr.js create mode 100644 modules/system/assets/js/snowboard/snowboard.extras.js create mode 100644 modules/system/assets/js/snowboard/snowboard.request.js create mode 100644 modules/system/assets/js/snowboard/utilities/Cookie.js create mode 100644 modules/system/assets/js/snowboard/utilities/JsonParser.js create mode 100644 modules/system/assets/js/snowboard/utilities/Sanitizer.js create mode 100644 modules/system/assets/js/snowboard/utilities/Url.js create mode 100644 modules/system/assets/js/updates/details.js create mode 100644 modules/system/assets/js/updates/install.js create mode 100644 modules/system/assets/js/updates/updates.js create mode 100644 modules/system/assets/less/framework.extras.less create mode 100644 modules/system/assets/less/settings/settings.less create mode 100644 modules/system/assets/less/snowboard.extras.less create mode 100644 modules/system/assets/less/styles.less create mode 100644 modules/system/assets/less/updates/details.less create mode 100644 modules/system/assets/less/updates/install.less create mode 100644 modules/system/assets/less/updates/updates.less create mode 100644 modules/system/assets/ui/README.md create mode 100644 modules/system/assets/ui/docs/autocomplete.md create mode 100644 modules/system/assets/ui/docs/breadcrumb.md create mode 100644 modules/system/assets/ui/docs/button.md create mode 100644 modules/system/assets/ui/docs/callout.md create mode 100644 modules/system/assets/ui/docs/chart.md create mode 100644 modules/system/assets/ui/docs/checkbox.md create mode 100644 modules/system/assets/ui/docs/datepicker.md create mode 100644 modules/system/assets/ui/docs/drag-scroll.md create mode 100644 modules/system/assets/ui/docs/drag-sort.md create mode 100644 modules/system/assets/ui/docs/drag-value.md create mode 100644 modules/system/assets/ui/docs/dropdown.md create mode 100644 modules/system/assets/ui/docs/filter.md create mode 100644 modules/system/assets/ui/docs/flag.md create mode 100644 modules/system/assets/ui/docs/flashmessage.md create mode 100644 modules/system/assets/ui/docs/form.md create mode 100644 modules/system/assets/ui/docs/foundation.md create mode 100644 modules/system/assets/ui/docs/icon.md create mode 100644 modules/system/assets/ui/docs/input-hotkey.md create mode 100644 modules/system/assets/ui/docs/input-monitor.md create mode 100644 modules/system/assets/ui/docs/input-preset.md create mode 100644 modules/system/assets/ui/docs/input-trigger.md create mode 100644 modules/system/assets/ui/docs/inspector.md create mode 100644 modules/system/assets/ui/docs/list.md create mode 100644 modules/system/assets/ui/docs/loader.md create mode 100644 modules/system/assets/ui/docs/pagination.md create mode 100644 modules/system/assets/ui/docs/popover.md create mode 100644 modules/system/assets/ui/docs/popup.md create mode 100644 modules/system/assets/ui/docs/progressbar.md create mode 100644 modules/system/assets/ui/docs/scoreboard.md create mode 100644 modules/system/assets/ui/docs/select.md create mode 100644 modules/system/assets/ui/docs/site.md create mode 100644 modules/system/assets/ui/docs/tab.md create mode 100644 modules/system/assets/ui/docs/toolbar.md create mode 100644 modules/system/assets/ui/docs/tooltip.md create mode 100644 modules/system/assets/ui/docs/utilities.md create mode 100644 modules/system/assets/ui/font/fa-brands-400.ttf create mode 100644 modules/system/assets/ui/font/fa-brands-400.woff2 create mode 100644 modules/system/assets/ui/font/fa-regular-400.ttf create mode 100644 modules/system/assets/ui/font/fa-regular-400.woff2 create mode 100644 modules/system/assets/ui/font/fa-solid-900.ttf create mode 100644 modules/system/assets/ui/font/fa-solid-900.woff2 create mode 100644 modules/system/assets/ui/font/fa-v4compatibility.ttf create mode 100644 modules/system/assets/ui/font/fa-v4compatibility.woff2 create mode 100644 modules/system/assets/ui/icons.css create mode 100644 modules/system/assets/ui/icons.less create mode 100644 modules/system/assets/ui/images/bitmap-icons.png create mode 100644 modules/system/assets/ui/images/loader-transparent.svg create mode 100644 modules/system/assets/ui/images/loader-white.svg create mode 100644 modules/system/assets/ui/images/loader.gif create mode 100644 modules/system/assets/ui/images/loader.svg create mode 100644 modules/system/assets/ui/images/primary-tab-shape.png create mode 100644 modules/system/assets/ui/js/autocomplete.js create mode 100644 modules/system/assets/ui/js/callout.js create mode 100644 modules/system/assets/ui/js/chart.bar.js create mode 100644 modules/system/assets/ui/js/chart.line.js create mode 100644 modules/system/assets/ui/js/chart.meter.js create mode 100644 modules/system/assets/ui/js/chart.pie.js create mode 100644 modules/system/assets/ui/js/chart.utils.js create mode 100644 modules/system/assets/ui/js/checkbox.balloon.js create mode 100644 modules/system/assets/ui/js/checkbox.js create mode 100644 modules/system/assets/ui/js/datepicker.js create mode 100644 modules/system/assets/ui/js/drag.scroll.js create mode 100644 modules/system/assets/ui/js/drag.sort.js create mode 100644 modules/system/assets/ui/js/drag.value.js create mode 100644 modules/system/assets/ui/js/dropdown.js create mode 100644 modules/system/assets/ui/js/filter.dates.js create mode 100644 modules/system/assets/ui/js/filter.js create mode 100644 modules/system/assets/ui/js/filter.numbers.js create mode 100644 modules/system/assets/ui/js/flashmessage.js create mode 100644 modules/system/assets/ui/js/foundation.baseclass.js create mode 100644 modules/system/assets/ui/js/foundation.controlutils.js create mode 100644 modules/system/assets/ui/js/foundation.element.js create mode 100644 modules/system/assets/ui/js/foundation.event.js create mode 100644 modules/system/assets/ui/js/input.hotkey.js create mode 100644 modules/system/assets/ui/js/input.monitor.js create mode 100644 modules/system/assets/ui/js/input.preset.js create mode 100644 modules/system/assets/ui/js/input.trigger.js create mode 100644 modules/system/assets/ui/js/inspector.datainteraction.js create mode 100644 modules/system/assets/ui/js/inspector.editor.autocomplete.js create mode 100644 modules/system/assets/ui/js/inspector.editor.base.js create mode 100644 modules/system/assets/ui/js/inspector.editor.checkbox.js create mode 100644 modules/system/assets/ui/js/inspector.editor.dictionary.js create mode 100644 modules/system/assets/ui/js/inspector.editor.dropdown.js create mode 100644 modules/system/assets/ui/js/inspector.editor.object.js create mode 100644 modules/system/assets/ui/js/inspector.editor.objectlist.js create mode 100644 modules/system/assets/ui/js/inspector.editor.popupbase.js create mode 100644 modules/system/assets/ui/js/inspector.editor.set.js create mode 100644 modules/system/assets/ui/js/inspector.editor.string.js create mode 100644 modules/system/assets/ui/js/inspector.editor.stringlist.js create mode 100644 modules/system/assets/ui/js/inspector.editor.stringlistautocomplete.js create mode 100644 modules/system/assets/ui/js/inspector.editor.text.js create mode 100644 modules/system/assets/ui/js/inspector.engine.js create mode 100644 modules/system/assets/ui/js/inspector.externalparametereditor.js create mode 100644 modules/system/assets/ui/js/inspector.groups.js create mode 100644 modules/system/assets/ui/js/inspector.helpers.js create mode 100644 modules/system/assets/ui/js/inspector.manager.js create mode 100644 modules/system/assets/ui/js/inspector.surface.js create mode 100644 modules/system/assets/ui/js/inspector.validationset.js create mode 100644 modules/system/assets/ui/js/inspector.validator.base.js create mode 100644 modules/system/assets/ui/js/inspector.validator.basenumber.js create mode 100644 modules/system/assets/ui/js/inspector.validator.float.js create mode 100644 modules/system/assets/ui/js/inspector.validator.integer.js create mode 100644 modules/system/assets/ui/js/inspector.validator.length.js create mode 100644 modules/system/assets/ui/js/inspector.validator.regex.js create mode 100644 modules/system/assets/ui/js/inspector.validator.required.js create mode 100644 modules/system/assets/ui/js/inspector.wrapper.base.js create mode 100644 modules/system/assets/ui/js/inspector.wrapper.container.js create mode 100644 modules/system/assets/ui/js/inspector.wrapper.popup.js create mode 100644 modules/system/assets/ui/js/list.rowlink.js create mode 100644 modules/system/assets/ui/js/list.sortable.js create mode 100644 modules/system/assets/ui/js/loader.base.js create mode 100644 modules/system/assets/ui/js/loader.cursor.js create mode 100644 modules/system/assets/ui/js/loader.stripe.js create mode 100644 modules/system/assets/ui/js/popover.js create mode 100644 modules/system/assets/ui/js/popup.js create mode 100644 modules/system/assets/ui/js/select.js create mode 100644 modules/system/assets/ui/js/tab.js create mode 100644 modules/system/assets/ui/js/toolbar.js create mode 100644 modules/system/assets/ui/js/tooltip.js create mode 100644 modules/system/assets/ui/less/autocomplete.less create mode 100644 modules/system/assets/ui/less/breadcrumb.less create mode 100644 modules/system/assets/ui/less/button.base.less create mode 100644 modules/system/assets/ui/less/button.groups.less create mode 100644 modules/system/assets/ui/less/button.less create mode 100644 modules/system/assets/ui/less/button.mixins.less create mode 100644 modules/system/assets/ui/less/button.variables.less create mode 100644 modules/system/assets/ui/less/callout.less create mode 100644 modules/system/assets/ui/less/chart.less create mode 100644 modules/system/assets/ui/less/checkbox.balloon.less create mode 100644 modules/system/assets/ui/less/checkbox.less create mode 100644 modules/system/assets/ui/less/datepicker.date.less create mode 100644 modules/system/assets/ui/less/datepicker.less create mode 100644 modules/system/assets/ui/less/datepicker.time.less create mode 100644 modules/system/assets/ui/less/datepicker.variables.less create mode 100644 modules/system/assets/ui/less/dropdown.base.less create mode 100644 modules/system/assets/ui/less/dropdown.less create mode 100644 modules/system/assets/ui/less/dropdown.variables.less create mode 100644 modules/system/assets/ui/less/filter.less create mode 100644 modules/system/assets/ui/less/flag.less create mode 100644 modules/system/assets/ui/less/flashmessage.less create mode 100644 modules/system/assets/ui/less/form.base.less create mode 100644 modules/system/assets/ui/less/form.groups.less create mode 100644 modules/system/assets/ui/less/form.less create mode 100644 modules/system/assets/ui/less/form.mixins.less create mode 100644 modules/system/assets/ui/less/form.variables.less create mode 100644 modules/system/assets/ui/less/global.less create mode 100644 modules/system/assets/ui/less/global.mixins.css3.less create mode 100644 modules/system/assets/ui/less/global.mixins.gradient.less create mode 100644 modules/system/assets/ui/less/global.mixins.triangle.less create mode 100644 modules/system/assets/ui/less/global.mixins.utility.less create mode 100644 modules/system/assets/ui/less/global.variables.less create mode 100644 modules/system/assets/ui/less/icon.close.less create mode 100644 modules/system/assets/ui/less/icon.icons.less create mode 100644 modules/system/assets/ui/less/icon.less create mode 100644 modules/system/assets/ui/less/icon.mixins.less create mode 100644 modules/system/assets/ui/less/icon.shims.less create mode 100644 modules/system/assets/ui/less/icon.variables.less create mode 100644 modules/system/assets/ui/less/inspector.less create mode 100644 modules/system/assets/ui/less/list.base.less create mode 100644 modules/system/assets/ui/less/list.less create mode 100644 modules/system/assets/ui/less/list.mixins.less create mode 100644 modules/system/assets/ui/less/list.rowlink.less create mode 100644 modules/system/assets/ui/less/list.variables.less create mode 100644 modules/system/assets/ui/less/loader.less create mode 100644 modules/system/assets/ui/less/pagination.less create mode 100644 modules/system/assets/ui/less/popover.less create mode 100644 modules/system/assets/ui/less/popup.base.less create mode 100644 modules/system/assets/ui/less/popup.less create mode 100644 modules/system/assets/ui/less/popup.variables.less create mode 100644 modules/system/assets/ui/less/progressbar.less create mode 100644 modules/system/assets/ui/less/scoreboard.less create mode 100644 modules/system/assets/ui/less/select.less create mode 100644 modules/system/assets/ui/less/select.mixins.less create mode 100644 modules/system/assets/ui/less/select.variables.less create mode 100644 modules/system/assets/ui/less/site.grid.less create mode 100644 modules/system/assets/ui/less/site.less create mode 100644 modules/system/assets/ui/less/site.mixins.less create mode 100644 modules/system/assets/ui/less/site.normalize.less create mode 100644 modules/system/assets/ui/less/site.print.less create mode 100644 modules/system/assets/ui/less/site.reset.less create mode 100644 modules/system/assets/ui/less/site.typography.less create mode 100644 modules/system/assets/ui/less/site.utility.less create mode 100644 modules/system/assets/ui/less/site.variables.less create mode 100644 modules/system/assets/ui/less/tab.base.less create mode 100644 modules/system/assets/ui/less/tab.less create mode 100644 modules/system/assets/ui/less/taglist.less create mode 100644 modules/system/assets/ui/less/toolbar.less create mode 100644 modules/system/assets/ui/less/toolbar.variables.less create mode 100644 modules/system/assets/ui/less/tooltip.less create mode 100644 modules/system/assets/ui/less/tooltip.variables.less create mode 100644 modules/system/assets/ui/less/utilities.less create mode 100644 modules/system/assets/ui/less/windex.variables.less create mode 100644 modules/system/assets/ui/storm-min.js create mode 100644 modules/system/assets/ui/storm.css create mode 100644 modules/system/assets/ui/storm.js create mode 100644 modules/system/assets/ui/storm.less create mode 100644 modules/system/assets/ui/vendor/bootstrap/js/dropdown.js create mode 100644 modules/system/assets/ui/vendor/bootstrap/js/modal.js create mode 100644 modules/system/assets/ui/vendor/bootstrap/js/tab.js create mode 100644 modules/system/assets/ui/vendor/bootstrap/js/tooltip.js create mode 100644 modules/system/assets/ui/vendor/bootstrap/js/transition.js create mode 100644 modules/system/assets/ui/vendor/clockpicker/css/jquery-clockpicker.css create mode 100644 modules/system/assets/ui/vendor/clockpicker/js/jquery-clockpicker.js create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ad.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ae.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/af.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ag.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ai.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/al.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/am.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ao.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/aq.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ar.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/as.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/at.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/au.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/aw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ax.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/az.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ba.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bb.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bd.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/be.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bh.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bi.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bj.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bl.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bo.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bq.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/br.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bs.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bt.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bv.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/by.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/bz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ca.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/cc.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/cd.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/cf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/cg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ch.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ci.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ck.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/cl.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/cm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/cn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/co.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/cr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/cu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/cv.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/cw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/cx.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/cy.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/cz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/de.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/dj.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/dk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/dm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/do.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/dz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ec.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ee.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/eg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/eh.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/er.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/es-ct.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/es.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/et.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/eu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/fi.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/fj.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/fk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/fm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/fo.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/fr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ga.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gb-eng.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gb-nir.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gb-sct.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gb-wls.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gb.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gd.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ge.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gh.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gi.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gl.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gp.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gq.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gs.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gt.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/gy.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/hk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/hm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/hn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/hr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ht.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/hu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/id.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ie.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/il.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/im.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/in.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/io.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/iq.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ir.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/is.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/it.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/je.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/jm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/jo.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/jp.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ke.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/kg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/kh.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ki.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/km.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/kn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/kp.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/kr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/kw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ky.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/kz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/la.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/lb.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/lc.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/li.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/lk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/lr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ls.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/lt.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/lu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/lv.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ly.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ma.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mc.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/md.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/me.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mh.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ml.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mo.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mp.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mq.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ms.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mt.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mv.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mx.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/my.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/mz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/na.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/nc.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ne.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/nf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ng.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ni.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/nl.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/no.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/np.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/nr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/nu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/nz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/om.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/pa.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/pe.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/pf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/pg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ph.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/pk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/pl.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/pm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/pn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/pr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ps.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/pt.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/pw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/py.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/qa.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/re.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ro.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/rs.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ru.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/rw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sa.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sb.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sc.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sd.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/se.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sh.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/si.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sj.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sl.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/so.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ss.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/st.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sv.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sx.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sy.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/sz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/tc.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/td.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/tf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/tg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/th.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/tj.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/tk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/tl.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/tm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/tn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/to.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/tr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/tt.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/tv.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/tw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/tz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ua.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ug.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/um.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/un.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/us.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/uy.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/uz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/va.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/vc.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ve.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/vg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/vi.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/vn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/vu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/wf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ws.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/ye.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/yt.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/za.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/zm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/1x1/zw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ad.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ae.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/af.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ag.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ai.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/al.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/am.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ao.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/aq.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ar.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/as.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/at.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/au.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/aw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ax.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/az.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ba.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bb.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bd.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/be.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bh.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bi.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bj.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bl.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bo.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bq.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/br.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bs.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bt.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bv.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/by.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/bz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ca.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/cc.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/cd.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/cf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/cg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ch.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ci.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ck.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/cl.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/cm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/cn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/co.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/cr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/cu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/cv.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/cw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/cx.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/cy.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/cz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/de.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/dj.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/dk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/dm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/do.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/dz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ec.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ee.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/eg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/eh.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/er.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/es-ct.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/es.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/et.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/eu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/fi.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/fj.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/fk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/fm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/fo.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/fr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ga.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gb-eng.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gb-nir.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gb-sct.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gb-wls.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gb.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gd.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ge.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gh.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gi.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gl.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gp.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gq.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gs.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gt.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/gy.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/hk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/hm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/hn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/hr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ht.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/hu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/id.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ie.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/il.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/im.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/in.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/io.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/iq.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ir.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/is.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/it.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/je.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/jm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/jo.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/jp.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ke.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/kg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/kh.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ki.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/km.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/kn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/kp.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/kr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/kw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ky.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/kz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/la.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/lb.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/lc.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/li.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/lk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/lr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ls.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/lt.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/lu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/lv.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ly.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ma.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mc.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/md.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/me.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mh.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ml.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mo.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mp.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mq.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ms.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mt.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mv.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mx.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/my.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/mz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/na.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/nc.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ne.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/nf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ng.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ni.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/nl.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/no.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/np.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/nr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/nu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/nz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/om.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/pa.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/pe.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/pf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/pg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ph.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/pk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/pl.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/pm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/pn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/pr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ps.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/pt.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/pw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/py.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/qa.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/re.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ro.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/rs.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ru.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/rw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sa.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sb.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sc.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sd.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/se.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sh.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/si.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sj.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sl.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/so.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ss.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/st.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sv.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sx.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sy.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/sz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/tc.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/td.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/tf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/tg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/th.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/tj.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/tk.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/tl.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/tm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/tn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/to.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/tr.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/tt.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/tv.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/tw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/tz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ua.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ug.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/um.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/un.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/us.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/uy.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/uz.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/va.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/vc.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ve.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/vg.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/vi.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/vn.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/vu.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/wf.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ws.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/ye.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/yt.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/za.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/zm.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/flags/4x3/zw.svg create mode 100644 modules/system/assets/ui/vendor/flag-icon/less/flag-icon-base.less create mode 100644 modules/system/assets/ui/vendor/flag-icon/less/flag-icon-list.less create mode 100644 modules/system/assets/ui/vendor/flag-icon/less/flag-icon-more.less create mode 100644 modules/system/assets/ui/vendor/flag-icon/less/flag-icon.less create mode 100644 modules/system/assets/ui/vendor/flag-icon/less/variables.less create mode 100644 modules/system/assets/ui/vendor/flot/LICENSE.txt create mode 100644 modules/system/assets/ui/vendor/flot/Makefile create mode 100644 modules/system/assets/ui/vendor/flot/excanvas.js create mode 100644 modules/system/assets/ui/vendor/flot/excanvas.min.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.colorhelpers.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.canvas.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.categories.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.crosshair.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.errorbars.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.fillbetween.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.image.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.navigate.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.pie.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.resize.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.selection.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.stack.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.symbol.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.threshold.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.time.js create mode 100644 modules/system/assets/ui/vendor/flot/jquery.flot.tooltip.js create mode 100644 modules/system/assets/ui/vendor/modernizr/modernizr.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/af.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ar-dz.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ar-kw.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ar-ly.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ar-ma.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ar-sa.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ar-tn.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ar.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/az.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/be.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/bg.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/bm.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/bn.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/bo.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/br.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/bs.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ca.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/cs.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/cv.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/cy.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/da.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/de-at.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/de-ch.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/de.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/dv.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/el.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/en-au.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/en-ca.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/en-gb.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/en-ie.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/en-il.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/en-nz.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/eo.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/es-do.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/es-us.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/es.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/et.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/eu.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/fa.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/fi.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/fo.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/fr-ca.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/fr-ch.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/fr.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/fy.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/gd.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/gl.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/gom-latn.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/gu.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/he.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/hi.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/hr.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/hu.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/hy-am.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/id.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/is.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/it.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ja.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/jv.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ka.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/kk.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/km.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/kn.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ko.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ky.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/lb.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/lo.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/lt.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/lv.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/me.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/mi.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/mk.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ml.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/mn.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/mr.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ms-my.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ms.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/mt.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/my.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/nb.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ne.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/nl-be.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/nl.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/nn.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/pa-in.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/pl.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/pt-br.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/pt.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ro.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ru.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/sd.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/se.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/si.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/sk.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/sl.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/sq.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/sr-cyrl.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/sr.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ss.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/sv.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/sw.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ta.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/te.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/tet.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/tg.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/th.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/tl-ph.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/tlh.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/tr.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/tzl.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/tzm-latn.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/tzm.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ug-cn.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/uk.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/ur.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/uz-latn.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/uz.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/vi.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/x-pseudo.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/yo.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/zh-cn.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/zh-hk.js create mode 100644 modules/system/assets/ui/vendor/moment/locale/zh-tw.js create mode 100644 modules/system/assets/ui/vendor/moment/moment-timezone-with-data.js create mode 100644 modules/system/assets/ui/vendor/moment/moment.js create mode 100644 modules/system/assets/ui/vendor/mousewheel/mousewheel.js create mode 100644 modules/system/assets/ui/vendor/mustache/mustache.js create mode 100644 modules/system/assets/ui/vendor/pikaday/README.md create mode 100644 modules/system/assets/ui/vendor/pikaday/css/pikaday.css create mode 100644 modules/system/assets/ui/vendor/pikaday/js/pikaday.jquery.js create mode 100644 modules/system/assets/ui/vendor/pikaday/js/pikaday.js create mode 100644 modules/system/assets/ui/vendor/raphael/raphael.js create mode 100644 modules/system/assets/ui/vendor/select2/WINTER-README.md create mode 100644 modules/system/assets/ui/vendor/select2/css/select2.css create mode 100644 modules/system/assets/ui/vendor/select2/css/select2.less create mode 100644 modules/system/assets/ui/vendor/select2/js/i18n/ar.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/az.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/bg.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/ca.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/cs.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/da.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/de.js create mode 100644 modules/system/assets/ui/vendor/select2/js/i18n/el.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/en.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/es.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/et.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/eu.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/fa.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/fi.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/fr.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/gl.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/he.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/hi.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/hr.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/hu.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/id.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/is.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/it.js create mode 100644 modules/system/assets/ui/vendor/select2/js/i18n/ja.js create mode 100644 modules/system/assets/ui/vendor/select2/js/i18n/km.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/ko.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/lt.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/lv.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/mk.js create mode 100644 modules/system/assets/ui/vendor/select2/js/i18n/ms.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/nb.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/nl.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/pl.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/pt-BR.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/pt.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/ro.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/ru.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/sk.js create mode 100644 modules/system/assets/ui/vendor/select2/js/i18n/sr-Cyrl.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/sr.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/sv.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/th.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/tr.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/uk.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/vi.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/zh-CN.js create mode 100755 modules/system/assets/ui/vendor/select2/js/i18n/zh-TW.js create mode 100755 modules/system/assets/ui/vendor/select2/js/select2.full.js create mode 100644 modules/system/assets/ui/vendor/sortable/jquery-sortable.js create mode 100644 modules/system/assets/vendor/prettify/lang-apollo.js create mode 100644 modules/system/assets/vendor/prettify/lang-basic.js create mode 100644 modules/system/assets/vendor/prettify/lang-clj.js create mode 100644 modules/system/assets/vendor/prettify/lang-css.js create mode 100644 modules/system/assets/vendor/prettify/lang-dart.js create mode 100644 modules/system/assets/vendor/prettify/lang-erlang.js create mode 100644 modules/system/assets/vendor/prettify/lang-go.js create mode 100644 modules/system/assets/vendor/prettify/lang-hs.js create mode 100644 modules/system/assets/vendor/prettify/lang-lisp.js create mode 100644 modules/system/assets/vendor/prettify/lang-llvm.js create mode 100644 modules/system/assets/vendor/prettify/lang-lua.js create mode 100644 modules/system/assets/vendor/prettify/lang-matlab.js create mode 100644 modules/system/assets/vendor/prettify/lang-ml.js create mode 100644 modules/system/assets/vendor/prettify/lang-mumps.js create mode 100644 modules/system/assets/vendor/prettify/lang-n.js create mode 100644 modules/system/assets/vendor/prettify/lang-pascal.js create mode 100644 modules/system/assets/vendor/prettify/lang-proto.js create mode 100644 modules/system/assets/vendor/prettify/lang-r.js create mode 100644 modules/system/assets/vendor/prettify/lang-rd.js create mode 100644 modules/system/assets/vendor/prettify/lang-scala.js create mode 100644 modules/system/assets/vendor/prettify/lang-sql.js create mode 100644 modules/system/assets/vendor/prettify/lang-tcl.js create mode 100644 modules/system/assets/vendor/prettify/lang-tex.js create mode 100644 modules/system/assets/vendor/prettify/lang-vb.js create mode 100644 modules/system/assets/vendor/prettify/lang-vhdl.js create mode 100644 modules/system/assets/vendor/prettify/lang-wiki.js create mode 100644 modules/system/assets/vendor/prettify/lang-xq.js create mode 100644 modules/system/assets/vendor/prettify/lang-yaml.js create mode 100644 modules/system/assets/vendor/prettify/prettify.css create mode 100644 modules/system/assets/vendor/prettify/prettify.js create mode 100644 modules/system/assets/vendor/prettify/run_prettify.js create mode 100644 modules/system/assets/vendor/prettify/theme-desert.css create mode 100644 modules/system/assets/vendor/syntaxhighlighter/LGPL-LICENSE create mode 100644 modules/system/assets/vendor/syntaxhighlighter/MIT-LICENSE create mode 100644 modules/system/assets/vendor/syntaxhighlighter/scripts/shAutoloader.js create mode 100644 modules/system/assets/vendor/syntaxhighlighter/scripts/shBrushPhp.js create mode 100644 modules/system/assets/vendor/syntaxhighlighter/scripts/shBrushPlain.js create mode 100644 modules/system/assets/vendor/syntaxhighlighter/scripts/shBrushXml.js create mode 100644 modules/system/assets/vendor/syntaxhighlighter/scripts/shCore.js create mode 100644 modules/system/assets/vendor/syntaxhighlighter/styles/shCore.css create mode 100644 modules/system/assets/vendor/syntaxhighlighter/styles/shCoreDefault.css create mode 100644 modules/system/behaviors/SettingsModel.php create mode 100644 modules/system/classes/CombineAssets.php create mode 100644 modules/system/classes/ComposerManager.php create mode 100644 modules/system/classes/ErrorHandler.php create mode 100644 modules/system/classes/FileManifest.php create mode 100644 modules/system/classes/ImageResizer.php create mode 100644 modules/system/classes/MailManager.php create mode 100644 modules/system/classes/MarkupManager.php create mode 100644 modules/system/classes/MediaLibrary.php create mode 100644 modules/system/classes/MediaLibraryItem.php create mode 100644 modules/system/classes/ModelBehavior.php create mode 100644 modules/system/classes/PluginBase.php create mode 100644 modules/system/classes/PluginManager.php create mode 100644 modules/system/classes/SettingsManager.php create mode 100644 modules/system/classes/SourceManifest.php create mode 100644 modules/system/classes/SystemController.php create mode 100644 modules/system/classes/UpdateManager.php create mode 100644 modules/system/classes/VersionManager.php create mode 100644 modules/system/classes/VersionYamlProcessor.php create mode 100644 modules/system/classes/asset/BundleManager.php create mode 100644 modules/system/classes/asset/PackageJson.php create mode 100644 modules/system/classes/asset/PackageManager.php create mode 100644 modules/system/classes/asset/Vite.php create mode 100644 modules/system/composer.json create mode 100644 modules/system/console/BaseScaffoldCommand.php create mode 100644 modules/system/console/CreateCommand.php create mode 100644 modules/system/console/CreateFactory.php create mode 100644 modules/system/console/CreateJob.php create mode 100644 modules/system/console/CreateMigration.php create mode 100644 modules/system/console/CreateModel.php create mode 100644 modules/system/console/CreatePlugin.php create mode 100644 modules/system/console/CreateSettings.php create mode 100644 modules/system/console/CreateTest.php create mode 100644 modules/system/console/PluginDisable.php create mode 100644 modules/system/console/PluginEnable.php create mode 100644 modules/system/console/PluginInstall.php create mode 100644 modules/system/console/PluginList.php create mode 100644 modules/system/console/PluginRefresh.php create mode 100644 modules/system/console/PluginRemove.php create mode 100644 modules/system/console/PluginRollback.php create mode 100644 modules/system/console/WinterDown.php create mode 100644 modules/system/console/WinterEnv.php create mode 100644 modules/system/console/WinterFresh.php create mode 100644 modules/system/console/WinterInstall.php create mode 100644 modules/system/console/WinterManifest.php create mode 100644 modules/system/console/WinterMirror.php create mode 100644 modules/system/console/WinterTest.php create mode 100644 modules/system/console/WinterUp.php create mode 100644 modules/system/console/WinterUpdate.php create mode 100644 modules/system/console/WinterUtil.php create mode 100644 modules/system/console/WinterVersion.php create mode 100644 modules/system/console/asset/AssetCompile.php create mode 100644 modules/system/console/asset/AssetCreate.php create mode 100644 modules/system/console/asset/AssetInstall.php create mode 100644 modules/system/console/asset/AssetList.php create mode 100644 modules/system/console/asset/fixtures/config/css/default.css.fixture create mode 100644 modules/system/console/asset/fixtures/config/css/tailwind.css.fixture create mode 100644 modules/system/console/asset/fixtures/config/js/default.js.fixture create mode 100644 modules/system/console/asset/fixtures/config/js/vue.js.fixture create mode 100644 modules/system/console/asset/fixtures/config/mix/winter.mix.js.fixture create mode 100644 modules/system/console/asset/fixtures/config/react/App.jsx.fixture create mode 100644 modules/system/console/asset/fixtures/config/react/package.js.fixture create mode 100644 modules/system/console/asset/fixtures/config/react/package.jsx.fixture create mode 100644 modules/system/console/asset/fixtures/config/tailwind/postcss.config.js.fixture create mode 100644 modules/system/console/asset/fixtures/config/tailwind/tailwind.plugin.config.js.fixture create mode 100644 modules/system/console/asset/fixtures/config/tailwind/tailwind.theme.config.js.fixture create mode 100644 modules/system/console/asset/fixtures/config/vite/vite.config.mjs.fixture create mode 100644 modules/system/console/asset/fixtures/mix.webpack.js.fixture create mode 100644 modules/system/console/asset/fixtures/winter.mix.js.fixture create mode 100644 modules/system/console/asset/mix/MixCompile.php create mode 100644 modules/system/console/asset/mix/MixCreate.php create mode 100644 modules/system/console/asset/mix/MixInstall.php create mode 100644 modules/system/console/asset/mix/MixList.php create mode 100644 modules/system/console/asset/mix/MixWatch.php create mode 100644 modules/system/console/asset/npm/NpmCommand.php create mode 100644 modules/system/console/asset/npm/NpmInstall.php create mode 100644 modules/system/console/asset/npm/NpmRun.php create mode 100644 modules/system/console/asset/npm/NpmUpdate.php create mode 100644 modules/system/console/asset/npm/NpmVersion.php create mode 100644 modules/system/console/asset/vite/ViteCompile.php create mode 100644 modules/system/console/asset/vite/ViteCreate.php create mode 100644 modules/system/console/asset/vite/ViteInstall.php create mode 100644 modules/system/console/asset/vite/ViteList.php create mode 100644 modules/system/console/asset/vite/ViteWatch.php create mode 100644 modules/system/console/scaffold/command/command.stub create mode 100644 modules/system/console/scaffold/factory/factory.stub create mode 100644 modules/system/console/scaffold/job/job.batched.stub create mode 100644 modules/system/console/scaffold/job/job.queued.stub create mode 100644 modules/system/console/scaffold/job/job.stub create mode 100644 modules/system/console/scaffold/migration/migration.create.stub create mode 100644 modules/system/console/scaffold/migration/migration.stub create mode 100644 modules/system/console/scaffold/migration/migration.update.stub create mode 100644 modules/system/console/scaffold/model/columns.stub create mode 100644 modules/system/console/scaffold/model/create_table.stub create mode 100644 modules/system/console/scaffold/model/fields.stub create mode 100644 modules/system/console/scaffold/model/model.stub create mode 100644 modules/system/console/scaffold/plugin/plugin.stub create mode 100644 modules/system/console/scaffold/plugin/version.stub create mode 100644 modules/system/console/scaffold/settings/fields.stub create mode 100644 modules/system/console/scaffold/settings/model.stub create mode 100644 modules/system/console/scaffold/test/pest.class.stub create mode 100644 modules/system/console/scaffold/test/pest.init.stub create mode 100644 modules/system/console/scaffold/test/pest.stub create mode 100644 modules/system/console/scaffold/test/pest.unit.stub create mode 100644 modules/system/console/scaffold/test/phpunit.stub create mode 100644 modules/system/console/scaffold/test/test.class.stub create mode 100644 modules/system/console/scaffold/test/test.plugin.stub create mode 100644 modules/system/console/scaffold/test/test.stub create mode 100644 modules/system/console/scaffold/test/test.unit.stub create mode 100644 modules/system/console/traits/HasPluginArgument.php create mode 100644 modules/system/controllers/EventLogs.php create mode 100644 modules/system/controllers/MailBrandSettings.php create mode 100644 modules/system/controllers/MailLayouts.php create mode 100644 modules/system/controllers/MailPartials.php create mode 100644 modules/system/controllers/MailTemplates.php create mode 100644 modules/system/controllers/RequestLogs.php create mode 100644 modules/system/controllers/Settings.php create mode 100644 modules/system/controllers/Updates.php create mode 100644 modules/system/controllers/eventlogs/_field_details.php create mode 100644 modules/system/controllers/eventlogs/_field_message.php create mode 100644 modules/system/controllers/eventlogs/_hint.php create mode 100644 modules/system/controllers/eventlogs/_list_toolbar.php create mode 100644 modules/system/controllers/eventlogs/_message_column.php create mode 100644 modules/system/controllers/eventlogs/config_filter.yaml create mode 100644 modules/system/controllers/eventlogs/config_form.yaml create mode 100644 modules/system/controllers/eventlogs/config_list.yaml create mode 100644 modules/system/controllers/eventlogs/index.php create mode 100644 modules/system/controllers/eventlogs/preview.php create mode 100644 modules/system/controllers/mailbrandsettings/_field_mail_preview.php create mode 100644 modules/system/controllers/mailbrandsettings/config_form.yaml create mode 100644 modules/system/controllers/mailbrandsettings/index.php create mode 100644 modules/system/controllers/maillayouts/config_form.yaml create mode 100644 modules/system/controllers/maillayouts/update.php create mode 100644 modules/system/controllers/mailpartials/config_form.yaml create mode 100644 modules/system/controllers/mailpartials/update.php create mode 100644 modules/system/controllers/mailtemplates/_list_layouts_toolbar.php create mode 100644 modules/system/controllers/mailtemplates/_list_partials_toolbar.php create mode 100644 modules/system/controllers/mailtemplates/_list_templates_toolbar.php create mode 100644 modules/system/controllers/mailtemplates/config_form.yaml create mode 100644 modules/system/controllers/mailtemplates/config_layouts_list.yaml create mode 100644 modules/system/controllers/mailtemplates/config_partials_list.yaml create mode 100644 modules/system/controllers/mailtemplates/config_templates_list.yaml create mode 100644 modules/system/controllers/mailtemplates/index.php create mode 100644 modules/system/controllers/mailtemplates/update.php create mode 100644 modules/system/controllers/requestlogs/_hint.php create mode 100644 modules/system/controllers/requestlogs/_list_toolbar.php create mode 100644 modules/system/controllers/requestlogs/_referer_field.php create mode 100644 modules/system/controllers/requestlogs/config_form.yaml create mode 100644 modules/system/controllers/requestlogs/config_list.yaml create mode 100644 modules/system/controllers/requestlogs/index.php create mode 100644 modules/system/controllers/requestlogs/preview.php create mode 100644 modules/system/controllers/settings/index.php create mode 100644 modules/system/controllers/settings/mysettings.php create mode 100644 modules/system/controllers/settings/update.php create mode 100644 modules/system/controllers/updates/_changelog_list.php create mode 100644 modules/system/controllers/updates/_column_code.php create mode 100644 modules/system/controllers/updates/_execute.php create mode 100644 modules/system/controllers/updates/_install_plugins.php create mode 100644 modules/system/controllers/updates/_install_themes.php create mode 100644 modules/system/controllers/updates/_is_enabled.php create mode 100644 modules/system/controllers/updates/_is_unfrozen.php create mode 100644 modules/system/controllers/updates/_list_manage_toolbar.php create mode 100644 modules/system/controllers/updates/_list_toolbar.php create mode 100644 modules/system/controllers/updates/_plugin_form.php create mode 100644 modules/system/controllers/updates/_project_form.php create mode 100644 modules/system/controllers/updates/_theme_form.php create mode 100644 modules/system/controllers/updates/_update_form.php create mode 100644 modules/system/controllers/updates/_update_list.php create mode 100644 modules/system/controllers/updates/config_list.yaml create mode 100644 modules/system/controllers/updates/config_manage_list.yaml create mode 100644 modules/system/controllers/updates/details.php create mode 100644 modules/system/controllers/updates/index.php create mode 100644 modules/system/controllers/updates/install.php create mode 100644 modules/system/controllers/updates/manage.php create mode 100644 modules/system/database/migrations/2013_10_01_000001_Db_Deferred_Bindings.php create mode 100644 modules/system/database/migrations/2013_10_01_000002_Db_System_Files.php create mode 100644 modules/system/database/migrations/2013_10_01_000003_Db_System_Plugin_Versions.php create mode 100644 modules/system/database/migrations/2013_10_01_000004_Db_System_Plugin_History.php create mode 100644 modules/system/database/migrations/2013_10_01_000005_Db_System_Settings.php create mode 100644 modules/system/database/migrations/2013_10_01_000006_Db_System_Parameters.php create mode 100644 modules/system/database/migrations/2013_10_01_000007_Db_System_Add_Disabled_Flag.php create mode 100644 modules/system/database/migrations/2013_10_01_000008_Db_System_Mail_Templates.php create mode 100644 modules/system/database/migrations/2013_10_01_000009_Db_System_Mail_Layouts.php create mode 100644 modules/system/database/migrations/2014_10_01_000010_Db_Jobs.php create mode 100644 modules/system/database/migrations/2014_10_01_000011_Db_System_Event_Logs.php create mode 100644 modules/system/database/migrations/2014_10_01_000012_Db_System_Request_Logs.php create mode 100644 modules/system/database/migrations/2014_10_01_000013_Db_System_Sessions.php create mode 100644 modules/system/database/migrations/2015_10_01_000014_Db_System_Mail_Layout_Rename.php create mode 100644 modules/system/database/migrations/2015_10_01_000015_Db_System_Add_Frozen_Flag.php create mode 100644 modules/system/database/migrations/2015_10_01_000016_Db_Cache.php create mode 100644 modules/system/database/migrations/2015_10_01_000017_Db_System_Revisions.php create mode 100644 modules/system/database/migrations/2015_10_01_000018_Db_FailedJobs.php create mode 100644 modules/system/database/migrations/2016_10_01_000019_Db_System_Plugin_History_Detail_Text.php create mode 100644 modules/system/database/migrations/2016_10_01_000020_Db_System_Timestamp_Fix.php create mode 100644 modules/system/database/migrations/2017_08_04_121309_Db_Deferred_Bindings_Add_Index_Session.php create mode 100644 modules/system/database/migrations/2017_10_01_000021_Db_System_Sessions_Update.php create mode 100644 modules/system/database/migrations/2017_10_01_000022_Db_Jobs_FailedJobs_Update.php create mode 100644 modules/system/database/migrations/2017_10_01_000023_Db_System_Mail_Partials.php create mode 100644 modules/system/database/migrations/2017_10_23_000024_Db_System_Mail_Layouts_Add_Options_Field.php create mode 100644 modules/system/database/migrations/2021_10_01_000025_Db_Add_Pivot_Data_To_Deferred_Bindings.php create mode 100644 modules/system/database/migrations/2022_08_06_000026_Db_System_Add_App_Birthday_Date.php create mode 100644 modules/system/database/migrations/2022_10_14_000027_Db_Jobs_FailedJobs_Update.php create mode 100644 modules/system/database/migrations/2023_09_24_000028_Db_System_Sessions_Indexes.php create mode 100644 modules/system/database/migrations/2023_10_20_000029_Db_Jobs_Batches.php create mode 100644 modules/system/database/migrations/2025_04_10_000031_Db_Add_System_Files_Metadata.php create mode 100644 modules/system/database/migrations/2026_08_09_000032_Db_System_Request_Logs_Indexes.php create mode 100644 modules/system/database/seeds/DatabaseSeeder.php create mode 100644 modules/system/database/seeds/SeedSetupMailLayouts.php create mode 100644 modules/system/helpers/Cache.php create mode 100644 modules/system/helpers/DateTime.php create mode 100644 modules/system/helpers/View.php create mode 100644 modules/system/lang/ar/client.php create mode 100644 modules/system/lang/ar/lang.php create mode 100644 modules/system/lang/ar/validation.php create mode 100644 modules/system/lang/be/client.php create mode 100644 modules/system/lang/be/lang.php create mode 100644 modules/system/lang/be/validation.php create mode 100644 modules/system/lang/bg/client.php create mode 100644 modules/system/lang/bg/lang.php create mode 100644 modules/system/lang/bg/validation.php create mode 100644 modules/system/lang/ca/client.php create mode 100644 modules/system/lang/ca/lang.php create mode 100644 modules/system/lang/ca/validation.php create mode 100644 modules/system/lang/cs/client.php create mode 100644 modules/system/lang/cs/lang.php create mode 100644 modules/system/lang/cs/validation.php create mode 100644 modules/system/lang/da/client.php create mode 100644 modules/system/lang/da/lang.php create mode 100644 modules/system/lang/da/validation.php create mode 100644 modules/system/lang/de/client.php create mode 100644 modules/system/lang/de/lang.php create mode 100644 modules/system/lang/de/validation.php create mode 100644 modules/system/lang/el/client.php create mode 100644 modules/system/lang/el/lang.php create mode 100644 modules/system/lang/el/validation.php create mode 100644 modules/system/lang/en/client.php create mode 100644 modules/system/lang/en/lang.php create mode 100644 modules/system/lang/en/validation.php create mode 100644 modules/system/lang/es-ar/lang.php create mode 100644 modules/system/lang/es-ar/validation.php create mode 100644 modules/system/lang/es/client.php create mode 100644 modules/system/lang/es/lang.php create mode 100644 modules/system/lang/es/validation.php create mode 100644 modules/system/lang/et/client.php create mode 100644 modules/system/lang/et/lang.php create mode 100644 modules/system/lang/et/validation.php create mode 100644 modules/system/lang/fa/client.php create mode 100644 modules/system/lang/fa/lang.php create mode 100644 modules/system/lang/fa/validation.php create mode 100644 modules/system/lang/fi/client.php create mode 100644 modules/system/lang/fi/lang.php create mode 100755 modules/system/lang/fi/validation.php create mode 100644 modules/system/lang/fr/client.php create mode 100644 modules/system/lang/fr/lang.php create mode 100644 modules/system/lang/fr/validation.php create mode 100644 modules/system/lang/hu/client.php create mode 100644 modules/system/lang/hu/lang.php create mode 100644 modules/system/lang/hu/validation.php create mode 100644 modules/system/lang/id/lang.php create mode 100644 modules/system/lang/id/validation.php create mode 100644 modules/system/lang/it/client.php create mode 100644 modules/system/lang/it/lang.php create mode 100644 modules/system/lang/it/validation.php create mode 100644 modules/system/lang/ja/lang.php create mode 100644 modules/system/lang/ja/validation.php create mode 100644 modules/system/lang/kr/client.php create mode 100644 modules/system/lang/kr/lang.php create mode 100644 modules/system/lang/kr/validation.php create mode 100644 modules/system/lang/lt/client.php create mode 100644 modules/system/lang/lt/lang.php create mode 100644 modules/system/lang/lt/validation.php create mode 100644 modules/system/lang/lv/client.php create mode 100644 modules/system/lang/lv/lang.php create mode 100644 modules/system/lang/lv/validation.php create mode 100644 modules/system/lang/nb-no/client.php create mode 100644 modules/system/lang/nb-no/lang.php create mode 100644 modules/system/lang/nb-no/validation.php create mode 100644 modules/system/lang/nl/client.php create mode 100644 modules/system/lang/nl/lang.php create mode 100644 modules/system/lang/nl/validation.php create mode 100644 modules/system/lang/pl/client.php create mode 100644 modules/system/lang/pl/lang.php create mode 100644 modules/system/lang/pl/validation.php create mode 100644 modules/system/lang/pt-br/client.php create mode 100644 modules/system/lang/pt-br/lang.php create mode 100644 modules/system/lang/pt-br/validation.php create mode 100644 modules/system/lang/pt-pt/client.php create mode 100644 modules/system/lang/pt-pt/lang.php create mode 100644 modules/system/lang/pt-pt/validation.php create mode 100644 modules/system/lang/ro/client.php create mode 100644 modules/system/lang/ro/lang.php create mode 100644 modules/system/lang/ro/validation.php create mode 100644 modules/system/lang/rs/client.php create mode 100644 modules/system/lang/rs/lang.php create mode 100644 modules/system/lang/rs/validation.php create mode 100644 modules/system/lang/ru/client.php create mode 100644 modules/system/lang/ru/lang.php create mode 100644 modules/system/lang/ru/validation.php create mode 100644 modules/system/lang/sk/client.php create mode 100644 modules/system/lang/sk/lang.php create mode 100644 modules/system/lang/sk/validation.php create mode 100644 modules/system/lang/sl/client.php create mode 100644 modules/system/lang/sl/lang.php create mode 100644 modules/system/lang/sl/validation.php create mode 100644 modules/system/lang/sv/client.php create mode 100644 modules/system/lang/sv/lang.php create mode 100644 modules/system/lang/sv/validation.php create mode 100644 modules/system/lang/th/client.php create mode 100644 modules/system/lang/th/lang.php create mode 100644 modules/system/lang/tr/client.php create mode 100644 modules/system/lang/tr/lang.php create mode 100644 modules/system/lang/tr/validation.php create mode 100644 modules/system/lang/uk/client.php create mode 100644 modules/system/lang/uk/lang.php create mode 100644 modules/system/lang/uk/validation.php create mode 100644 modules/system/lang/vn/client.php create mode 100644 modules/system/lang/vn/lang.php create mode 100644 modules/system/lang/vn/validation.php create mode 100644 modules/system/lang/zh-cn/client.php create mode 100644 modules/system/lang/zh-cn/lang.php create mode 100644 modules/system/lang/zh-cn/validation.php create mode 100644 modules/system/lang/zh-tw/client.php create mode 100644 modules/system/lang/zh-tw/lang.php create mode 100644 modules/system/lang/zh-tw/validation.php create mode 100644 modules/system/models/EventLog.php create mode 100644 modules/system/models/File.php create mode 100644 modules/system/models/LogSetting.php create mode 100644 modules/system/models/MailBrandSetting.php create mode 100644 modules/system/models/MailLayout.php create mode 100644 modules/system/models/MailPartial.php create mode 100644 modules/system/models/MailSetting.php create mode 100644 modules/system/models/MailTemplate.php create mode 100644 modules/system/models/Parameter.php create mode 100644 modules/system/models/PluginVersion.php create mode 100644 modules/system/models/RequestLog.php create mode 100644 modules/system/models/Revision.php create mode 100644 modules/system/models/eventlog/columns.yaml create mode 100644 modules/system/models/eventlog/fields.yaml create mode 100644 modules/system/models/file/fields.yaml create mode 100644 modules/system/models/logsetting/fields.yaml create mode 100644 modules/system/models/mailbrandsetting/custom.less create mode 100644 modules/system/models/mailbrandsetting/fields.yaml create mode 100644 modules/system/models/mailbrandsetting/sample_template.php create mode 100644 modules/system/models/maillayout/columns.yaml create mode 100644 modules/system/models/maillayout/fields.yaml create mode 100644 modules/system/models/mailpartial/columns.yaml create mode 100644 modules/system/models/mailpartial/fields.yaml create mode 100644 modules/system/models/mailsetting/_drivers_hint.php create mode 100644 modules/system/models/mailsetting/_send_test_button.php create mode 100644 modules/system/models/mailsetting/fields.yaml create mode 100644 modules/system/models/mailtemplate/columns.yaml create mode 100644 modules/system/models/mailtemplate/fields.yaml create mode 100644 modules/system/models/pluginversion/columns.yaml create mode 100644 modules/system/models/pluginversion/columns_manage.yaml create mode 100644 modules/system/models/requestlog/columns.yaml create mode 100644 modules/system/models/requestlog/fields.yaml create mode 100644 modules/system/package.json create mode 100644 modules/system/partials/_settings_menu.php create mode 100644 modules/system/partials/_settings_menu_items.php create mode 100644 modules/system/partials/_settings_menu_toolbar.php create mode 100644 modules/system/partials/_system_sidebar.php create mode 100644 modules/system/phpunit.xml create mode 100644 modules/system/providers.php create mode 100644 modules/system/reportwidgets/Status.php create mode 100644 modules/system/reportwidgets/status/partials/_warnings_form.php create mode 100644 modules/system/reportwidgets/status/partials/_widget.php create mode 100644 modules/system/routes.php create mode 100644 modules/system/tests/AliasesTest.php create mode 100644 modules/system/tests/README.md create mode 100644 modules/system/tests/ServiceProviderTest.php create mode 100644 modules/system/tests/bootstrap/PluginManagerTestCase.php create mode 100644 modules/system/tests/bootstrap/PluginTestCase.php create mode 100644 modules/system/tests/bootstrap/TestCase.php create mode 100644 modules/system/tests/bootstrap/app.php create mode 100644 modules/system/tests/classes/CombineAssetsTest.php create mode 100644 modules/system/tests/classes/CoreLangTest.php create mode 100644 modules/system/tests/classes/FileManifestTest.php create mode 100644 modules/system/tests/classes/ImageResizerTest.php create mode 100644 modules/system/tests/classes/MarkupManagerTest.php create mode 100644 modules/system/tests/classes/MediaLibraryTest.php create mode 100644 modules/system/tests/classes/PluginBaseTest.php create mode 100644 modules/system/tests/classes/PluginManagerTest.php create mode 100644 modules/system/tests/classes/SourceManifestTest.php create mode 100644 modules/system/tests/classes/VersionManagerTest.php create mode 100644 modules/system/tests/classes/asset/BundleManagerTest.php create mode 100644 modules/system/tests/classes/asset/PackageJsonTest.php create mode 100644 modules/system/tests/console/CreateCommandTest.php create mode 100644 modules/system/tests/console/CreateMigrationTest.php create mode 100644 modules/system/tests/console/WinterEnvTest.php create mode 100644 modules/system/tests/console/WinterUtilTest.php create mode 100644 modules/system/tests/console/asset/NpmTestTrait.php create mode 100644 modules/system/tests/console/asset/mix/MixCompileTest.php create mode 100644 modules/system/tests/console/asset/mix/MixCreateTest.php create mode 100644 modules/system/tests/console/asset/mix/MixInstallTest.php create mode 100644 modules/system/tests/console/asset/npm/NpmInstallTest.php create mode 100644 modules/system/tests/console/asset/npm/NpmRunTest.php create mode 100644 modules/system/tests/console/asset/npm/NpmUpdateTest.php create mode 100644 modules/system/tests/console/asset/vite/ViteCompileTest.php create mode 100644 modules/system/tests/console/asset/vite/ViteCreateTest.php create mode 100644 modules/system/tests/console/asset/vite/ViteInstallTest.php create mode 100644 modules/system/tests/fixtures/config/app.php create mode 100644 modules/system/tests/fixtures/config/cache.php create mode 100644 modules/system/tests/fixtures/config/cms.php create mode 100644 modules/system/tests/fixtures/config/database.php create mode 100644 modules/system/tests/fixtures/config/mail.php create mode 100644 modules/system/tests/fixtures/config/queue.php create mode 100644 modules/system/tests/fixtures/config/session.php create mode 100644 modules/system/tests/fixtures/manifest/1_0_0/modules/test/file1.php create mode 100644 modules/system/tests/fixtures/manifest/1_0_1/modules/test/file1.php create mode 100644 modules/system/tests/fixtures/manifest/1_0_1/modules/test/file2.php create mode 100644 modules/system/tests/fixtures/manifest/1_0_1/modules/test2/file1.php create mode 100644 modules/system/tests/fixtures/manifest/1_0_2/modules/test/file2.php create mode 100644 modules/system/tests/fixtures/manifest/1_0_2/modules/test/file3.php create mode 100644 modules/system/tests/fixtures/manifest/1_0_2/modules/test2/file1.php create mode 100644 modules/system/tests/fixtures/manifest/1_0_3/modules/test/file2.php create mode 100644 modules/system/tests/fixtures/manifest/1_0_3/modules/test2/file1.php create mode 100644 modules/system/tests/fixtures/manifest/1_1_0/modules/test/file3.php create mode 100644 modules/system/tests/fixtures/manifest/1_1_0/modules/test/file4.php create mode 100644 modules/system/tests/fixtures/manifest/1_1_0/modules/test2/file1.php create mode 100644 modules/system/tests/fixtures/manifest/1_1_0/modules/test3/file1.php create mode 100644 modules/system/tests/fixtures/manifest/1_1_1/modules/test/file3.php create mode 100644 modules/system/tests/fixtures/manifest/1_1_1/modules/test/file4.php create mode 100644 modules/system/tests/fixtures/manifest/1_1_1/modules/test2/file1.php create mode 100644 modules/system/tests/fixtures/manifest/1_1_1/modules/test3/file1.php create mode 100644 modules/system/tests/fixtures/manifest/1_1_1/modules/test3/file2.php create mode 100644 modules/system/tests/fixtures/manifest/forks.json create mode 100644 modules/system/tests/fixtures/media/text.txt create mode 100644 modules/system/tests/fixtures/media/winter space.png create mode 100644 modules/system/tests/fixtures/media/winter.png create mode 100644 modules/system/tests/fixtures/npm/package-abc.json create mode 100644 modules/system/tests/fixtures/npm/package-ac.json create mode 100644 modules/system/tests/fixtures/npm/package-corrupt.json create mode 100644 modules/system/tests/fixtures/npm/package-test.json create mode 100644 modules/system/tests/fixtures/npm/package-vitetheme.json create mode 100644 modules/system/tests/fixtures/plugins/database/tester/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/assets/images/avatar.png create mode 100644 modules/system/tests/fixtures/plugins/database/tester/models/Author.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/models/Category.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/models/Country.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/models/EventLog.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/models/Meta.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/models/Phone.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/models/Post.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/models/Role.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/models/Tag.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/models/User.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/updates/create_authors_table.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/updates/create_categories_table.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/updates/create_countries_table.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/updates/create_event_log_table.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/updates/create_meta_table.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/updates/create_phones_table.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/updates/create_posts_table.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/updates/create_roles_table.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/updates/create_tags_table.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/updates/create_users_table.php create mode 100644 modules/system/tests/fixtures/plugins/database/tester/updates/version.yaml create mode 100644 modules/system/tests/fixtures/plugins/dependencytest/acme/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/dependencytest/acme/updates/version.yaml create mode 100644 modules/system/tests/fixtures/plugins/dependencytest/dependency/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/dependencytest/dependency/updates/version.yaml create mode 100644 modules/system/tests/fixtures/plugins/dependencytest/found/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/dependencytest/found/updates/version.yaml create mode 100644 modules/system/tests/fixtures/plugins/dependencytest/notfound/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/dependencytest/notfound/updates/version.yaml create mode 100644 modules/system/tests/fixtures/plugins/dependencytest/wrongcase/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/dependencytest/wrongcase/updates/version.yaml create mode 100644 modules/system/tests/fixtures/plugins/mix/testa/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/mix/testa/assets/.gitignore create mode 100644 modules/system/tests/fixtures/plugins/mix/testa/assets/src/app.js create mode 100644 modules/system/tests/fixtures/plugins/mix/testa/winter.mix.js create mode 100644 modules/system/tests/fixtures/plugins/mix/testb/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/mix/testb/assets/.gitignore create mode 100644 modules/system/tests/fixtures/plugins/mix/testb/assets/src/app.js create mode 100644 modules/system/tests/fixtures/plugins/mix/testb/winter.mix.js create mode 100644 modules/system/tests/fixtures/plugins/mix/testc/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/mix/testc/assets/.gitignore create mode 100644 modules/system/tests/fixtures/plugins/mix/testc/assets/src/app.js create mode 100644 modules/system/tests/fixtures/plugins/mix/testc/winter.mix.js create mode 100644 modules/system/tests/fixtures/plugins/testvendor/goto/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/testvendor/test/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/testvendor/test/formwidgets/Sample.php create mode 100644 modules/system/tests/fixtures/plugins/winter/invalidreplacement/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/winter/invalidreplacement/updates/version.yaml create mode 100644 modules/system/tests/fixtures/plugins/winter/noupdates/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/winter/noupdates/updates/version.yaml create mode 100644 modules/system/tests/fixtures/plugins/winter/original/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/winter/original/updates/version.yaml create mode 100644 modules/system/tests/fixtures/plugins/winter/replacement/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/winter/replacement/updates/version.yaml create mode 100644 modules/system/tests/fixtures/plugins/winter/replacenotinstalled/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/winter/replacenotinstalled/updates/version.yaml create mode 100644 modules/system/tests/fixtures/plugins/winter/sample/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/winter/sample/updates/version.yaml create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/Plugin.php create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/classes/Users.php create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/components/Archive.php create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/components/Categories.php create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/components/Comments.php create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/components/ContentBlock.php create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/components/MainMenu.php create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/components/Post.php create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/components/mainmenu/default.htm create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/components/mainmenu/items.htm create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/components/post/default.htm create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/formwidgets/Preview.php create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/models/TestModel.php create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/models/testmodel/fields.yaml create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/rules/BeLikeBobRule.php create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/updates/create_blog_settings_table.php create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/updates/drop_blog_settings_table.php create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/updates/fix_database.php create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/updates/some_upgrade_file.php create mode 100644 modules/system/tests/fixtures/plugins/winter/tester/updates/version.yaml create mode 100644 modules/system/tests/fixtures/themes/apitest/.gitignore create mode 100644 modules/system/tests/fixtures/themes/assettest/assets/css/theme.css create mode 100644 modules/system/tests/fixtures/themes/assettest/assets/javascript/theme.js create mode 100644 modules/system/tests/fixtures/themes/assettest/vite.config.mjs create mode 100644 modules/system/tests/fixtures/themes/assettest/winter.mix.js create mode 100644 modules/system/tests/fixtures/themes/npmtest/package.json create mode 100644 modules/system/tests/fixtures/themes/npmtest/vite.config.mjs create mode 100644 modules/system/tests/fixtures/themes/npmtest/winter.mix.js create mode 100644 modules/system/tests/fixtures/themes/test/assets/css/style1.css create mode 100644 modules/system/tests/fixtures/themes/test/assets/css/style2.css create mode 100644 modules/system/tests/fixtures/themes/test/assets/images/winter.png create mode 100644 modules/system/tests/fixtures/themes/test/assets/js/script1.js create mode 100644 modules/system/tests/fixtures/themes/test/assets/js/script2.js create mode 100644 modules/system/tests/fixtures/themes/test/assets/js/subdir/script1.js create mode 100644 modules/system/tests/fixtures/themes/test/content/a/a-content.htm create mode 100644 modules/system/tests/fixtures/themes/test/content/html-content.htm create mode 100644 modules/system/tests/fixtures/themes/test/content/layout-content.txt create mode 100644 modules/system/tests/fixtures/themes/test/content/markdown-content.md create mode 100644 modules/system/tests/fixtures/themes/test/content/page-content.htm create mode 100644 modules/system/tests/fixtures/themes/test/content/text-content.txt create mode 100644 modules/system/tests/fixtures/themes/test/layouts/a/a-layout.htm create mode 100644 modules/system/tests/fixtures/themes/test/layouts/ajax-test.htm create mode 100644 modules/system/tests/fixtures/themes/test/layouts/content.htm create mode 100644 modules/system/tests/fixtures/themes/test/layouts/cycle-test.htm create mode 100644 modules/system/tests/fixtures/themes/test/layouts/no-php.htm create mode 100644 modules/system/tests/fixtures/themes/test/layouts/partials.htm create mode 100644 modules/system/tests/fixtures/themes/test/layouts/php-parser-test.htm create mode 100644 modules/system/tests/fixtures/themes/test/layouts/placeholder.htm create mode 100644 modules/system/tests/fixtures/themes/test/layouts/sidebar.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/404.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/a/a-page.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/ajax-test.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/authors.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/b/b-page.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/b/c/c-page.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/blog-archive.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/blog-category.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/blog-post.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/code-namespaces-aliases.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/code-namespaces.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/component-custom-render.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/component-partial-alias-override.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/component-partial-nesting.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/component-partial-override.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/component-partial.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/cycle-test.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/filters-test.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/index.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/no-component-class.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/no-component.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/no-layout.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/no-partial.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/no-soft-component-class.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/optional-full-php-tags.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/optional-short-php-tags.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/throw-php.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/with-component.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/with-components.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/with-content.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/with-layout.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/with-partials.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/with-placeholder.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/with-soft-component-class-alias.htm create mode 100644 modules/system/tests/fixtures/themes/test/pages/with-soft-component-class.htm create mode 100644 modules/system/tests/fixtures/themes/test/partials/a/a-partial.htm create mode 100644 modules/system/tests/fixtures/themes/test/partials/ajax-result.htm create mode 100644 modules/system/tests/fixtures/themes/test/partials/ajax-second-result.htm create mode 100644 modules/system/tests/fixtures/themes/test/partials/layout-partial.htm create mode 100644 modules/system/tests/fixtures/themes/test/partials/nesting/level1.htm create mode 100644 modules/system/tests/fixtures/themes/test/partials/nesting/level2.htm create mode 100644 modules/system/tests/fixtures/themes/test/partials/nesting/level3.htm create mode 100644 modules/system/tests/fixtures/themes/test/partials/override1/default.htm create mode 100644 modules/system/tests/fixtures/themes/test/partials/override2/default.htm create mode 100644 modules/system/tests/fixtures/themes/test/partials/override2/items.htm create mode 100644 modules/system/tests/fixtures/themes/test/partials/override3/default.htm create mode 100644 modules/system/tests/fixtures/themes/test/partials/override4/default.htm create mode 100644 modules/system/tests/fixtures/themes/test/partials/page-partial.htm create mode 100644 modules/system/tests/fixtures/themes/test/partials/testpost/default.htm create mode 100644 modules/system/tests/fixtures/themes/test/temporary/.gitignore create mode 100644 modules/system/tests/fixtures/themes/test/testobjects/component.htm create mode 100644 modules/system/tests/fixtures/themes/test/testobjects/components.htm create mode 100644 modules/system/tests/fixtures/themes/test/testobjects/compound.htm create mode 100644 modules/system/tests/fixtures/themes/test/testobjects/plain.html create mode 100644 modules/system/tests/fixtures/themes/test/testobjects/subdir/obj.html create mode 100644 modules/system/tests/fixtures/themes/test/testobjects/viewbag.htm create mode 100644 modules/system/tests/js/cases/framework/FormParent.test.js create mode 100644 modules/system/tests/js/cases/framework/FormWidgetDependants.test.js create mode 100644 modules/system/tests/js/cases/snowboard/ajax/DataAttribute.test.js create mode 100644 modules/system/tests/js/cases/snowboard/ajax/Request.test.js create mode 100644 modules/system/tests/js/cases/snowboard/extras/DataConfig.test.js create mode 100644 modules/system/tests/js/cases/snowboard/main/PluginLoader.test.js create mode 100644 modules/system/tests/js/cases/snowboard/main/Snowboard.test.js create mode 100644 modules/system/tests/js/fixtures/dataConfig/DataConfigFixture.js create mode 100644 modules/system/tests/js/fixtures/formWidget/FormWidgetStubs.js create mode 100644 modules/system/tests/js/fixtures/framework/TestClosureListener.js create mode 100644 modules/system/tests/js/fixtures/framework/TestDependencyOne.js create mode 100644 modules/system/tests/js/fixtures/framework/TestDependencyTwo.js create mode 100644 modules/system/tests/js/fixtures/framework/TestHasDependencies.js create mode 100644 modules/system/tests/js/fixtures/framework/TestListener.js create mode 100644 modules/system/tests/js/fixtures/framework/TestPlugin.js create mode 100644 modules/system/tests/js/fixtures/framework/TestPromiseClosureListener.js create mode 100644 modules/system/tests/js/fixtures/framework/TestPromiseListener.js create mode 100644 modules/system/tests/js/fixtures/framework/TestSingleton.js create mode 100644 modules/system/tests/js/fixtures/framework/TestSingletonWithDependency.js create mode 100644 modules/system/tests/js/helpers/FakeDom.js create mode 100644 modules/system/tests/js/helpers/FetchMock.js create mode 100644 modules/system/tests/js/jest.config.js create mode 100644 modules/system/tests/models/MailBrandSettingTest.php create mode 100644 modules/system/tests/models/RequestLogTest.php create mode 100644 modules/system/tests/package-testing.json create mode 100644 modules/system/tests/plugins/database/AttachManyModelTest.php create mode 100644 modules/system/tests/plugins/database/AttachOneModelTest.php create mode 100644 modules/system/tests/plugins/database/BelongsToManyModelTest.php create mode 100644 modules/system/tests/plugins/database/BelongsToModelTest.php create mode 100644 modules/system/tests/plugins/database/DeferredBindingTest.php create mode 100644 modules/system/tests/plugins/database/HasManyModelTest.php create mode 100644 modules/system/tests/plugins/database/HasManyThroughModelTest.php create mode 100644 modules/system/tests/plugins/database/HasOneModelTest.php create mode 100644 modules/system/tests/plugins/database/HasOneThroughModelTest.php create mode 100644 modules/system/tests/plugins/database/MorphManyModelTest.php create mode 100644 modules/system/tests/plugins/database/MorphOneModelTest.php create mode 100644 modules/system/tests/plugins/database/MorphToModelTest.php create mode 100644 modules/system/tests/plugins/database/NestedTreeModelTest.php create mode 100644 modules/system/tests/plugins/database/NullableModelTest.php create mode 100644 modules/system/tests/plugins/database/PluginModelTest.php create mode 100644 modules/system/tests/plugins/database/RevisionableModelTest.php create mode 100644 modules/system/tests/plugins/database/SimpleTreeModelTest.php create mode 100644 modules/system/tests/plugins/database/SluggableModelTest.php create mode 100644 modules/system/tests/plugins/database/SoftDeleteModelTest.php create mode 100644 modules/system/tests/plugins/database/ValidationModelTest.php create mode 100644 modules/system/tests/plugins/system/CustomValidatorRulesTest.php create mode 100644 modules/system/tests/traits/AssetMakerTest.php create mode 100644 modules/system/tests/traits/ViewMakerTest.php create mode 100644 modules/system/tests/traits/viewmakerstub/_can_override_php_with_htm.php create mode 100644 modules/system/tests/traits/viewmakerstub/_overridden.php create mode 100644 modules/system/tests/traits/viewmakerstub/_relative_no_ext.php create mode 100644 modules/system/tests/traits/viewmakerstub/folder/_no_ext.php create mode 100644 modules/system/tests/traits/viewmakerstub/layouts/_layout_partial.php create mode 100644 modules/system/tests/traits/viewmakerstub/layouts/default.php create mode 100644 modules/system/tests/traits/viewmakerstub/specific.php create mode 100644 modules/system/tests/traits/viewmakerstub/symbols.php create mode 100644 modules/system/tests/traits/viewmakerstub/view.php create mode 100644 modules/system/tests/traits/viewmakerstuboverride/_can_override_php_with_htm.htm create mode 100644 modules/system/tests/traits/viewmakerstuboverride/_overridden.php create mode 100644 modules/system/tests/twig/FilterTest.php create mode 100644 modules/system/tests/twig/SecurityPolicyTest.php create mode 100644 modules/system/tests/twig/SpacelessTest.php create mode 100644 modules/system/traits/AssetMaker.php create mode 100644 modules/system/traits/ConfigMaker.php create mode 100644 modules/system/traits/EventEmitter.php create mode 100644 modules/system/traits/LazyOwnerAlias.php create mode 100644 modules/system/traits/PropertyContainer.php create mode 100644 modules/system/traits/ResponseMaker.php create mode 100644 modules/system/traits/SecurityController.php create mode 100644 modules/system/traits/ViewMaker.php create mode 100644 modules/system/twig/Engine.php create mode 100644 modules/system/twig/Extension.php create mode 100644 modules/system/twig/FilterTokenParser.php create mode 100644 modules/system/twig/GetAttrAdjuster.php create mode 100644 modules/system/twig/Loader.php create mode 100644 modules/system/twig/MailPartialNode.php create mode 100644 modules/system/twig/MailPartialTokenParser.php create mode 100644 modules/system/twig/SecurityPolicy.php create mode 100644 modules/system/twig/SpacelessNode.php create mode 100644 modules/system/twig/SpacelessTokenParser.php create mode 100644 modules/system/twig/node/GetAttrNode.php create mode 100644 modules/system/twig/securitypolicy/SafeCollection.php create mode 100644 modules/system/twig/securitypolicy/SafePaginator.php create mode 100644 modules/system/views/error.php create mode 100644 modules/system/views/exception.php create mode 100644 modules/system/views/mail/layout-default.php create mode 100644 modules/system/views/mail/layout-system.php create mode 100644 modules/system/views/mail/partial-button.php create mode 100644 modules/system/views/mail/partial-footer.php create mode 100644 modules/system/views/mail/partial-header.php create mode 100644 modules/system/views/mail/partial-panel.php create mode 100644 modules/system/views/mail/partial-promotion.php create mode 100644 modules/system/views/mail/partial-subcopy.php create mode 100644 modules/system/views/mail/partial-table.php create mode 100644 modules/system/views/maintenance.php create mode 100644 modules/system/views/pagination/simple-default.blade.php create mode 100644 modules/system/winter.mix.js create mode 100644 package.json create mode 100644 phpcs.xml create mode 100644 phpunit.xml create mode 100644 plugins/vivespos/site/Plugin.php create mode 100644 plugins/vivespos/site/components/ContactForm.php create mode 100644 plugins/vivespos/site/composer.json create mode 100644 plugins/winter/demo/Plugin.php create mode 100644 plugins/winter/demo/components/Todo.php create mode 100644 plugins/winter/demo/components/todo/default.htm create mode 100644 plugins/winter/demo/components/todo/list.htm create mode 100644 plugins/winter/demo/composer.json create mode 100644 plugins/winter/demo/updates/version.yaml create mode 100644 robots.txt create mode 100644 storage/.gitignore create mode 100644 storage/app/.gitignore create mode 100644 storage/app/media/.gitignore create mode 100644 storage/app/resized/.gitignore create mode 100644 storage/app/uploads/.gitignore create mode 100644 storage/app/uploads/public/.gitignore create mode 100644 storage/cms/.gitignore create mode 100644 storage/cms/cache/.gitignore create mode 100644 storage/cms/combiner/.gitignore create mode 100644 storage/cms/twig/.gitignore create mode 100644 storage/framework/.gitignore create mode 100644 storage/framework/cache/.gitignore create mode 100644 storage/framework/sessions/.gitignore create mode 100644 storage/framework/views/.gitignore create mode 100644 storage/logs/.gitignore create mode 100644 storage/temp/.gitignore create mode 100644 storage/temp/public/.gitignore create mode 100644 themes/demo/README.md create mode 100644 themes/demo/assets/css/theme.css create mode 100644 themes/demo/assets/css/vendor.css create mode 100644 themes/demo/assets/fonts/lato-black-webfont.eot create mode 100644 themes/demo/assets/fonts/lato-black-webfont.svg create mode 100644 themes/demo/assets/fonts/lato-black-webfont.ttf create mode 100644 themes/demo/assets/fonts/lato-black-webfont.woff create mode 100644 themes/demo/assets/fonts/lato-italic-webfont.eot create mode 100644 themes/demo/assets/fonts/lato-italic-webfont.svg create mode 100644 themes/demo/assets/fonts/lato-italic-webfont.ttf create mode 100644 themes/demo/assets/fonts/lato-italic-webfont.woff create mode 100644 themes/demo/assets/fonts/lato-light-webfont.eot create mode 100644 themes/demo/assets/fonts/lato-light-webfont.svg create mode 100644 themes/demo/assets/fonts/lato-light-webfont.ttf create mode 100644 themes/demo/assets/fonts/lato-light-webfont.woff create mode 100644 themes/demo/assets/fonts/lato-regular-webfont.eot create mode 100644 themes/demo/assets/fonts/lato-regular-webfont.svg create mode 100644 themes/demo/assets/fonts/lato-regular-webfont.ttf create mode 100644 themes/demo/assets/fonts/lato-regular-webfont.woff create mode 100644 themes/demo/assets/images/theme-preview.png create mode 100644 themes/demo/assets/images/winter.png create mode 100644 themes/demo/assets/javascript/app.js create mode 100644 themes/demo/assets/less/controls/example.less create mode 100644 themes/demo/assets/less/elements/callouts.less create mode 100644 themes/demo/assets/less/elements/navbar.less create mode 100644 themes/demo/assets/less/elements/utilities.less create mode 100644 themes/demo/assets/less/layouts/default.less create mode 100644 themes/demo/assets/less/pages/ajax.less create mode 100644 themes/demo/assets/less/pages/plugins.less create mode 100644 themes/demo/assets/less/theme.less create mode 100644 themes/demo/assets/less/theme/boot.less create mode 100644 themes/demo/assets/less/theme/fonts.less create mode 100644 themes/demo/assets/less/theme/mixins.less create mode 100644 themes/demo/assets/less/theme/variables.less create mode 100644 themes/demo/assets/less/vendor.less create mode 100644 themes/demo/assets/vendor/bootstrap.js create mode 100644 themes/demo/assets/vendor/bootstrap/js/affix.js create mode 100644 themes/demo/assets/vendor/bootstrap/js/alert.js create mode 100644 themes/demo/assets/vendor/bootstrap/js/button.js create mode 100644 themes/demo/assets/vendor/bootstrap/js/carousel.js create mode 100644 themes/demo/assets/vendor/bootstrap/js/collapse.js create mode 100644 themes/demo/assets/vendor/bootstrap/js/dropdown.js create mode 100644 themes/demo/assets/vendor/bootstrap/js/modal.js create mode 100644 themes/demo/assets/vendor/bootstrap/js/popover.js create mode 100644 themes/demo/assets/vendor/bootstrap/js/scrollspy.js create mode 100644 themes/demo/assets/vendor/bootstrap/js/tab.js create mode 100644 themes/demo/assets/vendor/bootstrap/js/tooltip.js create mode 100644 themes/demo/assets/vendor/bootstrap/js/transition.js create mode 100644 themes/demo/assets/vendor/bootstrap/less/alerts.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/badges.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/bootstrap.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/breadcrumbs.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/button-groups.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/buttons.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/carousel.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/close.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/code.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/component-animations.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/dropdowns.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/forms.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/glyphicons.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/grid.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/input-groups.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/jumbotron.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/labels.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/list-group.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/media.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/alerts.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/background-variant.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/border-radius.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/buttons.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/center-block.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/clearfix.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/forms.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/gradients.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/grid-framework.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/grid.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/hide-text.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/image.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/labels.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/list-group.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/nav-divider.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/nav-vertical-align.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/opacity.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/pagination.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/panels.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/progress-bar.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/reset-filter.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/reset-text.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/resize.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/responsive-visibility.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/size.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/tab-focus.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/table-row.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/text-emphasis.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/text-overflow.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/mixins/vendor-prefixes.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/modals.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/navbar.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/navs.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/normalize.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/pager.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/pagination.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/panels.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/popovers.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/print.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/progress-bars.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/responsive-embed.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/responsive-utilities.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/scaffolding.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/tables.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/theme.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/thumbnails.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/tooltip.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/type.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/utilities.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/variables.less create mode 100644 themes/demo/assets/vendor/bootstrap/less/wells.less create mode 100644 themes/demo/assets/vendor/font-awesome/css/font-awesome.css create mode 100644 themes/demo/assets/vendor/font-awesome/font/FontAwesome.otf create mode 100644 themes/demo/assets/vendor/font-awesome/font/fontawesome-webfont.eot create mode 100644 themes/demo/assets/vendor/font-awesome/font/fontawesome-webfont.svg create mode 100644 themes/demo/assets/vendor/font-awesome/font/fontawesome-webfont.ttf create mode 100644 themes/demo/assets/vendor/font-awesome/font/fontawesome-webfont.woff create mode 100644 themes/demo/assets/vendor/font-awesome/less/bootstrap.less create mode 100644 themes/demo/assets/vendor/font-awesome/less/core.less create mode 100644 themes/demo/assets/vendor/font-awesome/less/extras.less create mode 100644 themes/demo/assets/vendor/font-awesome/less/font-awesome-ie7.less create mode 100644 themes/demo/assets/vendor/font-awesome/less/font-awesome.less create mode 100644 themes/demo/assets/vendor/font-awesome/less/icons.less create mode 100644 themes/demo/assets/vendor/font-awesome/less/mixins.less create mode 100644 themes/demo/assets/vendor/font-awesome/less/path.less create mode 100644 themes/demo/assets/vendor/font-awesome/less/variables.less create mode 100644 themes/demo/assets/vendor/jquery.js create mode 100644 themes/demo/composer.json create mode 100644 themes/demo/content/placeholder/layout.txt create mode 100644 themes/demo/content/placeholder/page.txt create mode 100644 themes/demo/content/welcome.htm create mode 100644 themes/demo/layouts/default.htm create mode 100644 themes/demo/meta/static-pages.yaml create mode 100644 themes/demo/pages/404.htm create mode 100644 themes/demo/pages/ajax.htm create mode 100644 themes/demo/pages/error.htm create mode 100644 themes/demo/pages/home.htm create mode 100644 themes/demo/pages/plugins.htm create mode 100644 themes/demo/partials/.gitkeep create mode 100644 themes/demo/partials/calcresult.htm create mode 100644 themes/demo/partials/explain/ajax.htm create mode 100644 themes/demo/partials/explain/plugins.htm create mode 100644 themes/demo/partials/site/footer.htm create mode 100644 themes/demo/partials/site/header.htm create mode 100644 themes/demo/theme.yaml create mode 100644 themes/vivespos/assets/css/custom.css create mode 100644 themes/vivespos/content/home-cta-lead.htm create mode 100644 themes/vivespos/content/home-cta-title.htm create mode 100644 themes/vivespos/content/home-hero-eyebrow.htm create mode 100644 themes/vivespos/content/home-hero-lead.htm create mode 100644 themes/vivespos/content/home-hero-title.htm create mode 100644 themes/vivespos/layouts/default.htm create mode 100644 themes/vivespos/meta/menus/footer.yaml create mode 100644 themes/vivespos/meta/menus/header.yaml create mode 100644 themes/vivespos/pages/blog.htm create mode 100644 themes/vivespos/pages/blog/post.htm create mode 100644 themes/vivespos/pages/contacto.htm create mode 100644 themes/vivespos/pages/home.htm create mode 100644 themes/vivespos/partials/home/comparison.htm create mode 100644 themes/vivespos/partials/home/cta.htm create mode 100644 themes/vivespos/partials/home/faq.htm create mode 100644 themes/vivespos/partials/home/features.htm create mode 100644 themes/vivespos/partials/home/hero.htm create mode 100644 themes/vivespos/partials/home/modes.htm create mode 100644 themes/vivespos/partials/home/pricing.htm create mode 100644 themes/vivespos/partials/home/screenshots.htm create mode 100644 themes/vivespos/partials/site/footer.htm create mode 100644 themes/vivespos/partials/site/header.htm create mode 100644 themes/vivespos/partials/site/jsonld-software.htm create mode 100644 themes/vivespos/partials/site/tracking.htm create mode 100644 themes/vivespos/partials/site/whatsapp-float.htm create mode 100644 themes/vivespos/theme.yaml diff --git a/.devcontainer/.vscode/launch.json b/.devcontainer/.vscode/launch.json new file mode 100644 index 0000000..f855a76 --- /dev/null +++ b/.devcontainer/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Listen for Xdebug", + "type": "php", + "request": "launch", + "port": 9003 + }, + ] +} diff --git a/.devcontainer/README.md b/.devcontainer/README.md new file mode 100644 index 0000000..eeea50d --- /dev/null +++ b/.devcontainer/README.md @@ -0,0 +1,72 @@ +# Welcome to the Winter development environment + +

+ Winter CMS Logo +

+ +This development environment container sets up a fully-functional installation of Winter CMS, built on [FrankenPHP](https://frankenphp.dev/) with PHP 8.4. It makes it simple to start working with Winter CMS in VSCode, PHPStorm and online code-editing suites such as GitHub Codespaces. + +This image is based on the official [Winter CMS Docker image](https://github.com/wintercms/docker) and inherits all its features. For detailed configuration options, see the [Docker image README](https://github.com/wintercms/docker/blob/main/README.md). + +If you opted to use the `bootstrap-winter` feature, which is enabled by default, Winter CMS will be automatically configured and an administrator account will be generated with the credentials **admin / admin** for you to quickly sign in. It is recommended once you have done so that you change this password immediately. + +The following plugins and themes will be installed automatically with this feature: + +- Workshop theme (https://github.com/wintercms/wn-workshop-theme) +- Pages plugin (https://github.com/wintercms/wn-pages-plugin) +- Blog plugin (https://github.com/wintercms/wn-blog-plugin) +- Test plugin (https://github.com/wintercms/wn-test-plugin) + +## Using this environment + +When this environment is built, FrankenPHP is automatically started, with the root folder of the Winter project being used. A preview of the website will be opened immediately - if you do not see this, you can open the **Ports** tab in VSCode to view the URL generated for viewing the project. + +XDebug is enabled by default, and allows you to quickly use step debugging. It will be available in the **Debug** tab of VSCode or similar screen in other IDEs. + +By default, when using the `bootstrap-winter` feature, changes to certain folders and locations will be ignored by Git to keep the change list clean. This includes the `plugins` and `themes` folders, the `config/app.php` file and the `composer.json` file in the root folder. If you wish to use this environment for your own projects, it is recommended that you do not use this feature. Please see the **Using in your own projects** section below for using this environment outside of Winter development. + +## Environment platform + +The following software is installed in this environment. + +- FrankenPHP (Caddy) +- PHP 8.4 with the following extensions: + - `intl` + - `gd` + - `xdebug` +- Composer +- NodeJS 24 (including `npm`) +- Git + +## Using in your own projects + +You may use this development environment for your own projects, making it a great starting point to hit the ground running with Winter. It is recommended that you *disable* the `bootstrap-winter` feature when using this environment for your own projects. + +You may disable this feature by modifying the `.devcontainer/devcontainer.json` file before running the container and commenting out the feature: + +```json5 + "features": { + "ghcr.io/devcontainers/features/common-utils:2": {}, + "ghcr.io/devcontainers/features/github-cli:1": {}, + // Comment the following feature if you wish to bootstrap and configure Winter manually (ie. you wish to use this for your own project) + "./local-features/bootstrap-winter": "latest" + }, +``` + +If this feature is disabled, you must bootstrap your project manually. This includes: + +- Downloading the Composer dependencies. +- Generating the configuration for the project, either as an `.env` file or in the `config` folder. +- Finally, Running the database migrations. + +You may view the `.devcontainer/local-features/bootstrap-winter/bootstrap.sh` file to see how we bootstrap Winter, and run these commands manually. You will only need to do this once per project container. + +If you wish to mount your own volumes, use your own databases or any other complex usages, please review the [Winter Docker image documentation](https://github.com/wintercms/docker/blob/main/README.md#persisting-data) or the [FrankenPHP environment variables](https://frankenphp.dev/docs/config/#environment-variables) for configuration options. + +## Troubleshooting + +### Preview website missing styles / assets on Codespaces + +By default, ports that are forwarded in Codespaces are private by default. While we have tried to fix this automatically in the Winter bootstrap process by making the port public through the GitHub CLI, it unfortunately is not consistently applied. + +If you find that your preview website is missing assets or styling, open the **Ports** tab by opening the Action Palette in Codespaces (`F1`) and using the **View: Toggle Ports** action. Right click on the **Preview Winter installation** port, right click on it and choose **Port Visiblity -> Public**. This should resolve the issue. diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..6428060 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,60 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/debian +{ + "name": "Winter on PHP 8.4", + "image": "ghcr.io/wintercms/winter:latest", + "features": { + "ghcr.io/devcontainers/features/common-utils:2": { + "installZsh": true, + "configureZshAsDefaultShell": true, + "username": "winter", + "upgradePackages": false + }, + "ghcr.io/devcontainers/features/github-cli:1": {}, + // Comment the following feature if you wish to bootstrap and configure Winter manually (ie. you wish to use this for your own project) + "./local-features/bootstrap-winter": "latest" + }, + "workspaceMount": "source=${localWorkspaceFolder},target=/winter,type=bind", + "workspaceFolder": "/winter", + "containerEnv": { + "APP_DEBUG": "true", + "XDEBUG_MODE": "debug", + "ROUTES_CACHE": "false", + "ASSET_CACHE": "false", + "DB_CONNECTION": "sqlite", + "DB_DATABASE": "${containerWorkspaceFolder}/storage/database.sqlite" + }, + "forwardPorts": [8000], + "portsAttributes": { + "8000": { + "label": "Preview Winter installation", + "onAutoForward": "openPreview" + }, + "9003": { + "label": "Xdebug", + "onAutoForward": "notify" + } + }, + "customizations": { + "vscode": { + "settings": { + "php.validate.executablePath": "/usr/local/bin/php", + "phpcs.executablePath": "${containerWorkspaceFolder}/vendor/bin/phpcs" + }, + "extensions": [ + "xdebug.php-debug", + "bmewburn.vscode-intelephense-client", + "shevaua.phpcs", + "swordev.phpstan", + "wintercms.winter-cms" + ] + }, + "codespaces": { + "openFiles": [ + ".devcontainer/README.md" + ] + } + }, + "postAttachCommand": "nohup ${containerWorkspaceFolder}/.devcontainer/run-frankenphp.sh > /dev/null 2>&1", + "remoteUser": "winter" +} diff --git a/.devcontainer/local-features/bootstrap-winter/bootstrap.sh b/.devcontainer/local-features/bootstrap-winter/bootstrap.sh new file mode 100755 index 0000000..31a65a8 --- /dev/null +++ b/.devcontainer/local-features/bootstrap-winter/bootstrap.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash + +set -e + +if [ ! -d "${PWD}/vendor" ] && [ ! -f "${PWD}/composer.lock" ]; then + echo "### Updating Composer dependencies" + php ${PWD}/.devcontainer/local-features/bootstrap-winter/update-composer.php + composer update --no-interaction --no-scripts --no-audit +fi + +if [ ! -f "${PWD}/.env" ]; then + echo "### Generating .env file" + php artisan winter:env -q + php artisan key:generate -q +fi + +if [ "${DB_CONNECTION}" = "sqlite" ] && [ "${DB_DATABASE}" = "${PWD}/storage/database.sqlite" ] && [ ! -f "${PWD}/storage/database.sqlite" ]; then + SETUP_ADMIN=true + echo "### Creating SQLite database" + touch storage/database.sqlite +fi + +echo "### Run migrations" +php artisan migrate + +echo "### Set theme" +php artisan theme:use workshop + +if [ "${SETUP_ADMIN}" = true ]; then + echo "### Setup admin" + php artisan winter:passwd admin admin +fi + +echo "### Ignoring files in Git" +echo "plugins/*" >> "${PWD}/.git/info/exclude" +echo "themes/*" >> "${PWD}/.git/info/exclude" +echo "composer.json" >> "${PWD}/.git/info/exclude" +git update-index --assume-unchanged composer.json +git restore config + +cp ${PWD}/.devcontainer/.vscode/launch.json ${PWD}/.vscode/launch.json + +echo "### Mirror site to public directory" +php artisan winter:mirror public + +if [ "${CODESPACES}" = "true" ]; then + echo "### Configure for Codespaces" + php ${PWD}/.devcontainer/local-features/bootstrap-winter/codespaces.php + git update-index --assume-unchanged config/app.php + gh codespace ports visibility 8000:public -c $CODESPACE_NAME +fi diff --git a/.devcontainer/local-features/bootstrap-winter/codespaces.php b/.devcontainer/local-features/bootstrap-winter/codespaces.php new file mode 100644 index 0000000..2c7ea56 --- /dev/null +++ b/.devcontainer/local-features/bootstrap-winter/codespaces.php @@ -0,0 +1,25 @@ +set('trustedHosts', [ + 'localhost', + '^(.+\.)?app.github.dev', +]); +$config->set('trustedProxies', '*'); + +$config->write(); + +$env = EnvFile::open($root . '/.env'); + +$env->set('APP_URL', 'https://' . $_ENV['CODESPACE_NAME'] . '.app.github.dev'); +$env->set('LINK_POLICY', 'force'); + +$env->write(); diff --git a/.devcontainer/local-features/bootstrap-winter/devcontainer-feature.json b/.devcontainer/local-features/bootstrap-winter/devcontainer-feature.json new file mode 100644 index 0000000..a9d74f2 --- /dev/null +++ b/.devcontainer/local-features/bootstrap-winter/devcontainer-feature.json @@ -0,0 +1,6 @@ +{ + "id": "bootstrap-winter", + "name": "Bootstrap Winter", + "description": "Bootstrap and configure Winter CMS automatically for development on Winter itself", + "postCreateCommand": "sh ./.devcontainer/local-features/bootstrap-winter/bootstrap.sh" +} diff --git a/.devcontainer/local-features/bootstrap-winter/install.sh b/.devcontainer/local-features/bootstrap-winter/install.sh new file mode 100755 index 0000000..262318b --- /dev/null +++ b/.devcontainer/local-features/bootstrap-winter/install.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +# Install Xdebug extension +install-php-extensions xdebug + +echo "Done" diff --git a/.devcontainer/local-features/bootstrap-winter/update-composer.php b/.devcontainer/local-features/bootstrap-winter/update-composer.php new file mode 100644 index 0000000..fbd1d8f --- /dev/null +++ b/.devcontainer/local-features/bootstrap-winter/update-composer.php @@ -0,0 +1,27 @@ + 'dev-main', + 'winter/wn-blog-plugin' => 'dev-main', + 'winter/wn-blog-plugin' => 'dev-main', + 'winter/wn-workshop-theme' => 'dev-main', +]; + +// Install Winter packages +foreach ($packages as $package => $version) { + if (!in_array($package, array_keys($composer['require']))) { + $composer['require'][$package] = $version; + } +} + +// Change Merge plugin config +$composer['extra']['merge-plugin']['include'] = [ + 'plugins/*/*/composer.json', +]; + +file_put_contents( + $composerPath, + json_encode($composer, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) +); diff --git a/.devcontainer/run-frankenphp.sh b/.devcontainer/run-frankenphp.sh new file mode 100755 index 0000000..79e7106 --- /dev/null +++ b/.devcontainer/run-frankenphp.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +set -e + +USER_ID=$(id -u) +GROUP_ID=$(id -g) + +# Ensure the Caddy config and data directories are owned by the current user +sudo chown -R $USER_ID:$GROUP_ID /config/caddy +sudo chown -R $USER_ID:$GROUP_ID /data +sudo touch /var/log/frankenphp.log +sudo chown $USER_ID:$GROUP_ID /var/log/frankenphp.log + +# If debugging is enabled, disable Opcache so changes are reflected immediately +if [ "${APP_DEBUG}" = "true" ] || [ "${APP_DEBUG}" = "1" ]; then + sudo sed -i 's/opcache.enable = On/opcache.enable = Off/' /usr/local/etc/php/conf.d/winter.ini +fi + +# Run server in background +if [ "${CODESPACES}" = "true" ]; then + # Ensure environment variables are set correctly for Codespaces + SERVER_NAME="http://:8000" APP_URL="https://${CODESPACE_NAME}-8000.app.github.dev" /usr/local/bin/frankenphp run -c /etc/frankenphp/Caddyfile -a caddyfile > /var/log/frankenphp.log 2>&1 & +else + /usr/local/bin/frankenphp run -c /etc/frankenphp/Caddyfile -a caddyfile > /var/log/frankenphp.log 2>&1 & +fi + diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..39f90e5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 4 + +[**/.github/workflows/**.{yml,yaml}] +indent_size = 2 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..f2ea1a4 --- /dev/null +++ b/.env.example @@ -0,0 +1,13 @@ +APP_ENV=production +APP_DEBUG=false +APP_KEY= +APP_URL=http://localhost + +DB_CONNECTION=sqlite +DB_DATABASE=storage/database.sqlite + +CACHE_STORE=file +SESSION_DRIVER=file +QUEUE_CONNECTION=sync + +MAIL_MAILER=log diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1a7fadf --- /dev/null +++ b/.gitattributes @@ -0,0 +1,10 @@ +* text=auto + +*.md diff=markdown +*.php diff=php + +/.devcontainer export-ignore +/.github export-ignore +.gitattributes export-ignore +CHANGELOG.md export-ignore +/package.json export-ignore diff --git a/.github/ISSUE_TEMPLATE/1_BUG_REPORT.yaml b/.github/ISSUE_TEMPLATE/1_BUG_REPORT.yaml new file mode 100644 index 0000000..4ff78ea --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1_BUG_REPORT.yaml @@ -0,0 +1,78 @@ +name: Bug Report +description: Report a general Winter CMS or Storm library issue. See our policy below if reporting a security issue. +labels: ["Status: Review Needed", "Type: Unconfirmed Bug"] +body: + - type: markdown + attributes: + value: | + Thanks for your interest in improving Winter CMS! To avoid duplicate issues please ensure that no previous issues already cover the problem you wish to report before you submit your report. Otherwise, feel free to fill out the form below to submit an issue. + + **Please do not use this form to report a security issue. For security issues, review our [Security Policy](https://github.com/wintercms/winter/security/policy).** + - type: dropdown + id: build + attributes: + label: Winter CMS Build + description: Please select the Winter CMS build that you encountered your issue with. You can find the version in the **Updates & Plugins** section of the Settings page of the Backend, or by running the `php artisan winter:version` command. + options: + - dev-develop + - 1.2 + - 1.1 + - 1.0 (please try updating first) + - Other (please specify below) + validations: + required: true + - type: dropdown + id: php_version + attributes: + label: PHP Version + description: Please provide us the branch of PHP version. For example, for PHP version 7.4.9, select `7.4`, or for PHP version 8.0.1, select `8.0`. + options: + - 8.4 + - 8.3 + - 8.2 + - 8.1 + - 8.0 + - 7.4 + - 7.3 + - 7.2 + - Other (please specify below) + validations: + required: true + - type: dropdown + id: database + attributes: + label: Database engine + description: Please provide us with the database server type you are running. + options: + - MySQL/MariaDB + - PostgreSQL + - SQLite + - SQL Server + - No database + - Other (please specify below) + validations: + required: true + - type: input + id: plugins + attributes: + label: Plugins installed + description: If any plugins are installed, please list them here in the format `Author.PluginName, Author2.PluginName, etc`. + - type: textarea + id: description + attributes: + label: Issue description + description: Please describe the issue in as much detail as possible. Include screenshots of error messages or copy and paste any logs that result from the issue occurring. + validations: + required: true + - type: textarea + id: replication + attributes: + label: Steps to replicate + description: Please list the steps that you took in order for the issue to occur. + validations: + required: true + - type: textarea + id: workaround + attributes: + label: Workaround + description: If you have a workaround, please detail it here, for the benefit of other users who encounter the issue. diff --git a/.github/ISSUE_TEMPLATE/2_PRE_PR.yaml b/.github/ISSUE_TEMPLATE/2_PRE_PR.yaml new file mode 100644 index 0000000..523633f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2_PRE_PR.yaml @@ -0,0 +1,32 @@ +name: Pre-Pull Request Discussion +description: If you intend to submit a PR and wish to discuss it first, start here. +labels: ["Status: Review Needed", "Type: Conceptual Enhancement"] +body: + - type: markdown + attributes: + value: | + Thanks for your interest in submitting a pull request to Winter CMS. We always value contributions from our community. If you wish to start a discussion on the pull request before submission, such as discussing implementation details, please use this form. + - type: dropdown + id: subsystem + attributes: + label: Package targeted + description: Please select which portion of Winter CMS your PR is targeting. + options: + - Winter CMS + - Storm Library + - Both + - Other (please specify below) + validations: + required: true + - type: textarea + id: description + attributes: + label: Description + description: Please describe what your PR is intending to do. + validations: + required: true + - type: textarea + id: compatibility + attributes: + label: Will this change be backwards-compatible? + description: Please describe if this intended change may break backwards compatibility or not. If it does, state the rationale in which you believe this to be an acceptable break in backwards compatibility. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..3d872e1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,14 @@ +blank_issues_enabled: true +contact_links: + - name: General Winter CMS Support + url: https://wintercms.com/support + about: If you need help with Winter CMS, please review our support options. + - name: Discord + url: https://discord.gg/D5MFSPH6Ux + about: Join us on Discord for general discussions and one-on-one help. + - name: Feature Requests + url: https://github.com/wintercms/winter/discussions + about: Please post an Idea thread to the Discussions section for feature requests. + - name: Documentation Issue + url: https://github.com/wintercms/docs + about: For documentation issues, please submit an issue or PR to the Docs repository. diff --git a/.github/assets/Github Banner.png b/.github/assets/Github Banner.png new file mode 100644 index 0000000000000000000000000000000000000000..aedade011a3b27203e332d43e3404fa65d907663 GIT binary patch literal 512401 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 z
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 z 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


bzFYyyRZGP&+VRiac|xnLft$1 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

U?T6KZSY1; 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 literal 0 HcmV?d00001 diff --git a/.github/workflows/code-quality.yaml b/.github/workflows/code-quality.yaml new file mode 100644 index 0000000..1147541 --- /dev/null +++ b/.github/workflows/code-quality.yaml @@ -0,0 +1,68 @@ +name: Code Quality + +on: + pull_request: + push: + branches: + - 1.0 + - 1.1 + - 1.2 + - develop + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + codeQuality: + runs-on: ubuntu-latest + name: PHP + steps: + - name: Checkout changes + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Install PHP and PHP Code Sniffer + uses: shivammathur/setup-php@v2 + with: + php-version: 8.2 + extensions: curl, fileinfo, gd, mbstring, openssl, pdo, pdo_sqlite, sqlite3, xml, zip + tools: phpcs + + - name: Run code quality checks (on push) + if: github.event_name == 'push' + run: ./.github/workflows/utilities/phpcs-push ${{ github.sha }} + + - name: Run code quality checks (on pull request) + if: github.event_name == 'pull_request' + run: ./.github/workflows/utilities/phpcs-pr ${{ github.base_ref }} + codeQualityJS: + runs-on: ubuntu-latest + name: JavaScript + steps: + - name: Checkout changes + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Install Node + uses: actions/setup-node@v1 + with: + node-version: 12 + + - name: Install Node dependencies for System Module + working-directory: ./modules/system + run: npm install + + - name: Run code quality checks on System Module + working-directory: ./modules/system + run: npx eslint . + + - name: Install Node dependencies for Backend Module + working-directory: ./modules/backend + run: npm install + + - name: Run code quality checks on Backend Module + working-directory: ./modules/backend + run: npx eslint . diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..50154e9 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,128 @@ +name: Docker + +on: + push: + tags: + - "v[0-9]+.[0-9]+.[0-9]+" + +concurrency: + group: docker-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + updateDockerImage: + name: Update Docker image + runs-on: ubuntu-latest + env: + version: ${{ github.ref_name }} + steps: + - name: Checkout changes + uses: actions/checkout@v4 + with: + repository: wintercms/docker + ref: main + token: ${{ secrets.WINTER_BOT_TOKEN }} + + - name: Determine latest FrankenPHP, PHP and Node versions + id: versions + env: + GH_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + + # Stay within the major versions currently used by the Dockerfile + frankenphpMajor=$(sed -n 's/^ARG FRANKENPHP_VERSION="\([0-9]*\)\..*"$/\1/p' Dockerfile) + phpMajor=$(sed -n 's/^ARG PHP_VERSION="\([0-9]*\)\..*"$/\1/p' Dockerfile) + nodeMajor=$(sed -n 's/^ARG NODE_VERSION="v\([0-9]*\)\..*"$/\1/p' Dockerfile) + + # The base image is a combined FrankenPHP + PHP tag, so both versions must be resolved + # together - the latest of each individually may not exist as a published image. Walk + # back through the FrankenPHP releases until one with a Trixie image is found. + frankenphp="" + php="" + + for candidate in $(gh api "repos/php/frankenphp/releases?per_page=100" \ + --jq '.[] | select(.draft == false and .prerelease == false) | .tag_name' \ + | sed -n "s/^v\($frankenphpMajor\.[0-9]\+\.[0-9]\+\)$/\1/p"); do + php=$(curl -fsSL "https://hub.docker.com/v2/repositories/dunglas/frankenphp/tags?page_size=100&name=$candidate-php$phpMajor" \ + | jq -r '.results[].name' \ + | sed -n "s/^$candidate-php\($phpMajor\.[0-9]\+\.[0-9]\+\)-trixie$/\1/p" \ + | sort -V \ + | tail -n 1) + + if [ -n "$php" ]; then + frankenphp="$candidate" + break + fi + done + + if [ -z "$frankenphp" ] || [ -z "$php" ]; then + echo "Unable to resolve a FrankenPHP $frankenphpMajor.x image for PHP $phpMajor.x" >&2 + exit 1 + fi + + node=$(curl -fsSL "https://nodejs.org/dist/index.json" \ + | jq -r --arg major "v$nodeMajor." 'map(select(.version | startswith($major))) | .[0].version // ""') + + if [ -z "$node" ]; then + echo "Unable to resolve a Node $nodeMajor.x release" >&2 + exit 1 + fi + + echo "frankenphp=$frankenphp" >> "$GITHUB_OUTPUT" + echo "php=$php" >> "$GITHUB_OUTPUT" + echo "node=$node" >> "$GITHUB_OUTPUT" + + - name: Update versions + env: + frankenphp: ${{ steps.versions.outputs.frankenphp }} + php: ${{ steps.versions.outputs.php }} + node: ${{ steps.versions.outputs.node }} + run: | + set -euo pipefail + + currentFrankenphp=$(sed -n 's/^ARG FRANKENPHP_VERSION="\(.*\)"$/\1/p' Dockerfile) + currentPhp=$(sed -n 's/^ARG PHP_VERSION="\(.*\)"$/\1/p' Dockerfile) + currentNode=$(sed -n 's/^ARG NODE_VERSION="\(.*\)"$/\1/p' Dockerfile) + + sed -i -E "s/^ARG WINTER_VERSION=\".*\"$/ARG WINTER_VERSION=\"$version\"/" Dockerfile + sed -i -E "s/^ARG FRANKENPHP_VERSION=\".*\"$/ARG FRANKENPHP_VERSION=\"$frankenphp\"/" Dockerfile + sed -i -E "s/^ARG PHP_VERSION=\".*\"$/ARG PHP_VERSION=\"$php\"/" Dockerfile + sed -i -E "s/^ARG NODE_VERSION=\".*\"$/ARG NODE_VERSION=\"$node\"/" Dockerfile + + grep -q "^ARG WINTER_VERSION=\"$version\"$" Dockerfile + grep -q "^ARG FRANKENPHP_VERSION=\"$frankenphp\"$" Dockerfile + grep -q "^ARG PHP_VERSION=\"$php\"$" Dockerfile + grep -q "^ARG NODE_VERSION=\"$node\"$" Dockerfile + + # Written outside the checkout so that it is not picked up by the commit + notes="$RUNNER_TEMP/release-notes.md" + echo "- Updated Winter to version $version" > "$notes" + + if [ "$currentFrankenphp" != "$frankenphp" ]; then + echo "- Updated FrankenPHP to version $frankenphp" >> "$notes" + fi + if [ "$currentPhp" != "$php" ]; then + echo "- Updated PHP to version $php" >> "$notes" + fi + if [ "$currentNode" != "$node" ]; then + echo "- Updated Node to version $node" >> "$notes" + fi + + - name: Commit changes + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Update to Winter ${{ env.version }} + file_pattern: Dockerfile + commit_user_name: Winter Bot + commit_user_email: 80384029+WinterCMSBot@users.noreply.github.com + + - name: Publish release + env: + GH_TOKEN: ${{ secrets.WINTER_BOT_TOKEN }} + run: | + gh release create "$version" \ + --repo wintercms/docker \ + --target main \ + --title "$version" \ + --notes-file "$RUNNER_TEMP/release-notes.md" diff --git a/.github/workflows/manifest.yml b/.github/workflows/manifest.yml new file mode 100644 index 0000000..e03b53d --- /dev/null +++ b/.github/workflows/manifest.yml @@ -0,0 +1,69 @@ +name: Manifest + +on: + push: + tags: + - "*" + workflow_dispatch: + +concurrency: + group: manifest-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + updateManifest: + name: Update manifest + runs-on: ubuntu-latest + env: + phpVersion: "8.4" + extensions: curl, fileinfo, gd, mbstring, openssl, pdo, pdo_sqlite, sqlite3, xml, zip + key: winter-cms-cache-develop + steps: + - name: Checkout changes + uses: actions/checkout@v4 + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ env.phpVersion }} + extensions: ${{ env.extensions }} + + - name: Install Composer dependencies + run: composer install --no-interaction --no-progress --no-scripts + + - name: Download manifest + run: wget -O builds.json https://github.com/wintercms/meta/raw/master/manifest/builds.json + + - name: Run manifest + run: php artisan winter:manifest builds.json + + - name: Create artifact + uses: actions/upload-artifact@v4 + with: + name: winter-manifest + path: builds.json + + commitManifest: + name: Commit manifest + runs-on: ubuntu-latest + needs: updateManifest + steps: + - name: Checkout changes + uses: actions/checkout@v4 + with: + repository: wintercms/meta + ref: master + token: ${{ secrets.WINTER_BOT_TOKEN }} + + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: winter-manifest + path: manifest + + - name: Commit changes + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Update manifest + commit_user_name: Winter Bot + commit_user_email: 80384029+WinterCMSBot@users.noreply.github.com diff --git a/.github/workflows/subsplit.yml b/.github/workflows/subsplit.yml new file mode 100644 index 0000000..3347025 --- /dev/null +++ b/.github/workflows/subsplit.yml @@ -0,0 +1,32 @@ +name: Module sub-split + +on: + push: + # Branches only. Tag pushes are handled by the `create` event below; without + # this filter they would also fire here and pass the tag name to `split -b`, + # which then fails looking for a branch that doesn't exist. + branches: + - "**" + create: + delete: + +jobs: + split: + name: Sub-split + runs-on: ubuntu-latest + container: wintercms/cli:0.3.4 + env: + WINTER_CLI_GITHUB_TOKEN: ${{ secrets.WINTER_SPLIT_TOKEN }} + steps: + - name: Create tag + if: github.event_name == 'create' && github.ref_type == 'tag' + run: winter split -a "${{ github.ref_name }}" + - name: Delete branch + if: github.event_name == 'delete' && github.ref_type == 'branch' + run: winter split --remove-branch="${{ github.event.ref }}" + - name: Delete tag + if: github.event_name == 'delete' && github.ref_type == 'tag' + run: winter split --remove-tag="${{ github.event.ref }}" + - name: Push + if: github.event_name == 'push' + run: winter split -b "${{ github.ref_name }}" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..398fe5a --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,175 @@ +name: Tests + +on: + push: + branches: + - '1.2' + - develop + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + frontendTests: + strategy: + max-parallel: 2 + matrix: + operatingSystem: [ubuntu-latest, windows-latest] + fail-fast: false + runs-on: ${{ matrix.operatingSystem }} + name: ${{ matrix.operatingSystem }} / JavaScript + env: + nodeVersion: 16 + phpVersion: '8.2' + extensions: curl, fileinfo, gd, mbstring, openssl, pdo, pdo_sqlite, sqlite3, xml, zip + key: winter-cms-cache-develop + steps: + - name: Checkout changes + uses: actions/checkout@v3 + + - name: Setup extension cache + id: extcache + uses: shivammathur/cache-extensions@v1 + with: + php-version: ${{ env.phpVersion }} + extensions: ${{ env.extensions }} + key: ${{ env.key }} + + - name: Cache extensions + uses: actions/cache@v3 + with: + path: ${{ steps.extcache.outputs.dir }} + key: ${{ steps.extcache.outputs.key }} + restore-keys: ${{ steps.extcache.outputs.key }} + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ env.phpVersion }} + extensions: ${{ env.extensions }} + + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version: ${{ env.nodeVersion }} + + - name: Switch library dependency (develop) + if: github.ref == 'refs/heads/develop' || github.base_ref == 'develop' + run: php ./.github/workflows/utilities/library-switcher "dev-develop as 1.2" + + - name: Switch library dependency (1.2) + if: github.head_ref == '1.2' || github.ref == 'refs/heads/1.2' || github.base_ref == '1.2' + run: php ./.github/workflows/utilities/library-switcher "1.2.x-dev as 1.2" + + - name: Setup dependency cache + id: composercache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Cache dependencies + uses: actions/cache@v3 + with: + path: ${{ steps.composercache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: ${{ runner.os }}-composer- + + - name: Install Composer dependencies + run: composer install --no-interaction --no-progress --no-scripts + + - name: Reset modules + run: | + git reset --hard + git clean -fd + + - name: Run post-update Composer scripts + run: php artisan package:discover + + - name: Run tests + run: | + php artisan mix:install + php artisan mix:run module-system test + + phpUnitTests: + strategy: + max-parallel: 8 + matrix: + operatingSystem: [ubuntu-latest, windows-latest] + phpVersion: ['8.1', '8.2', '8.3', '8.4', '8.5'] + fail-fast: false + runs-on: ${{ matrix.operatingSystem }} + name: ${{ matrix.operatingSystem }} / PHP ${{ matrix.phpVersion }} + env: + extensions: curl, fileinfo, gd, mbstring, openssl, pdo, pdo_sqlite, sqlite3, xml, zip + key: winter-cms-cache-develop + steps: + - name: Checkout changes + uses: actions/checkout@v3 + + - name: Setup extension cache + id: extcache + uses: shivammathur/cache-extensions@v1 + with: + php-version: ${{ matrix.phpVersion }} + extensions: ${{ env.extensions }} + key: ${{ env.key }} + + - name: Cache extensions + uses: actions/cache@v3 + with: + path: ${{ steps.extcache.outputs.dir }} + key: ${{ steps.extcache.outputs.key }} + restore-keys: ${{ steps.extcache.outputs.key }} + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.phpVersion }} + extensions: ${{ env.extensions }} + + - name: Switch library dependency (develop) + if: github.ref == 'refs/heads/develop' || github.base_ref == 'develop' + run: php ./.github/workflows/utilities/library-switcher "dev-develop as 1.2" + + - name: Switch library dependency (1.0) + if: github.head_ref == '1.0' || github.ref == 'refs/heads/1.0' || github.base_ref == '1.0' + run: php ./.github/workflows/utilities/library-switcher "1.0.x-dev as 1.0" + + - name: Switch library dependency (1.1) + if: github.head_ref == '1.1' || github.ref == 'refs/heads/1.1' || github.base_ref == '1.1' + run: php ./.github/workflows/utilities/library-switcher "1.1.x-dev as 1.1" + + - name: Switch library dependency (1.2) + if: github.head_ref == '1.2' || github.ref == 'refs/heads/1.2' || github.base_ref == '1.2' + run: php ./.github/workflows/utilities/library-switcher "1.2.x-dev as 1.2" + + - name: Setup dependency cache + id: composercache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Cache dependencies + uses: actions/cache@v3 + with: + path: ${{ steps.composercache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: ${{ runner.os }}-composer- + + - name: Install Composer dependencies + run: composer install --no-interaction --no-progress --no-scripts + + - name: Reset modules + run: | + git reset --hard + git clean -fd + + - name: Run post-update Composer scripts + run: php artisan package:discover + + - name: Setup problem matchers for PHPUnit + if: matrix.phpVersion == '8.1' + run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" + + - name: Run Linting and Tests + run: | + composer lint + php artisan winter:test -m system -m backend -m cms diff --git a/.github/workflows/utilities/library-switcher b/.github/workflows/utilities/library-switcher new file mode 100755 index 0000000..e8839b9 --- /dev/null +++ b/.github/workflows/utilities/library-switcher @@ -0,0 +1,18 @@ +#!/usr/bin/env php + (($line[3] ?? 'err') === 'warning'), + 'message' => $line[4] ?? 'unknown', + 'line' => $line[1] ?? '0', + ]; +} + +// Render report +fwrite(STDERR, "\e[0;31mFound " + . ((count($lines) === 1) + ? '1 issue' + : count($lines) . ' issues') + . " with code quality.\e[0m"); +fwrite(STDERR, "\n"); + +foreach ($files as $file => $errors) { + fwrite(STDERR, "\n"); + fwrite(STDERR, "\e[1;37m" . str_replace('"', '', $file) . "\e[0m"); + fwrite(STDERR, "\n\n"); + + foreach ($errors as $error) { + fwrite(STDERR, "\e[2m" . str_pad(' L' . $error['line'], 7) . " | \e[0m"); + fwrite(STDERR, $error['warning'] ? "\e[1;33mWARN:\e[0m " : "\e[0;31mERR:\e[0m "); + fwrite(STDERR, $error['message']); + fwrite(STDERR, "\n"); + } +} + +exit(1); diff --git a/.github/workflows/utilities/phpcs-push b/.github/workflows/utilities/phpcs-push new file mode 100755 index 0000000..fe51c44 --- /dev/null +++ b/.github/workflows/utilities/phpcs-push @@ -0,0 +1,87 @@ +#!/usr/bin/env php + (($line[3] ?? 'err') === 'warning'), + 'message' => $line[4] ?? 'unknown', + 'line' => $line[1] ?? '0', + ]; +} + +// Render report +fwrite(STDERR, "\e[0;31mFound " + . ((count($lines) === 1) + ? '1 issue' + : count($lines) . ' issues') + . " with code quality.\e[0m"); +fwrite(STDERR, "\n"); + +foreach ($files as $file => $errors) { + fwrite(STDERR, "\n"); + fwrite(STDERR, "\e[1;37m" . str_replace('"', '', $file) . "\e[0m"); + fwrite(STDERR, "\n\n"); + + foreach ($errors as $error) { + fwrite(STDERR, "\e[2m" . str_pad(' L' . $error['line'], 7) . " | \e[0m"); + fwrite(STDERR, $error['warning'] ? "\e[1;33mWARN:\e[0m " : "\e[0;31mERR:\e[0m "); + fwrite(STDERR, $error['message']); + fwrite(STDERR, "\n"); + } +} +exit(1); + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a2907ef --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/storage/ +/vendor/ +/node_modules/ +.env +composer.lock +*.sqlite +*.sqlite-journal diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..b6afe66 --- /dev/null +++ b/.htaccess @@ -0,0 +1,60 @@ + + + + Options -MultiViews + + + RewriteEngine On + + ## + ## You may need to uncomment the following line for some hosting environments, + ## if you have installed to a subdirectory, enter the name here also. + ## + # RewriteBase / + + ## + ## Uncomment following lines to force HTTPS. + ## + # RewriteCond %{HTTPS} off + # RewriteRule (.*) https://%{SERVER_NAME}/$1 [L,R=301] + + ## + ## Paths explicitly blocked from being handled by the server + ## + RewriteRule ^bootstrap/.* index.php [L,NC] + RewriteRule ^config/.* index.php [L,NC] + RewriteRule ^vendor/.* index.php [L,NC] + RewriteRule ^storage/cms/.* index.php [L,NC] + RewriteRule ^storage/logs/.* index.php [L,NC] + RewriteRule ^storage/framework/.* index.php [L,NC] + RewriteRule ^storage/temp/protected/.* index.php [L,NC] + RewriteRule ^storage/app/uploads/protected/.* index.php [L,NC] + + ## + ## Paths explicitly handled by the server + ## + RewriteCond %{REQUEST_FILENAME} -f + RewriteCond %{REQUEST_FILENAME} !/.well-known/* + RewriteCond %{REQUEST_FILENAME} !/storage/app/uploads/public/.* + RewriteCond %{REQUEST_FILENAME} !/storage/app/media/.* + RewriteCond %{REQUEST_FILENAME} !/storage/app/resized/.* + RewriteCond %{REQUEST_FILENAME} !/storage/temp/public/.* + RewriteCond %{REQUEST_FILENAME} !/themes/.*/(assets|resources)/.* + RewriteCond %{REQUEST_FILENAME} !/plugins/.*/(assets|resources)/.* + RewriteCond %{REQUEST_FILENAME} !/modules/.*/(assets|resources)/.* + RewriteRule !^index.php index.php [L,NC] + + ## + ## Block all PHP files, except index + ## + RewriteCond %{REQUEST_FILENAME} -f + RewriteCond %{REQUEST_FILENAME} \.php$ + RewriteRule !^index.php index.php [L,NC] + + ## + ## Standard routes + ## + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + + diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..ab85385 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "wintercms.winter-cms" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3211f57 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,41 @@ +{ + "files.associations": { + "**/modules/*/behaviors/*/partials/*.htm": "php", + "**/modules/*/blocks/*.block": "wintercms-block", + "**/modules/*/controllers/*/*.htm": "php", + "**/modules/*/formwidgets/*/partials/*.htm": "php", + "**/modules/*/layouts/*.htm": "php", + "**/modules/*/models/*/*.htm": "php", + "**/modules/*/partials/*.htm": "php", + "**/modules/*/reportwidgets/*/partials/*.htm": "php", + "**/modules/*/views/mail/*.htm": "wintercms", + "**/modules/*/widgets/*/partials/*.htm": "php", + + "**/plugins/*/*/behaviors/*/partials/*.htm": "php", + "**/plugins/*/*/blocks/*.block": "wintercms-block", + "**/plugins/*/*/components/**/*.htm": "wintercms-twig", + "**/plugins/*/*/controllers/*/*.htm": "php", + "**/plugins/*/*/formwidgets/*/partials/*.htm": "php", + "**/plugins/*/*/layouts/*.htm": "php", + "**/plugins/*/*/models/*/*.htm": "php", + "**/plugins/*/*/partials/*.htm": "php", + "**/plugins/*/*/reportwidgets/*/partials/*.htm": "php", + "**/plugins/*/*/views/mail/*.htm": "wintercms", + "**/plugins/*/*/widgets/*/partials/*.htm": "php", + + "**/themes/*/blocks/**/*.block": "wintercms-block", + "**/themes/*/content/**/*.htm": "wintercms", + "**/themes/*/layouts/*.htm": "wintercms", + "**/themes/*/pages/**/*.htm": "wintercms", + "**/themes/*/partials/**/*.htm": "wintercms" + }, + "emmet.includeLanguages": { + "wintercms": "html", + "wintercms-twig": "html", + "wintercms-block": "html" + }, + "eslint.validate": [ + "javascript", + "vue" + ] +} diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..2fe8e8d --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,95 @@ +# Agent guide — Winter CMS core + +Winter core sits on top of [Winter Storm](https://github.com/wintercms/storm) (installed at `vendor/winter/storm/`), which sits on top of Laravel, which sits on top of Symfony components. The helper you want almost certainly already exists at one of those layers. **Search Storm → Laravel → Symfony before writing any "small utility"**, often with safer edge-case handling than a fresh implementation would have. + +## Where to look (in this order) + +1. **Storm itself** — each `vendor/winter/storm/src//README.md` catalogues that module's public API: + - `Filesystem/` — `PathResolver` (`resolve`, `within`, `join`, `standardize`), `Filesystem` (extends Illuminate's; adds `isAbsolutePath`, `symbolizePath`, `existsInsensitive`, `chmodRecursive`) + - `Support/` — strings, arrays, class loading + - `Network/`, `Html/`, `Parse/`, `Database/`, `Halcyon/`, `Auth/`, etc. + - Path helpers (always loaded): `themes_path()`, `plugins_path()`, `media_path()`, `uploads_path()`, `temp_path()` — use these instead of `base_path('themes')` etc. + +2. **Laravel (Illuminate)** — everything Laravel ships is available: + - `Illuminate\Support\Str` — `Str::startsWith/endsWith/contains/before/after/between/slug/camel/snake/kebab/studly/random/uuid/limit/mask/finish/start/of/headline/title`. Use instead of regex one-liners. + - `Illuminate\Support\Arr` — `Arr::get/set/has/forget/only/except/dot/undot/flatten/pluck/wrap/first/last/where`. Use instead of nested foreach. + - `Illuminate\Support\Collection` (via `collect()`) — chainable map/filter/reduce. + - `Illuminate\Filesystem\Filesystem` — `deleteDirectory()`, `cleanDirectory()`, `copyDirectory()`, `moveDirectory()`, `allFiles()`, `glob()`, `isDirectory()`, `prepend()`, `append()`, `replace()`, `hash()`. + - Global helpers: `data_get/set/fill`, `value`, `tap`, `optional`, `transform`, `head`, `last`, `class_basename`, `now`, `today`, `e`, `__`/`trans`, `cache`, `config`, `env`, `app`, `resolve`, `route`, `url`, `report`, `rescue`, `retry`, `throw_if`/`unless`, `abort`/`abort_if`/`unless`. + - Facades: `Cache`, `Config`, `DB`, `Event`, `File`, `Hash`, `Http`, `Lang`, `Log`, `Mail`, `Queue`, `Redis`, `Route`, `Schema`, `Session`, `Storage`, `URL`, `Validator`, `View`. + +3. **Symfony components** at `vendor/symfony/`: `console`, `css-selector`, `error-handler`, `event-dispatcher`, `finder`, `http-foundation`, `http-kernel`, `mailer`, `mime`, `process`, `routing`, `string`, `translation`, `uid`, `var-dumper`, `yaml`. Most commonly reached for: + - `Symfony\Component\Finder\Finder` — `Finder::create()->files()->name('*.less')->in($dir)` replaces RecursiveIteratorIterator chains. + - `Symfony\Component\Filesystem\Filesystem` — `dumpFile()` (atomic write), `mirror()`, `mkdir()` (idempotent), `remove()`, `symlink()`. + - `Symfony\Component\Process\Process` — safe external command execution instead of `exec()`/`shell_exec()`. + - `Symfony\Component\Yaml\Yaml` — strict YAML. + - `Symfony\Component\String\` — Unicode-aware strings. + - `Symfony\Component\Uid\Uuid`/`Ulid` — UUID/ULID generation. + +`grep -rl 'function ' vendor/winter/storm/src/ vendor/laravel/framework/src/ vendor/symfony/` is a 10-second check. + +## Concrete substitutions worth memorising + +Paths and filesystem: + +| If you reach for… | Use this instead | +|---|---| +| `realpath()` + null-check + slash-trim | `\Winter\Storm\Filesystem\PathResolver::resolve()` | +| `str_starts_with($path, $root)` to gate file access | `PathResolver::within($path, $root)` — separator-boundary safe | +| Manual `base_path('themes')` / `base_path('plugins')` | `themes_path()` / `plugins_path()` (Storm's autoloaded helpers) | +| Recursive `rmrf` in tests | `\File::deleteDirectory($path)` (Laravel facade) | +| Detect absolute path | `(new \Winter\Storm\Filesystem\Filesystem())->isAbsolutePath($path)` | +| Custom path-symbol resolution (`~/...`) | `(new \Winter\Storm\Filesystem\Filesystem())->symbolizePath($path)` | +| `str_replace('\\', '/', $path)` (cross-platform comparison) | `(new \Winter\Storm\Filesystem\Filesystem())->normalizePath($path)` | +| `str_replace('/', DIRECTORY_SEPARATOR, $path)` (handing to OS API) | `\Winter\Storm\Filesystem\PathResolver::standardize($path)` | +| Atomic file write (avoid partial-write races) | `(new \Symfony\Component\Filesystem\Filesystem())->dumpFile($path, $contents)` | +| Find files matching a pattern | `\Symfony\Component\Finder\Finder::create()->files()->name('*.ext')->in($dir)` | + +Strings and arrays: + +| If you reach for… | Use this instead | +|---|---| +| `preg_match('/^prefix/', $s)` | `Str::startsWith($s, 'prefix')` (accepts array of prefixes) | +| Manual `strpos !== false` | `Str::contains($s, $needle)` | +| `strtolower`-then-replace slug generation | `Str::slug($s)` | +| Random hex/string for tmp paths, tokens | `Str::random()` / `Str::uuid()` | +| Deep array key access with null safety | `data_get($array, 'a.b.c', $default)` | +| Pulling subset of array keys | `Arr::only($array, [...])` / `Arr::except($array, [...])` | +| Chained map / filter / reduce on array | `collect($array)->filter(...)->map(...)->values()->all()` | + +Other: + +| If you reach for… | Use this instead | +|---|---| +| `exec()` / `shell_exec()` / backticks | `(new \Symfony\Component\Process\Process([$cmd, ...$args]))->mustRun()` | +| Manual YAML parsing | `\Symfony\Component\Yaml\Yaml::parse()` | +| JSON parsing without strict error handling | `json_decode($s, true, 512, JSON_THROW_ON_ERROR)` | +| UUID generation by `random_bytes` + hex shuffle | `Str::uuid()` or `\Symfony\Component\Uid\Uuid::v7()` | +| HTTP request to external service | Laravel's `\Http::get(...)` facade | + +## Layering boundaries + +Storm depends on Laravel + Symfony pieces. It must **not** depend on Winter modules. Conversely, Winter core modules are free to use Storm. So: + +- CMS / theme / plugin / system concerns live in `modules/` (backend, cms, system). +- Generic filesystem, path, parser, network primitives live in `vendor/winter/storm/`. +- When a Storm class needs a *policy* that's CMS-specific (e.g. "which directories count as theme asset roots"), expose a public setter on the Storm class and have the module-level caller supply the policy. Don't reach into module-level constants from Storm. + +## Autoloading & file placement + +Modules and plugins are autoloaded by `Winter\Storm\Support\ClassLoader` (see `ClassLoader::load()`), **not** plain PSR-4. Its convention: the namespace's **directory segments are lower-cased** to form the path, while the class file keeps its proper PascalCase name. So `System\Twig\SecurityPolicy\SafeCollection` resolves to `modules/system/twig/securitypolicy/SafeCollection.php` — note the lowercase `securitypolicy/` directory. + +- **New sub-namespace directories must be lowercase on disk**, even though the namespace segment stays PascalCase: `System\Twig\Node` → `modules/system/twig/node/`, not `Node/`. The file name keeps its PascalCase and must match the class name exactly. +- This only bites on case-sensitive filesystems: a capitalized directory works on macOS/Windows (case-insensitive) and passes local tests, then fails Linux CI with `Class "…" not found`. **If Windows CI is green but every Ubuntu job fails to find a class, suspect a directory-case mismatch.** + +## Tests + +- Backend/CMS/system tests usually extend `System\Tests\Bootstrap\PluginTestCase` (boots Laravel, plugins, auth) or `System\Tests\Bootstrap\TestCase` (boots the framework but not plugins). +- Fixtures that flow through `Assetic\Asset\FileAsset` (e.g. `CombineAssets::combineToFile()`) must live under `base_path()`. `sys_get_temp_dir()` will fail with "source is not in the root directory". Use `base_path('storage/framework/cache/')` for temp dirs and clean up with `\File::deleteDirectory()` in `tearDown()`. +- A failing test that doesn't reproduce on a fresh clone is almost always a stale local `vendor/`. Run `composer update` in Storm (`~/Repositories/WinterCMS/Core/storm` or wherever you check it out) before claiming "environment issue". + +## Working across Winter core + Storm + +When a change touches both, work in the actual local checkouts (e.g. `~/Repositories/WinterCMS/Core/storm` and `~/Repositories/WinterCMS/Core/winter`) on parallel branches, and symlink `vendor/winter/storm` to the local Storm checkout so changes are visible in the live install. Avoid `/tmp` worktrees — the user can't test what they can't see. + +Open both PRs concurrently; the maintainer handles merge order and Storm release tagging. The Winter core PR's `composer.json` constraint bump waits for the Storm tag. diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..6331924 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1 @@ +View the changelog on the [meta repository](https://github.com/wintercms/meta/tree/master/release-notes) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b868eeb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,45 @@ +FROM php:8.2-apache-bookworm + +LABEL coolify.managed=true +LABEL maintainer="VivesPOS" + +ENV APACHE_DOCUMENT_ROOT=/var/www/html +ENV COMPOSER_ALLOW_SUPERUSER=1 + +RUN apt-get update && apt-get install -y --no-install-recommends \ + libpng-dev libjpeg-dev libfreetype6-dev libzip-dev libsqlite3-dev \ + unzip git curl && \ + docker-php-ext-configure gd --with-freetype --with-jpeg && \ + docker-php-ext-install gd zip pdo_sqlite pdo_mysql mbstring exif opcache && \ + a2enmod rewrite headers expires && \ + curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' \ + /etc/apache2/sites-available/*.conf && \ + sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' \ + /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf && \ + printf '\n AllowOverride All\n Require all granted\n\n' \ + > /etc/apache2/conf-available/vivespos.conf && \ + a2enconf vivespos + +WORKDIR /var/www/html + +COPY . . + +RUN composer install --no-dev --optimize-autoloader --no-interaction || true + +RUN php artisan winter:version 2>/dev/null || true + +RUN php artisan key:generate --force 2>/dev/null || true + +RUN chown -R www-data:www-data /var/www/html && \ + chmod -R 755 /var/www/html && \ + chmod -R 777 storage bootstrap/cache themes plugins + +EXPOSE 80 + +HEALTHCHECK --interval=30s --timeout=5s --retries=3 \ + CMD curl -f http://localhost:80/ || exit 1 + +CMD ["apache2-foreground"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7b47a3b --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2013-2021.03.01 October CMS +Copyright (c) 2021 Winter CMS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..537b95d --- /dev/null +++ b/README.md @@ -0,0 +1,115 @@ +

+ Winter CMS Logo +

+ +[Winter](https://wintercms.com) is a free, open-source content management system based on the [Laravel](https://laravel.com) PHP framework. Developers and agencies all around the world rely upon Winter for its quick prototyping and development, safe and secure codebase and dedication to simplicity. + +No matter how large or small your project is, Winter provides a rich development environment, regardless of your level of experience. + +[![Version](https://img.shields.io/github/v/release/wintercms/winter?sort=semver&style=flat-square)](https://github.com/wintercms/winter/releases) +[![Tests](https://img.shields.io/github/actions/workflow/status/wintercms/winter/tests.yml?branch=develop&label=tests&style=flat-square)](https://github.com/wintercms/winter/actions) +[![License](https://img.shields.io/github/license/wintercms/winter?label=open%20source&style=flat-square)](https://packagist.org/packages/wintercms/winter) +[![Discord](https://img.shields.io/badge/discord-join-purple?style=flat-square&logo=discord&logoColor=white)](https://discord.gg/D5MFSPH6Ux) + +## Installing Winter + +Winter can be installed in several ways for both new users and experienced developers - see our [Installation page](https://wintercms.com/install) for more information. + +### Quick start with Composer + +For advanced users, run the following command in your terminal to install Winter via Composer: + +```shell +composer create-project wintercms/winter example.com "dev-develop" +``` + +Run the following command with the folder created by the previous command to generate an environment file which will contain your configuration settings: + +```shell +php artisan winter:env +``` + +After configuring your installation, you can run the following command to run the database migrations and automatically create an administrator account with the username `admin`. The password of this account will be automatically generated and displayed in your terminal. + +```shell +php artisan winter:up +``` + +## Learning Winter + +The best place to learn Winter is by [reading the documentation](https://wintercms.com/docs) or [following some tutorials](https://wintercms.com/blog/category/tutorials). You can also join the maintenance team and our active community on [Discord](https://discord.gg/D5MFSPH6Ux) who are always willing to help out with questions. + +## Development team + +Winter was forked from October CMS in March 2021 due to a difference in open source management philosophies between the core maintainer team and the two founders of October. + +The development of Winter is lead by [Luke Towers](https://luketowers.ca/), along with many wonderful people that dedicate their time to help support and grow the community. The [Frostbyte Foundation](mailto:hello@frostbytefoundation.org) provides an organisational backing for the project and the continued development of Winter, its plugins and themes and its ecosystem. + + + + + + + + + +
Luke Towers
Luke Towers
Ben Thomson
Ben Thomson
Marc Jauvin
Marc Jauvin
Jack Wilkinson
Jack Wilkinson
Damien Mathieu
Damien Mathieu
+ +## Foundation library + +Winter is built on top of the wildly-popular [Laravel](https://laravel.com) framework for PHP, with the in-house [Storm](https://github.com/wintercms/storm) library as a buffer between the Laravel framework and the Winter project, to minimize breaking changes and improve stability. + +## Getting in touch + +You can get in touch with the maintainer team using the following mediums: + +* [Follow us on Twitter](https://twitter.com/usewintercms) for announcements and updates. +* [Join us on Discord](https://discord.gg/D5MFSPH6Ux) to chat with us. + +## Contributing + +Before contributing issues or pull requests, be sure to review the [Contributing Guidelines](https://github.com/wintercms/.github/blob/master/CONTRIBUTING.md) first. + +### Coding standards + +Please follow the following guides and code standards: + +* [PSR 4 Coding Standards](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) +* [PSR 2 Coding Style Guide](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) +* [PSR 1 Coding Standards](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md) + +### Code of conduct + +In order to ensure that the Winter community is welcoming to all, please review and abide by the [Code of Conduct](https://github.com/wintercms/.github/blob/master/CODE_OF_CONDUCT.md). + +## Sponsors + +Winter CMS development is financially supported by the generosity of the following sponsors. If you would like to have your name, company and link added to this list and support open-source development, feel free to make a donation to our [Open Collective](https://opencollective.com/wintercms). + +### Organizations + +
+ Laravel logo + + +Laravel provides [Laravel Vapor](https://vapor.laravel.com/?ref=wintercms) to the Winter CMS project which is used to power the serverless PHP hosting used for our [main website and documentation](https://wintercms.com/). + + + Froala logo + + +Froala provides a perpetual, Enterprise license to Winter CMS which allows us and our users to use the Froala WYSIWYG Editor in Winter CMS powered projects. + +### Individuals + +Big thanks to our sponsors on OpenCollective: + +- Orville + +## License + +The Winter platform is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). + +## Security vulnerabilities + +Please review [our security policy](https://github.com/wintercms/winter/security/policy) on how to report security vulnerabilities. diff --git a/artisan b/artisan new file mode 100755 index 0000000..8d1e73f --- /dev/null +++ b/artisan @@ -0,0 +1,51 @@ +#!/usr/bin/env php +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| Shutdown The Application +|-------------------------------------------------------------------------- +| +| Once Artisan has finished running, we will fire off the shutdown events +| so that any final work may be done by the application before we shut +| down the process. This is the last thing to happen to the request. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 0000000..10e92d3 --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,55 @@ +singleton( + Illuminate\Contracts\Http\Kernel::class, + Winter\Storm\Foundation\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + Winter\Storm\Foundation\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + Winter\Storm\Foundation\Exception\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php new file mode 100644 index 0000000..429da18 --- /dev/null +++ b/bootstrap/autoload.php @@ -0,0 +1,38 @@ +=8.1", + "winter/storm": "~1.2.0", + "winter/wn-system-module": "~1.2.0", + "winter/wn-backend-module": "~1.2.0", + "winter/wn-cms-module": "~1.2.0", + "laravel/framework": "^9.1", + "wikimedia/composer-merge-plugin": "~2.1.0", + "winter/wn-pages-plugin": "~1.2.0", + "winter/wn-blog-plugin": "~1.2.0", + "winter/wn-sitemap-plugin": "~1.2.0", + "winter/wn-seo-plugin": "~1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.8", + "mockery/mockery": "^1.4.4", + "fakerphp/faker": "^1.9.2", + "squizlabs/php_codesniffer": "^3.2", + "php-parallel-lint/php-parallel-lint": "^1.0", + "dms/phpunit-arraysubset-asserts": "^0.1.0|^0.2.1" + }, + "scripts": { + "post-create-project-cmd": [ + "@php artisan winter:install", + "@php artisan winter:env", + "@php artisan winter:mirror public --relative" + ], + "post-update-cmd": [ + "@php artisan winter:version", + "@php artisan package:discover" + ], + "test": [ + "phpunit --stop-on-failure" + ], + "lint": [ + "parallel-lint --exclude vendor --exclude storage --exclude modules/system/tests/fixtures/plugins/testvendor/goto/Plugin.php ." + ], + "sniff": [ + "phpcs --colors -nq --report=\"full\" --extensions=\"php\"" + ] + }, + "minimum-stability": "dev", + "prefer-stable": true, + "extra": { + "merge-plugin": { + "include": [ + "plugins/myauthor/*/composer.json", + "plugins/vivespos/*/composer.json" + ], + "recurse": true, + "replace": false, + "merge-replace": false, + "merge-dev": false + } + }, + "config": { + "allow-plugins": { + "composer/installers": true, + "wikimedia/composer-merge-plugin": true + } + } +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..e4a78cb --- /dev/null +++ b/config/app.php @@ -0,0 +1,322 @@ + env('APP_DEBUG', true), + + /* + |-------------------------------------------------------------------------- + | Application Name + |-------------------------------------------------------------------------- + | + | This value is the name of your application. This value is used when the + | framework needs to place the application's name in a notification or + | any other location as required by the application or its packages. + | + */ + + 'name' => env('APP_NAME', 'Winter CMS'), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Asset URL + |-------------------------------------------------------------------------- + | + | This URL is used to properly generate URLs for assets, including + | URLs generated by the `| theme` & `| asset` filters in Twig, or the + | `Url::asset()` & `asset()` helpers. If set to null, the URL used will + | be the current hostname or `app.url` config. + | + | 'asset_url' => 'https://cdn.example.com/', + | + */ + + 'asset_url' => env('ASSET_URL', null), + + /* + |-------------------------------------------------------------------------- + | Temporary Path + |-------------------------------------------------------------------------- + | + | This is used to set the application's temporary path. Normally this value + | is set automatically by the application, however on some systems you + | may need to change it (Laravel Vapor / read-only systems: /tmp). + | + */ + + 'tempPath' => env('APP_TEMP_PATH', null), + + /* + |-------------------------------------------------------------------------- + | Trusted hosts + |-------------------------------------------------------------------------- + | + | You may specify valid hosts for your application as an array or boolean + | below. This helps prevent host header poisoning attacks. + | + | Possible values: + | - `true`: Trust the host specified in app.url, as well as the "www" + | subdomain, if applicable. + | - `false`: Disable the trusted hosts feature. + | - array: Defines the domains to be trusted hosts. Each item should be + | a string defining a domain, IP address, or a regex pattern. + | + | Example of array values: + | + | 'trustedHosts' => [ + | 'example.com', // Matches just example.com + | 'www.example.com', // Matches just www.example.com + | '^(.+\.)?example\.com$', // Matches example.com and all subdomains + | 'https://example.com', // Matches just example.com + | ], + | + | NOTE: Even when set to `false`, this functionality is explicitly enabled + | on the Backend password reset flow for security reasons. + */ + + 'trustedHosts' => false, + + /* + |-------------------------------------------------------------------------- + | Trusted proxies + |-------------------------------------------------------------------------- + | + | You may specify valid proxies for your application, in order for URLs + | and requests to be presented as the proxy address should you request + | a URL through the proxy. + | + | Possible values: + | - `null` or `false`: Do not trust any proxies + | - `'*'`: Trust all proxies + | - string: A single or comma-separated list of proxies to trust + | - array: An array of proxies to trust + | + | Examples: + | - To trust any proxy (i.e. a single proxy with an unknown IP address): + | + | 'trustedProxies' => '*', + | + | - To trust all proxies (i.e. AWS ELB behind CloudFront): + | + | 'trustedProxies' => '**', + | + | - To trust two IP addresses as proxies + | + | 'trustedProxies' => '192.168.1.1, 192.168.1.2', + | 'trustedProxies' => ['192.168.1.1', '192.168.1.2'], + */ + + 'trustedProxies' => null, + + /* + |-------------------------------------------------------------------------- + | Trusted proxy headers + |-------------------------------------------------------------------------- + | + | In addition to the above, you can also determine which headers to trust + | from your proxy when rewriting the request. This is an integer map value + | so you may specify more than one value. + | + | Possible values: + | - 'HEADER_X_FORWARDED_ALL' - trust all forwarded headers + | - Illuminate\Http\Request::HEADER_X_FORWARDED_FOR - trust only the proxy IP + | - Illuminate\Http\Request::HEADER_X_FORWARDED_HOST - trust only the proxy hostname + | - Illuminate\Http\Request::HEADER_X_FORWARDED_PORT - trust only the proxy port + | - Illuminate\Http\Request::HEADER_X_FORWARDED_PROTO - trust only the proxy protocol + | - Illuminate\Http\Request::HEADER_X_FORWARDED_PREFIX - trust only the proxy prefix + | - Illuminate\Http\Request::HEADER_X_FORWARDED_AWS_ELB - trust Amazon Elastic Load Balancing headers + | - Illuminate\Http\Request::HEADER_X_FORWARDED_TRAEFIK - trust Traefik reverse proxy headers + | + | Examples: + | - To trust only the hostname, use the following: + | + | 'trustedProxyHeaders' => Illuminate\Http\Request::HEADER_X_FORWARDED_HOST + | + | - For trusting all except the protocol, you can use the following: + | + | 'trustedProxyHeaders' => Illuminate\Http\Request::HEADER_X_FORWARDED_FOR + | | Illuminate\Http\Request::HEADER_X_FORWARDED_HOST + | | Illuminate\Http\Request::HEADER_X_FORWARDED_PORT + | + | - Amazon ELB users should always use the "HEADER_X_FORWARDED_AWS_ELB" option. + */ + + 'trustedProxyHeaders' => 'HEADER_X_FORWARDED_ALL', + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + | + | -------- STOP! -------- + | Before you change this value, consider carefully if that is actually + | what you want to do. It is HIGHLY recommended that this is always set + | to UTC (as your server & DB timezone should be as well) and instead you + | use cms.backendTimezone to set the default timezone used in the backend + | to display dates & times. + | + */ + + 'timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Scheduler Timezone + |-------------------------------------------------------------------------- + | + | This property specifies the default timezone for your application's + | scheduled tasks. You can set it independently of the application's + | default timezone to ensure that schedules run at the desired local time. + | + */ + + 'schedule_timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + | WARNING: Avoid setting this to a locale that is not supported by the + | backend yet, as this can cause issues in the backend. + | + | Currently supported backend locales are listed in + | Backend\Models\Preference->getLocaleOptions() + | + */ + + 'locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Faker Locale + |-------------------------------------------------------------------------- + | + | This locale will be used by the Faker PHP library when generating fake + | data for your database seeds. For example, this will be used to get + | localized telephone numbers, street address information and more. + | + */ + + 'faker_locale' => 'en_US', + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + */ + + 'key' => env('APP_KEY'), + 'cipher' => 'AES-256-CBC', + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => array_merge(include(base_path('modules/system/providers.php')), [ + + // 'Illuminate\Html\HtmlServiceProvider', // Example + + System\ServiceProvider::class, + ]), + + /* + |-------------------------------------------------------------------------- + | Load automatically discovered packages + |-------------------------------------------------------------------------- + | + | By default, Winter CMS disables the loading of discovered packages + | through Laravel's package discovery service, in order to allow packages + | used by plugins to be disabled if the plugin itself is disabled. + | + | Set this to `true` to enable automatic loading of these packages. This + | will result in packages being loaded, even if the plugin using them is + | disabled. This is NOT RECOMMENDED. + | + | Please note that packages defined in `app.providers` will still be loaded + | even if discovery is disabled. + | + */ + + 'loadDiscoveredPackages' => false, + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => array_merge(include(base_path('modules/system/aliases.php')), [ + // 'Str' => 'Illuminate\Support\Str', // Example + ]), +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..846e31a --- /dev/null +++ b/config/auth.php @@ -0,0 +1,41 @@ + [ + + /* + |-------------------------------------------------------------------------- + | Enable throttling of Backend authentication attempts + |-------------------------------------------------------------------------- + | + | If set to true, users will be given a limited number of attempts to sign + | in to the Backend before being blocked for a specified number of minutes. + | + */ + + 'enabled' => true, + + /* + |-------------------------------------------------------------------------- + | Failed Authentication Attempt Limit + |-------------------------------------------------------------------------- + | + | Number of failed attempts allowed while trying to authenticate a user. + | + */ + + 'attemptLimit' => 5, + + /* + |-------------------------------------------------------------------------- + | Suspension Time + |-------------------------------------------------------------------------- + | + | The number of minutes to suspend further attempts on authentication once + | the attempt limit is reached. + | + */ + + 'suspensionTime' => 15, + ], +]; diff --git a/config/broadcasting.php b/config/broadcasting.php new file mode 100644 index 0000000..948f010 --- /dev/null +++ b/config/broadcasting.php @@ -0,0 +1,60 @@ + env('BROADCAST_DRIVER', 'null'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + 'pusher' => [ + 'app_id' => env('PUSHER_APP_ID'), + 'client_options' => [ + // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html + ], + 'driver' => 'pusher', + 'key' => env('PUSHER_APP_KEY'), + 'options' => [ + 'cluster' => env('PUSHER_APP_CLUSTER'), + 'useTLS' => true, + ], + 'secret' => env('PUSHER_APP_SECRET'), + ], + 'ably' => [ + 'driver' => 'ably', + 'key' => env('ABLY_KEY'), + ], + 'redis' => [ + 'connection' => 'default', + 'driver' => 'redis', + ], + 'log' => [ + 'driver' => 'log', + ], + 'null' => [ + 'driver' => 'null', + ], + ], +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..c689a4b --- /dev/null +++ b/config/cache.php @@ -0,0 +1,139 @@ + env('CACHE_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "apc", "array", "database", "file", + | "memcached", "redis", "dynamodb", "octane", "null" + | + */ + + 'stores' => [ + 'apc' => [ + 'driver' => 'apc', + ], + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + 'database' => [ + 'connection' => null, + 'driver' => 'database', + 'lock_connection' => null, + 'table' => 'cache', + ], + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache'), + ], + 'memcached' => [ + 'driver' => 'memcached', + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + 'redis' => [ + 'connection' => 'cache', + 'driver' => 'redis', + 'lock_connection' => 'default', + ], + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'endpoint' => env('DYNAMODB_ENDPOINT'), + 'key' => env('AWS_ACCESS_KEY_ID'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + ], + 'octane' => [ + 'driver' => 'octane', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing a RAM based store such as APC or Memcached, there might + | be other applications utilizing the same cache. So, we'll specify a + | value to get prefixed to all our keys so we can avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', str_slug(env('APP_NAME', 'winter'), '_') . '_cache'), + + /* + |-------------------------------------------------------------------------- + | Cache Key for the CMS' PHP code parser cache + |-------------------------------------------------------------------------- + | + | This option controls the cache key used by the CMS when storing generated + | PHP from the theme PHP sections. Recommended to change this when multiple + | servers running Winter CMS are connected to the same cache server to + | prevent conflicts. + | + */ + + 'codeParserDataCacheKey' => 'cms-php-file-data', + + /* + |-------------------------------------------------------------------------- + | Disable Request Cache + |-------------------------------------------------------------------------- + | + | The request cache stores cache retrievals from the cache store + | in memory to speed up consecutive retrievals within the same request. + | + | true - always disable this in-memory request cache + | + | false - always enable; be aware that long-running console commands + | (including queue workers) may retain cache entries in memory that + | have been changed in other processes or would have otherwise + | expired, causing issues with the `queue:restart` command, for + | example + | + | null - enable for HTTP requests, disable when running in CLI + | + */ + + 'disableRequestCache' => null, +]; diff --git a/config/cms.php b/config/cms.php new file mode 100644 index 0000000..f604eb9 --- /dev/null +++ b/config/cms.php @@ -0,0 +1,476 @@ + 'vivespos', + + /* + |-------------------------------------------------------------------------- + | Bleeding edge updates + |-------------------------------------------------------------------------- + | + | If you are developing with Winter, it is important to have the latest + | code base. Set this value to 'true' to tell the platform to download + | and use the development copies of core files and plugins. + | + */ + + 'edgeUpdates' => false, + + /* + |-------------------------------------------------------------------------- + | Back-end URI prefix + |-------------------------------------------------------------------------- + | + | Specifies the URL name used for accessing back-end pages. + | For example: backend -> http://localhost/backend + | + */ + + 'backendUri' => 'backend', + + /* + |-------------------------------------------------------------------------- + | Back-end force HTTPS security + |-------------------------------------------------------------------------- + | + | Use this setting to force a secure protocol when accessing any back-end + | pages, including the authentication pages. This is usually handled by + | web server config, but can be handled by the app for added security. + | + */ + + 'backendForceSecure' => false, + + /* + |-------------------------------------------------------------------------- + | Back-end login remember + |-------------------------------------------------------------------------- + | + | Define live duration of backend sessions: + | + | true - session never expire (cookie expiration in 5 years) + | + | false - session have a limited time (see session.lifetime) + | + | null - The form login display a checkbox that allow user to choose + | wanted behavior + | + */ + + 'backendForceRemember' => true, + + /* + |-------------------------------------------------------------------------- + | Back-end timezone + |-------------------------------------------------------------------------- + | + | This acts as the default setting for a back-end user's timezone. This can + | be changed by the user at any time using the backend preferences. All + | dates displayed in the back-end will be converted to this timezone. + | + */ + + 'backendTimezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Back-end Skin + |-------------------------------------------------------------------------- + | + | Specifies the back-end skin to use. + | + */ + + 'backendSkin' => \Backend\Skins\Standard::class, + + /* + |-------------------------------------------------------------------------- + | Automatically run migrations on login + |-------------------------------------------------------------------------- + | + | If value is true, UpdateManager will be run on logging in to the backend. + | It's recommended to set this value to 'null' in production enviroments + | because it clears the cache every time a user logs in to the backend. + | If set to null, this setting is enabled when debug mode (app.debug) is enabled + | and disabled when debug mode is disabled. + | + */ + + 'runMigrationsOnLogin' => null, + + /* + |-------------------------------------------------------------------------- + | Determines which modules to load + |-------------------------------------------------------------------------- + | + | Specify which modules should be registered when using the application. + | + */ + + 'loadModules' => [ + 'System', + 'Backend', + 'Cms', + ], + + /* + |-------------------------------------------------------------------------- + | Prevents application updates + |-------------------------------------------------------------------------- + | + | If using composer or git to download updates to the core files, set this + | value to 'true' to prevent the update gateway from trying to download + | these files again as part of the application update process. Plugins + | and themes will still be downloaded. + | + */ + + 'disableCoreUpdates' => false, + + /* + |-------------------------------------------------------------------------- + | Specific plugins to disable + |-------------------------------------------------------------------------- + | + | Specify plugin codes which will always be disabled in the application. + | + */ + + 'disablePlugins' => [], + + /* + |-------------------------------------------------------------------------- + | Determines if the routing caching is enabled. + |-------------------------------------------------------------------------- + | + | If the caching is enabled, the page URL map is saved in the cache. If a page + | URL was changed on the disk, the old URL value could be still saved in the cache. + | To update the cache the back-end Clear Cache feature should be used. It is recommended + | to disable the caching during the development, and enable it in the production mode. + | + */ + + 'enableRoutesCache' => env('ROUTES_CACHE', false), + + /* + |-------------------------------------------------------------------------- + | Time to live for the URL map. + |-------------------------------------------------------------------------- + | + | The URL map used in the CMS page routing process. By default + | the map is updated every time when a page is saved in the back-end or when the + | interval, in minutes, specified with the urlMapCacheTTL parameter expires. + | + */ + + 'urlCacheTtl' => 10, + + /* + |-------------------------------------------------------------------------- + | Time to live for parsed CMS objects. + |-------------------------------------------------------------------------- + | + | Specifies the number of minutes the CMS object cache lives. After the interval + | is expired item are re-cached. Note that items are re-cached automatically when + | the corresponding template file is modified. + | + */ + + 'parsedPageCacheTTL' => 10, + + /* + |-------------------------------------------------------------------------- + | Determines if the asset caching is enabled. + |-------------------------------------------------------------------------- + | + | If the caching is enabled, combined assets are cached. If a asset file + | is changed on the disk, the old file contents could be still saved in the cache. + | To update the cache the back-end Clear Cache feature should be used. It is recommended + | to disable the caching during the development, and enable it in the production mode. + | + */ + + 'enableAssetCache' => env('ASSET_CACHE', false), + + /* + |-------------------------------------------------------------------------- + | Determines if the asset minification is enabled. + |-------------------------------------------------------------------------- + | + | If the minification is enabled, combined assets are compressed (minified). + | It is recommended to disable the minification during development, and + | enable it in production mode. If set to null, assets are minified + | when debug mode (app.debug) is disabled. + | + */ + + 'enableAssetMinify' => null, + + /* + |-------------------------------------------------------------------------- + | Check import timestamps when combining assets + |-------------------------------------------------------------------------- + | + | If deep hashing is enabled, the combiner cache will be reset when a change + | is detected on imported files, in addition to those referenced directly. + | This will cause slower page performance. If set to null, deep hashing + | is used when debug mode (app.debug) is enabled. + | + */ + + 'enableAssetDeepHashing' => null, + + /* + |-------------------------------------------------------------------------- + | Database-driven Themes + |-------------------------------------------------------------------------- + | + | Stores theme templates in the database instead of the filesystem. + | + | false - All theme templates are sourced from the filesystem. + | + | true - Source theme templates from the database with fallback to the filesytem. + | + | null - Setting equal to the inverse of app.debug: debug enabled, this disabled. + | + | The database layer stores all modified CMS files in the database. Files that are + | not modified continue to be loaded from the filesystem. The `theme:sync $themeDir` + | console command is available to populate the database from the filesystem with + | the `--toFile` flag to sync in the other direction (database to filesystem) and + | the `--paths="/path/to/file.md,/path/to/file2.md" flag to sync only specific files. + | + | Files modified in the database are cached to indicate that they should be loaded + | from the database. + | + */ + + 'databaseTemplates' => env('DATABASE_TEMPLATES', false), + + /* + |-------------------------------------------------------------------------- + | Public plugins path + |-------------------------------------------------------------------------- + | + | Specifies the public plugins path relative to the application base URL, + | or you can specify a full URL path. + | + */ + + 'pluginsPath' => '/plugins', + + /* + |-------------------------------------------------------------------------- + | Public themes path + |-------------------------------------------------------------------------- + | + | Specifies the public themes path relative to the application base URL, + | or you can specify a full URL path. + | + */ + + 'themesPath' => '/themes', + + /* + |-------------------------------------------------------------------------- + | Resource storage + |-------------------------------------------------------------------------- + | + | Specifies the configuration for resource storage, such as media and + | upload files. These resources are used: + | + | media - generated by the media manager. + | uploads - generated by attachment model relationships. + | resized - generated by System\Classes\ImageResizer or the resize() Twig filter + | + | For each resource you can specify: + | + | disk - filesystem disk, as specified in filesystems.php config. + | folder - a folder prefix for storing all generated files inside. + | path - the public path relative to the application base URL, + | or you can specify a full URL path. + | + | Optionally, you can specify how long temporary URLs to protected files + | in cloud storage (ex. AWS, RackSpace) are valid for by setting + | temporaryUrlTTL to a value in seconds to define a validity period. This + | is only used for the 'uploads' config when using a supported cloud disk + | + | NOTE: If you have installed Winter in a subfolder, are using local + | storage and are not using a linkPolicy of 'force' you should include + | the path to the subfolder in the `path` option for these storage + | configurations. + | + | Example: Winter is installed under https://localhost/projects/winter. + | You should then specify `/projects/winter/storage/app/uploads` as the + | path for the uploads disk and `/projects/winter/storage/app/media` as + | the path for the media disk. + */ + + 'storage' => [ + 'uploads' => [ + 'disk' => 'local', + 'folder' => 'uploads', + 'path' => '/storage/app/uploads', + 'temporaryUrlTTL' => 3600, + ], + 'media' => [ + 'disk' => 'local', + 'folder' => 'media', + 'path' => '/storage/app/media', + ], + 'resized' => [ + 'disk' => 'local', + 'folder' => 'resized', + 'path' => '/storage/app/resized', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Convert Line Endings + |-------------------------------------------------------------------------- + | + | Determines if Winter should convert line endings from the windows style + | \r\n to the unix style \n. + | + */ + + 'convertLineEndings' => false, + + /* + |-------------------------------------------------------------------------- + | Linking policy + |-------------------------------------------------------------------------- + | + | Controls how URL links are generated throughout the application. + | + | detect - detect hostname and use the current schema + | secure - detect hostname and force HTTPS schema + | insecure - detect hostname and force HTTP schema + | force - force hostname and schema using app.url config value + | + | NOTE: force will ensure that the app.url value is used as the host for + | urls generated through the URL helpers which might have unintended + | consequences for projects that support multiple hostnames. + | + */ + + 'linkPolicy' => env('LINK_POLICY', 'detect'), + + /* + |-------------------------------------------------------------------------- + | Default permission mask + |-------------------------------------------------------------------------- + | + | Specifies a default file and folder permission for newly created objects. + | + */ + + 'defaultMask' => [ + 'file' => null, + 'folder' => null, + ], + + /* + |-------------------------------------------------------------------------- + | Safe mode + |-------------------------------------------------------------------------- + | + | If safe mode is enabled, the PHP code section is disabled in the CMS + | for security reasons. If set to null, safe mode is enabled when + | debug mode (app.debug) is disabled. + | + */ + + 'enableSafeMode' => null, + + /* + |-------------------------------------------------------------------------- + | Cross Site Request Forgery (CSRF) Protection + |-------------------------------------------------------------------------- + | + | If the CSRF protection is enabled, all "postback" & AJAX requests are + | checked for a valid security token. + | + */ + + 'enableCsrfProtection' => env('ENABLE_CSRF', true), + + /* + |-------------------------------------------------------------------------- + | Force bytecode invalidation + |-------------------------------------------------------------------------- + | + | When using OPcache with opcache.validate_timestamps set to 0 or APC + | with apc.stat set to 0 and Twig cache enabled, clearing the template + | cache won't update the cache, set to true to get around this. + | + */ + + 'forceBytecodeInvalidation' => true, + + /* + |-------------------------------------------------------------------------- + | Twig Strict Variables + |-------------------------------------------------------------------------- + | + | If strict_variables is disabled, Twig will silently ignore invalid + | variables (variables and or attributes/methods that do not exist) and + | replace them with a null value. When enabled, Twig throws an exception + | instead. If set to null, it is enabled when debug mode (app.debug) is + | enabled. + | + */ + + 'enableTwigStrictVariables' => false, + + /* + |-------------------------------------------------------------------------- + | Base Directory Restriction + |-------------------------------------------------------------------------- + | + | Restricts loading backend template and config files to within the base + | directory of the application. + | + | WARNING: This should always be enabled for security reasons. However, in + | some cases you may need to disable this; for instance when developing + | plugins that are stored elsewhere in the filesystem for organizational + | reasons and then symlinked into the application plugins/ directory. + | + | NEVER have this disabled in production. + | + */ + + 'restrictBaseDir' => env('RESTRICT_BASE_DIR', true), + + /* + |-------------------------------------------------------------------------- + | Backend Service Worker + |-------------------------------------------------------------------------- + | + | Allow plugins to run Service Workers in the backend. + | + | WARNING: This should always be disabled for security reasons as Service + | Workers can be hijacked and used to run XSS into the backend. Turning + | this feature on can create a conflict if you have a frontend Service + | Worker running. The 'scope' needs to be correctly set and not have a + | duplicate subfolder structure on the frontend, otherwise it will run + | on both the frontend and backend of your website. + | + | true - allow service workers to run in the backend + | + | false - disallow service workers to run in the backend + | + */ + + 'enableBackendServiceWorkers' => false, +]; diff --git a/config/cookie.php b/config/cookie.php new file mode 100644 index 0000000..654d29d --- /dev/null +++ b/config/cookie.php @@ -0,0 +1,20 @@ + [ + // 'my_cookie', + ], +]; diff --git a/config/cors.php b/config/cors.php new file mode 100644 index 0000000..6d9d75c --- /dev/null +++ b/config/cors.php @@ -0,0 +1,34 @@ + [], + + 'allowed_methods' => ['*'], + + 'allowed_origins' => ['*'], + + 'allowed_origins_patterns' => [], + + 'allowed_headers' => ['*'], + + 'exposed_headers' => [], + + 'max_age' => 0, + + 'supports_credentials' => false, + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..f57e26a --- /dev/null +++ b/config/database.php @@ -0,0 +1,133 @@ + env('DB_CONNECTION', 'mysql'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Winter CMS is shown below to make development simple. + | + | All database work in Winter CMS is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + 'sqlite' => [ + 'database' => env('DB_DATABASE', storage_path('database.sqlite')), + 'driver' => 'sqlite', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + 'prefix' => '', + 'url' => env('DATABASE_URL'), + ], + 'mysql' => [ + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'database' => env('DB_DATABASE', 'winter'), + 'driver' => 'mysql', + 'engine' => 'InnoDB', + 'host' => env('DB_HOST', '127.0.0.1'), + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + 'password' => env('DB_PASSWORD', ''), + 'port' => env('DB_PORT', '3306'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'unix_socket' => env('DB_SOCKET', ''), + 'url' => env('DATABASE_URL'), + 'username' => env('DB_USERNAME', 'winter'), + ], + 'pgsql' => [ + 'charset' => 'utf8', + 'database' => env('DB_DATABASE', 'winter'), + 'driver' => 'pgsql', + 'host' => env('DB_HOST', '127.0.0.1'), + 'password' => env('DB_PASSWORD', ''), + 'port' => env('DB_PORT', '5432'), + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + 'url' => env('DATABASE_URL'), + 'username' => env('DB_USERNAME', 'winter'), + ], + 'sqlsrv' => [ + 'charset' => 'utf8', + 'database' => env('DB_DATABASE', 'winter'), + 'driver' => 'sqlsrv', + 'host' => env('DB_HOST', '127.0.0.1'), + 'password' => env('DB_PASSWORD', ''), + 'port' => env('DB_PORT', '1433'), + 'prefix' => '', + 'prefix_indexes' => true, + 'url' => env('DATABASE_URL'), + 'username' => env('DB_USERNAME', 'winter'), + ], + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as APC or Memcached. Winter makes it easy to dig right in. + | + */ + + 'redis' => [ + 'client' => env('REDIS_CLIENT', 'phpredis'), + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', str_slug(env('APP_NAME', 'winter'), '_') . '_database_'), + ], + 'default' => [ + 'database' => env('REDIS_DB', '0'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'url' => env('REDIS_URL'), + ], + 'cache' => [ + 'database' => env('REDIS_CACHE_DB', '1'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'url' => env('REDIS_URL'), + ], + ], +]; diff --git a/config/dev/.gitignore b/config/dev/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/config/dev/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/config/develop.php b/config/develop.php new file mode 100644 index 0000000..2d31619 --- /dev/null +++ b/config/develop.php @@ -0,0 +1,58 @@ + false, + + /* + |-------------------------------------------------------------------------- + | Allow deep-level symlinks + |-------------------------------------------------------------------------- + | + | Winter CMS, by default, will allow symlinks within the first level of + | subdirectories. When this feature is enabled, the system will allow + | symlinks to be used at any directory level. This can be useful for + | symlinking individual plugins or themes. + | + | Please note that this has a negative effect on performance. This feature + | abides by "cms.restrictBaseDir" - if enabled, symlinks cannot point to + | resources outside of the root folder. + | + | true - allow symlinks at any level + | + | false - only allow symlinks at the first level of subdirectories (default) + | + */ + + 'allowDeepSymlinks' => false, + + /* + |-------------------------------------------------------------------------- + | Enable Snowboard debugging + |-------------------------------------------------------------------------- + | + | By default, Snowboard debugging and client-side logging is disabled. + | + | If you wish to enable Snowboard debugging, set this value to `true`. + | + */ + + 'debugSnowboard' => env('DEBUG_SNOWBOARD', false), +]; diff --git a/config/environment.php b/config/environment.php new file mode 100644 index 0000000..caa9f65 --- /dev/null +++ b/config/environment.php @@ -0,0 +1,32 @@ + 'development', + + /* + |-------------------------------------------------------------------------- + | Environment Multitenancy + |-------------------------------------------------------------------------- + | + | You may specify a different environment according to the hostname that + | is provided with the HTTP request. This is useful if you want to use + | different configuration, such as database and theme, per hostname. + | + */ + + 'hosts' => [ + 'localhost' => 'dev', + ], +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000..64cd176 --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,53 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been setup for each driver as an example of the required options. + | + | Supported Drivers: "local", "ftp", "sftp", "s3" + | + | NOTE: s3's stream_uploads option requires the Winter.DriverAWS plugin + | to be installed and enabled. + | + */ + + 'disks' => [ + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + 'url' => '/storage/app', + 'visibility' => 'public', + ], + 's3' => [ + 'bucket' => env('AWS_BUCKET'), + 'driver' => 's3', + 'endpoint' => env('AWS_ENDPOINT'), + 'key' => env('AWS_ACCESS_KEY_ID'), + 'region' => env('AWS_DEFAULT_REGION'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'stream_uploads' => env('AWS_S3_STREAM_UPLOADS', false), + 'url' => env('AWS_URL'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + ], + ], +]; diff --git a/config/hashing.php b/config/hashing.php new file mode 100644 index 0000000..ad56664 --- /dev/null +++ b/config/hashing.php @@ -0,0 +1,51 @@ + 'bcrypt', + + /* + |-------------------------------------------------------------------------- + | Bcrypt Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Bcrypt algorithm. This will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'bcrypt' => [ + 'rounds' => env('BCRYPT_ROUNDS', 10), + ], + + /* + |-------------------------------------------------------------------------- + | Argon Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Argon algorithm. These will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'argon' => [ + 'memory' => 65536, + 'threads' => 1, + 'time' => 4, + ], +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..415941e --- /dev/null +++ b/config/logging.php @@ -0,0 +1,107 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Winter uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'channels' => [ + 'single', + ], + 'driver' => 'stack', + 'ignore_exceptions' => false, + ], + 'single' => [ + 'driver' => 'single', + 'level' => env('LOG_LEVEL', 'debug'), + 'path' => storage_path('logs/system.log'), + ], + 'daily' => [ + 'days' => 14, + 'driver' => 'daily', + 'level' => env('LOG_LEVEL', 'debug'), + 'path' => storage_path('logs/system.log'), + ], + 'slack' => [ + 'driver' => 'slack', + 'emoji' => ':boom:', + 'level' => env('LOG_LEVEL', 'critical'), + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Winter Log', + ], + 'papertrail' => [ + 'driver' => 'monolog', + 'handler' => env('LOG_PAPERTRAIL_HANDLER', \Monolog\Handler\SyslogUdpHandler::class), + 'handler_with' => [ + 'connectionString' => 'tls://' . env('PAPERTRAIL_URL') . ':' . env('PAPERTRAIL_PORT'), + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + ], + 'level' => env('LOG_LEVEL', 'debug'), + ], + 'stderr' => [ + 'driver' => 'monolog', + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'handler' => \Monolog\Handler\StreamHandler::class, + 'level' => env('LOG_LEVEL', 'debug'), + 'with' => [ + 'stream' => 'php://stderr', + ], + ], + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + ], + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + ], + 'null' => [ + 'driver' => 'monolog', + 'handler' => \Monolog\Handler\NullHandler::class, + ], + 'emergency' => [ + 'path' => storage_path('logs/system.log'), + ], + ], +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000..a297c11 --- /dev/null +++ b/config/mail.php @@ -0,0 +1,92 @@ + env('MAIL_MAILER', 'smtp'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Winter supports a variety of mail "transport" drivers to be used while + | sending an e-mail. You will specify which one you are using for your + | mailers below. You are free to add additional mailers as required. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", + | "postmark", "log", "array", "failover" + | + */ + + 'mailers' => [ + 'smtp' => [ + 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), + 'password' => env('MAIL_PASSWORD'), + 'port' => env('MAIL_PORT', 587), + 'timeout' => null, + 'transport' => 'smtp', + 'username' => env('MAIL_USERNAME'), + ], + 'ses' => [ + 'transport' => 'ses', + ], + 'mailgun' => [ + 'transport' => 'mailgun', + ], + 'postmark' => [ + 'transport' => 'postmark', + ], + 'mail' => [ + 'transport' => 'mail', + ], + 'sendmail' => [ + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -t -i'), + 'transport' => 'sendmail', + ], + 'log' => [ + 'channel' => env('MAIL_LOG_CHANNEL'), + 'transport' => 'log', + ], + 'array' => [ + 'transport' => 'array', + ], + 'failover' => [ + 'mailers' => [ + 'smtp', + 'log', + ], + 'transport' => 'failover', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'noreply@example.com'), + 'name' => env('MAIL_FROM_NAME', env('APP_NAME', 'Winter CMS')), + ], +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000..7115084 --- /dev/null +++ b/config/queue.php @@ -0,0 +1,102 @@ + env('QUEUE_CONNECTION', 'sync'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection information for each server that + | is used by your application. A default configuration has been added + | for each back-end shipped with Winter. You are free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + 'sync' => [ + 'driver' => 'sync', + ], + 'database' => [ + 'after_commit' => false, + 'driver' => 'database', + 'queue' => 'default', + 'retry_after' => 90, + 'table' => 'jobs', + ], + 'beanstalkd' => [ + 'after_commit' => false, + 'block_for' => 0, + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'retry_after' => 90, + ], + 'sqs' => [ + 'after_commit' => false, + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'suffix' => env('SQS_SUFFIX'), + ], + 'redis' => [ + 'after_commit' => false, + 'block_for' => null, + 'connection' => 'default', + 'driver' => 'redis', + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => 90, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control which database and table are used to store the jobs that + | have failed. You may change them to any database / table you wish. + | + */ + + 'failed' => [ + 'database' => env('DB_CONNECTION', 'mysql'), + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'table' => 'failed_jobs', + ], +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..fd9b6e0 --- /dev/null +++ b/config/services.php @@ -0,0 +1,30 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), + 'secret' => env('MAILGUN_SECRET'), + ], + 'postmark' => [ + 'token' => env('POSTMARK_TOKEN'), + ], + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + ], +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..2137951 --- /dev/null +++ b/config/session.php @@ -0,0 +1,216 @@ + env('SESSION_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to immediately expire on the browser closing, set that option. + | + */ + + 'lifetime' => env('SESSION_LIFETIME', 120), + 'expire_on_close' => false, + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it is stored. All encryption will be run + | automatically by Laravel and you can use the Session like normal. + | + */ + + 'encrypt' => false, + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When using the native session driver, we need a location where session + | files may be stored. A default has been set for you but a different + | location may be specified. This is only needed for file sessions. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table we + | should use to manage the sessions. Of course, a sensible default is + | provided for you; however, you are free to change this as needed. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | While using one of the framework's cache driven session backends you may + | list a cache store that should be used for these sessions. This value + | must match with one of the application's configured cache "stores". + | + | Affects: "apc", "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [ + 2, + 100, + ], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the cookie used to identify a session + | instance by ID. The name specified here will get used every time a + | new session cookie is created by the framework for every driver. + | + */ + + 'cookie' => env('SESSION_COOKIE', str_slug(env('APP_NAME', 'winter'), '_') . '_session'), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application but you are free to change this when necessary. + | + */ + + 'path' => '/', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | Here you may change the domain of the cookie used to identify a session + | in your application. This will determine which domains the cookie is + | available to in your application. A sensible default has been set. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. You are free to modify this option if needed. + | + */ + + 'http_only' => true, + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE', false), + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" since this is a secure default value. + | + | Cookies that match the domain of the current site, i.e. what's displayed + | in the browser's address bar, are referred to as first-party cookies. + | Similarly, cookies from domains other than the current site are referred + | to as third-party cookies. + | + | Cookies without a SameSite attribute will be treated as `SameSite=lax`, + | meaning the default behaviour will be to restrict cookies to first party + | contexts only. + | + | Cookies for cross-site usage must specify `same_site` as 'None' and `secure` + | as `true` to work correctly. + | + | lax - Cookies are allowed to be sent with top-level navigations and will + | be sent along with GET request initiated by third party website. + | This is the default value in modern browsers. + | + | strict - Cookies will only be sent in a first-party context and not be + | sent along with requests initiated by third party websites. + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => 'lax', +]; diff --git a/config/testing/cms.php b/config/testing/cms.php new file mode 100644 index 0000000..f8660bb --- /dev/null +++ b/config/testing/cms.php @@ -0,0 +1,182 @@ + 'test', + + /* + |-------------------------------------------------------------------------- + | Time to live for parsed CMS objects. + |-------------------------------------------------------------------------- + | + | Specifies the number of minutes the CMS object cache lives. After the interval + | is expired item are re-cached. Note that items are re-cached automatically when + | the corresponding template file is modified. + | + */ + + 'parsedPageCacheTTL' => 1440, + + /* + |-------------------------------------------------------------------------- + | Determines if the routing caching is enabled. + |-------------------------------------------------------------------------- + | + | If the caching is enabled, the page URL map is saved in the cache. If a page + | URL was changed on the disk, the old URL value could be still saved in the cache. + | To update the cache the back-end Clear Cache feature should be used. It is recommended + | to disable the caching during the development, and enable it in the production mode. + | + */ + + 'enableRoutesCache' => true, + + /* + |-------------------------------------------------------------------------- + | Time to live for the URL map. + |-------------------------------------------------------------------------- + | + | The URL map used in the CMS page routing process. By default + | the map is updated every time when a page is saved in the back-end or when the + | interval, in minutes, specified with the urlMapCacheTTL parameter expires. + | + */ + + 'urlCacheTtl' => 1, + + /* + |-------------------------------------------------------------------------- + | Determines if the asset caching is enabled. + |-------------------------------------------------------------------------- + | + | If the caching is enabled, combined assets are cached. If a asset file + | is changed on the disk, the old file contents could be still saved in the cache. + | To update the cache the back-end Clear Cache feature should be used. It is recommended + | to disable the caching during the development, and enable it in the production mode. + | + */ + + 'enableAssetCache' => false, + + /* + |-------------------------------------------------------------------------- + | Disables Twig caching for unit tests + |-------------------------------------------------------------------------- + */ + + 'twigNoCache' => true, + + /* + |-------------------------------------------------------------------------- + | Convert Line Endings + |-------------------------------------------------------------------------- + | + | Determines if Winter should convert line endings from the windows style + | \r\n to the unix style \n. + | + */ + + 'convertLineEndings' => true, + + /* + |-------------------------------------------------------------------------- + | Local plugins path + |-------------------------------------------------------------------------- + | + | Specifies the absolute local plugins path. + | + */ + + 'pluginsPathLocal' => base_path('modules/system/tests/fixtures/plugins'), + + /* + |-------------------------------------------------------------------------- + | Local themes path + |-------------------------------------------------------------------------- + | + | Specifies the absolute local themes path. + | + */ + + 'themesPathLocal' => base_path('modules/cms/tests/fixtures/themes'), + + /* + |-------------------------------------------------------------------------- + | Resource storage + |-------------------------------------------------------------------------- + | + | Specifies the configuration for resource storage, such as media and + | upload files. These resources are used: + | + | media - generated by the media manager. + | uploads - generated by attachment model relationships. + | resized - generated by System\Classes\ImageResizer or the resize() Twig filter + | + | For each resource you can specify: + | + | disk - filesystem disk, as specified in filesystems.php config. + | folder - a folder prefix for storing all generated files inside. + | path - the public path relative to the application base URL, + | or you can specify a full URL path. + | + | Optionally, you can specify how long temporary URLs to protected files + | in cloud storage (ex. AWS, RackSpace) are valid for by setting + | temporaryUrlTTL to a value in seconds to define a validity period. This + | is only used for the 'uploads' config when using a supported cloud disk + | + | NOTE: If you have installed Winter in a subfolder, are using local + | storage and are not using a linkPolicy of 'force' you should include + | the path to the subfolder in the `path` option for these storage + | configurations. + | + | Example: Winter is installed under https://localhost/projects/winter. + | You should then specify `/projects/winter/storage/app/uploads` as the + | path for the uploads disk and `/projects/winter/storage/app/media` as + | the path for the media disk. + */ + + 'storage' => [ + + 'uploads' => [ + 'disk' => 'local', + 'folder' => 'uploads', + 'path' => '/storage/tests/app/uploads', + 'temporaryUrlTTL' => 3600, + ], + + 'media' => [ + 'disk' => 'local', + 'folder' => 'media', + 'path' => '/storage/tests/app/media', + ], + + 'resized' => [ + 'disk' => 'local', + 'folder' => 'resized', + 'path' => '/storage/tests/app/resized', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cross Site Request Forgery (CSRF) Protection + |-------------------------------------------------------------------------- + | + | If the CSRF protection is enabled, all "postback" requests are checked + | for a valid security token. + | + */ + + 'enableCsrfProtection' => false, + +]; diff --git a/config/testing/filesystems.php b/config/testing/filesystems.php new file mode 100644 index 0000000..d7bf8bf --- /dev/null +++ b/config/testing/filesystems.php @@ -0,0 +1,64 @@ + 'local', + + /* + |-------------------------------------------------------------------------- + | Default Cloud Filesystem Disk + |-------------------------------------------------------------------------- + | + | Many applications store files both locally and in the cloud. For this + | reason, you may specify a default "cloud" driver here. This driver + | will be bound as the Cloud disk implementation in the container. + | + */ + + 'cloud' => 's3', + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been setup for each driver as an example of the required options. + | + | Supported Drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => base_path('storage/tests/app'), + 'url' => '/storage/tests/app', + ], + + 's3' => [ + 'driver' => 's3', + 'key' => '', + 'secret' => '', + 'region' => '', + 'bucket' => '', + // 'url' => env('AWS_URL'), + // 'endpoint' => env('AWS_ENDPOINT'), + ], + + ], + +]; diff --git a/config/view.php b/config/view.php new file mode 100644 index 0000000..63394f6 --- /dev/null +++ b/config/view.php @@ -0,0 +1,34 @@ + [ + // Default Laravel Blade template location + // @see https://github.com/octobercms/october/issues/3473 & https://github.com/octobercms/october/issues/3459 + // realpath(base_path('resources/views')) + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => env('VIEW_COMPILED_PATH', realpath(storage_path('framework/views'))), +]; diff --git a/index.php b/index.php new file mode 100644 index 0000000..3ce7b10 --- /dev/null +++ b/index.php @@ -0,0 +1,48 @@ +make(Illuminate\Contracts\Http\Kernel::class); + +$response = $kernel->handle( + $request = Illuminate\Http\Request::capture() +); + +$response->send(); + +$kernel->terminate($request, $response); diff --git a/modules/backend/.eslintignore b/modules/backend/.eslintignore new file mode 100644 index 0000000..b84f862 --- /dev/null +++ b/modules/backend/.eslintignore @@ -0,0 +1,17 @@ +# Ignore build files +**/node_modules/** +build/*.js +**/build/*.js +**/mix.webpack.js + +# Ignore all JS except for Mix-based assets +assets/js +assets/vendor +behaviors/**/*.js +controllers/**/*.js +formwidgets/**/*.js +reportwidgets/**/*.js +widgets/**/*.js + +# Ignore test fixtures +tests diff --git a/modules/backend/.eslintrc.json b/modules/backend/.eslintrc.json new file mode 100644 index 0000000..c625599 --- /dev/null +++ b/modules/backend/.eslintrc.json @@ -0,0 +1,45 @@ +{ + "env": { + "es6": true, + "browser": true + }, + "globals": { + "Snowboard": "writable" + }, + "extends": [ + "airbnb-base", + "plugin:vue/vue3-recommended" + ], + "ignorePatterns": [ + "assets/js", + "assets/vendor", + "behaviors/**/*.js", + "controllers/**/*.js", + "formwidgets/**/*.js", + "reportwidgets/**/*.js", + "widgets/**/*.js" + ], + "rules": { + "class-methods-use-this": ["off"], + "indent": ["error", 4, { + "SwitchCase": 1 + }], + "max-len": ["off"], + "new-cap": ["error", { "properties": false }], + "no-alert": ["off"], + "no-param-reassign": ["error", { + "props": false + }], + "vue/html-indent": ["error", 4], + "vue/html-self-closing": ["error", { + "html": { + "void": "never", + "normal": "any", + "component": "always" + }, + "svg": "always", + "math": "always" + }], + "vue/multi-word-component-names": ["off"] + } +} diff --git a/modules/backend/.gitignore b/modules/backend/.gitignore new file mode 100644 index 0000000..e75539d --- /dev/null +++ b/modules/backend/.gitignore @@ -0,0 +1,6 @@ +# Backend module ignores + +# Ignore Mix files +node_modules +package-lock.json +mix.webpack.js diff --git a/modules/backend/LICENSE b/modules/backend/LICENSE new file mode 100644 index 0000000..7b47a3b --- /dev/null +++ b/modules/backend/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2013-2021.03.01 October CMS +Copyright (c) 2021 Winter CMS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/modules/backend/README.md b/modules/backend/README.md new file mode 100644 index 0000000..bce0dcf --- /dev/null +++ b/modules/backend/README.md @@ -0,0 +1,5 @@ +# Winter CMS - Backend Module + +This repository is a read-only sub-split of the Winter CMS `Backend` module for use in Composer. Please note that we do not accept any pull requests to this repository. + +If you wish to make changes to this module, please submit them to the [main repository](https://github.com/wintercms/winter). diff --git a/modules/backend/ServiceProvider.php b/modules/backend/ServiceProvider.php new file mode 100644 index 0000000..9ff5e50 --- /dev/null +++ b/modules/backend/ServiceProvider.php @@ -0,0 +1,338 @@ +registerConsole(); + $this->registerMailer(); + $this->registerBackendPermissions(); + $this->registerBackendUserEvents(); + + /* + * Backend specific + */ + if ($this->app->runningInBackend()) { + $this->registerBackendNavigation(); + $this->registerBackendReportWidgets(); + $this->registerBackendWidgets(); + $this->registerBackendSettings(); + } + } + + /** + * Bootstrap the module events. + * + * @return void + */ + public function boot() + { + $this->registerAssetBundles(); + parent::boot('backend'); + } + + /** + * Register console commands + */ + protected function registerConsole() + { + $this->registerConsoleCommand('create.controller', \Backend\Console\CreateController::class); + $this->registerConsoleCommand('create.formwidget', \Backend\Console\CreateFormWidget::class); + $this->registerConsoleCommand('create.reportwidget', \Backend\Console\CreateReportWidget::class); + $this->registerConsoleCommand('user.create', \Backend\Console\UserCreate::class); + $this->registerConsoleCommand('winter.passwd', \Backend\Console\WinterPasswd::class); + } + + /** + * Register mail templates + */ + protected function registerMailer() + { + MailManager::instance()->registerCallback(function ($manager) { + $manager->registerMailTemplates([ + 'backend::mail.invite', + 'backend::mail.restore', + ]); + }); + } + + /** + * Register asset bundles + */ + protected function registerAssetBundles() + { + CombineAssets::registerCallback(function ($combiner) { + $combiner->registerBundle('~/modules/backend/assets/less/winter.less'); + $combiner->registerBundle('~/modules/backend/assets/js/winter.js'); + $combiner->registerBundle('~/modules/backend/widgets/table/assets/js/build.js'); + $combiner->registerBundle('~/modules/backend/assets/vendor/ace-codeeditor/build.js'); + $combiner->registerBundle('~/modules/backend/widgets/mediamanager/assets/js/mediamanager-browser.js'); + $combiner->registerBundle('~/modules/backend/widgets/mediamanager/assets/less/mediamanager.less'); + $combiner->registerBundle('~/modules/backend/widgets/reportcontainer/assets/less/reportcontainer.less'); + $combiner->registerBundle('~/modules/backend/widgets/table/assets/less/table.less'); + $combiner->registerBundle('~/modules/backend/formwidgets/repeater/assets/less/repeater.less'); + $combiner->registerBundle('~/modules/backend/formwidgets/fieldset/assets/less/fieldset.less'); + $combiner->registerBundle('~/modules/backend/formwidgets/fileupload/assets/less/fileupload.less'); + $combiner->registerBundle('~/modules/backend/formwidgets/nestedform/assets/less/nestedform.less'); + $combiner->registerBundle('~/modules/backend/formwidgets/richeditor/assets/js/build-plugins.js'); + $combiner->registerBundle('~/modules/backend/formwidgets/permissioneditor/assets/less/permissioneditor.less'); + $combiner->registerBundle('~/modules/backend/formwidgets/markdowneditor/assets/less/markdowneditor.less'); + + /* + * Rich Editor is protected by DRM + */ + if (file_exists(base_path('modules/backend/formwidgets/richeditor/assets/vendor/froala_drm'))) { + $combiner->registerBundle('~/modules/backend/formwidgets/richeditor/assets/less/richeditor.less'); + $combiner->registerBundle('~/modules/backend/formwidgets/richeditor/assets/js/build.js'); + } + }); + + PackageManager::registerCallback(function ($mix) { + $mix->registerPackage('module-backend.formwidgets.codeeditor', '~/modules/backend/formwidgets/codeeditor/assets/winter.mix.js'); + }); + } + + /* + * Register navigation + */ + protected function registerBackendNavigation() + { + BackendMenu::registerCallback(function ($manager) { + $manager->registerMenuItems('Winter.Backend', [ + 'dashboard' => [ + 'label' => 'backend::lang.dashboard.menu_label', + 'icon' => 'icon-dashboard', + 'iconSvg' => 'modules/backend/assets/images/dashboard-icon.svg', + 'url' => Backend::url('backend'), + 'permissions' => ['backend.access_dashboard'], + 'order' => 10 + ], + 'media' => [ + 'label' => 'backend::lang.media.menu_label', + 'icon' => 'icon-folder', + 'iconSvg' => 'modules/backend/assets/images/media-icon.svg', + 'url' => Backend::url('backend/media'), + 'permissions' => ['media.*'], + 'order' => 200 + ] + ]); + $manager->registerOwnerAlias('Winter.Backend', 'October.Backend'); + }); + } + + /* + * Register report widgets + */ + protected function registerBackendReportWidgets() + { + WidgetManager::instance()->registerReportWidgets(function ($manager) { + $manager->registerReportWidget(\Backend\ReportWidgets\Welcome::class, [ + 'label' => 'backend::lang.dashboard.welcome.widget_title_default', + 'context' => 'dashboard' + ]); + }); + } + + /* + * Register permissions + */ + protected function registerBackendPermissions() + { + BackendAuth::registerCallback(function ($manager) { + $manager->registerPermissions('Winter.Backend', [ + 'backend.access_dashboard' => [ + 'label' => 'system::lang.permissions.view_the_dashboard', + 'tab' => 'system::lang.permissions.name', + 'roles' => [UserRole::CODE_DEVELOPER, UserRole::CODE_PUBLISHER], + ], + 'backend.manage_default_dashboard' => [ + 'label' => 'system::lang.permissions.manage_default_dashboard', + 'tab' => 'system::lang.permissions.name', + 'comment' => 'system::lang.permissions.manage_default_dashboard_comment', + 'roles' => [UserRole::CODE_DEVELOPER], + ], + 'backend.manage_users' => [ + 'label' => 'system::lang.permissions.manage_other_administrators', + 'tab' => 'system::lang.permissions.name', + 'comment' => 'system::lang.permissions.manage_other_administrators_comment', + 'roles' => [UserRole::CODE_DEVELOPER], + ], + 'backend.impersonate_users' => [ + 'label' => 'system::lang.permissions.impersonate_users', + 'tab' => 'system::lang.permissions.name', + 'comment' => 'system::lang.permissions.impersonate_users_comment', + 'roles' => [UserRole::CODE_DEVELOPER], + ], + 'backend.manage_preferences' => [ + 'label' => 'system::lang.permissions.manage_preferences', + 'tab' => 'system::lang.permissions.name', + 'roles' => [UserRole::CODE_DEVELOPER, UserRole::CODE_PUBLISHER], + ], + 'backend.manage_editor' => [ + 'label' => 'system::lang.permissions.manage_editor', + 'tab' => 'system::lang.permissions.name', + 'comment' => 'system::lang.permissions.manage_editor_comment', + 'roles' => [UserRole::CODE_DEVELOPER], + ], + 'backend.manage_own_editor' => [ + 'label' => 'system::lang.permissions.manage_own_editor', + 'tab' => 'system::lang.permissions.name', + 'roles' => [UserRole::CODE_DEVELOPER, UserRole::CODE_PUBLISHER], + ], + 'backend.manage_branding' => [ + 'label' => 'system::lang.permissions.manage_branding', + 'tab' => 'system::lang.permissions.name', + 'comment' => 'system::lang.permissions.manage_branding_comment', + 'roles' => [UserRole::CODE_DEVELOPER], + ], + 'media.manage_media' => [ + 'label' => 'backend::lang.permissions.manage_media', + 'tab' => 'system::lang.permissions.name', + 'roles' => [UserRole::CODE_DEVELOPER, UserRole::CODE_PUBLISHER], + ], + 'backend.allow_unsafe_markdown' => [ + 'label' => 'backend::lang.permissions.allow_unsafe_markdown', + 'tab' => 'system::lang.permissions.name', + 'comment' => 'backend::lang.permissions.allow_unsafe_markdown_comment', + 'roles' => [UserRole::CODE_DEVELOPER], + ], + ]); + $manager->registerPermissionOwnerAlias('Winter.Backend', 'October.Backend'); + }); + } + + /** + * Register the backend user events + */ + protected function registerBackendUserEvents() + { + Event::listen('backend.user.login', function (\Backend\Models\User $user) { + // @TODO: Deprecate this, and only run migrations when it makes sense + $runMigrationsOnLogin = (bool) Config::get('cms.runMigrationsOnLogin', Config::get('app.debug', false)); + if ($runMigrationsOnLogin) { + try { + // Load version updates + UpdateManager::instance()->update(); + } catch (Exception $e) { + Flash::error($e->getMessage()); + } + } + + // Log the sign in event + AccessLog::add($user); + }); + } + + /* + * Register widgets + */ + protected function registerBackendWidgets() + { + WidgetManager::instance()->registerFormWidgets(function ($manager) { + $manager->registerFormWidget(\Backend\FormWidgets\CodeEditor::class, 'codeeditor'); + $manager->registerFormWidget(\Backend\FormWidgets\ColorPicker::class, 'colorpicker'); + $manager->registerFormWidget(\Backend\FormWidgets\DataTable::class, 'datatable'); + $manager->registerFormWidget(\Backend\FormWidgets\DatePicker::class, 'datepicker'); + $manager->registerFormWidget(\Backend\FormWidgets\FieldSet::class, 'fieldset'); + $manager->registerFormWidget(\Backend\FormWidgets\FileUpload::class, 'fileupload'); + $manager->registerFormWidget(\Backend\FormWidgets\IconPicker::class, 'iconpicker'); + $manager->registerFormWidget(\Backend\FormWidgets\MarkdownEditor::class, 'markdown'); + $manager->registerFormWidget(\Backend\FormWidgets\MediaFinder::class, 'mediafinder'); + $manager->registerFormWidget(\Backend\FormWidgets\NestedForm::class, 'nestedform'); + $manager->registerFormWidget(\Backend\FormWidgets\RecordFinder::class, 'recordfinder'); + $manager->registerFormWidget(\Backend\FormWidgets\Relation::class, 'relation'); + $manager->registerFormWidget(\Backend\FormWidgets\RelationManager::class, 'relationmanager'); + $manager->registerFormWidget(\Backend\FormWidgets\Repeater::class, 'repeater'); + $manager->registerFormWidget(\Backend\FormWidgets\RichEditor::class, 'richeditor'); + $manager->registerFormWidget(\Backend\FormWidgets\Sensitive::class, 'sensitive'); + $manager->registerFormWidget(\Backend\FormWidgets\TagList::class, 'taglist'); + }); + } + + /* + * Register settings + */ + protected function registerBackendSettings() + { + SettingsManager::instance()->registerCallback(function ($manager) { + $manager->registerSettingItems('Winter.Backend', [ + 'branding' => [ + 'label' => 'backend::lang.branding.menu_label', + 'description' => 'backend::lang.branding.menu_description', + 'category' => SettingsManager::CATEGORY_SYSTEM, + 'icon' => 'icon-paint-brush', + 'class' => 'Backend\Models\BrandSetting', + 'permissions' => ['backend.manage_branding'], + 'order' => 500, + 'keywords' => 'brand style' + ], + 'editor' => [ + 'label' => 'backend::lang.editor.menu_label', + 'description' => 'backend::lang.editor.menu_description', + 'category' => SettingsManager::CATEGORY_SYSTEM, + 'icon' => 'icon-code', + 'class' => 'Backend\Models\EditorSetting', + 'permissions' => ['backend.manage_editor'], + 'order' => 500, + 'keywords' => 'html code class style' + ], + 'myaccount' => [ + 'label' => 'backend::lang.myaccount.menu_label', + 'description' => 'backend::lang.myaccount.menu_description', + 'category' => SettingsManager::CATEGORY_MYSETTINGS, + 'icon' => 'icon-user', + 'url' => Backend::url('backend/myaccount'), + 'order' => 500, + 'context' => 'mysettings', + 'keywords' => 'backend::lang.myaccount.menu_keywords' + ], + 'preferences' => [ + 'label' => 'backend::lang.backend_preferences.menu_label', + 'description' => 'backend::lang.backend_preferences.menu_description', + 'category' => SettingsManager::CATEGORY_MYSETTINGS, + 'icon' => 'icon-laptop', + 'url' => Backend::url('backend/preferences'), + 'permissions' => ['backend.manage_preferences'], + 'order' => 510, + 'context' => 'mysettings' + ], + 'access_logs' => [ + 'label' => 'backend::lang.access_log.menu_label', + 'description' => 'backend::lang.access_log.menu_description', + 'category' => SettingsManager::CATEGORY_LOGS, + 'icon' => 'icon-lock', + 'url' => Backend::url('backend/accesslogs'), + 'permissions' => ['system.access_logs'], + 'order' => 920 + ] + ]); + $manager->registerOwnerAlias('Winter.Backend', 'October.Backend'); + }); + } +} diff --git a/modules/backend/assets/.gitignore b/modules/backend/assets/.gitignore new file mode 100644 index 0000000..5e4176a --- /dev/null +++ b/modules/backend/assets/.gitignore @@ -0,0 +1 @@ +!vendor diff --git a/modules/backend/assets/css/dashboard/dashboard.css b/modules/backend/assets/css/dashboard/dashboard.css new file mode 100644 index 0000000..2fb878c --- /dev/null +++ b/modules/backend/assets/css/dashboard/dashboard.css @@ -0,0 +1,12 @@ +.dashboard-container > .report-container.loading { + position: absolute; + width: 100%; + height: 100%; +} +.dashboard-container > .report-container.loading .loading-indicator-container { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} diff --git a/modules/backend/assets/css/winter.css b/modules/backend/assets/css/winter.css new file mode 100644 index 0000000..f550032 --- /dev/null +++ b/modules/backend/assets/css/winter.css @@ -0,0 +1,1118 @@ +@import "../vendor/jcrop/css/jquery.Jcrop.min.css"; +@import "../../../system/assets/vendor/prettify/prettify.css"; +@import "../../../system/assets/vendor/prettify/theme-desert.css"; +@-webkit-keyframes showSweetAlert{0%{transform:scale(0.7);-webkit-transform:scale(0.7)}45%{transform:scale(1.05);-webkit-transform:scale(1.05)}80%{transform:scale(0.95);-webkit-tranform:scale(0.95)}100%{transform:scale(1);-webkit-transform:scale(1)}} +@keyframes showSweetAlert{0%{transform:scale(0.7);-webkit-transform:scale(0.7)}45%{transform:scale(1.05);-webkit-transform:scale(1.05)}80%{transform:scale(0.95);-webkit-tranform:scale(0.95)}100%{transform:scale(1);-webkit-transform:scale(1)}} +@-webkit-keyframes hideSweetAlert{0%{transform:scale(1);-webkit-transform:scale(1)}100%{transform:scale(0.5);-webkit-transform:scale(0.5)}} +@keyframes hideSweetAlert{0%{transform:scale(1);-webkit-transform:scale(1)}100%{transform:scale(0.5);-webkit-transform:scale(0.5)}} +.showSweetAlert{-webkit-animation:showSweetAlert 0.3s;animation:showSweetAlert 0.3s} +.hideSweetAlert{-webkit-animation:hideSweetAlert 0.2s;animation:hideSweetAlert 0.2s} +@-webkit-keyframes animateSuccessTip{0%{width:0;left:1px;top:19px}54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}100%{width:25px;left:14px;top:45px}} +@keyframes animateSuccessTip{0%{width:0;left:1px;top:19px}54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}100%{width:25px;left:14px;top:45px}} +@-webkit-keyframes animateSuccessLong{0%{width:0;right:46px;top:54px}65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}100%{width:47px;right:8px;top:38px}} +@keyframes animateSuccessLong{0%{width:0;right:46px;top:54px}65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}100%{width:47px;right:8px;top:38px}} +@-webkit-keyframes rotatePlaceholder{0%{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}5%{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}12%{transform:rotate(-405deg);-webkit-transform:rotate(-405deg)}100%{transform:rotate(-405deg);-webkit-transform:rotate(-405deg)}} +@keyframes rotatePlaceholder{0%{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}5%{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}12%{transform:rotate(-405deg);-webkit-transform:rotate(-405deg)}100%{transform:rotate(-405deg);-webkit-transform:rotate(-405deg)}} +.animateSuccessTip{-webkit-animation:animateSuccessTip 0.75s;animation:animateSuccessTip 0.75s} +.animateSuccessLong{-webkit-animation:animateSuccessLong 0.75s;animation:animateSuccessLong 0.75s} +.icon.success.animate::after{-webkit-animation:rotatePlaceholder 4.25s ease-in;animation:rotatePlaceholder 4.25s ease-in} +@-webkit-keyframes animateErrorIcon{0%{transform:rotateX(100deg);-webkit-transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0deg);-webkit-transform:rotateX(0deg);opacity:1}} +@keyframes animateErrorIcon{0%{transform:rotateX(100deg);-webkit-transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0deg);-webkit-transform:rotateX(0deg);opacity:1}} +.animateErrorIcon{-webkit-animation:animateErrorIcon 0.5s;animation:animateErrorIcon 0.5s} +@-webkit-keyframes animateXMark{0%{transform:scale(0.4);-webkit-transform:scale(0.4);margin-top:26px;opacity:0}50%{transform:scale(0.4);-webkit-transform:scale(0.4);margin-top:26px;opacity:0}80%{transform:scale(1.15);-webkit-transform:scale(1.15);margin-top:-6px}100%{transform:scale(1);-webkit-transform:scale(1);margin-top:0;opacity:1}} +@keyframes animateXMark{0%{transform:scale(0.4);-webkit-transform:scale(0.4);margin-top:26px;opacity:0}50%{transform:scale(0.4);-webkit-transform:scale(0.4);margin-top:26px;opacity:0}80%{transform:scale(1.15);-webkit-transform:scale(1.15);margin-top:-6px}100%{transform:scale(1);-webkit-transform:scale(1);margin-top:0;opacity:1}} +.animateXMark{-webkit-animation:animateXMark 0.5s;animation:animateXMark 0.5s} +@-webkit-keyframes pulseWarning{0%{border-color:#F8D486}100%{border-color:#F8BB86}} +@keyframes pulseWarning{0%{border-color:#F8D486}100%{border-color:#F8BB86}} +.pulseWarning{-webkit-animation:pulseWarning 0.75s infinite alternate;animation:pulseWarning 0.75s infinite alternate} +@-webkit-keyframes pulseWarningIns{0%{background-color:#F8D486}100%{background-color:#F8BB86}} +@keyframes pulseWarningIns{0%{background-color:#F8D486}100%{background-color:#F8BB86}} +.pulseWarningIns{-webkit-animation:pulseWarningIns 0.75s infinite alternate;animation:pulseWarningIns 0.75s infinite alternate} +.sweet-overlay{background-color:rgba(0,0,0,0.4);position:fixed;left:0;right:0;top:0;bottom:0;display:none;z-index:7600} +.sweet-alert{background-color:#f9f9f9;width:478px;padding:17px;border-radius:5px;text-align:center;position:fixed;left:50%;top:50%;margin-left:-256px;margin-top:-200px;overflow:hidden;display:none;z-index:8600} +@media all and (max-width:767px){.sweet-alert{width:auto;margin-left:0;margin-right:0;left:15px;right:15px}} +.sweet-alert .icon{width:80px;height:80px;border:4px solid gray;border-radius:50%;margin:20px auto;position:relative;box-sizing:content-box} +.sweet-alert .icon.error{border-color:#c8113f} +.sweet-alert .icon.error .x-mark{position:relative;display:block} +.sweet-alert .icon.error .line{position:absolute;height:5px;width:47px;background-color:#e01346;display:block;top:37px;border-radius:2px} +.sweet-alert .icon.error .line.left{-webkit-transform:rotate(45deg);transform:rotate(45deg);left:17px} +.sweet-alert .icon.error .line.right{-webkit-transform:rotate(-45deg);transform:rotate(-45deg);right:16px} +.sweet-alert .icon.warning{border-color:#da783f} +.sweet-alert .icon.warning .body{position:absolute;width:5px;height:47px;left:50%;top:10px;border-radius:2px;margin-left:-2px;background-color:#de8754} +.sweet-alert .icon.warning .dot{position:absolute;width:7px;height:7px;border-radius:50%;margin-left:-3px;left:50%;bottom:10px;background-color:#de8754} +.sweet-alert .icon.info{border-color:#33b1d0} +.sweet-alert .icon.info::before{content:"";position:absolute;width:5px;height:29px;left:50%;bottom:17px;border-radius:2px;margin-left:-2px;background-color:#48b9d5} +.sweet-alert .icon.info::after{content:"";position:absolute;width:7px;height:7px;border-radius:50%;margin-left:-3px;top:19px;background-color:#48b9d5} +.sweet-alert .icon.success{border-color:#499532} +.sweet-alert .icon.success::before, +.sweet-alert .icon.success::after{content:'';border-radius:50%;position:absolute;width:60px;height:120px;background:white;-webkit-transform:rotate(45deg);transform:rotate(45deg)} +.sweet-alert .icon.success::before{border-radius:120px 0 0 120px;top:-7px;left:-33px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:60px 60px;transform-origin:60px 60px} +.sweet-alert .icon.success::after{border-radius:0 120px 120px 0;top:-11px;left:30px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:0 60px;transform-origin:0 60px} +.sweet-alert .icon.success .placeholder{width:80px;height:80px;border:4px solid rgba(82,168,56,0.2);border-radius:50%;box-sizing:content-box;position:absolute;left:-4px;top:-4px;z-index:2} +.sweet-alert .icon.success .fix{width:5px;height:90px;background-color:#f9f9f9;position:absolute;left:28px;top:8px;z-index:1;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)} +.sweet-alert .icon.success .line{height:5px;background-color:#52a838;display:block;border-radius:2px;position:absolute;z-index:2} +.sweet-alert .icon.success .line.tip{width:25px;left:14px;top:46px;-webkit-transform:rotate(45deg);transform:rotate(45deg)} +.sweet-alert .icon.success .line.long{width:47px;right:8px;top:38px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)} +.sweet-alert .icon.custom{background-size:contain;border-radius:0;border:none;background-position:center center;background-repeat:no-repeat} +.sweet-alert .btn-default:focus{border-color:#656d79;outline:0} +.sweet-alert .btn-success:focus{border-color:#499532;outline:0} +.sweet-alert .btn-info:focus{border-color:#33b1d0;outline:0} +.sweet-alert .btn-danger:focus{border-color:#c8113f;outline:0} +.sweet-alert .btn-warning:focus{border-color:#da783f;outline:0} +.sweet-alert button::-moz-focus-inner{border:0} +.sweet-overlay{background-color:rgba(0,0,0,0.2);z-index:10499} +.sweet-alert{text-align:right;border-radius:3px;-webkit-box-shadow:0 27px 24px 0 rgba(0,0,0,0.2),0 40px 77px 0 rgba(0,0,0,0.22);box-shadow:0 27px 24px 0 rgba(0,0,0,0.2),0 40px 77px 0 rgba(0,0,0,0.22);z-index:10500} +.sweet-alert h2{word-break:break-word;word-wrap:break-word;max-height:350px;overflow-y:auto;margin:10px 0 17px 0;color:#2b3e50;text-align:left;font-size:15px;line-height:23px} +.sweet-alert p{margin:0} +.sweet-alert p.text-muted{margin-bottom:20px;color:#555} +.global-notice{position:sticky;top:0;display:flex;align-items:center;flex-wrap:wrap;gap:0.5em;justify-content:space-between;z-index:10500;background:#ab2a1c;color:#FFF;padding:0.5em 0.75em} +.global-notice .notice-icon{font-size:1.5em;vertical-align:bottom;display:inline-block;margin-right:0.25em} +.global-notice .notice-text{display:inline-block;vertical-align:middle} +.control-simplelist{font-size:13px;padding:20px 20px 2px 20px;margin-bottom:20px;background:#FFF;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px} +.control-simplelist ul{padding-left:15px} +.control-simplelist.form-control ul{margin-bottom:0} +.control-simplelist.form-control li{padding-top:5px;padding-bottom:5px} +.control-simplelist.with-icons ul, +.control-simplelist.with-checkboxes ul, +.control-simplelist.is-divided ul, +.control-simplelist.is-selectable ul{list-style-type:none;padding-left:0} +.control-simplelist.with-checkboxes li{margin-top:-5px} +.control-simplelist.with-checkboxes li:first-child{margin-top:0} +.control-simplelist.with-checkboxes li:last-child div.custom-checkbox{margin-bottom:0} +.control-simplelist.with-checkboxes li:last-child div.custom-checkbox label{margin-bottom:5px} +.control-simplelist.is-sortable li.placeholder{position:relative} +.control-simplelist.is-sortable li.placeholder:before{top:-10px;position:absolute;content:'';display:block;width:0;height:0;border-top:4.5px solid transparent;border-bottom:4.5px solid transparent;border-left:5px solid #999} +.control-simplelist.is-sortable li.dragged{position:absolute;opacity:0.5;filter:alpha(opacity=50);z-index:2000;color:#2da7c7;width:auto !important} +.control-simplelist.is-scrollable{height:200px} +.control-simplelist.is-scrollable.size-tiny{min-height:250px} +.control-simplelist.is-scrollable.size-small{min-height:300px} +.control-simplelist.is-scrollable.size-large{min-height:400px} +.control-simplelist.is-scrollable.size-huge{min-height:450px} +.control-simplelist.is-scrollable.size-giant{min-height:550px} +.control-simplelist.is-divided, +.control-simplelist.is-selectable, +.control-simplelist.is-selectable-box{padding:0} +.control-simplelist.is-divided li .heading, +.control-simplelist.is-selectable li .heading, +.control-simplelist.is-selectable-box li .heading{font-size:14px;font-weight:500} +.control-simplelist.is-divided li, +.control-simplelist.is-selectable li{padding:5px 10px;border-bottom:1px solid #D4D8DA} +.control-simplelist.is-divided li:last-child, +.control-simplelist.is-selectable li:last-child{border-bottom:none} +.control-simplelist.is-selectable li a{padding:5px 10px;margin:-5px -10px;display:block;color:#333} +.control-simplelist.is-selectable li:hover{background:#48b2ce;cursor:pointer} +.control-simplelist.is-selectable li:hover, +.control-simplelist.is-selectable li:hover a{color:white} +.control-simplelist.is-selectable li:hover a{text-decoration:none} +.control-simplelist.is-selectable li.active a{background:#f0f0f0} +.control-simplelist.is-selectable li.active a:hover{background:#48b2ce} +.control-simplelist.is-selectable-box{padding-top:15px;margin-bottom:0} +.control-simplelist.is-selectable-box li{width:155px;margin:8px;display:inline-block;text-align:center;vertical-align:top} +.control-simplelist.is-selectable-box li a{text-decoration:none;display:block;color:#333} +.control-simplelist.is-selectable-box li a .box{display:block;width:155px;height:155px;border:3px solid rgba(0,0,0,0.1);position:relative;-webkit-transition:border 0.3s ease;transition:border 0.3s ease} +.control-simplelist.is-selectable-box li a .image{display:block;width:56px;height:56px;position:absolute;top:50%;left:50%;margin-top:-28px;margin-left:-28px} +.control-simplelist.is-selectable-box li a .image>i{font-size:56px;color:rgba(0,0,0,0.25)} +.control-simplelist.is-selectable-box li a .heading{margin:7px 0;padding:0} +.control-simplelist.is-selectable-box li a .description{font-size:12px} +.control-simplelist.is-selectable-box li a:hover .box{border-color:rgba(0,0,0,0.2)} +.control-simplelist.is-selectable-box li a:hover .image>i{color:rgba(0,0,0,0.45)} +.list-preview .control-simplelist.is-selectable ul{margin-bottom:0} +.drag-noselect{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} +.control-scrollbar{position:relative;overflow:hidden;height:100%} +.control-scrollbar>.scrollbar-scrollbar{position:absolute;z-index:100} +.control-scrollbar>.scrollbar-scrollbar .scrollbar-track{background-color:transparent;position:relative;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px} +.control-scrollbar>.scrollbar-scrollbar .scrollbar-track .scrollbar-thumb{background-color:rgba(0,0,0,0.35);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;cursor:pointer;overflow:hidden;position:absolute} +.control-scrollbar>.scrollbar-scrollbar.disabled{display:none !important} +.control-scrollbar.vertical>.scrollbar-scrollbar{right:0;margin-right:5px;width:6px} +.control-scrollbar.vertical>.scrollbar-scrollbar .scrollbar-track{height:100%;width:6px} +.control-scrollbar.vertical>.scrollbar-scrollbar .scrollbar-track .scrollbar-thumb{height:20px;width:6px;top:0;left:0} +.control-scrollbar.vertical>.scrollbar-scrollbar:active, +.control-scrollbar.vertical>.scrollbar-scrollbar:hover{width:8px;-webkit-transition:width 0.3s;transition:width 0.3s} +.control-scrollbar.vertical>.scrollbar-scrollbar:active .scrollbar-track, +.control-scrollbar.vertical>.scrollbar-scrollbar:hover .scrollbar-track, +.control-scrollbar.vertical>.scrollbar-scrollbar:active .scrollbar-thumb, +.control-scrollbar.vertical>.scrollbar-scrollbar:hover .scrollbar-thumb{width:8px;-webkit-transition:width 0.3s;transition:width 0.3s} +.control-scrollbar.horizontal>.scrollbar-scrollbar{margin:0 0 5px;clear:both;height:6px} +.control-scrollbar.horizontal>.scrollbar-scrollbar .scrollbar-track{width:100%;height:6px} +.control-scrollbar.horizontal>.scrollbar-scrollbar .scrollbar-track .scrollbar-thumb{height:6px;margin:2px 0;left:0;top:0} +.control-scrollbar.horizontal>.scrollbar-scrollbar:active, +.control-scrollbar.horizontal>.scrollbar-scrollbar:hover{height:8px;-webkit-transition:height 0.3s;transition:height 0.3s} +.control-scrollbar.horizontal>.scrollbar-scrollbar:active .scrollbar-track, +.control-scrollbar.horizontal>.scrollbar-scrollbar:hover .scrollbar-track, +.control-scrollbar.horizontal>.scrollbar-scrollbar:active .scrollbar-thumb, +.control-scrollbar.horizontal>.scrollbar-scrollbar:hover .scrollbar-thumb{height:8px;-webkit-transition:height 0.3s;transition:height 0.3s} +html.mobile .control-scrollbar{overflow:auto;-webkit-overflow-scrolling:touch} +.no-touch .control-scrollbar>.scrollbar-scrollbar{opacity:0;-webkit-transition:opacity 0.3s;transition:opacity 0.3s} +.no-touch .control-scrollbar:active>.scrollbar-scrollbar, +.no-touch .control-scrollbar:hover>.scrollbar-scrollbar{opacity:1} +@media (max-width:768px){.responsive-sidebar>.layout-cell:last-child .control-scrollbar{overflow:visible;height:auto}.responsive-sidebar>.layout-cell:last-child .control-scrollbar .scrollbar-scrollbar{display:none!important}} +.control-filelist p.no-data{padding:22px 0;margin:0;color:#666;font-size:14px;text-align:center;font-weight:normal;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px} +.control-filelist ul{padding:0;margin:0} +.control-filelist ul li{font-weight:normal;line-height:150%;position:relative;list-style:none} +.control-filelist ul li a:hover{background:#ddd} +.control-filelist ul li.active>a{background:#ddd;position:relative} +.control-filelist ul li.active>a:after{position:absolute;height:100%;width:4px;left:0;top:0;background:#2da7c7;display:block;content:' '} +.control-filelist ul li a{display:block;padding:10px 45px 10px 20px;outline:none} +.control-filelist ul li a:hover, +.control-filelist ul li a:focus, +.control-filelist ul li a:active{text-decoration:none} +.control-filelist ul li a span{display:block} +.control-filelist ul li a span.title{font-weight:normal;color:#405261;font-size:14px} +.control-filelist ul li a span.description{color:#8f8f8f;font-size:12px;white-space:nowrap;font-weight:normal;overflow:hidden;text-overflow:ellipsis} +.control-filelist ul li a span.description strong{color:#405261;font-weight:normal} +.control-filelist ul li.group>h4, +.control-filelist ul li.group>div.group>h4{font-weight:normal;font-size:14px;margin-top:0;margin-bottom:0;position:relative} +.control-filelist ul li.group>h4 a, +.control-filelist ul li.group>div.group>h4 a{padding:10px 20px 10px 53px;color:#405261;position:relative;outline:none} +.control-filelist ul li.group>h4 a:hover, +.control-filelist ul li.group>div.group>h4 a:hover{background:transparent} +.control-filelist ul li.group>h4 a:before, +.control-filelist ul li.group>div.group>h4 a:before, +.control-filelist ul li.group>h4 a:after, +.control-filelist ul li.group>div.group>h4 a:after{width:10px;height:10px;display:block;position:absolute;top:1px} +.control-filelist ul li.group>h4 a:after, +.control-filelist ul li.group>div.group>h4 a:after{left:33px;top:9px;font-family:"Font Awesome 6 Free";font-weight:900;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;content:"\f07b";color:#a1aab1;font-size:16px} +.control-filelist ul li.group>h4 a:before, +.control-filelist ul li.group>div.group>h4 a:before{left:20px;top:9px;color:#cfcfcf;font-family:"Font Awesome 6 Free";font-weight:900;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;content:"\f0da";-webkit-transform:rotate(90deg) translate(5px,0);-ms-transform:rotate(90deg) translate(5px,0);transform:rotate(90deg) translate(5px,0);-webkit-transition:all 0.1s ease;transition:all 0.1s ease} +.control-filelist ul li.group>ul>li>a{padding-left:52px} +.control-filelist ul li.group>ul>li.group{padding-left:20px} +.control-filelist ul li.group>ul>li.group>ul>li>a{padding-left:324px;margin-left:-270px} +.control-filelist ul li.group>ul>li.group>ul>li.group>ul>li>a{padding-left:297px;margin-left:-243px} +.control-filelist ul li.group>ul>li.group>ul>li.group>ul>li.group>ul>li>a{padding-left:270px;margin-left:-216px} +.control-filelist ul li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li>a{padding-left:243px;margin-left:-189px} +.control-filelist ul li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li>a{padding-left:216px;margin-left:-162px} +.control-filelist ul li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li>a{padding-left:189px;margin-left:-135px} +.control-filelist ul li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li>a{padding-left:162px;margin-left:-108px} +.control-filelist ul li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li>a{padding-left:135px;margin-left:-81px} +.control-filelist ul li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li>a{padding-left:108px;margin-left:-54px} +.control-filelist ul li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li.group>ul>li>a{padding-left:81px;margin-left:-27px} +.control-filelist ul li.group[data-status=collapsed]>h4 a:before, +.control-filelist ul li.group[data-status=collapsed]>div.group>h4 a:before{-webkit-transform:rotate(0deg) translate(3px,0);-ms-transform:rotate(0deg) translate(3px,0);transform:rotate(0deg) translate(3px,0)} +.control-filelist ul li.group[data-status=collapsed]>ul, +.control-filelist ul li.group[data-status=collapsed]>div.subitems{display:none} +.control-filelist ul li>div.controls{position:absolute;right:19px;top:6px} +.control-filelist ul li>div.controls .dropdown{width:14px;height:21px} +.control-filelist ul li>div.controls .dropdown.open a.control{display:block!important} +.control-filelist ul li>div.controls .dropdown.open a.control:before{visibility:visible;display:block} +.control-filelist ul li>div.controls a.control{color:#405261;font-size:14px;visibility:hidden;overflow:hidden;width:14px;height:21px;display:none;text-decoration:none;cursor:pointer;padding:0;opacity:0.5;filter:alpha(opacity=50)} +.control-filelist ul li>div.controls a.control:before{visibility:visible;display:block;margin-right:0} +.control-filelist ul li>div.controls a.control:hover{opacity:1;filter:alpha(opacity=100)} +.control-filelist ul li:hover>div.controls, +.control-filelist ul li:hover>a.control{display:block!important} +.control-filelist ul li:hover>div.controls>a.control, +.control-filelist ul li:hover>a.control>a.control{display:block!important} +.control-filelist ul li .checkbox{position:absolute;top:-5px;right:0} +.control-filelist ul li .checkbox label{margin-right:0} +.control-filelist ul li .checkbox label:before{border-color:#ccc} +.control-filelist.single-line ul li a span.title{text-overflow:ellipsis;overflow:hidden;white-space:nowrap} +.control-filelist.filelist-hero ul li{background:#fff;border-bottom:none} +.control-filelist.filelist-hero ul li>a{padding:11px 45px 10px 50px;font-size:13px;border-bottom:1px solid #ECF0F1} +.control-filelist.filelist-hero ul li>a span.title{font-size:14px;font-weight:normal;color:#2b3e50} +.control-filelist.filelist-hero ul li>a span.description{font-size:13px} +.control-filelist.filelist-hero ul li>a .list-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);font-size:22px;color:#b7c0c2} +.control-filelist.filelist-hero ul li>a:hover{background:#48b2ce;border-bottom:1px solid #48b2ce !important} +.control-filelist.filelist-hero ul li>a:hover span.title, +.control-filelist.filelist-hero ul li>a:hover span.description{color:#fff !important} +.control-filelist.filelist-hero ul li>a:hover .list-icon{color:#fff !important} +.control-filelist.filelist-hero ul li>a:active{background:#6cc551;border-bottom:1px solid #6cc551 !important} +.control-filelist.filelist-hero ul li>a:active span.title, +.control-filelist.filelist-hero ul li>a:active span.description{color:#fff !important} +.control-filelist.filelist-hero ul li>a:active .list-icon{color:#fff !important} +.control-filelist.filelist-hero ul li .checkbox{top:-2px;right:0} +.control-filelist.filelist-hero ul li.active>a{border-bottom:1px solid #ddd} +.control-filelist.filelist-hero ul li.active>a:after{top:-1px;bottom:-1px;height:auto} +.control-filelist.filelist-hero ul li.active>a>span.borders:before{content:' ';position:absolute;width:100%;height:1px;display:block;left:0;background-color:#ddd} +.control-filelist.filelist-hero ul li.active>a>span.borders:before{top:-1px} +.control-filelist.filelist-hero ul li.active>a:hover>span.borders:before{background-color:#48b2ce} +.control-filelist.filelist-hero ul li.active>a:active>span.borders:before{background-color:#6cc551} +.control-filelist.filelist-hero ul li>h4{padding-top:7px;padding-bottom:6px;border-bottom:1px solid #ECF0F1} +.control-filelist.filelist-hero ul li>div.controls{display:none;position:absolute;right:16px;top:15px} +.control-filelist.filelist-hero ul li>div.controls>a.control{width:16px;height:23px;background:transparent;overflow:hidden;display:inline-block;color:#fff !important;padding:0} +.control-filelist.filelist-hero ul li>div.controls>a.control:before{font-size:17px} +.control-filelist.filelist-hero ul li:hover>div.controls{display:block} +.control-filelist.filelist-hero ul li.separator{position:relative;border-bottom:1px solid #95a5a6;padding:12px 15px 13px 15px} +.control-filelist.filelist-hero ul li.separator:before{z-index:31;content:'';display:block;width:0;height:0;border-left:9.5px solid transparent;border-right:9.5px solid transparent;border-top:11px solid white;border-bottom-width:0;position:absolute;left:13px;bottom:-8px} +.control-filelist.filelist-hero ul li.separator:after{z-index:30;content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-top:9px solid #95a5a6;border-bottom-width:0;position:absolute;left:14px;bottom:-9px} +.control-filelist.filelist-hero ul li.separator h5{color:#2b3e50;font-size:14px;margin:0;font-weight:normal;padding:0} +.control-filelist.filelist-hero ul>li.group>ul>li>a{padding-left:66px} +.control-filelist.filelist-hero.single-level ul li:hover{background:#48b2ce} +.control-filelist.filelist-hero.single-level ul li:hover>a{background:#48b2ce;border-bottom:1px solid #48b2ce !important} +.control-filelist.filelist-hero.single-level ul li:hover>a span.title, +.control-filelist.filelist-hero.single-level ul li:hover>a span.description{color:#fff !important} +.control-filelist.filelist-hero.single-level ul li:hover>a .list-icon{color:#fff !important} +.control-filelist.filelist-hero.single-level ul li:active{background:#6cc551} +.control-filelist.filelist-hero.single-level ul li:active>a{background:#6cc551;border-bottom:1px solid #6cc551 !important} +.control-filelist.filelist-hero.single-level ul li:active>a span.title, +.control-filelist.filelist-hero.single-level ul li:active>a span.description{color:#fff !important} +.control-filelist.filelist-hero.single-level ul li:active>a .list-icon{color:#fff !important} +.control-scrollpanel{position:relative;background:#ECF0F1} +.control-scrollpanel .control-scrollbar.vertical>.scrollbar-scrollbar{right:0} +.tooltip .tooltip-inner{text-align:left;padding:5px 8px} +.tooltip.in{opacity:1;filter:alpha(opacity=100)} +.wn-logo-white, +.oc-logo-white{background-image:url(../images/winter-logo-white.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:contain} +.wn-logo, +.oc-logo{background-image:url(../images/winter-logo.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:contain} +.layout.control-tabs.wn-logo-transparent:not(.has-tabs), +.layout.control-tabs.oc-logo-transparent:not(.has-tabs), +.flex-layout-column.wn-logo-transparent:not(.has-tabs), +.flex-layout-column.oc-logo-transparent:not(.has-tabs), +.layout-cell.wn-logo-transparent, +.layout-cell.oc-logo-transparent{background-size:50% auto;background-repeat:no-repeat;background-image:url(../images/winter-logo.svg);background-position:50% 50%;position:relative} +.layout.control-tabs.wn-logo-transparent:not(.has-tabs):after, +.layout.control-tabs.oc-logo-transparent:not(.has-tabs):after, +.flex-layout-column.wn-logo-transparent:not(.has-tabs):after, +.flex-layout-column.oc-logo-transparent:not(.has-tabs):after, +.layout-cell.wn-logo-transparent:after, +.layout-cell.oc-logo-transparent:after{content:'';display:table-cell;position:absolute;left:0;top:0;height:100%;width:100%;background:rgba(249,249,249,0.7)} +.report-widget{padding:15px;background:white;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;font-size:13px} +.report-widget h3{font-size:14px;color:#7e8c8d;text-transform:uppercase;font-weight:600;margin-top:0;margin-bottom:30px} +.report-widget .height-100{height:100px} +.report-widget .height-200{height:200px} +.report-widget .height-300{height:300px} +.report-widget .height-400{height:400px} +.report-widget .height-500{height:500px} +.report-widget p.report-description{margin-bottom:0;margin-top:15px;font-size:12px;line-height:190%;color:#7e8c8d} +.report-widget a:not(.btn){color:#7e8c8d;text-decoration:none} +.report-widget a:not(.btn):hover{color:#2da7c7;text-decoration:none} +.report-widget p.flash-message.static{margin-bottom:0} +.report-widget .icon-circle.success{color:#52a838} +.report-widget .icon-circle.primary{color:#103141} +.report-widget .icon-circle.warning{color:#de8754} +.report-widget .icon-circle.danger{color:#e01346} +.report-widget .icon-circle.info{color:#48b9d5} +.control-treelist ol{padding:0;margin:0;list-style:none} +.control-treelist ol ol{margin:0;margin-left:15px;padding-left:15px;border-left:1px solid #dbdee0} +.control-treelist>ol>li>div.record:before{display:none} +.control-treelist li{margin:0;padding:0} +.control-treelist li>div.record{margin:0;font-size:12px;margin-bottom:5px;position:relative;display:block} +.control-treelist li>div.record:before{color:#bdc3c7;font-family:"Font Awesome 6 Free";font-weight:900;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;content:"\f111";font-size:6px;position:absolute;left:-18px;top:11px} +.control-treelist li>div.record>a.move{display:inline-block;padding:7px 0 7px 10px;text-decoration:none;color:#bdc3c7} +.control-treelist li>div.record>a.move:hover{color:#48b2ce} +.control-treelist li>div.record>a.move:before{font-family:"Font Awesome 6 Free";font-weight:900;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;content:"\f0c9"} +.control-treelist li>div.record>span{color:#666;display:inline-block;padding:7px 15px 7px 5px} +.control-treelist li.dragged{position:absolute;z-index:2000;width:auto !important;height:auto !important} +.control-treelist li.dragged>div.record{opacity:0.5;filter:alpha(opacity=50);background:#48b2ce !important} +.control-treelist li.dragged>div.record>a.move:before, +.control-treelist li.dragged>div.record>span{color:white} +.control-treelist li.dragged>div.record:before{display:none} +.control-treelist li.placeholder{display:inline-block;position:relative;background:#48b2ce !important;height:25px;margin-bottom:5px} +.control-treelist li.placeholder:before{display:block;position:absolute;font-family:"Font Awesome 6 Free";font-weight:900;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;content:"\f053";color:#d35714;left:-10px;top:8px;z-index:2000} +.control-treeview{margin-bottom:40px} +.control-treeview ol{margin:0;padding:0;list-style:none;background:#fff} +.control-treeview ol>li{-webkit-transition:width 1s;transition:width 1s} +.control-treeview ol>li>div{font-size:14px;font-weight:normal;background:#fff;border-bottom:1px solid #ECF0F1;position:relative} +.control-treeview ol>li>div>a{color:#2b3e50;padding:11px 45px 10px 61px;display:block;line-height:150%;text-decoration:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box} +.control-treeview ol>li>div:before{content:' ';background-image:url(../images/treeview-icons.png);background-position:0 -28px;background-repeat:no-repeat;background-size:42px auto;position:absolute;width:21px;height:22px;left:28px;top:15px} +.control-treeview ol>li>div span.comment{display:block;font-weight:400;color:#95a5a6;font-size:13px;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} +.control-treeview ol>li>div>span.expand{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;display:none;position:absolute;width:20px;height:20px;top:19px;left:2px;cursor:pointer;color:#bdc3c7;-webkit-transition:transform 0.1s ease;transition:transform 0.1s ease} +.control-treeview ol>li>div>span.expand:before{font-family:"Font Awesome 6 Free";font-weight:900;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;content:"\f0da";line-height:100%;font-size:15px;position:relative;left:8px;top:2px} +.control-treeview ol>li>div>span.drag-handle{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;-webkit-transition:opacity 0.4s;transition:opacity 0.4s;position:absolute;right:9px;bottom:0;width:18px;height:19px;cursor:move;color:#bdc3c7;opacity:0;filter:alpha(opacity=0)} +.control-treeview ol>li>div>span.drag-handle:before{font-family:"Font Awesome 6 Free";font-weight:900;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;content:"\f0c9";font-size:18px} +.control-treeview ol>li>div span.borders{font-size:0} +.control-treeview ol>li>div>ul.submenu{position:absolute;left:20px;bottom:-36.9px;padding:0;list-style:none;z-index:200;height:37px;display:none;margin-left:15px;background:transparent url(../images/treeview-submenu-tabs.png) repeat-x left -39px} +.control-treeview ol>li>div>ul.submenu:before, +.control-treeview ol>li>div>ul.submenu:after{background:transparent url(../images/treeview-submenu-tabs.png) no-repeat left top;content:' ';display:block;width:20px;height:37px;position:absolute;top:0} +.control-treeview ol>li>div>ul.submenu:before{left:-20px} +.control-treeview ol>li>div>ul.submenu:after{background-position:-100px top;right:-20px} +.control-treeview ol>li>div>ul.submenu li{font-size:12px} +.control-treeview ol>li>div>ul.submenu li a{display:block;padding:4px 3px 0 3px;color:#fff;text-decoration:none;outline:none} +.control-treeview ol>li>div>ul.submenu li a i{margin-right:5px} +.control-treeview ol>li>div:hover>ul.submenu{display:block} +.control-treeview ol>li>div:active>ul.submenu{background-position:left -116px} +.control-treeview ol>li>div:active>ul.submenu:before{background-position:left -77px} +.control-treeview ol>li>div:active>ul.submenu:after{background-position:-100px -77px} +.control-treeview ol>li>div .checkbox{position:absolute;top:-2px;right:0} +.control-treeview ol>li>div .checkbox label{margin-right:0} +.control-treeview ol>li>div .checkbox label:before{border-color:#ccc} +.control-treeview ol>li>div.popover-highlight{background-color:#48b2ce !important} +.control-treeview ol>li>div.popover-highlight:before{background-position:0 -80px} +.control-treeview ol>li>div.popover-highlight>a{color:#fff !important;cursor:default} +.control-treeview ol>li>div.popover-highlight span{color:#fff !important} +.control-treeview ol>li>div.popover-highlight>ul.submenu, +.control-treeview ol>li>div.popover-highlight>span.drag-handle{display:none!important} +.control-treeview ol>li.dragged div, +.control-treeview ol>li>div:hover{background-color:#48b2ce !important} +.control-treeview ol>li.dragged div>a, +.control-treeview ol>li>div:hover>a{color:#fff !important} +.control-treeview ol>li.dragged div:before, +.control-treeview ol>li>div:hover:before{background-position:0 -80px} +.control-treeview ol>li.dragged div:after, +.control-treeview ol>li>div:hover:after{top:0 !important;bottom:0 !important} +.control-treeview ol>li.dragged div span, +.control-treeview ol>li>div:hover span{color:#fff !important} +.control-treeview ol>li.dragged div span.drag-handle, +.control-treeview ol>li>div:hover span.drag-handle{cursor:move;opacity:1;filter:alpha(opacity=100)} +.control-treeview ol>li.dragged div span.borders, +.control-treeview ol>li>div:hover span.borders{display:none} +.control-treeview ol>li>div:active{background-color:#6cc551 !important} +.control-treeview ol>li>div:active>a{color:#fff !important} +.control-treeview ol>li[data-no-drag-mode] div:hover span.drag-handle{cursor:default!important;opacity:0.3 !important;filter:alpha(opacity=30) !important} +.control-treeview ol>li.dragged li.has-subitems>div:before, +.control-treeview ol>li.dragged.has-subitems>div:before{background-position:0 -52px} +.control-treeview ol>li.dragged div>ul.submenu{display:none!important} +.control-treeview ol>li>ol{padding-left:20px;padding-right:20px} +.control-treeview ol>li[data-status=collapsed]>ol{display:none} +.control-treeview ol>li.has-subitems>div:before{background-position:0 0;width:23px;height:26px;left:26px} +.control-treeview ol>li.has-subitems>div:hover:before, +.control-treeview ol>li.has-subitems>div.popover-highlight:before{background-position:0 -52px} +.control-treeview ol>li.has-subitems>div span.expand{display:block} +.control-treeview ol>li.placeholder{position:relative;opacity:0.5;filter:alpha(opacity=50)} +.control-treeview ol>li.placeholder ol{display:none} +.control-treeview ol>li.dragged{position:absolute;z-index:2000;opacity:0.25;filter:alpha(opacity=25)} +.control-treeview ol>li.dragged>div{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px} +.control-treeview ol>li.dragged ol{display:none} +.control-treeview ol>li.drop-target>div{background-color:#2581b8 !important} +.control-treeview ol>li.drop-target>div>a{color:#fff} +.control-treeview ol>li.drop-target>div>a>span.comment{color:#fff} +.control-treeview ol>li.drop-target>div:before{background-position:0 -80px} +.control-treeview ol>li.drop-target.has-subitems>div:before{background-position:0 -52px} +.control-treeview ol>li[data-status=expanded]>div>span.expand{-webkit-transform:rotate(90deg) translate(0,0);-ms-transform:rotate(90deg) translate(0,0);transform:rotate(90deg) translate(0,0)} +.control-treeview ol>li.drag-ghost{background-color:transparent;box-sizing:content-box} +.control-treeview ol>li.active>div{background:#ddd} +.control-treeview ol>li.active>div:after{position:absolute;width:4px;left:0;top:-1px;bottom:-1px;background:#2da7c7;display:block;content:' '} +.control-treeview ol>li.active>div>span.comment, +.control-treeview ol>li.active>div>span.expand{color:#8f8f8f} +.control-treeview ol>li.active>div>span.borders:before, +.control-treeview ol>li.active>div>span.borders:after{content:' ';position:absolute;width:100%;height:1px;display:block;left:0;background-color:#ddd} +.control-treeview ol>li.active>div>span.borders:before{top:-1px} +.control-treeview ol>li.active>div>span.borders:after{bottom:-1px} +.control-treeview ol>li.no-data{padding:18px 0;margin:0;color:#666;font-size:14px;text-align:center;font-weight:400} +.control-treeview ol>li>ol>li>div{margin-left:-20px;margin-right:-20px;padding-left:71px} +.control-treeview ol>li>ol>li>div>a{margin-left:-71px;padding-left:71px} +.control-treeview ol>li>ol>li>div:before{margin-left:10px} +.control-treeview ol>li>ol>li>div>span.expand{left:12px} +.control-treeview ol>li>ol>li>ol>li>div{margin-left:-40px;margin-right:-40px;padding-left:81px} +.control-treeview ol>li>ol>li>ol>li>div>a{margin-left:-81px;padding-left:81px} +.control-treeview ol>li>ol>li>ol>li>div:before{margin-left:20px} +.control-treeview ol>li>ol>li>ol>li>div>span.expand{left:22px} +.control-treeview ol>li>ol>li>ol>li>ol>li>div{margin-left:-60px;margin-right:-60px;padding-left:91px} +.control-treeview ol>li>ol>li>ol>li>ol>li>div>a{margin-left:-91px;padding-left:91px} +.control-treeview ol>li>ol>li>ol>li>ol>li>div:before{margin-left:30px} +.control-treeview ol>li>ol>li>ol>li>ol>li>div>span.expand{left:32px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>div{margin-left:-80px;margin-right:-80px;padding-left:101px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>div>a{margin-left:-101px;padding-left:101px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>div:before{margin-left:40px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>div>span.expand{left:42px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div{margin-left:-100px;margin-right:-100px;padding-left:111px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div>a{margin-left:-111px;padding-left:111px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div:before{margin-left:50px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div>span.expand{left:52px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div{margin-left:-120px;margin-right:-120px;padding-left:121px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div>a{margin-left:-121px;padding-left:121px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div:before{margin-left:60px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div>span.expand{left:62px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div{margin-left:-140px;margin-right:-140px;padding-left:131px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div>a{margin-left:-131px;padding-left:131px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div:before{margin-left:70px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div>span.expand{left:72px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div{margin-left:-160px;margin-right:-160px;padding-left:141px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div>a{margin-left:-141px;padding-left:141px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div:before{margin-left:80px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div>span.expand{left:82px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div{margin-left:-180px;margin-right:-180px;padding-left:151px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div>a{margin-left:-151px;padding-left:151px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div:before{margin-left:90px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div>span.expand{left:92px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div{margin-left:-200px;margin-right:-200px;padding-left:161px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div>a{margin-left:-161px;padding-left:161px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div:before{margin-left:100px} +.control-treeview ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>ol>li>div>span.expand{left:102px} +.control-treeview p.no-data{padding:18px 0;margin:0;color:#666;font-size:14px;text-align:center;font-weight:400} +.control-treeview a.menu-control{display:block;margin:20px;padding:13px 15px;border:dotted 2px #ebebeb;color:#bdc3c7;font-size:12px;font-weight:600;text-transform:uppercase;border-radius:5px;vertical-align:middle} +.control-treeview a.menu-control:hover, +.control-treeview a.menu-control:focus{text-decoration:none;background-color:#48b2ce;color:#fff;border:none;padding:15px 17px} +.control-treeview a.menu-control:active{background:#6cc551;color:#fff} +.control-treeview a.menu-control i{margin-right:10px;font-size:14px} +.control-treeview.treeview-light{margin-bottom:0;margin-top:20px} +.control-treeview.treeview-light ol{background-color:transparent} +.control-treeview.treeview-light ol>li>div{background-color:transparent;border-bottom:none} +.control-treeview.treeview-light ol>li>div:before{top:15px} +.control-treeview.treeview-light ol>li>div>a{padding-top:10px;padding-bottom:10px} +.control-treeview.treeview-light ol>li>div span.expand{top:19px} +.control-treeview.treeview-light ol>li>div>span.drag-handle{top:0;right:0;bottom:auto;height:100%;width:60px;background:#2581b8;-webkit-transition:none !important;transition:none !important} +.control-treeview.treeview-light ol>li>div>span.drag-handle:before{position:absolute;left:50%;top:50%;margin-left:-6px} +.control-treeview.treeview-light ol>li>div>ul.submenu{right:60px;left:auto;bottom:auto;top:0;height:100%;margin:0;background:transparent;white-space:nowrap;font-size:0} +.control-treeview.treeview-light ol>li>div>ul.submenu:before, +.control-treeview.treeview-light ol>li>div>ul.submenu:after{display:none} +.control-treeview.treeview-light ol>li>div>ul.submenu li{height:100%;display:inline-block;background:#2581b8;border-right:1px solid #328ec8} +.control-treeview.treeview-light ol>li>div>ul.submenu li p{display:table;height:100%;padding:0;margin:0} +.control-treeview.treeview-light ol>li>div>ul.submenu li p a{display:table-cell;vertical-align:middle;height:100%;padding:0 20px;font-size:13px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box} +.control-treeview.treeview-light ol>li>div>ul.submenu li p a i.control-icon{font-size:22px;margin-right:0} +body.dragging .control-treeview ol.dragging, +body.dragging .control-treeview ol.dragging ol{background:#ccc;padding-right:0} +body.dragging .control-treeview ol.dragging>li>div, +body.dragging .control-treeview ol.dragging ol>li>div{margin-right:0;-webkit-transition:margin 1s;transition:margin 1s} +body.dragging .control-treeview ol.dragging>li>div .custom-checkbox, +body.dragging .control-treeview ol.dragging ol>li>div .custom-checkbox{-webkit-transition:opacity 0.5s;transition:opacity 0.5s;opacity:0;filter:alpha(opacity=0)} +body.dragging .control-treeview.treeview-light ol.dragging>li>div, +body.dragging .control-treeview.treeview-light ol.dragging ol>li>div{background-color:#f9f9f9} +@media only screen and (min--moz-device-pixel-ratio:1.5),only screen and (-o-min-device-pixel-ratio:1.5),only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-devicepixel-ratio:1.5),only screen and (min-resolution:1.5dppx){.control-treeview ol>li>div:before{background-position:0 -79px;background-size:21px auto}.control-treeview ol>li.has-subitems>div:before{background-position:0 -52px}.control-treeview ol>li.has-subitems>div:hover:before,.control-treeview ol>li.has-subitems>div.popover-highlight:before{background-position:0 -102px}.control-treeview ol>li.dragged>div:before,.control-treeview ol>li.dragged li>div:before,.control-treeview ol>li>div:hover:before,.control-treeview ol>li>div.popover-highlight:before{background-position:0 -129px}.control-treeview ol>li.dragged li.has-subitems>div:before,.control-treeview ol>li.dragged.has-subitems>div:before{background-position:0 -102px}.control-treeview ol>li.drop-target>div:before{background-position:0 -129px}.control-treeview ol>li.drop-target.has-subitems>div:before{background-position:0 -102px}} +.sidenav-tree{width:300px} +.sidenav-tree .control-toolbar{padding:0} +.sidenav-tree .control-toolbar .toolbar-item{display:block} +.sidenav-tree .control-toolbar input.form-control{border:none;outline:none;padding:12px 13px 13px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:inset -3px 0 3px rgba(0,0,0,0.1);box-shadow:inset -3px 0 3px rgba(0,0,0,0.1)} +.sidenav-tree .control-toolbar input.form-control.search{background-position:right -78px} +.sidenav-tree ul{padding:0;margin:0;list-style:none} +.sidenav-tree div.scrollbar-thumb{background:rgba(0,0,0,0.2) !important} +.sidenav-tree ul.top-level>li[data-status=collapsed]>div.group h3:before{-webkit-transform:rotate(0deg) translate(2px,-2px);-ms-transform:rotate(0deg) translate(2px,-2px);transform:rotate(0deg) translate(2px,-2px)} +.sidenav-tree ul.top-level>li[data-status=collapsed]>div.group:before, +.sidenav-tree ul.top-level>li[data-status=collapsed]>div.group:after{display:none} +.sidenav-tree ul.top-level>li[data-status=collapsed] ul{display:none} +.sidenav-tree ul.top-level>li>div.group{position:relative} +.sidenav-tree ul.top-level>li>div.group h3{background:rgba(0,0,0,0.15);color:#ecf0f1;text-transform:uppercase;font-size:15px;padding:15px 15px 15px 40px;margin:0;position:relative;cursor:pointer;font-weight:400} +.sidenav-tree ul.top-level>li>div.group h3:before{display:block;position:absolute;width:10px;height:10px;left:16px;top:15px;color:#cfcfcf;font-family:"Font Awesome 6 Free";font-weight:900;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;content:"\f105";-webkit-transform:rotate(90deg) translate(5px,-3px);-ms-transform:rotate(90deg) translate(5px,-3px);transform:rotate(90deg) translate(5px,-3px);-webkit-transition:all 0.1s ease;transition:all 0.1s ease;font-size:16px} +.sidenav-tree ul.top-level>li>div.group:before, +.sidenav-tree ul.top-level>li>div.group:after{content:'';display:block;width:0;height:0;border-left:7.5px solid transparent;border-right:7.5px solid transparent;border-top:8px solid #103141;border-bottom-width:0;position:absolute;left:15px;bottom:-8px;z-index:101} +.sidenav-tree ul.top-level>li>div.group:after{content:'';display:block;width:0;height:0;border-left:7.5px solid transparent;border-right:7.5px solid transparent;border-top:8px solid rgba(0,0,0,0.15);border-bottom-width:0} +.sidenav-tree ul.top-level>li>ul li a{display:block;position:relative;padding:18px 25px 18px 55px;background:transparent;border-bottom:1px solid rgba(0,0,0,0.15);color:#fff;text-decoration:none !important;opacity:0.65;filter:alpha(opacity=65)} +.sidenav-tree ul.top-level>li>ul li a:active, +.sidenav-tree ul.top-level>li>ul li a:hover{opacity:1;filter:alpha(opacity=100);text-decoration:none} +.sidenav-tree ul.top-level>li>ul li a i{position:absolute;left:16px;top:18px;font-size:22px} +.sidenav-tree ul.top-level>li>ul li a span{display:block;line-height:150%} +.sidenav-tree ul.top-level>li>ul li a span.header{color:#fff;font-size:15px;margin-bottom:5px} +.sidenav-tree ul.top-level>li>ul li a span.description{color:rgba(255,255,255,0.6);font-size:13px} +.sidenav-tree ul.top-level>li>ul li:hover a, +.sidenav-tree ul.top-level>li>ul li.active a{opacity:1;filter:alpha(opacity=100)} +.sidenav-tree ul.top-level>li>ul li.active{border-left:5px solid #2da7c7} +.sidenav-tree ul.top-level>li>ul li.active a{color:rgba(255,255,255,0.91);padding-right:20px} +.sidenav-tree ul.top-level>li>ul li.active a span.header{color:#fff} +.sidenav-tree ul.top-level>li>ul li.active a span.description{color:rgba(255,255,255,0.91)} +.sidenav-tree .back-link{display:none} +@media (min-width:768px){.sidenav-tree-root .sidenav-tree{width:600px}.sidenav-tree-root .sidenav-tree ul.top-level>li>ul{font-size:0;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-items:stretch;align-content:stretch}.sidenav-tree-root .sidenav-tree ul.top-level>li>ul>li{display:inline-block;width:300px}.sidenav-tree-root .sidenav-tree ul.top-level>li>ul>li a{height:100%}} +@media (min-width:768px) and (max-width:991px){.sidenav-tree-root .sidenav-tree{width:100%}.sidenav-tree-root .sidenav-tree ul.top-level>li>ul>li{width:50%}} +@media (min-width:1200px){.sidenav-tree-root .sidenav-tree{width:900px}} +@media (max-width:768px){.sidenav-tree{width:100%;height:auto !important;display:block !important}.sidenav-tree>.layout{display:none}.sidenav-tree-root .sidenav-tree{width:100% !important;height:100% !important;display:table-cell !important}.sidenav-tree-root .sidenav-tree .back-link{display:none !important}.sidenav-tree-root .sidenav-tree>.layout{display:table !important}.sidenav-tree-root #layout-body{display:none}body.has-sidenav-tree .sidenav-tree .back-link{display:block;padding:13px 15px;background:#2b3e50;color:#bdc3c7;font-size:14px;line-height:14px;text-transform:uppercase}body.has-sidenav-tree .sidenav-tree .back-link i{display:inline-block;margin-right:10px}body.has-sidenav-tree .sidenav-tree .back-link:hover{text-decoration:none}body.has-sidenav-tree #layout-body{display:block !important}} +div.panel{padding:20px} +div.panel.no-padding{padding:0} +div.panel.no-padding-bottom{padding-bottom:0} +div.panel.padding-top{padding-top:20px} +div.panel.padding-less{padding:15px} +div.panel.transparent{background:transparent} +div.panel.border-left{border-left:1px solid #e8eaeb} +div.panel.border-right{border-right:1px solid #e8eaeb} +div.panel.border-bottom{border-bottom:1px solid #e8eaeb} +div.panel.border-top{border-top:1px solid #e8eaeb} +div.panel.triangle-down{position:relative} +div.panel.triangle-down:after{content:'';display:block;width:0;height:0;border-left:7.5px solid transparent;border-right:7.5px solid transparent;border-top:8px solid white;border-bottom-width:0;position:absolute;left:15px;bottom:-8px;z-index:101} +div.panel.triangle-down:before{content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-top:9px solid #e8eaeb;border-bottom-width:0;position:absolute;left:14px;bottom:-9px;z-index:100} +div.panel h3.section, +div.panel>label{text-transform:uppercase;color:#95a5a6;font-size:13px;font-weight:600;margin:0 0 15px 0} +div.panel>label{margin-bottom:5px} +.nav.selector-group{font-size:13px;letter-spacing:0.01em;margin-bottom:20px} +.nav.selector-group li a{padding:7px 20px 7px 23px;color:#95a5a6} +.nav.selector-group li.active{border-left:3px solid #e6802b;padding-left:0} +.nav.selector-group li.active a{padding-left:20px;color:#2b3e50} +.nav.selector-group li i[class^="icon-"]{font-size:17px;margin-right:6px;position:relative;top:1px} +div.panel .nav.selector-group{margin:0 -20px 20px -20px} +ul.tree-path{list-style:none;padding:0;margin-bottom:0} +ul.tree-path li{display:inline-block;margin-right:1px;font-size:13px} +ul.tree-path li:after{font-family:"Font Awesome 6 Free";font-weight:900;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;content:"\f105";display:inline-block;font-size:13px;margin-left:5px;position:relative;top:1px;color:#95a5a6} +ul.tree-path li:last-child a{cursor:default} +ul.tree-path li:last-child:after{display:none} +ul.tree-path li.go-up{font-size:12px;margin-right:7px} +ul.tree-path li.go-up a{color:#95a5a6} +ul.tree-path li.go-up a:hover{color:#2da7c7} +ul.tree-path li.go-up:after{display:none} +ul.tree-path li.root a{font-weight:600;color:#405261} +ul.tree-path li a{color:#95a5a6} +ul.tree-path li a:hover{text-decoration:none} +table.name-value-list{border-collapse:collapse;font-size:13px} +table.name-value-list th, +table.name-value-list td{padding:4px 0 4px 0;vertical-align:top} +table.name-value-list tr:first-child th, +table.name-value-list tr:first-child td{padding-top:0} +table.name-value-list th{font-weight:600;color:#95a5a6;padding-right:15px;text-transform:uppercase} +table.name-value-list td{color:#2b3e50;word-wrap:break-word} +.scrollpad-scrollbar-size-tester{width:50px;height:50px;overflow-y:scroll;position:absolute;top:-200px;left:-200px} +.scrollpad-scrollbar-size-tester div{height:100px} +.scrollpad-scrollbar-size-tester::-webkit-scrollbar{width:0;height:0} +div.control-scrollpad{position:relative;width:100%;height:100%;overflow:hidden} +div.control-scrollpad>div{overflow:hidden;overflow-y:scroll;height:100%} +div.control-scrollpad>div::-webkit-scrollbar{width:0;height:0} +div.control-scrollpad[data-direction=horizontal]>div{overflow-x:scroll;overflow-y:hidden;width:100%} +div.control-scrollpad[data-direction=horizontal]>div::-webkit-scrollbar{width:auto;height:0} +div.control-scrollpad>.scrollpad-scrollbar{z-index:199;position:absolute;top:0;right:0;bottom:0;width:11px;background-color:transparent;opacity:0;overflow:hidden;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-transition:opacity 0.3s;transition:opacity 0.3s} +div.control-scrollpad>.scrollpad-scrollbar .drag-handle{position:absolute;right:2px;min-height:10px;width:7px;background-color:rgba(0,0,0,0.35);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px} +div.control-scrollpad>.scrollpad-scrollbar:hover{opacity:0.7;filter:alpha(opacity=70);-webkit-transition:opacity 0 linear;transition:opacity 0 linear} +div.control-scrollpad>.scrollpad-scrollbar[data-visible]{opacity:0.7;filter:alpha(opacity=70)} +div.control-scrollpad>.scrollpad-scrollbar[data-hidden]{display:none} +div.control-scrollpad[data-direction=horizontal]>.scrollpad-scrollbar{top:auto;left:0;width:auto;height:11px} +div.control-scrollpad[data-direction=horizontal]>.scrollpad-scrollbar .drag-handle{right:auto;top:2px;height:7px;min-height:0;min-width:10px;width:auto} +.svg-icon-container img.svg-icon{display:none} +.svg-icon-container.svg-active-effects img.svg-icon{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:0.6;filter:alpha(opacity=60)} +.svg-icon-container.svg-active-effects:hover img.svg-icon, +.svg-icon-container.svg-active-effects.active img.svg-icon{-webkit-filter:none;filter:none;opacity:1;filter:alpha(opacity=100)} +html.svg .svg-icon-container i.svg-replace{display:none} +@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}} +@keyframes fadeIn{0%{opacity:0}100%{opacity:1}} +.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn} +@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}} +@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}} +.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown} +@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}} +@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}} +.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft} +@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}} +@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}} +.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight} +@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}} +@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}} +.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp} +@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}} +@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}} +@keyframes fadeOut{0%{opacity:1}100%{opacity:0}} +.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut} +@-webkit-keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}} +@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}} +.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown} +@-webkit-keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}} +@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}} +.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft} +@-webkit-keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}} +@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}} +.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight} +@-webkit-keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}} +@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}} +.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp} +html:not(.mobile) body.drag *{cursor:grab !important;cursor:-webkit-grab !important;cursor:-moz-grab !important} +body.dragging, +body.dragging *{cursor:move !important} +body.loading, +body.loading *{cursor:wait !important} +body.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default !important} +html, +body{height:100%} +body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";background:#f9f9f9;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale} +#layout-canvas{min-height:100%;height:100%} +.control-tabs.primary-tabs>ul.nav-tabs, +.control-tabs.primary-tabs>div>ul.nav-tabs, +.control-tabs.primary-tabs>div>div>ul.nav-tabs{margin-left:-20px;margin-right:-20px} +.control-tabs.primary-tabs.tabs-no-inset>ul.nav-tabs, +.control-tabs.primary-tabs.tabs-no-inset>div>ul.nav-tabs, +.control-tabs.primary-tabs.tabs-no-inset>div>div>ul.nav-tabs{margin-left:0;margin-right:0} +.layout{display:table;table-layout:fixed;height:100%;width:100%} +.layout>.layout-row{display:table-row;vertical-align:top;height:100%} +.layout>.layout-row>.layout-cell{display:table-cell;vertical-align:top;height:100%} +.layout>.layout-row>.layout-cell.layout-container, +.layout>.layout-row>.layout-cell .layout-container, +.layout>.layout-row>.layout-cell.padded-container, +.layout>.layout-row>.layout-cell .padded-container{padding:20px 20px 0 20px} +.layout>.layout-row>.layout-cell.layout-container .container-flush, +.layout>.layout-row>.layout-cell .layout-container .container-flush, +.layout>.layout-row>.layout-cell.padded-container .container-flush, +.layout>.layout-row>.layout-cell .padded-container .container-flush{padding-top:0} +.layout>.layout-row>.layout-cell .layout-relative{position:relative;height:100%} +.layout>.layout-row>.layout-cell .layout-absolute{position:absolute;height:100%;width:100%} +.layout>.layout-row>.layout-cell.min-size{width:0} +.layout>.layout-row>.layout-cell.min-height{height:0} +.layout>.layout-row>.layout-cell.center{text-align:center} +.layout>.layout-row>.layout-cell.middle{vertical-align:middle} +.layout>.layout-row>.layout-cell.layout-container, +.layout>.layout-row>.layout-cell .layout-container, +.layout>.layout-row>.layout-cell.padded-container, +.layout>.layout-row>.layout-cell .padded-container{padding:20px 20px 0 20px} +.layout>.layout-row>.layout-cell.layout-container .container-flush, +.layout>.layout-row>.layout-cell .layout-container .container-flush, +.layout>.layout-row>.layout-cell.padded-container .container-flush, +.layout>.layout-row>.layout-cell .padded-container .container-flush{padding-top:0} +.layout>.layout-row>.layout-cell .layout-relative{position:relative;height:100%} +.layout>.layout-row>.layout-cell .layout-absolute{position:absolute;height:100%;width:100%} +.layout>.layout-row>.layout-cell.min-size{width:0} +.layout>.layout-row>.layout-cell.min-height{height:0} +.layout>.layout-row>.layout-cell.center{text-align:center} +.layout>.layout-row>.layout-cell.middle{vertical-align:middle} +.layout>.layout-row.min-size{height:0.1px} +.layout>.layout-cell{display:table-cell;vertical-align:top;height:100%} +.layout>.layout-cell.layout-container, +.layout>.layout-cell .layout-container, +.layout>.layout-cell.padded-container, +.layout>.layout-cell .padded-container{padding:20px 20px 0 20px} +.layout>.layout-cell.layout-container .container-flush, +.layout>.layout-cell .layout-container .container-flush, +.layout>.layout-cell.padded-container .container-flush, +.layout>.layout-cell .padded-container .container-flush{padding-top:0} +.layout>.layout-cell .layout-relative{position:relative;height:100%} +.layout>.layout-cell .layout-absolute{position:absolute;height:100%;width:100%} +.layout>.layout-cell.min-size{width:0} +.layout>.layout-cell.min-height{height:0} +.layout>.layout-cell.center{text-align:center} +.layout>.layout-cell.middle{vertical-align:middle} +.whiteboard{background:white} +.layout-fill-container{position:absolute;left:0;top:0;width:100%;height:100%} +[data-calculate-width]>form, +[data-calculate-width]>div{display:inline-block} +body.compact-container .layout.layout-container, +body.compact-container .layout .layout-container{padding:0 !important} +body.slim-container .layout.layout-container, +body.slim-container .layout .layout-container{padding-left:0 !important;padding-right:0 !important} +@media (max-width:768px){.layout .hide-on-small{display:none}.layout.responsive-sidebar>.layout-cell:first-child{display:table-footer-group;height:auto}.layout.responsive-sidebar>.layout-cell:first-child .control-breadcrumb{display:none}.layout.responsive-sidebar>.layout-cell:last-child{display:table-header-group;width:auto;height:auto}.layout.responsive-sidebar>.layout-cell:last-child .layout-absolute{position:static}} +@supports (-moz-appearance:none){a:focus:not(:focus-visible){outline:none}} +.flex-layout-column{display:-webkit-box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:-ms-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column} +.flex-layout-column.full-height-strict{height:100%} +.flex-layout-column.absolute{position:absolute!important} +.flex-layout-column.fill-container{position:absolute;left:0;top:0;width:100%;height:100%} +.flex-layout-row{display:-webkit-box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:-ms-flex;display:flex;-webkit-flex-direction:row;-moz-flex-direction:row;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row} +.flex-layout-column.justify-center, +.flex-layout-row.justify-center{-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-webkit-box-pack:center;justify-content:center} +.flex-layout-column.align-center, +.flex-layout-row.align-center{-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;align-items:center;-webkit-align-content:center;-moz-align-content:center;-webkit-box-align:center;-ms-align-content:center;align-content:center} +.flex-layout-column.full-height, +.flex-layout-row.full-height{min-height:100%} +.flex-layout-item{margin:0} +.flex-layout-item.fix{-webkit-box-flex:0;-webkit-flex:0 0 auto;-moz-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto} +.flex-layout-item.stretch{-webkit-box-flex:1;-webkit-flex:1 1 auto;-moz-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto} +.flex-layout-item.stretch-constrain{-webkit-box-flex:1;-webkit-flex:1;-moz-flex:1;-ms-flex:1;flex:1} +.flex-layout-item.center{-webkit-align-self:center;-moz-align-self:center;-ms-align-self:center;align-self:center} +.flex-layout-item.relative{position:relative} +.flex-layout-item.layout-container{max-width:none} +body.mainmenu-open{overflow:hidden;position:fixed} +.mainmenu-tooltip .tooltip-inner{font-size:13px;padding:6px 16px} +ul.mainmenu-nav{font-size:14px} +ul.mainmenu-nav li{} +ul.mainmenu-nav li .svg-icon{-webkit-backface-visibility:hidden;backface-visibility:hidden} +ul.mainmenu-nav li span.counter{display:block;position:absolute;top:0.143em;right:0;padding:0.143em 0.429em 0.214em 0.286em;background-color:#d9350f;color:#fff;font-size:0.786em;line-height:100%;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;opacity:1;filter:alpha(opacity=100);-webkit-transform:scale(1,);-ms-transform:scale(1,);transform:scale(1,);-webkit-transition:all 0.3s;transition:all 0.3s} +ul.mainmenu-nav li span.counter.empty{opacity:0;filter:alpha(opacity=0);-webkit-transform:scale(0,);-ms-transform:scale(0,);transform:scale(0,)} +nav#layout-mainmenu{background-color:#151515;padding:0 0 0 20px;line-height:0;white-space:nowrap;display:flex} +nav#layout-mainmenu a{text-decoration:none} +nav#layout-mainmenu a:focus{background:transparent} +nav#layout-mainmenu ul{margin:0;padding:0;list-style:none;float:left;white-space:nowrap;overflow:hidden} +nav#layout-mainmenu ul li{color:rgba(255,255,255,0.6);display:inline-block;vertical-align:top;position:relative;margin-right:30px} +nav#layout-mainmenu ul li a{display:inline-block;font-size:14px;color:inherit;padding:14px 0 10px} +nav#layout-mainmenu ul li a:hover{background-color:transparent} +nav#layout-mainmenu ul li a:active, +nav#layout-mainmenu ul li a:focus{text-decoration:none;color:rgba(255,255,255,0.6)} +nav#layout-mainmenu ul li a i{line-height:1;font-size:30px;vertical-align:middle} +nav#layout-mainmenu ul li a img.svg-icon{height:30px;width:30px;margin-right:10px;position:relative;top:0} +nav#layout-mainmenu ul.nav{display:inline-block} +nav#layout-mainmenu .toolbar-item{flex:1 1 auto;display:block;padding-right:0;overflow:hidden} +nav#layout-mainmenu .toolbar-item-account{flex:0 0 auto} +nav#layout-mainmenu .toolbar-item:before, +nav#layout-mainmenu .toolbar-item:after{margin-top:0} +nav#layout-mainmenu .toolbar-item:before{left:-12px} +nav#layout-mainmenu .toolbar-item:after{right:-12px} +nav#layout-mainmenu .toolbar-item.scroll-active-before:before{color:#fff} +nav#layout-mainmenu .toolbar-item.scroll-active-after:after{color:#fff} +nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-quick-action{margin:0} +nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-quick-action:first-child{margin-left:21px} +nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-quick-action i{font-size:20px} +nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-quick-action a{position:relative;padding:0 10px;top:-1px} +nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account{margin-right:0} +nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account>a{padding:0 15px 0 10px;font-size:13px;position:relative} +nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account.highlight>a{z-index:600} +nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account img.account-avatar{width:45px;height:45px} +nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account .account-name{margin-right:15px} +nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account ul{line-height:23px} +html.svg nav#layout-mainmenu img.svg-icon, +html.svg .mainmenu-collapsed img.svg-icon{display:inline-block} +nav#layout-mainmenu ul li .mainmenu-accountmenu{position:fixed;top:0;right:20px;background:#f9f9f9;z-index:600;display:none;-webkit-box-shadow:0 1px 6px rgba(0,0,0,0.12),0 1px 4px rgba(0,0,0,0.24);box-shadow:0 1px 6px rgba(0,0,0,0.12),0 1px 4px rgba(0,0,0,0.24);border-radius:3px} +nav#layout-mainmenu ul li .mainmenu-accountmenu.active{display:block} +nav#layout-mainmenu ul li .mainmenu-accountmenu:after{content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-bottom:7px solid #f9f9f9;right:9px;top:-7px;position:absolute} +nav#layout-mainmenu ul li .mainmenu-accountmenu ul{float:none;display:block;overflow:visible} +nav#layout-mainmenu ul li .mainmenu-accountmenu li{padding:0;margin:0;font-weight:normal;text-align:left;display:block} +nav#layout-mainmenu ul li .mainmenu-accountmenu li a{display:block;padding:10px 30px;text-align:left;font-size:14px;color:#666} +nav#layout-mainmenu ul li .mainmenu-accountmenu li a:hover, +nav#layout-mainmenu ul li .mainmenu-accountmenu li a:focus{background:#48b2ce;color:#fff} +nav#layout-mainmenu ul li .mainmenu-accountmenu li a:active{background:#6cc551;color:#fff} +nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:hover:after, +nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:focus:after, +nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:active:after{content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-bottom:7px solid #48b2ce;position:absolute;right:9px;top:-7px;z-index:102} +nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:active:after{content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-bottom:7px solid #6cc551} +nav#layout-mainmenu ul li .mainmenu-accountmenu li.divider{height:1px;width:100%;background-color:#e0e0e0} +nav#layout-mainmenu.navbar-mode-inline, +nav#layout-mainmenu.navbar-mode-inline_no_icons{height:60px} +nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-toolbar li.mainmenu-quick-action a, +nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-toolbar li.mainmenu-quick-action a{height:60px;line-height:60px} +nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-toolbar li.mainmenu-account>a, +nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-toolbar li.mainmenu-account>a{height:60px;line-height:60px} +nav#layout-mainmenu.navbar-mode-inline ul li .mainmenu-accountmenu, +nav#layout-mainmenu.navbar-mode-inline_no_icons ul li .mainmenu-accountmenu{top:70px} +nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li, +nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li{margin:5px 0} +nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li a, +nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li a{padding:10px 15px} +nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li a .nav-icon, +nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li a .nav-icon{position:relative;top:-1px;margin-right:5px;width:30px;height:30px} +nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li a .nav-icon i, +nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li a .nav-icon i, +nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li a .nav-icon img, +nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li a .nav-icon img{margin:0} +nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li a .nav-label, +nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li a .nav-label{line-height:30px} +nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li:first-child, +nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li:first-child{margin-left:-13px} +nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li:last-child, +nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li:last-child{margin-right:0} +nav#layout-mainmenu.navbar-mode-inline_no_icons .nav-icon{display:none !important} +nav#layout-mainmenu.navbar-mode-tile{height:78px} +nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-toolbar li.mainmenu-quick-action a{height:78px;line-height:78px} +nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-toolbar li.mainmenu-account>a{height:78px;line-height:78px} +nav#layout-mainmenu.navbar-mode-tile ul li .mainmenu-accountmenu{top:88px} +nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a{position:relative;width:65px;height:65px} +nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a .nav-icon{text-align:center;display:block;position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-26.5px;width:30px;height:30px} +nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a .nav-icon i, +nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a .nav-icon img{margin:0} +nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a .nav-label{display:block;width:100px;height:20px;line-height:20px;position:absolute;bottom:4px;left:50%;padding:0 5px;margin-left:-50px;overflow:hidden;text-overflow:ellipsis;text-align:center} +nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li{padding:0 15px;margin:7px 0 0} +nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li:first-child{margin-left:-7px} +nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li:hover .nav-label{width:auto;min-width:100px;text-overflow:all;overflow:visible;z-index:2} +nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li.active:first-child{margin-left:0} +nav#layout-mainmenu .menu-toggle{height:45px;line-height:45px;font-size:16px;display:none} +nav#layout-mainmenu .menu-toggle .menu-toggle-icon{background:#333;display:inline-block;height:45px;line-height:45px;width:45px;text-align:center;opacity:0.7} +nav#layout-mainmenu .menu-toggle .menu-toggle-icon i{line-height:45px;font-size:20px;vertical-align:bottom} +nav#layout-mainmenu .menu-toggle .menu-toggle-title{margin-left:10px} +nav#layout-mainmenu .menu-toggle:hover .menu-toggle-icon{opacity:1} +body.mainmenu-open nav#layout-mainmenu .menu-toggle-icon{opacity:1} +nav#layout-mainmenu.navbar-mode-collapse{padding-left:0;height:45px} +nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-quick-action a{height:45px;line-height:45px} +nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-account>a{height:45px;line-height:45px} +nav#layout-mainmenu.navbar-mode-collapse ul li .mainmenu-accountmenu{top:55px} +nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-account>a{padding-right:0} +nav#layout-mainmenu.navbar-mode-collapse ul li .mainmenu-accountmenu:after{right:13px} +nav#layout-mainmenu.navbar-mode-collapse ul.nav{display:none} +nav#layout-mainmenu.navbar-mode-collapse .menu-toggle{display:inline-block;color:#fff !important} +@media (max-width:769px){nav#layout-mainmenu.navbar{padding-left:0;height:45px}nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-quick-action a{height:45px;line-height:45px}nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-account>a{height:45px;line-height:45px}nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu{top:55px}nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-account>a{padding-right:0}nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu:after{right:13px}nav#layout-mainmenu.navbar ul.nav{display:none}nav#layout-mainmenu.navbar .menu-toggle{display:inline-block;color:#fff !important}} +.mainmenu-collapsed{position:absolute;height:100%;top:0;left:0;margin:0;background:#000} +.mainmenu-collapsed>div{display:block;height:100%} +.mainmenu-collapsed>div ul.mainmenu-nav li a{position:relative;width:65px;height:65px} +.mainmenu-collapsed>div ul.mainmenu-nav li a .nav-icon{text-align:center;display:block;position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-26.5px;width:30px;height:30px} +.mainmenu-collapsed>div ul.mainmenu-nav li a .nav-icon i, +.mainmenu-collapsed>div ul.mainmenu-nav li a .nav-icon img{margin:0} +.mainmenu-collapsed>div ul.mainmenu-nav li a .nav-label{display:block;width:100px;height:20px;line-height:20px;position:absolute;bottom:4px;left:50%;padding:0 5px;margin-left:-50px;overflow:hidden;text-overflow:ellipsis;text-align:center} +.mainmenu-collapsed>div ul.mainmenu-nav li{padding:0 15px;margin:7px 0 0} +.mainmenu-collapsed>div ul.mainmenu-nav li:first-child{margin-left:-7px} +.mainmenu-collapsed>div ul.mainmenu-nav li:hover .nav-label{width:auto;min-width:100px;text-overflow:all;overflow:visible;z-index:2} +.mainmenu-collapsed>div ul.mainmenu-nav li.active:first-child{margin-left:0} +.mainmenu-collapsed>div ul.mainmenu-nav li:first-child{margin-left:0} +.mainmenu-collapsed>div ul{margin:0;padding:5px 0 15px 15px;overflow:hidden} +.mainmenu-collapsed>div ul li{color:rgba(255,255,255,0.6);display:inline-block;vertical-align:top;position:relative;margin-right:30px} +.mainmenu-collapsed>div ul li a{display:inline-block;font-size:14px;color:inherit} +.mainmenu-collapsed>div ul li a:hover{background-color:transparent} +.mainmenu-collapsed>div ul li a:active, +.mainmenu-collapsed>div ul li a:focus{text-decoration:none;color:rgba(255,255,255,0.6)} +.mainmenu-collapsed>div ul li a i{line-height:1;font-size:30px;vertical-align:middle} +.mainmenu-collapsed>div ul li a img.svg-icon{height:30px;width:30px;position:relative;top:0} +.mainmenu-collapsed .scroll-marker{position:absolute;left:0;width:100%;height:10px;display:none} +.mainmenu-collapsed .scroll-marker:after{font-family:"Font Awesome 6 Free";font-weight:900;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;content:"\f141";display:block;position:absolute;left:50%;margin-left:-3px;top:0;height:9px;font-size:10px;color:rgba(255,255,255,0.6)} +.mainmenu-collapsed .scroll-marker.before{top:0} +.mainmenu-collapsed .scroll-marker.after{bottom:3px} +.mainmenu-collapsed .scroll-marker.after:after{top:2px} +.mainmenu-collapsed.scroll-before .scroll-marker.before{display:block} +.mainmenu-collapsed.scroll-after .scroll-marker.after{display:block} +body.mainmenu-open .mainmenu-collapsed ul{position:absolute;left:0;top:10px;bottom:10px} +html.mobile .mainmenu-collapsed ul{overflow:auto;-webkit-overflow-scrolling:touch} +nav#layout-mainmenu.navbar ul li:hover a:active, +.mainmenu-collapsed li:hover a:active, +nav#layout-mainmenu.navbar ul li:hover a:focus, +.mainmenu-collapsed li:hover a:focus{color:#fff !important} +.touch .mainmenu-collapsed li a:hover{color:rgba(255,255,255,0.6)} +nav#layout-mainmenu.navbar ul li.highlight>a, +.mainmenu-collapsed li.highlight>a{color:#fff !important} +nav#layout-mainmenu.navbar ul li.active, +.mainmenu-collapsed li.active{color:#fff !important} +nav#layout-mainmenu.navbar ul li.active a, +.mainmenu-collapsed li.active a{color:#fff !important} +nav#layout-mainmenu.navbar ul li:hover, +.mainmenu-collapsed li:hover{color:#fff;background:transparent} +body.drag nav#layout-mainmenu.navbar ul.nav li:hover, +body.drag .mainmenu-collapsed ul li:hover{color:rgba(255,255,255,0.6)} +.layout-sidenav-container{width:120px} +#layout-sidenav{position:absolute;height:100%;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:14px} +#layout-sidenav ul{position:relative;margin:0;padding:0;height:100%;overflow:hidden} +#layout-sidenav ul li{display:block;text-align:center;position:relative} +#layout-sidenav ul li a{padding:1.429em 0.714em;display:block;font-size:0.929em;color:rgba(255,255,255,0.6);font-weight:normal;position:relative} +#layout-sidenav ul li a:hover{text-decoration:none;background-color:transparent} +#layout-sidenav ul li a:focus{background:transparent} +#layout-sidenav ul li a i{color:rgba(255,255,255,0.6);display:block;margin-bottom:5px;font-size:2em} +#layout-sidenav ul li:first-child a{padding-top:2.143em} +#layout-sidenav ul li.active a, +#layout-sidenav ul li a:hover{color:#fff} +#layout-sidenav ul li.active a i, +#layout-sidenav ul li a:hover i{color:#fff} +#layout-sidenav ul li span.counter{display:block;position:absolute;top:1.071em;right:1.071em;padding:0.143em 0.429em 0.214em 0.286em;background-color:#d9350f;color:#fff;font-size:0.786em;line-height:100%;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;opacity:1;filter:alpha(opacity=100);-webkit-transform:scale(1,);-ms-transform:scale(1,);transform:scale(1,);-webkit-transition:all 0.3s;transition:all 0.3s} +#layout-sidenav ul li span.counter.empty{opacity:0;filter:alpha(opacity=0);-webkit-transform:scale(0,);-ms-transform:scale(0,);transform:scale(0,)} +@media (min-width:768px) and (max-width:991px){#layout-sidenav{font-size:12px}.layout-sidenav-container{width:100px}} +@media (max-width:767px){#layout-sidenav{font-size:10px}.layout-sidenav-container{width:80px}} +html.mobile #layout-sidenav ul{overflow:auto;-webkit-overflow-scrolling:touch} +#layout-sidenav.layout-sidenav ul.drag li:not(.active) a:hover, +.touch #layout-sidenav.layout-sidenav li:not(.active) a:hover{color:rgba(255,255,255,0.6) !important} +#layout-sidenav.layout-sidenav ul.drag li:not(.active) a:hover i, +.touch #layout-sidenav.layout-sidenav li:not(.active) a:hover i{color:rgba(255,255,255,0.6) !important} +#layout-sidenav.layout-sidenav ul.drag li:not(.active) a:hover:after, +.touch #layout-sidenav.layout-sidenav li:not(.active) a:hover:after{display:none !important} +#layout-side-panel .fix-button{position:absolute;right:-25px;top:0;display:none;width:25px;height:25px;font-size:13px;background:#ecf0f1;z-index:120;opacity:0.5;filter:alpha(opacity=50);-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0} +#layout-side-panel .fix-button i{display:block;text-align:center;margin-top:5px;color:#aaa} +#layout-side-panel .fix-button:hover{text-decoration:none;display:block;opacity:1 !important;filter:alpha(opacity=100) !important} +#layout-side-panel:hover .fix-button{display:block} +#layout-side-panel .fix-button-content-header .fix-button{top:46px} +#layout-side-panel .sidepanel-content-header{background:#2896b2;color:white;font-size:15px;padding:12px 20px 13px;position:relative} +#layout-side-panel .sidepanel-content-header:after{content:'';display:block;width:0;height:0;border-left:7.5px solid transparent;border-right:7.5px solid transparent;border-top:8px solid #2896b2;border-bottom-width:0;position:absolute;left:14px;bottom:-8px} +body.side-panel-not-fixed #layout-side-panel{display:none} +body.side-panel-not-fixed #layout-side-panel .fix-button{opacity:0.5;filter:alpha(opacity=50)} +body.display-side-panel #layout-side-panel{display:block;position:absolute;z-index:600;width:350px;-webkit-box-shadow:3px 0 3px 0 rgba(0,0,0,0.1);box-shadow:3px 0 3px 0 rgba(0,0,0,0.1)} +@media (min-width:992px){body.side-panel-fix-shadow #layout-side-panel{-webkit-box-shadow:none;box-shadow:none}} +.touch #layout-side-panel .fix-button{display:none} +@media (max-width:768px){#layout-side-panel .fix-button{display:none}} +#layout-footer{width:100%;z-index:100;height:60px;position:fixed;bottom:0;color:#666;background-color:rgba(255,255,255,0.8);border-top:1px solid #dfdfdf} +#layout-footer .brand, +#layout-footer .tagline{margin:10px;height:40px;line-height:40px} +#layout-footer .brand{float:left;font-size:16px} +#layout-footer .brand .logo{margin:0 10px} +#layout-footer .tagline{float:right} +#layout-footer .tagline p{color:#999} +body.outer{background:#2b3e50} +body.outer .layout>.layout-row.layout-head{text-align:center;background:#f9f9f9} +body.outer .layout>.layout-row.layout-head>.layout-cell{height:40%;padding:50px 0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;vertical-align:middle;position:relative} +body.outer .layout>.layout-row.layout-head>.layout-cell:after{content:'';display:block;width:0;height:0;border-left:28px solid transparent;border-right:28px solid transparent;border-top:20px solid #f9f9f9;border-bottom-width:0;position:absolute;bottom:-20px;left:50%;margin-left:-28px} +body.outer .layout>.layout-row.layout-head>.layout-cell h1.wn-logo, +body.outer .layout>.layout-row.layout-head>.layout-cell h1.oc-logo{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;display:inline-block;width:100%;max-width:450px;height:170px;min-height:72px} +body.outer .layout>.layout-row>.layout-cell{vertical-align:top} +body.outer .layout>.layout-row>.layout-cell .outer-form-container{margin:0 auto;width:436px;padding:40px 0} +body.outer .layout>.layout-row>.layout-cell .outer-form-container h2{font-size:18px;margin:20px 0;color:#feffff} +body.outer .layout>.layout-row>.layout-cell .outer-form-container .horizontal-form{font-size:0;display:-webkit-box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:-ms-flex;display:flex} +body.outer .layout>.layout-row>.layout-cell .outer-form-container .horizontal-form input{vertical-align:top;margin-right:9px;display:inline-block;border:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px} +body.outer .layout>.layout-row>.layout-cell .outer-form-container .horizontal-form button{background:#2da7c7;text-align:center;font-size:13px;font-weight:600;height:40px;vertical-align:top;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box} +body.outer .layout>.layout-row>.layout-cell .outer-form-container .remember label{color:rgba(255,255,255,0.44)} +body.outer .layout>.layout-row>.layout-cell .outer-form-container .remember input#remember{display:none} +body.outer .layout>.layout-row>.layout-cell .outer-form-container .forgot-password{margin-top:30px;font-size:13px;top:8px} +body.outer .layout>.layout-row>.layout-cell .outer-form-container .forgot-password a{color:rgba(255,255,255,0.44)} +body.outer .layout>.layout-row>.layout-cell .outer-form-container .forgot-password:before{color:rgba(255,255,255,0.44);font-size:14px;position:relative;margin-right:5px} +html.csstransitions body.outer .outer-form-container{-webkit-transition:all 0.5s ease-out;transition:all 0.5s ease-out;-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1)} +html.csstransitions body.outer.preload .outer-form-container{-webkit-transform:scale(0.2,0.2);-moz-transform:scale(0.2,0.2);-ms-transform:scale(0.2,0.2);-o-transform:scale(0.2,0.2);transform:scale(0.2,0.2)} +@media (max-width:768px){body.outer .layout>.layout-row.layout-head>.layout-cell{padding:50px 20px}body.outer .layout>.layout-row>.layout-cell .outer-form-container{width:auto;padding:40px}body.outer .layout>.layout-row>.layout-cell .outer-form-container .horizontal-form{display:block}body.outer .layout>.layout-row>.layout-cell .outer-form-container .horizontal-form input{display:block;width:100% !important;margin-bottom:20px}} +body.fancy-layout .master-tabs.control-tabs, +.master-tabs.control-tabs.fancy-layout{overflow:hidden} +body.fancy-layout .master-tabs.control-tabs:before, +.master-tabs.control-tabs.fancy-layout:before, +body.fancy-layout .master-tabs.control-tabs:after, +.master-tabs.control-tabs.fancy-layout:after{top:13px;font-size:14px;color:rgba(255,255,255,0.35)} +body.fancy-layout .master-tabs.control-tabs:before, +.master-tabs.control-tabs.fancy-layout:before{left:8px} +body.fancy-layout .master-tabs.control-tabs:after, +.master-tabs.control-tabs.fancy-layout:after{right:8px} +body.fancy-layout .master-tabs.control-tabs.scroll-before:before, +.master-tabs.control-tabs.fancy-layout.scroll-before:before{color:#fff} +body.fancy-layout .master-tabs.control-tabs.scroll-after:after, +.master-tabs.control-tabs.fancy-layout.scroll-after:after{color:#fff} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container{background:#2896b2;padding-left:20px;padding-right:20px} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs{margin-left:-8px} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li{margin-left:-5px;top:1px;padding-top:3px} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li span.tab-close, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li span.tab-close{top:14px;right:-3px;left:auto;z-index:110;font-family:sans-serif} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li span.tab-close i, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li span.tab-close i{top:4px;right:1px;color:rgba(255,255,255,0.3) !important;font-style:normal;font-weight:bold;font-size:16px} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li span.tab-close i:hover, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li span.tab-close i:hover{color:#fff !important} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li a, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li a{border-bottom:none;background:transparent;font-size:14px;color:rgba(255,255,255,0.35);padding:6px 0 0 24px!important;overflow:visible} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li a>span.title, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li a>span.title{position:relative;display:inline-block;padding:12px 5px 0 5px;height:38px;font-size:14px;z-index:100;background-color:#2c9cb9} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li a>span.title:before, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li a>span.title:before, +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li a>span.title:after, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li a>span.title:after{content:' ';position:absolute;width:20px;display:block;height:37px;top:0;z-index:100;background-color:#2c9cb9} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li a>span.title:before, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li a>span.title:before{left:-14px;-webkit-border-radius:8px 0 0 0;-moz-border-radius:8px 0 0 0;border-radius:8px 0 0 0;-webkit-transform:skewX(-20deg);-ms-transform:skewX(-20deg);transform:skewX(-20deg)} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li a>span.title:after, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li a>span.title:after{right:-14px;-webkit-border-radius:0 8px 0 0;-moz-border-radius:0 8px 0 0;border-radius:0 8px 0 0;-webkit-transform:skewX(20deg);-ms-transform:skewX(20deg);transform:skewX(20deg)} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li a>span.title span, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li a>span.title span{border-top:none;padding:0;margin-top:0;overflow:visible} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li a:before, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li a:before{z-index:110;position:absolute;top:18px;left:22px} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li a[class*=icon]>span.title, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li a[class*=icon]>span.title{padding-left:18px} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li.active a, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li.active a{z-index:107;color:#fff} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li.active span.tab-close i, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li.active span.tab-close i{color:#fff} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li.active a>span.title, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li.active a>span.title{background-color:#2da7c7;z-index:105} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li.active a>span.title:before, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li.active a>span.title:before{z-index:107;background-color:#2da7c7} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li.active a>span.title:after, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li.active a>span.title:after{background-color:#2da7c7;z-index:107} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li[data-modified] span.tab-close i, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li[data-modified] span.tab-close i{top:5px;font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li[data-modified] span.tab-close i:before, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li[data-modified] span.tab-close i:before{font-family:"Font Awesome 6 Free";font-weight:900;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;content:"\f111";font-size:9px} +body.fancy-layout .master-tabs.control-tabs>div>div.tabs-container>ul.nav-tabs>li:first-child, +.master-tabs.control-tabs.fancy-layout>div>div.tabs-container>ul.nav-tabs>li:first-child{margin-left:0} +body.fancy-layout .master-tabs.control-tabs[data-closable]>div>div.tabs-container>ul.nav-tabs>li a>span.title, +.master-tabs.control-tabs.fancy-layout[data-closable]>div>div.tabs-container>ul.nav-tabs>li a>span.title{padding-right:10px} +body.fancy-layout .master-tabs.control-tabs.has-tabs:before, +.master-tabs.control-tabs.fancy-layout.has-tabs:before, +body.fancy-layout .master-tabs.control-tabs.has-tabs:after, +.master-tabs.control-tabs.fancy-layout.has-tabs:after{display:block} +body.fancy-layout .master-tabs.control-tabs.has-tabs>div.tab-content, +.master-tabs.control-tabs.fancy-layout.has-tabs>div.tab-content{background:#f9f9f9} +body.fancy-layout .master-tabs.control-tabs>.tab-content>.tab-pane, +.master-tabs.control-tabs.fancy-layout>.tab-content>.tab-pane{padding:0} +body.fancy-layout .master-tabs.control-tabs>.tab-content>.tab-pane.padded-pane, +.master-tabs.control-tabs.fancy-layout>.tab-content>.tab-pane.padded-pane{padding:20px 20px 0 20px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs.master-area>div>ul.nav-tabs, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs.master-area>div>ul.nav-tabs{-webkit-transition:background-color 0.5s;transition:background-color 0.5s;background:#2da7c7} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs{background:#7F8C8D;margin-left:0!important;margin-right:0!important} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs:before, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs:before{display:none} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs>li, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs>li{background:transparent;border-right:none;margin-right:-8px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs>li:first-child, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs>li:first-child{margin-left:-5px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs>li a, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs>li a{background:transparent;border:none;padding:12px 16px 0;font-size:14px;font-weight:400;color:#95a5a6} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs>li a span.title, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs>li a span.title{background:#d5d9d8;border-top:none;padding:5px 5px 3px 5px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs>li a span.title:before, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs>li a span.title:before, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs>li a span.title:after, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs>li a span.title:after{background:#d5d9d8;border-width:0;top:0} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs>li a span.title:before, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs>li a span.title:before{left:-20px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs>li a span.title:after, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs>li a span.title:after{right:-20px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs>li a span.title span, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs>li a span.title span{border-width:0;vertical-align:top} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs>li.active a, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs>li.active a{color:#808c8d} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs>li.active a:before, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs>li.active a:before{display:none} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs>li.active a span.title, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs>li.active a span.title{background:#fafafa} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs>li.active a span.title:before, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs>li.active a span.title:before, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>div>ul.nav-tabs>li.active a span.title:after, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>div>ul.nav-tabs>li.active a span.title:after{background:#fafafa} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>.tab-content>.tab-pane, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>.tab-content>.tab-pane{padding:20px 20px 0 20px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs>.tab-content>.tab-pane.pane-compact, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs>.tab-content>.tab-pane.pane-compact{padding:0} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs.collapsed, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs.collapsed{display:none} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.primary-tabs.has-tabs>div.tab-content, +*:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.fancy-layout.primary-tabs.has-tabs>div.tab-content{background:#f9f9f9} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs:before{left:5px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs:after{right:5px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs>div>ul.nav-tabs{background:#475354} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs>div>ul.nav-tabs>li{border-right:none;padding-right:0;margin-right:0} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs>div>ul.nav-tabs>li a{background:transparent;border:none;padding:12px 10px 13px 10px;font-size:14px;font-weight:normal;line-height:14px;color:#919898} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs>div>ul.nav-tabs>li a span span{overflow:visible;border-top:none;margin-top:0;padding-top:0} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs>div>ul.nav-tabs>li:first-child{padding-left:15px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs>div>ul.nav-tabs>li.active a{color:#fff} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs .tab-collapse-icon{position:absolute;display:block;text-decoration:none;outline:none;opacity:0.6;filter:alpha(opacity=60);-webkit-transition:all 0.3s;transition:all 0.3s;font-size:12px;color:#fff;right:11px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs .tab-collapse-icon:hover{text-decoration:none;opacity:1;filter:alpha(opacity=100)} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs .tab-collapse-icon.primary{color:#fff;top:12px;right:11px;bottom:auto;z-index:100;-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs .tab-collapse-icon.primary i{position:relative;display:block} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.primary-collapsed .tab-collapse-icon.primary{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1)} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs>div>ul.nav-tabs{background:#f9f9f9} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs>div>ul.nav-tabs>li{margin-left:-19px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs>div>ul.nav-tabs>li:first-child{margin-left:0;padding-left:8px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs>div>ul.nav-tabs>li a{padding:8px 16px 0 16px;font-weight:400;height:36px;color:#2b3e50;opacity:0.6;filter:alpha(opacity=60)} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs>div>ul.nav-tabs>li a>span.title{position:relative;display:inline-block;padding:8px 5px 9px 5px;font-size:14px;z-index:100;height:27px!important;background-color:transparent} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs>div>ul.nav-tabs>li a>span.title:before, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs>div>ul.nav-tabs>li a>span.title:after{content:' ';position:absolute;background-color:white;width:15px;height:28px;top:0;z-index:100;display:none} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs>div>ul.nav-tabs>li a>span.title:before{left:-11px;-webkit-border-radius:8px 0 0 0;-moz-border-radius:8px 0 0 0;border-radius:8px 0 0 0;-webkit-transform:skewX(-20deg);-ms-transform:skewX(-20deg);transform:skewX(-20deg)} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs>div>ul.nav-tabs>li a>span.title:after{right:-11px;-webkit-border-radius:0 8px 0 0;-moz-border-radius:0 8px 0 0;border-radius:0 8px 0 0;-webkit-transform:skewX(20deg);-ms-transform:skewX(20deg);transform:skewX(20deg)} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs>div>ul.nav-tabs>li a>span.title span{height:18px;font-size:14px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs>div>ul.nav-tabs>li.active a{opacity:1;filter:alpha(opacity=100)} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs>div>ul.nav-tabs>li.active a>span.title{background-color:white} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs>div>ul.nav-tabs>li.active a>span.title:before, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs>div>ul.nav-tabs>li.active a>span.title:after{display:block} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs .tab-collapse-icon.primary{color:#000} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed .tab-collapse-icon.primary{color:#fff} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed>div>ul.nav-tabs{background:#2da7c7} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed>div>ul.nav-tabs>li a{color:white} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed>div>ul.nav-tabs>li a>span.title:before, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed>div>ul.nav-tabs>li a>span.title:after{background-color:white} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed>div>ul.nav-tabs>li.active a{color:#2b3e50} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs.has-tabs>div.tab-content{background:#f9f9f9} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs>.tab-content>.tab-pane{padding:0} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-tabs>.tab-content>.tab-pane.padded-pane{padding:20px 20px 0 20px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields{position:relative;background:#2da7c7;padding:18px 23px 0 23px;-webkit-transition:all 0.5s;transition:all 0.5s} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields:before, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields:after{content:" ";display:table} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields:after{clear:both} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields label{text-transform:uppercase;color:rgba(255,255,255,0.5);margin-bottom:0} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .form-control[disabled]{background-color:rgba(29,29,29,0.11) !important} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields input[type=text]{background:transparent;border:none;color:#fff;font-size:35px;font-weight:100;height:auto;padding:0;-webkit-box-shadow:none;box-shadow:none} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields input[type=text]::-moz-placeholder{color:rgba(255,255,255,0.5);opacity:1} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields input[type=text]:-ms-input-placeholder{color:rgba(255,255,255,0.5)} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields input[type=text]::-webkit-input-placeholder{color:rgba(255,255,255,0.5)} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields input[type=text]:focus, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields input[type=text]:hover{background-color:rgba(255,255,255,0.1)} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .form-group{padding-bottom:0} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .form-group.is-required>label:after{display:none} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .tab-collapse-icon{position:absolute;display:block;text-decoration:none;outline:none;opacity:0.6;filter:alpha(opacity=60);-webkit-transition:all 0.3s;transition:all 0.3s;font-size:12px;color:#fff;right:11px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .tab-collapse-icon:hover{text-decoration:none;opacity:1;filter:alpha(opacity=100)} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .tab-collapse-icon.primary{color:#fff;top:12px;right:11px;bottom:auto;z-index:100;-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .tab-collapse-icon.primary i{position:relative;display:block} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .tab-collapse-icon.tabless{top:14px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields.collapsed{padding:5px 23px 0 10px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields.collapsed .tab-collapse-icon.tabless{-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields.collapsed .form-group:not(.collapse-visible){display:none} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields.collapsed .form-buttons{margin-left:10px;padding-bottom:0} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .loading-indicator-container .loading-indicator{background-color:#2da7c7;padding:0 0 0 30px;color:rgba(255,255,255,0.5);margin-top:1px;height:90%;font-size:12px;line-height:100%} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .loading-indicator-container .loading-indicator>span{left:-10px;top:18px} +body.breadcrumb-fancy .control-breadcrumb, +.control-breadcrumb.breadcrumb-fancy{margin-bottom:0;background-color:#1198bc} +body.breadcrumb-fancy .control-breadcrumb li, +.control-breadcrumb.breadcrumb-fancy li{background-color:#0e7d9a;color:rgba(255,255,255,0.5)} +body.breadcrumb-fancy .control-breadcrumb li a, +.control-breadcrumb.breadcrumb-fancy li a{opacity:0.5;-webkit-transition:all 0.3s ease;transition:all 0.3s ease} +body.breadcrumb-fancy .control-breadcrumb li a:hover, +.control-breadcrumb.breadcrumb-fancy li a:hover{opacity:1} +body.breadcrumb-fancy .control-breadcrumb li:not(:last-child)::before, +.control-breadcrumb.breadcrumb-fancy li:not(:last-child)::before{border-left-color:#2da7c7;opacity:0.5} +body.breadcrumb-fancy .control-breadcrumb li:after, +.control-breadcrumb.breadcrumb-fancy li:after{border-left-color:#0e7d9a} +body.breadcrumb-fancy .control-breadcrumb li:last-child, +.control-breadcrumb.breadcrumb-fancy li:last-child{background-color:#1198bc} +body.breadcrumb-fancy .control-breadcrumb li:last-child:before, +.control-breadcrumb.breadcrumb-fancy li:last-child:before{opacity:1;border-left-color:#1198bc} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs .form-buttons:not(.normalized), +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .form-buttons:not(.normalized){-webkit-transition:all 0.5s;transition:all 0.5s;padding-top:14px;padding-bottom:5px} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs .form-buttons:not(.normalized) .btn, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .form-buttons:not(.normalized) .btn{padding:0;margin-right:5px;margin-top:-6px;margin-right:30px;background:transparent;color:#fff;font-weight:normal;-webkit-box-shadow:none;box-shadow:none;opacity:0.5;filter:alpha(opacity=50);-webkit-transition:all 0.3s ease;transition:all 0.3s ease} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs .form-buttons:not(.normalized) .btn:hover, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .form-buttons:not(.normalized) .btn:hover{opacity:1;filter:alpha(opacity=100)} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs .form-buttons:not(.normalized) .btn:last-child, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .form-buttons:not(.normalized) .btn:last-child{margin-right:0} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs .form-buttons:not(.normalized) .btn[class^="wn-icon-"]:before, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .form-buttons:not(.normalized) .btn[class^="wn-icon-"]:before, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs .form-buttons:not(.normalized) .btn[class*=" wn-icon-"]:before, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .form-buttons:not(.normalized) .btn[class*=" wn-icon-"]:before, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs .form-buttons:not(.normalized) .btn[class^="oc-icon-"]:before, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .form-buttons:not(.normalized) .btn[class^="oc-icon-"]:before, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs .form-buttons:not(.normalized) .btn[class*=" oc-icon-"]:before, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .form-buttons:not(.normalized) .btn[class*=" oc-icon-"]:before{opacity:1} +.fancy-layout form[class$="-data-changed"] *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs .btn.save{opacity:1;filter:alpha(opacity=100)} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs>.tab-content>.tab-pane>.form-group>.field-codeeditor{border:none !important;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs>.tab-content>.tab-pane>.form-group>.field-codeeditor .editor-code{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs>.tab-content>.tab-pane>.form-group>.field-richeditor{border:none;border-left:1px solid #d1d6d9 !important} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs>.tab-content>.tab-pane>.form-group>.field-richeditor, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs>.tab-content>.tab-pane>.form-group>.field-richeditor .fr-toolbar, +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs>.tab-content>.tab-pane>.form-group>.field-richeditor .fr-wrapper{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border-top-right-radius:0;border-top-left-radius:0} +.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs.secondary-content-tabs>.tab-content>.tab-pane>.form-group>.field-richeditor .fr-toolbar{background:white} +body.side-panel-not-fixed .fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs>.tab-content>.tab-pane>.form-group>.field-richeditor, +body.side-panel-not-fixed.fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.control-tabs>.tab-content>.tab-pane>.form-group>.field-richeditor{border-left:none} +html.cssanimations .fancy-layout *:not(.nested-form):not(.modal-body)>.form-widget>.layout-row>.form-tabless-fields .loading-indicator-container .loading-indicator>span{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite;background-image:url('../../../system/assets/ui/images/loader-white.svg');background-size:20px 20px} +.flyout-container>.flyout{overflow:hidden;width:0;left:0!important;-webkit-transition:width 0.1s;transition:width 0.1s} +.flyout-overlay{width:100%;height:100%;top:0;z-index:5000;position:absolute;background-color:rgba(0,0,0,0);-webkit-transition:background-color 0.3s;transition:background-color 0.3s} +.flyout-toggle{position:absolute;top:20px;left:0;width:23px;height:25px;background:#2b3e50;cursor:pointer;border-bottom-right-radius:4px;border-top-right-radius:4px;color:#bdc3c7;font-size:10px} +.flyout-toggle i{margin:7px 0 0 6px;display:inline-block} +.flyout-toggle:hover i{color:#fff} +body.flyout-visible{overflow:hidden} +body.flyout-visible .flyout-overlay{background-color:rgba(0,0,0,0.3)} +/* Record navigation (formcontroller/partials/_record_navigation.php) */ +.control-breadcrumb{position:relative} +.form-record-nav{position:absolute;top:0;bottom:0;right:20px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;gap:9px;font-size:12px} +.form-record-nav .form-record-nav-position{color:#5a6b7b;font-weight:600;letter-spacing:.3px;white-space:nowrap} +.form-record-nav .form-record-nav-group{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(255,255,255,.55);border:1px solid rgba(0,0,0,.09);border-radius:6px;overflow:hidden;box-shadow:0 1px 1px rgba(0,0,0,.03)} +.form-record-nav .form-record-nav-btn{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:28px;height:24px;color:#5a6b7b;text-decoration:none;-webkit-transition:background-color .12s ease,color .12s ease;transition:background-color .12s ease,color .12s ease} +.form-record-nav .form-record-nav-btn+.form-record-nav-btn{border-left:1px solid rgba(0,0,0,.09)} +.form-record-nav .form-record-nav-btn:not(.is-disabled):hover{background-color:#fff;color:#1f2d3d} +.form-record-nav .form-record-nav-btn.is-disabled{color:#b6bfc7;cursor:default} +.form-record-nav .form-record-nav-btn svg{display:block} diff --git a/modules/backend/assets/images/dashboard-icon.svg b/modules/backend/assets/images/dashboard-icon.svg new file mode 100644 index 0000000..abdd52d --- /dev/null +++ b/modules/backend/assets/images/dashboard-icon.svg @@ -0,0 +1,17 @@ + + + + dashboard-icon + Created with Sketch. + + + + + + + + + + + + diff --git a/modules/backend/assets/images/favicon.png b/modules/backend/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..2a14a9fec17433c84c0fd4b43592d78f6142d602 GIT binary patch literal 5053 zcma)Ac{Ek+_kYg07uR)h>Ed!JN`^+mHD%~{&98YZQ-;hHQb{r#$u&!cGKTajQg~JL zX1F23m9Z$r%@EOG&J^EUzqNkfKYqjdKI^Rg?6sfI-e>RUoU@+u+3^-;2HbcNJOF^( z$WYe`0GOr10E=Nw>~`(#tch%4Vxwo`dsg<|%l~=RwG3slFdXNt%&dXshw7_B@+U4h zc>%D))JRv`CgjAI0c}56n@H;=xH+k?Gu|bKqkPo@x_{^E@e~>u?jKk_Q};aX{a*(c(7{_sg$Fr(*bDNq7OnH#aWZ!pei#2~C8;lc2 z!T&E7PeHAA-@s&pgn3i`(s{;uC@GjZtVmGt0$lNoS^g zI6~--Oq0&jlG)dFrQhD#k>o%sNUlSaL<967Ucg!D?EGX-iY$u&Ljd&v3<9yX8iy*s z0ahprIc!SVhv12Tzc6#qhr`j54iNZJAIFyiy1$*@`W7{yFevndQ(Pk?yGTaUjaP!*c$+rwm>LCg!j?X@bi4M(=RCGIKZ-N3=f^ zL>l~r66-=&*YMbvAJ{`Kq*yRNG+#^XIp8XB$NKe$W}$QT1i@1~0>z9N;_6GDC|m|0 zeO}l6z2OuynyOipsYQVGOyQveW>J^Q$2;uyOuMGSxy%PQ9?;}kwDFAShx;3O)`N-I zdvo$e-14#rJfYIOWn`NN=i-e`6?9DSsldJ~P$23A3hal`KS#TS_{A%PANJni6%t2+ z6g4zfe{L$c#$iZVv5#6Y%3+HecX+g1YKFg3@Ace**|2fNVTGOLJu?rqUT|04MWvDV zgwdJZWkdC^+wMuMj+>W1=e8f%R?a7d+J}9DY{bO60!QI#r8bH?H|R(&E=yKvK9Rja(wPwt zKQF0_{2)eA^gMmJUVch&fTn#m zC?kb_p5sx~u8WuhBGI)n5)qxRE5q*+a> z9Xu@-xIHo?GB&<2F`cj23~{_~RQX1Br)jY3wfDv-HuL>51Rpt`Bf9J-5=8%b`J{K; zVLhloRP2ai9s*=(WmN?E^MUp`qM5TF1B2OwZV;en5s9#r+RS4~Z49%1eo^bqUW4c4 z%`_~loGQhZv1rqjBZ{X*1Nr68(`x0^{1|~e(9+0|@E8wU%Fc+q1Ry0EI=HqWf!eps zwFxyIGD`8QmyY8U4UAG*=?>C`-iVGsUPG!(s{1tItWnTFmfIfmbIV+DawZP}!UBZFMK)Tv&aFQ*)%E|&@>1mvukB^ve(x-UGcg;{^x+D$UXuaO$TdRA; zK;&%qO%-LGW{8viBtEiHd{ug|AX0ARZ>d9HUQEbPybm5Ke=W(2EmpbfC?IrdMqF0z z?uD6`Tr<;Q+07ix?pUXOrh?j^izYRuxb+{HPhyC`r&fiQLXdi0*elTpr}fhbM;nwp z>JUtJw***J_(nVO@j}PetV74$E56YZf@}zoX*HB9<@dRLwczm)m!2oa!?uPg!3;Ss zdO$0uI67xtG(Q9Di`_7#)M3BQ3#*+Xup3pveu$k*KoC* zgYDXO$ne@hr;vN`Ke>(yc{J$i=`iM18I=|p7}^r?%2rH4nn?gbhX8zNPt)c^)(2Z= zxuP4gDV;<|aOa8_`{{tD=7x-GXPy>Nj5)*rKV!-rDUMLOZcIteE?}Y5fd`EbqagUG zBK~clm(oyoa+^X67TrV7%!e-j@$gjp^IL9CvL|nK6W#_4=vZtd-BADAv`T6*gE;sJ zkXy)_EoDw;8@u#|l7jrh7DU0ZEU4|mCF>ugv!fRg!u(_i@V~9->gyg3#5d=k&eubT z7a1mBmZ>R?TBQY4POO!at!}eUh~Qbzmj#0-upAZ*tM5Y| zFM*_0L-~=rukI`TG5utmd%}R1ehlZzC{3zSGA~*W6Zzq|)QY7~qT}Yi*Y@Q^HEy%j ze#~|K8WgRF2+)|LkwIprzGrZBAG_y6p4mB8!)!>5uuns&>{Kg^IPaOM!DHyylg;fv zfa*OtV4|+{6AL5-Oc5kq|Jr`m@fiWK8h!fh`E?+sH$7@)fBwSS(<(5OZ<`(Em78OB z=oVQMnxnGYxPdHBzaybXR3fmht0Z!?YY=X8Jd{0YCxj4W`9D}y_c#k zK2DGZcak5}Ni`|uX<`(3u4xL&CP?gf+bZh-dTxAq!P8M) z^bLcDqRq4Ol^zK3X`VC=esV8MY-d+f%ftiCAJ?-X!Or6t2PO3|fqIomv{T3Wq>0J6 z;KZG=_tO5I4X)Lel-%4Rx48RVH3{c-eLknEOy)IHQ2VYpuv}a{&u%Lvy)*wW(rU>w zE#Q{e^rL8mqp82Q)c5C?z}3mgk9w+Fjcur9OUSYOU8A)o=|c2Xc6^!9^yHWIw{GmA zyA_$9VO+^ysYK(lT(J|RqxVnp1b~hwf zQOi?}-(&L`RC!8~Gt8x8rLbYcv0^iOahImRHO#=FsGZ=e#!!22$YlTR&F*dnHoH0g zv9arCFF(~DxlqoZyudT_Gs+R6uIbkmF-Xx_y(~(h1t9O~qoWGj9X(^%&U*&}u9TLJ z4x~D2CkzEfEPNkI*hTqswM%s4pvv=>3#V=(M1(}Q+Z?iL>2luDg&g}H`2ElK2(Uo5 z1%9NtIhSNeK1g~;Ap#Q7zBcDmr&V9VbH-RJJERNcjdJT`%b6ORdJqha)o}oi$mzG= zExC${mA?Zl2j=#N{JjM^3RA|s&HX+VS!`HG=DzC&W@;eg^x4iZew0*rrdCXvxD_WA zR1PVId5#s@Bvq^_PCV+^k+XT36#+Q-aV!{2A3e$br(Gf_1O$1;Un|+>_O0|zLNq8u z!!U|=u!?g#^elYIh(!$?=M`^iw1*AlX)5Jn#n~8ZA2_c$7TY|vuGRwv(7A{jN#*&o ziCbUJu?I*QcYSDj=;v`KralRkxRKW5H^oP%_YUu-`>o;V_jIB(E248K-WnmpVV5>`Bhqpb zcr1@gcMs3p^T{u5HQ)W-N}yoc!qr1CZCSPdbG3$b`vK-`Cl7>0V&Ueh>uGljZZaU# zSp6myXBO8v#OC!doBm$a93!W_gF}D>-AZZIg~;w9cLwcSQl+|X<%GZA%L-`4Y|S6# z9?ouqE<@^{`4ON|1a?X^S(VJUiWmEo^<`e<6bDC0t5H1o!VmU5@)JSlr@AU}^!ZvD zCilGj&5?pnsH`EEH|-gg2*mJo;^Ki<1oxNYpgtmsMQ=%Sjj>;h#ZgsfAulouQ3$fJ zXH-|8j*#1+re#+qFN^~gfJT;9P>k(s1Xl6vuULdo9d)9gx%!LKU=x*=SIeIBBGVVmc;C!^ADGCIBKjj+4zclYV?Ecs?}7B6N? zl2E2CO?9F5_}1ujg%&~PR{cCAV~~)O@q(HmqV90}uQcVQgS1!Cf!E#3jhV-R{!k`= z;+HDtjLR448L~U%v$P6?YPGk3!mQ`hV;rX`0{iab5TFb7B+`Z!|Bi&N3hURiLjaXQ zAKWm#{~=vv;u5WyAKSI zLm!KPo`BH5w(J5%zjP@Coo#q{B~RidsX6o%9l+!w>BM$R7n1^E`MhICbmPpT_mOua z8F1K);jjQoJV%J%wj%unvqk1^28^LXmlTZU`sg*4_q*wUR?3L9- zPGJ>n@^V=UwIzO^KP^0n>L0gwzfc;%KGQDI7yoVXh*Px5%h6I3k#E_y689vR!m;oA>;5X#-=Q^LbS}mV^WhQ`STCgOry#mQU4W7IU!<>fV#N@f7=(PDe( z-rieX!ij))cj>lNwa_F{zl|*197*RZ*2C|LY&KFs?mJbIxP_Xqi=T4;0~MZ zO^-u!OJ1jVDc2U)J25eC4Vr#~v!HYb0w65$zlGuM|D`=uX*bha%3Gx1yg}U8U(Hgu sts_4&mj226CQ$Dw`>Xx-@3A$`#iOZ__-&G`{mW>iXQun`57#UI0<2k!SpWb4 literal 0 HcmV?d00001 diff --git a/modules/backend/assets/images/logo.svg b/modules/backend/assets/images/logo.svg new file mode 100644 index 0000000..9d202b9 --- /dev/null +++ b/modules/backend/assets/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/backend/assets/images/media-icon.svg b/modules/backend/assets/images/media-icon.svg new file mode 100644 index 0000000..3723217 --- /dev/null +++ b/modules/backend/assets/images/media-icon.svg @@ -0,0 +1,22 @@ + + + + media-icon + Created with Sketch. + + + + + + + + + + + + + + + + + diff --git a/modules/backend/assets/images/secondary-tab-shape-content.svg b/modules/backend/assets/images/secondary-tab-shape-content.svg new file mode 100644 index 0000000..164511a --- /dev/null +++ b/modules/backend/assets/images/secondary-tab-shape-content.svg @@ -0,0 +1,16 @@ + + + +]> + + + + + + + + diff --git a/modules/backend/assets/images/tab-shape.svg b/modules/backend/assets/images/tab-shape.svg new file mode 100644 index 0000000..0645c36 --- /dev/null +++ b/modules/backend/assets/images/tab-shape.svg @@ -0,0 +1,16 @@ + + + +]> + + + + + + + + + diff --git a/modules/backend/assets/images/treeview-icons.png b/modules/backend/assets/images/treeview-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..a08c70b88675eaaffa84fb2e6e29a80e9455de3a GIT binary patch literal 1344 zcmeAS@N?(olHy`uVBq!ia0vp^S_}+~dK}C^*7@HBr-2;n0G|-ohMwO4|Nl>2x(vdg z3JEj~XeOpn5J60Fl0+beBU^##c(^Pc238m1atWHtA;zY)31|XCGp!`ZFBnKOGV=2a z3fkE@JG;2Jy1Kc!yL)(ediweX1O&vzB_t#!CMD(P7Zem078jS4l$Ms4S5{V6cXS*% za^&dIW5#fw+3UVZrR@#EL8-@bkS{^Q5bpMU=R{rm5qz?Fs@ z3=GVEo-U3d6>)E_cxD|j5NJ)D%0KDLgct?o66rU07EQkQg<;aW`X&#qM>kogYHbKV zX0MQIw;=3%;HwAO_SQn$R~G-?>@$1H_m`UgyZ68E*;4sg{N%1=jzovecR5T9yyX9V zQn={kFxgfz!*}`I-fKb;Jh7Vo%h=VdC-QMKCU8AH`Q^lu=|0k8XPw%sp9cNEa4|0P z%G7_~PI<)M(^fuPmb`?odg+BEf3~R0ndwV13`>^U%v@E?dTMcG#<$!xbH8)-zWBBz zQ0wRqsr+i?rQa*2uF)=UO4}`(kut^Z@z=mbi+W4P7PxR)Z;OD}_UEckqRs$M?3Ot#eD)bo5% zQf&tf`t}!gbes^-RC*iP#v|yz`;F2j!_1XHk&h~GzyD|Z)@!Kv!_1$9mF-Er=9c~5 z`Tia|U;o>#trArp6d%s?_K6+0&s@=!zjdwTuDm|`J;7ctSwpwyD}Rm8&zFHwA71}; zGCq`MP-};icYTB)N{9D{Z?q*htIbYqoZTT!C&Va86z8SjQ_xl&M zkvCv{=8HAG%S!&TthD*Z-;*{gbJ+ruDCL_`QF(`of~8(5t^Yc~i1AcBtJYK>$ILB` zpN?M2lAd<^)FtH!L7F8goSu&}b2vFmO714STH|r@nXaPGU73Hg|p5nw)-Wm>jmo3~Z7QDShVXCzO(88Hbmo(y>rae+MIcj^xzq;%|qk%wM zVU7M|6;Gp1#uF-@3KA;EB!E1HcfaeK@-DyYjr%_5CdYS%9|!q%??3zSbNZas_n%I5 z;Z}XSQ((oU?;QrI+Ch(aw^*%@yLIom-V~v29YKq}5y*?F}EnRcYSajva%Uxop z{4#@YcP`@!ymhVYjZ5&&8$OCIqknL$m^Z%by|4Ir++^+lKjj^0}_{J^E}SGC%!%ePtr2VXNv9kt@9}8+j8T>}dkQ z5l%i(2_Pp1%1K#x|8+;3>arrvum8(FUJ3U9d-gBemNTx#3MN|ufq9t0)78&qol`;+ E0BLsAIRF3v literal 0 HcmV?d00001 diff --git a/modules/backend/assets/images/treeview-submenu-tabs.png b/modules/backend/assets/images/treeview-submenu-tabs.png new file mode 100644 index 0000000000000000000000000000000000000000..6c39867bada1d1380af79023b63857b8d905e2e8 GIT binary patch literal 2714 zcmb`JS5y;N9>#Boir_FvK$<8ZQiLEul#ZyN2%$;~RRjg;CDhPjLsRrM`bKV7VlA>dy56%N>nP4dKn9Il)Nby>UL^#j+*D+MI%xhu$6EUDFKk zy&}wz!5*7UL6@J!t^qx`_kAgda^#FH+?A!7`XTZ)#5Xp8?buWg-n4mlcEKD9rnYZ; zf#8-Ye+{ENWEh(9k2_y91y{mu@wYU#@AxZ4`^dGf=|Y+TF#R0?QY9^gN1)4z_ZF<} z^&St~o8t_C^SE;dBK)Tyt&f=cdw7Yrf{Rp^9^C(P>#8Gp=y~%7JUQ5W(eTatQXmu7{J$)#&s5Tp94IdT>oA{ZCHcb)a3OOg$<3) zyZhA;)1O5eCx+6eq>%lmZd%?*K(5i^_^u~RQ%%iYf#)r5E zY`j3b?|dCs&4rJ!Kt-nTl8{~r?>_3{!9?2;@UeVqiqrZZx^tp=Vk!1BM!T-OvJI|H zIkD4^@(WJ~p`QmV>SIQ}*8LHqeReTRyz9IXt4pJ0TpaCIx9DW&dRVj%CH#q6(9OROrU zqiADXI9=a|A|RhkOhZJqiJP{ctVFVY(XZKLWjsGbo2xs zfm%3^tS`Uwl2;-Z7>Wp8sj}^v-~d5Hq~ImLfdk-kMmQ=5RZ- z6534lEg52^P#WMXqMd}IqM%UQqHpv0z8fQEW#0@MfXAQ^=x_-1lAfaUz}F^^ueedk zizCSr=G(px>*t)=zP&^$V(Z4VeuG9@i2eT&^aJ&C-kGkLCC~vz(o)>3YjC$5zH>5U!#@Te%26GHVWK~foS@;{& z0eXe!N~s6e(ebBqNoy-%s{&XEq2Z>Erw?Z3V}bts5$qW(OLc_4MIuh=E{0xX^|fjt zml66QK$d(RgbezDii&#$1)dkIHPF_?IBOiO>&JGrI7-hVNXBhdM9)L8*&WCLdw_bA zRc(bQ*}fndxaYR@Jdhz)W#-W*o84OOxt6+Dw9T`2Nj7-)oR+)0S%lXP%|y{H%LL;o z5ZjPuc5JFphS++qV(Ieijra(XTfdA2>p9ecBi8!b_3vlf^RlWx-1o9r8mis!&g*?^$mKlnI-2ka;x(+5>Tr!5g=0I+&Hm1n?u2aNBHf-|`o-rydV9g;O zbRGSct8C5NG?$V*HsF$Z8ws6)(O|sqU(4oWx9Rf+P!PQq@BJ^HsbPAJgOZ-+wBQg? z=rjg(!>SS;Qcxx$q7;2;#rY*_ZJic54wVb@SCD)C&a+gSECJBjnev#hKY6ykwLyA- z`DlDO1vQ^&#FHseMhaJ_o`+LA`Wh7@UcKX&hMO^~iZn_9wNb+iRgithbmJ5b!mm@@ z7X-Ho5+w>;#WCg(0K1~=>^Qhi2*H=AAv9d}liJ@`NCXWR4sNlE*NvZhUg1Cb!2jN% zx{FOatGJ^u^~8*HL|AF_YQR=~|0cUwU16*U`F41SD1yv_jTxkQmD&h6v8iR)GqG0L zKPvM0SrVMV&&M#6oi3d@*aw$88k4wsUg(vsO735b!;e;tcfF5wyl}!-aSqkmadyh1 zgD53o$}zbP+3IoaJ>;ErSf_-tWc8&(8_hj`{{E?A&F*&SMEve$M%OyQ9A7z&zfmOC zWTeq&Cps}0J&Yp_R$*+3>fB)mawL)(+|{Lg=KbbFLg5b;De~pO%lsx`gbV^A>Ycc0 zKKxmf>6WsRN)Ds;H@u@Jf^7XngKlshl(vpn#iP=E@zn~-j`u!>?iw_7a|0tIZ(|%q zxp?gRr`c!U-z;Thn%)iJ3}2Le&J4($FY&7+C*5KFveL#u$b|M=JvxehA~H7klTcA( z{mB(+(hbe~t6`I;a3rsx4;hk1YJl)!aowzsw1te(IZ21GT8|!W=d`pa0H|{4gXcpN?Q67G7jjO5CxCrmN8U=8eJp`W8h5_b z>nC=RZtrV{^x?WCpn>`B8Fy9jE&59ms-#<9~MLo({BG_j4X&DMERn7H~uHt)FXC}Aq5@( ze`sTpXO5RVX^8NHYt1$+s9 W%d8tG7McG_pnKg=`?qTjxPJmA&?X}Q literal 0 HcmV?d00001 diff --git a/modules/backend/assets/images/winter-logo-white.svg b/modules/backend/assets/images/winter-logo-white.svg new file mode 100644 index 0000000..e072730 --- /dev/null +++ b/modules/backend/assets/images/winter-logo-white.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/backend/assets/images/winter-logo.svg b/modules/backend/assets/images/winter-logo.svg new file mode 100644 index 0000000..18c85e7 --- /dev/null +++ b/modules/backend/assets/images/winter-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/backend/assets/images/wordmark.png b/modules/backend/assets/images/wordmark.png new file mode 100644 index 0000000000000000000000000000000000000000..3b2280df613d32c3ef15c355fe3170526c8b44e2 GIT binary patch literal 56536 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�Pen^PFW5vLkH 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 CUH_E; literal 0 HcmV?d00001 diff --git a/modules/backend/assets/js/auth/auth.js b/modules/backend/assets/js/auth/auth.js new file mode 100644 index 0000000..caa70f0 --- /dev/null +++ b/modules/backend/assets/js/auth/auth.js @@ -0,0 +1,5 @@ +$(document).ready(function(){ + $(document.body).removeClass('preload') + + $('form input[type=text], form input[type=password]').first().focus() +}) \ No newline at end of file diff --git a/modules/backend/assets/js/backend.js b/modules/backend/assets/js/backend.js new file mode 100644 index 0000000..f8898d6 --- /dev/null +++ b/modules/backend/assets/js/backend.js @@ -0,0 +1,102 @@ +/* + * Winter General Utilities + */ + +/* + * Path helpers + */ + +if ($.wn === undefined) + $.wn = {} +if ($.oc === undefined) + $.oc = $.wn + +$.wn.backendUrl = function(url) { + var backendBasePath = $('meta[name="backend-base-path"]').attr('content') + + if (!backendBasePath) + return url + + if (url.substr(0, 1) == '/') + url = url.substr(1) + + return backendBasePath + '/' + url +} + +/* + * String escape + */ +if ($.wn === undefined) + $.wn = {} +if ($.oc === undefined) + $.oc = $.wn + +$.wn.escapeHtmlString = function(string) { + var htmlEscapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '/': '/' + }, + htmlEscaper = /[&<>"'\/]/g + + return ('' + string).replace(htmlEscaper, function(match) { + return htmlEscapes[match]; + }) +} + +/* + * Inverse Click Event (not used) + * + * Calls the handler function if the user has clicked outside the object + * and not on any of the elements in the exception list. + */ +/* +$.fn.extend({ + clickOutside: function(handler, exceptions) { + var $this = this; + + $('body').on('click', function(event) { + if (exceptions && $.inArray(event.target, exceptions) > -1) { + return; + } else if ($.contains($this[0], event.target)) { + return; + } else { + handler(event, $this); + } + }); + + return this; + } +}) +*/ + +/* + * Browser Fixes + * - If another fix using JS is necessary, move this logic to backend.fixes.js + */ + +/* + * Internet Explorer v11 + * - IE11 will not honor height 100% when overflow is used on the Y axis. + */ +if (!!window.MSInputMethodContext && !!document.documentMode) { + $(window).on('resize', function() { + fixMediaManager() + fixSidebar() + }) + + function fixMediaManager() { + var $el = $('div[data-control="media-manager"] .control-scrollpad') + $el.height($el.parent().height()) + } + + function fixSidebar() { + $('#layout-sidenav').height(Math.max( + $('#layout-body').innerHeight(), + $(window).height() - $('#layout-mainmenu').height() + )) + } +} diff --git a/modules/backend/assets/js/preferences/preferences.js b/modules/backend/assets/js/preferences/preferences.js new file mode 100644 index 0000000..b8049d7 --- /dev/null +++ b/modules/backend/assets/js/preferences/preferences.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_wintercms_wn_backend_module=self.webpackChunk_wintercms_wn_backend_module||[]).push([[429],{449:function(e,t,i){var n=i(171);(e=>{class t extends e.Singleton{construct(){this.widget=null}listens(){return{"backend.widget.initialized":"onWidgetInitialized"}}onWidgetInitialized(e,t){e===document.getElementById("CodeEditor-formEditorPreview-_editor_preview")&&(this.widget=t,this.enablePreferences())}enablePreferences(){(0,n.M)("change");Object.entries({show_gutter:"showGutter",highlight_active_line:"highlightActiveLine",use_hard_tabs:"!useSoftTabs",display_indent_guides:"displayIndentGuides",show_invisibles:"showInvisibles",show_print_margin:"showPrintMargin",show_minimap:"showMinimap",enable_folding:"codeFolding",bracket_colors:"bracketColors",show_colors:"showColors"}).forEach(([e,t])=>{this.element(e).addEventListener("change",e=>{this.widget.setConfig(t.replace(/^!/,""),/^!/.test(t)?!e.target.checked:e.target.checked)})}),this.element("theme").addEventListener("$change",e=>{this.widget.loadTheme(e.target.value)}),this.element("font_size").addEventListener("$change",e=>{this.widget.setConfig("fontSize",e.target.value)}),this.element("tab_size").addEventListener("$change",e=>{this.widget.setConfig("tabSize",e.target.value)}),this.element("word_wrap").addEventListener("$change",e=>{const{value:t}=e.target;switch(t){case"off":this.widget.setConfig("wordWrap",!1);break;case"fluid":this.widget.setConfig("wordWrap","fluid");break;default:this.widget.setConfig("wordWrap",parseInt(t,10))}}),document.querySelectorAll("[data-switch-lang]").forEach(e=>{e.addEventListener("click",t=>{t.preventDefault();const i=e.dataset.switchLang,n=document.querySelector(`[data-lang-snippet="${i}"]`);n&&(this.widget.setValue(n.textContent.trim()),this.widget.setLanguage(i))})}),this.widget.events.once("create",()=>{const e=new MouseEvent("click");document.querySelector('[data-switch-lang="css"]').dispatchEvent(e)})}element(e){return document.getElementById(`Form-field-Preference-editor_${e}`)}}e.addPlugin("backend.preferences",t)})(window.Snowboard)}},function(e){e.O(0,[810],function(){return t=449,e(e.s=t);var t});e.O()}]); \ No newline at end of file diff --git a/modules/backend/assets/js/vendor/jquery-and-migrate.min.js b/modules/backend/assets/js/vendor/jquery-and-migrate.min.js new file mode 100644 index 0000000..04ba79a --- /dev/null +++ b/modules/backend/assets/js/vendor/jquery-and-migrate.min.js @@ -0,0 +1,5 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0\x20\t\r\n\f]*)[^>]*)\/>/gi;s.UNSAFE_restoreLegacyHtmlPrefilter=function(){s.migrateEnablePatches("self-closed-tags")},i(s,"htmlPrefilter",function(e){var t,r;return(r=(t=e).replace(F,"<$1>"))!==t&&T(t)!==T(r)&&u("self-closed-tags","HTML tags must be properly nested and closed: "+t),e.replace(F,"<$1>")},"self-closed-tags"),s.migrateDisablePatches("self-closed-tags");var D,W,_,I=s.fn.offset;return i(s.fn,"offset",function(){var e=this[0];return!e||e.nodeType&&e.getBoundingClientRect?I.apply(this,arguments):(u("offset-valid-elem","jQuery.fn.offset() requires a valid DOM element"),arguments.length?this:void 0)},"offset-valid-elem"),s.ajax&&(D=s.param,i(s,"param",function(e,t){var r=s.ajaxSettings&&s.ajaxSettings.traditional;return void 0===t&&r&&(u("param-ajax-traditional","jQuery.param() no longer uses jQuery.ajaxSettings.traditional"),t=r),D.call(this,e,t)},"param-ajax-traditional")),c(s.fn,"andSelf",s.fn.addBack,"andSelf","jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()"),s.Deferred&&(W=s.Deferred,_=[["resolve","done",s.Callbacks("once memory"),s.Callbacks("once memory"),"resolved"],["reject","fail",s.Callbacks("once memory"),s.Callbacks("once memory"),"rejected"],["notify","progress",s.Callbacks("memory"),s.Callbacks("memory")]],i(s,"Deferred",function(e){var a=W(),i=a.promise();function t(){var o=arguments;return s.Deferred(function(n){s.each(_,function(e,t){var r="function"==typeof o[e]&&o[e];a[t[1]](function(){var e=r&&r.apply(this,arguments);e&&"function"==typeof e.promise?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[t[0]+"With"](this===i?n.promise():this,r?[e]:arguments)})}),o=null}).promise()}return c(a,"pipe",t,"deferred-pipe","deferred.pipe() is deprecated"),c(i,"pipe",t,"deferred-pipe","deferred.pipe() is deprecated"),e&&e.call(a,a),a},"deferred-pipe"),s.Deferred.exceptionHook=W.exceptionHook),s}); diff --git a/modules/backend/assets/js/vendor/jquery-migrate.min.js b/modules/backend/assets/js/vendor/jquery-migrate.min.js new file mode 100644 index 0000000..29a4939 --- /dev/null +++ b/modules/backend/assets/js/vendor/jquery-migrate.min.js @@ -0,0 +1,2 @@ +/*! jQuery Migrate v3.4.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +"undefined"==typeof jQuery.migrateMute&&(jQuery.migrateMute=!0),function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],function(e){return t(e,window)}):"object"==typeof module&&module.exports?module.exports=t(require("jquery"),window):t(jQuery,window)}(function(s,n){"use strict";function e(e){return 0<=function(e,t){for(var r=/^(\d+)\.(\d+)\.(\d+)/,n=r.exec(e)||[],o=r.exec(t)||[],a=1;a<=3;a++){if(+o[a]<+n[a])return 1;if(+n[a]<+o[a])return-1}return 0}(s.fn.jquery,e)}s.migrateVersion="3.4.1";var t=Object.create(null);s.migrateDisablePatches=function(){for(var e=0;e\x20\t\r\n\f]*)[^>]*)\/>/gi;s.UNSAFE_restoreLegacyHtmlPrefilter=function(){s.migrateEnablePatches("self-closed-tags")},i(s,"htmlPrefilter",function(e){var t,r;return(r=(t=e).replace(F,"<$1>"))!==t&&T(t)!==T(r)&&u("self-closed-tags","HTML tags must be properly nested and closed: "+t),e.replace(F,"<$1>")},"self-closed-tags"),s.migrateDisablePatches("self-closed-tags");var D,W,_,I=s.fn.offset;return i(s.fn,"offset",function(){var e=this[0];return!e||e.nodeType&&e.getBoundingClientRect?I.apply(this,arguments):(u("offset-valid-elem","jQuery.fn.offset() requires a valid DOM element"),arguments.length?this:void 0)},"offset-valid-elem"),s.ajax&&(D=s.param,i(s,"param",function(e,t){var r=s.ajaxSettings&&s.ajaxSettings.traditional;return void 0===t&&r&&(u("param-ajax-traditional","jQuery.param() no longer uses jQuery.ajaxSettings.traditional"),t=r),D.call(this,e,t)},"param-ajax-traditional")),c(s.fn,"andSelf",s.fn.addBack,"andSelf","jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()"),s.Deferred&&(W=s.Deferred,_=[["resolve","done",s.Callbacks("once memory"),s.Callbacks("once memory"),"resolved"],["reject","fail",s.Callbacks("once memory"),s.Callbacks("once memory"),"rejected"],["notify","progress",s.Callbacks("memory"),s.Callbacks("memory")]],i(s,"Deferred",function(e){var a=W(),i=a.promise();function t(){var o=arguments;return s.Deferred(function(n){s.each(_,function(e,t){var r="function"==typeof o[e]&&o[e];a[t[1]](function(){var e=r&&r.apply(this,arguments);e&&"function"==typeof e.promise?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[t[0]+"With"](this===i?n.promise():this,r?[e]:arguments)})}),o=null}).promise()}return c(a,"pipe",t,"deferred-pipe","deferred.pipe() is deprecated"),c(i,"pipe",t,"deferred-pipe","deferred.pipe() is deprecated"),e&&e.call(a,a),a},"deferred-pipe"),s.Deferred.exceptionHook=W.exceptionHook),s}); diff --git a/modules/backend/assets/js/vendor/jquery.autoellipsis.js b/modules/backend/assets/js/vendor/jquery.autoellipsis.js new file mode 100644 index 0000000..7bd28ef --- /dev/null +++ b/modules/backend/assets/js/vendor/jquery.autoellipsis.js @@ -0,0 +1,447 @@ +/*! + + Copyright (c) 2011 Peter van der Spek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + + +(function($) { + + /** + * Hash containing mapping of selectors to settings hashes for target selectors that should be live updated. + * + * @type {Object.} + * @private + */ + var liveUpdatingTargetSelectors = {}; + + /** + * Interval ID for live updater. Contains interval ID when the live updater interval is active, or is undefined + * otherwise. + * + * @type {number} + * @private + */ + var liveUpdaterIntervalId; + + /** + * Boolean indicating whether the live updater is running. + * + * @type {boolean} + * @private + */ + var liveUpdaterRunning = false; + + /** + * Set of default settings. + * + * @type {Object.} + * @private + */ + var defaultSettings = { + ellipsis: '...', + setTitle: 'never', + live: false + }; + + /** + * Perform ellipsis on selected elements. + * + * @param {string} selector the inner selector of elements that ellipsis may work on. Inner elements not referred to by this + * selector are left untouched. + * @param {Object.=} options optional options to override default settings. + * @return {jQuery} the current jQuery object for chaining purposes. + * @this {jQuery} the current jQuery object. + */ + $.fn.ellipsis = function(selector, options) { + var subjectElements, settings; + + subjectElements = $(this); + + // Check for options argument only. + if (typeof selector !== 'string') { + options = selector; + selector = undefined; + } + + // Create the settings from the given options and the default settings. + settings = $.extend({}, defaultSettings, options); + + // If selector is not set, work on immediate children (default behaviour). + settings.selector = selector; + + // Do ellipsis on each subject element. + subjectElements.each(function() { + var elem = $(this); + + // Do ellipsis on subject element. + ellipsisOnElement(elem, settings); + }); + + // If live option is enabled, add subject elements to live updater. Otherwise remove from live updater. + if (settings.live) { + addToLiveUpdater(subjectElements.selector, settings); + + } else { + removeFromLiveUpdater(subjectElements.selector); + } + + // Return jQuery object for chaining. + return this; + }; + + + /** + * Perform ellipsis on the given container. + * + * @param {jQuery} containerElement jQuery object containing one DOM element to perform ellipsis on. + * @param {Object.} settings the settings for this ellipsis operation. + * @private + */ + function ellipsisOnElement(containerElement, settings) { + var containerData = containerElement.data('jqae'); + if (!containerData) containerData = {}; + + // Check if wrapper div was already created and bound to the container element. + var wrapperElement = containerData.wrapperElement; + + // If not, create wrapper element. + if (!wrapperElement) { + wrapperElement = containerElement.wrapInner('
').find('>div'); + + // Wrapper div should not add extra size. + wrapperElement.css({ + margin: 0, + padding: 0, + border: 0 + }); + } + + // Check if the original wrapper element content was already bound to the wrapper element. + var wrapperElementData = wrapperElement.data('jqae'); + if (!wrapperElementData) wrapperElementData = {}; + + var wrapperOriginalContent = wrapperElementData.originalContent; + + // If so, clone the original content, re-bind the original wrapper content to the clone, and replace the + // wrapper with the clone. + if (wrapperOriginalContent) { + wrapperElement = wrapperElementData.originalContent.clone(true) + .data('jqae', {originalContent: wrapperOriginalContent}).replaceAll(wrapperElement); + + } else { + // Otherwise, clone the current wrapper element and bind it as original content to the wrapper element. + + wrapperElement.data('jqae', {originalContent: wrapperElement.clone(true)}); + } + + // Bind the wrapper element and current container width and height to the container element. Current container + // width and height are stored to detect changes to the container size. + containerElement.data('jqae', { + wrapperElement: wrapperElement, + containerWidth: containerElement.width(), + containerHeight: containerElement.height() + }); + + // Calculate with current container element height. + var containerElementHeight = containerElement.height(); + + // Calculate wrapper offset. + var wrapperOffset = (parseInt(containerElement.css('padding-top'), 10) || 0) + (parseInt(containerElement.css('border-top-width'), 10) || 0) - (wrapperElement.offset().top - containerElement.offset().top); + + // Normally the ellipsis characters are applied to the last non-empty text-node in the selected element. If the + // selected element becomes empty during ellipsis iteration, the ellipsis characters cannot be applied to that + // selected element, and must be deferred to the previous selected element. This parameter keeps track of that. + var deferAppendEllipsis = false; + + // Loop through all selected elements in reverse order. + var selectedElements = wrapperElement; + if (settings.selector) selectedElements = $(wrapperElement.find(settings.selector).get().reverse()); + + selectedElements.each(function() { + var selectedElement = $(this), + originalText = selectedElement.text(), + ellipsisApplied = false; + + // Check if we can safely remove the selected element. This saves a lot of unnecessary iterations. + if (wrapperElement.innerHeight() - selectedElement.innerHeight() > containerElementHeight + wrapperOffset) { + selectedElement.remove(); + + } else { + // Reverse recursively remove empty elements, until the element that contains a non-empty text-node. + removeLastEmptyElements(selectedElement); + + // If the selected element has not become empty, start ellipsis iterations on the selected element. + if (selectedElement.contents().length) { + + // If a deffered ellipsis is still pending, apply it now to the last text-node. + if (deferAppendEllipsis) { + getLastTextNode(selectedElement).get(0).nodeValue += settings.ellipsis; + deferAppendEllipsis = false; + } + + // Iterate until wrapper element height is less than or equal to the original container element + // height plus possible wrapperOffset. + while (wrapperElement.innerHeight() > containerElementHeight + wrapperOffset) { + // Apply ellipsis on last text node, by removing one word. + ellipsisApplied = ellipsisOnLastTextNode(selectedElement); + + // If ellipsis was succesfully applied, remove any remaining empty last elements and append the + // ellipsis characters. + if (ellipsisApplied) { + removeLastEmptyElements(selectedElement); + + // If the selected element is not empty, append the ellipsis characters. + if (selectedElement.contents().length) { + getLastTextNode(selectedElement).get(0).nodeValue += settings.ellipsis; + + } else { + // If the selected element has become empty, defer the appending of the ellipsis characters + // to the previous selected element. + deferAppendEllipsis = true; + selectedElement.remove(); + break; + } + + } else { + // If ellipsis could not be applied, defer the appending of the ellipsis characters to the + // previous selected element. + deferAppendEllipsis = true; + selectedElement.remove(); + break; + } + } + + // If the "setTitle" property is set to "onEllipsis" and the ellipsis has been applied, or if the + // property is set to "always", the add the "title" attribute with the original text. Else remove the + // "title" attribute. When the "setTitle" property is set to "never" we do not touch the "title" + // attribute. + if (((settings.setTitle == 'onEllipsis') && ellipsisApplied) || (settings.setTitle == 'always')) { + selectedElement.attr('title', originalText); + + } else if (settings.setTitle != 'never') { + selectedElement.removeAttr('title'); + } + } + } + }); + } + + /** + * Performs ellipsis on the last text node of the given element. Ellipsis is done by removing a full word. + * + * @param {jQuery} element jQuery object containing a single DOM element. + * @return {boolean} true when ellipsis has been done, false otherwise. + * @private + */ + function ellipsisOnLastTextNode(element) { + var lastTextNode = getLastTextNode(element); + + // If the last text node is found, do ellipsis on that node. + if (lastTextNode.length) { + var text = lastTextNode.get(0).nodeValue; + + // Find last space character, and remove text from there. If no space is found the full remaining text is + // removed. + var pos = text.lastIndexOf(' '); + if (pos > -1) { + text = $.trim(text.substring(0, pos)); + lastTextNode.get(0).nodeValue = text; + + } else { + lastTextNode.get(0).nodeValue = ''; + } + + return true; + } + + return false; + } + + /** + * Get last text node of the given element. + * + * @param {jQuery} element jQuery object containing a single element. + * @return {jQuery} jQuery object containing a single text node. + * @private + */ + function getLastTextNode(element) { + if (element.contents().length) { + + // Get last child node. + var contents = element.contents(); + var lastNode = contents.eq(contents.length - 1); + + // If last node is a text node, return it. + if (lastNode.filter(textNodeFilter).length) { + return lastNode; + + } else { + // Else it is an element node, and we recurse into it. + + return getLastTextNode(lastNode); + } + + } else { + // If there is no last child node, we append an empty text node and return that. Normally this should not + // happen, as we test for emptiness before calling getLastTextNode. + + element.append(''); + var contents = element.contents(); + return contents.eq(contents.length - 1); + } + } + + /** + * Remove last empty elements. This is done recursively until the last element contains a non-empty text node. + * + * @param {jQuery} element jQuery object containing a single element. + * @return {boolean} true when elements have been removed, false otherwise. + * @private + */ + function removeLastEmptyElements(element) { + if (element.contents().length) { + + // Get last child node. + var contents = element.contents(); + var lastNode = contents.eq(contents.length - 1); + + // If last child node is a text node, check for emptiness. + if (lastNode.filter(textNodeFilter).length) { + var text = lastNode.get(0).nodeValue; + text = $.trim(text); + + if (text == '') { + // If empty, remove the text node. + lastNode.remove(); + + return true; + + } else { + return false; + } + + } else { + // If the last child node is an element node, remove the last empty child nodes on that node. + while (removeLastEmptyElements(lastNode)) { + } + + // If the last child node contains no more child nodes, remove the last child node. + if (lastNode.contents().length) { + return false; + + } else { + lastNode.remove(); + + return true; + } + } + } + + return false; + } + + /** + * Filter for testing on text nodes. + * + * @return {boolean} true when this node is a text node, false otherwise. + * @this {Node} + * @private + */ + function textNodeFilter() { + return this.nodeType === 3; + } + + /** + * Add target selector to hash of target selectors. If this is the first target selector added, start the live + * updater. + * + * @param {string} targetSelector the target selector to run the live updater for. + * @param {Object.} settings the settings to apply on this target selector. + * @private + */ + function addToLiveUpdater(targetSelector, settings) { + // Store target selector with its settings. + liveUpdatingTargetSelectors[targetSelector] = settings; + + // If the live updater has not yet been started, start it now. + if (!liveUpdaterIntervalId) { + liveUpdaterIntervalId = window.setInterval(function() { + doLiveUpdater(); + }, 200); + } + } + + /** + * Remove the target selector from the hash of target selectors. It this is the last remaining target selector + * being removed, stop the live updater. + * + * @param {string} targetSelector the target selector to stop running the live updater for. + * @private + */ + function removeFromLiveUpdater(targetSelector) { + // If the hash contains the target selector, remove it. + if (liveUpdatingTargetSelectors[targetSelector]) { + delete liveUpdatingTargetSelectors[targetSelector]; + + // If no more target selectors are in the hash, stop the live updater. + if (!liveUpdatingTargetSelectors.length) { + if (liveUpdaterIntervalId) { + window.clearInterval(liveUpdaterIntervalId); + liveUpdaterIntervalId = undefined; + } + } + } + }; + + /** + * Run the live updater. The live updater is periodically run to check if its monitored target selectors require + * re-applying of the ellipsis. + * + * @private + */ + function doLiveUpdater() { + // If the live updater is already running, skip this time. We only want one instance running at a time. + if (!liveUpdaterRunning) { + liveUpdaterRunning = true; + + // Loop through target selectors. + for (var targetSelector in liveUpdatingTargetSelectors) { + $(targetSelector).each(function() { + var containerElement, containerData; + + containerElement = $(this); + containerData = containerElement.data('jqae'); + + // If container element dimensions have changed, or the container element is new, run ellipsis on + // that container element. + if ((containerData.containerWidth != containerElement.width()) || + (containerData.containerHeight != containerElement.height())) { + ellipsisOnElement(containerElement, liveUpdatingTargetSelectors[targetSelector]); + } + }); + } + + liveUpdaterRunning = false; + } + }; + +})(jQuery); \ No newline at end of file diff --git a/modules/backend/assets/js/vendor/jquery.cookie.js b/modules/backend/assets/js/vendor/jquery.cookie.js new file mode 100644 index 0000000..feb62e9 --- /dev/null +++ b/modules/backend/assets/js/vendor/jquery.cookie.js @@ -0,0 +1,117 @@ +/*! + * jQuery Cookie Plugin v1.4.1 + * https://github.com/carhartl/jquery-cookie + * + * Copyright 2006, 2014 Klaus Hartl + * Released under the MIT license + */ +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // CommonJS + factory(require('jquery')); + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + + var pluses = /\+/g; + + function encode(s) { + return config.raw ? s : encodeURIComponent(s); + } + + function decode(s) { + return config.raw ? s : decodeURIComponent(s); + } + + function stringifyCookieValue(value) { + return encode(config.json ? JSON.stringify(value) : String(value)); + } + + function parseCookieValue(s) { + if (s.indexOf('"') === 0) { + // This is a quoted cookie as according to RFC2068, unescape... + s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); + } + + try { + // Replace server-side written pluses with spaces. + // If we can't decode the cookie, ignore it, it's unusable. + // If we can't parse the cookie, ignore it, it's unusable. + s = decodeURIComponent(s.replace(pluses, ' ')); + return config.json ? JSON.parse(s) : s; + } catch(e) {} + } + + function read(s, converter) { + var value = config.raw ? s : parseCookieValue(s); + return $.isFunction(converter) ? converter(value) : value; + } + + var config = $.cookie = function (key, value, options) { + + // Write + + if (arguments.length > 1 && !$.isFunction(value)) { + options = $.extend({}, config.defaults, options); + + if (typeof options.expires === 'number') { + var days = options.expires, t = options.expires = new Date(); + t.setTime(+t + days * 864e+5); + } + + return (document.cookie = [ + encode(key), '=', stringifyCookieValue(value), + options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE + options.path ? '; path=' + options.path : '', + options.domain ? '; domain=' + options.domain : '', + options.secure ? '; secure' : '' + ].join('')); + } + + // Read + + var result = key ? undefined : {}; + + // To prevent the for loop in the first place assign an empty array + // in case there are no cookies at all. Also prevents odd result when + // calling $.cookie(). + var cookies = document.cookie ? document.cookie.split('; ') : []; + + for (var i = 0, l = cookies.length; i < l; i++) { + var parts = cookies[i].split('='); + var name = decode(parts.shift()); + var cookie = parts.join('='); + + if (key && key === name) { + // If second argument (value) is a function it's a converter... + result = read(cookie, value); + break; + } + + // Prevent storing a cookie that we couldn't decode. + if (!key && (cookie = read(cookie)) !== undefined) { + result[name] = cookie; + } + } + + return result; + }; + + config.defaults = {}; + + $.removeCookie = function (key, options) { + if ($.cookie(key) === undefined) { + return false; + } + + // Must not alter options, thus extending a fresh object... + $.cookie(key, '', $.extend({}, options, { expires: -1 })); + return !$.cookie(key); + }; + +})); diff --git a/modules/backend/assets/js/vendor/jquery.min.js b/modules/backend/assets/js/vendor/jquery.min.js new file mode 100644 index 0000000..7f37b5d --- /dev/null +++ b/modules/backend/assets/js/vendor/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0= config.min_move_x) { + cancelTouch(); + if(dx > 0) { + config.wipeLeft(); + } + else { + config.wipeRight(); + } + } + else if(Math.abs(dy) >= config.min_move_y) { + cancelTouch(); + if(dy > 0) { + config.wipeDown(); + } + else { + config.wipeUp(); + } + } + } + } + + function onTouchStart(e) + { + if (e.touches.length == 1) { + startX = e.touches[0].pageX; + startY = e.touches[0].pageY; + isMoving = true; + this.addEventListener('touchmove', onTouchMove, false); + } + } + if ('ontouchstart' in document.documentElement) { + this.addEventListener('touchstart', onTouchStart, false); + } + }); + + return this; + }; + + })(jQuery); \ No newline at end of file diff --git a/modules/backend/assets/js/vendor/jquery.waterfall.js b/modules/backend/assets/js/vendor/jquery.waterfall.js new file mode 100644 index 0000000..a27b6fb --- /dev/null +++ b/modules/backend/assets/js/vendor/jquery.waterfall.js @@ -0,0 +1,63 @@ +(function($) { +/** + * Runs functions given in arguments in series, each functions passing their results to the next one. + * Return jQuery Deferred object. + * + * @example + * $.waterfall( + * function() { return $.ajax({url : first_url}) }, + * function() { return $.ajax({url : second_url}) }, + * function() { return $.ajax({url : another_url}) } + *).fail(function() { + * console.log(arguments) + *).done(function() { + * console.log(arguments) + *}) + * + * @example2 + * event_chain = []; + * event_chain.push(function() { var deferred = $.Deferred(); deferred.resolve(); return deferred; }); + * $.waterfall.apply(this, event_chain).fail(function(){}).done(function(){}); + * + * @author Dmitry (dio) Levashov, dio@std42.ru + * @return jQuery.Deferred + */ +$.waterfall = function() { + var steps = [], + dfrd = $.Deferred(), + pointer = 0; + + $.each(arguments, function(i, a) { + steps.push(function() { + var args = [].slice.apply(arguments), d; + + if (typeof(a) == 'function') { + if (!((d = a.apply(null, args)) && d.promise)) { + d = $.Deferred()[d === false ? 'reject' : 'resolve'](d); + } + } else if (a && a.promise) { + d = a; + } else { + d = $.Deferred()[a === false ? 'reject' : 'resolve'](a); + } + + d.fail(function() { + dfrd.reject.apply(dfrd, [].slice.apply(arguments)); + }) + .done(function(data) { + pointer++; + args.push(data); + + pointer == steps.length + ? dfrd.resolve.apply(dfrd, args) + : steps[pointer].apply(null, args); + }); + }); + }); + + steps.length ? steps[0]() : dfrd.resolve(); + + return dfrd; +} + +})(jQuery); \ No newline at end of file diff --git a/modules/backend/assets/js/winter-min.js b/modules/backend/assets/js/winter-min.js new file mode 100644 index 0000000..e8c3dbc --- /dev/null +++ b/modules/backend/assets/js/winter-min.js @@ -0,0 +1,762 @@ +(function($){$.fn.touchwipe=function(settings){var config={min_move_x:20,min_move_y:20,wipeLeft:function(){},wipeRight:function(){},wipeUp:function(){},wipeDown:function(){},preventDefaultEvents:true};if(settings)$.extend(config,settings);this.each(function(){var startX;var startY;var isMoving=false;function cancelTouch(){this.removeEventListener('touchmove',onTouchMove);startX=null;isMoving=false;}function onTouchMove(e){if(config.preventDefaultEvents){e.preventDefault();}if(isMoving){var x=e.touches[0].pageX;var y=e.touches[0].pageY;var dx=startX-x;var dy=startY-y;if(Math.abs(dx)>=config.min_move_x){cancelTouch();if(dx>0){config.wipeLeft();}else{config.wipeRight();}}else if(Math.abs(dy)>=config.min_move_y){cancelTouch();if(dy>0){config.wipeDown();}else{config.wipeUp();}}}}function onTouchStart(e){if(e.touches.length==1){startX=e.touches[0].pageX;startY=e.touches[0].pageY;isMoving=true;this.addEventListener('touchmove',onTouchMove,false);}}if('ontouchstart'in document.documentElement){ +this.addEventListener('touchstart',onTouchStart,false);}});return this;};})(jQuery);(function($){var liveUpdatingTargetSelectors={};var liveUpdaterIntervalId;var liveUpdaterRunning=false;var defaultSettings={ellipsis:'...',setTitle:'never',live:false};$.fn.ellipsis=function(selector,options){var subjectElements,settings;subjectElements=$(this);if(typeof selector!=='string'){options=selector;selector=undefined;}settings=$.extend({},defaultSettings,options);settings.selector=selector;subjectElements.each(function(){var elem=$(this);ellipsisOnElement(elem,settings);});if(settings.live){addToLiveUpdater(subjectElements.selector,settings);}else{removeFromLiveUpdater(subjectElements.selector);}return this;};function ellipsisOnElement(containerElement,settings){var containerData=containerElement.data('jqae');if(!containerData)containerData={};var wrapperElement=containerData.wrapperElement;if(!wrapperElement){wrapperElement=containerElement.wrapInner('
').find('>div');wrapperElement.css({ +margin:0,padding:0,border:0});}var wrapperElementData=wrapperElement.data('jqae');if(!wrapperElementData)wrapperElementData={};var wrapperOriginalContent=wrapperElementData.originalContent;if(wrapperOriginalContent){wrapperElement=wrapperElementData.originalContent.clone(true).data('jqae',{originalContent:wrapperOriginalContent}).replaceAll(wrapperElement);}else{wrapperElement.data('jqae',{originalContent:wrapperElement.clone(true)});}containerElement.data('jqae',{wrapperElement:wrapperElement,containerWidth:containerElement.width(),containerHeight:containerElement.height()});var containerElementHeight=containerElement.height();var wrapperOffset=(parseInt(containerElement.css('padding-top'),10)||0)+(parseInt(containerElement.css('border-top-width'),10)||0)-(wrapperElement.offset().top-containerElement.offset().top);var deferAppendEllipsis=false;var selectedElements=wrapperElement;if(settings.selector)selectedElements=$(wrapperElement.find(settings.selector).get().reverse()); +selectedElements.each(function(){var selectedElement=$(this),originalText=selectedElement.text(),ellipsisApplied=false;if(wrapperElement.innerHeight()-selectedElement.innerHeight()>containerElementHeight+wrapperOffset){selectedElement.remove();}else{removeLastEmptyElements(selectedElement);if(selectedElement.contents().length){if(deferAppendEllipsis){getLastTextNode(selectedElement).get(0).nodeValue+=settings.ellipsis;deferAppendEllipsis=false;}while(wrapperElement.innerHeight()>containerElementHeight+wrapperOffset){ellipsisApplied=ellipsisOnLastTextNode(selectedElement);if(ellipsisApplied){removeLastEmptyElements(selectedElement);if(selectedElement.contents().length){getLastTextNode(selectedElement).get(0).nodeValue+=settings.ellipsis;}else{deferAppendEllipsis=true;selectedElement.remove();break;}}else{deferAppendEllipsis=true;selectedElement.remove();break;}}if(((settings.setTitle=='onEllipsis')&&ellipsisApplied)||(settings.setTitle=='always')){selectedElement.attr('title',originalText); +}else if(settings.setTitle!='never'){selectedElement.removeAttr('title');}}}});}function ellipsisOnLastTextNode(element){var lastTextNode=getLastTextNode(element);if(lastTextNode.length){var text=lastTextNode.get(0).nodeValue;var pos=text.lastIndexOf(' ');if(pos>-1){text=$.trim(text.substring(0,pos));lastTextNode.get(0).nodeValue=text;}else{lastTextNode.get(0).nodeValue='';}return true;}return false;}function getLastTextNode(element){if(element.contents().length){var contents=element.contents();var lastNode=contents.eq(contents.length-1);if(lastNode.filter(textNodeFilter).length){return lastNode;}else{return getLastTextNode(lastNode);}}else{element.append('');var contents=element.contents();return contents.eq(contents.length-1);}}function removeLastEmptyElements(element){if(element.contents().length){var contents=element.contents();var lastNode=contents.eq(contents.length-1);if(lastNode.filter(textNodeFilter).length){var text=lastNode.get(0).nodeValue;text=$.trim(text);if(text==''){ +lastNode.remove();return true;}else{return false;}}else{while(removeLastEmptyElements(lastNode)){}if(lastNode.contents().length){return false;}else{lastNode.remove();return true;}}}return false;}function textNodeFilter(){return this.nodeType===3;}function addToLiveUpdater(targetSelector,settings){liveUpdatingTargetSelectors[targetSelector]=settings;if(!liveUpdaterIntervalId){liveUpdaterIntervalId=window.setInterval(function(){doLiveUpdater();},200);}}function removeFromLiveUpdater(targetSelector){if(liveUpdatingTargetSelectors[targetSelector]){delete liveUpdatingTargetSelectors[targetSelector];if(!liveUpdatingTargetSelectors.length){if(liveUpdaterIntervalId){window.clearInterval(liveUpdaterIntervalId);liveUpdaterIntervalId=undefined;}}}};function doLiveUpdater(){if(!liveUpdaterRunning){liveUpdaterRunning=true;for(var targetSelector in liveUpdatingTargetSelectors){$(targetSelector).each(function(){var containerElement,containerData;containerElement=$(this);containerData=containerElement.data('jqae'); +if((containerData.containerWidth!=containerElement.width())||(containerData.containerHeight!=containerElement.height())){ellipsisOnElement(containerElement,liveUpdatingTargetSelectors[targetSelector]);}});}liveUpdaterRunning=false;}};})(jQuery);(function($){$.waterfall=function(){var steps=[],dfrd=$.Deferred(),pointer=0;$.each(arguments,function(i,a){steps.push(function(){var args=[].slice.apply(arguments),d;if(typeof(a)=='function'){if(!((d=a.apply(null,args))&&d.promise)){d=$.Deferred()[d===false?'reject':'resolve'](d);}}else if(a&&a.promise){d=a;}else{d=$.Deferred()[a===false?'reject':'resolve'](a);}d.fail(function(){dfrd.reject.apply(dfrd,[].slice.apply(arguments));}).done(function(data){pointer++;args.push(data);pointer==steps.length?dfrd.resolve.apply(dfrd,args):steps[pointer].apply(null,args);});});});steps.length?steps[0]():dfrd.resolve();return dfrd;}})(jQuery);(function(factory){if(typeof define==='function'&&define.amd){define(['jquery'],factory);}else if(typeof exports==='object'){ +factory(require('jquery'));}else{factory(jQuery);}}(function($){var pluses=/\+/g;function encode(s){return config.raw?s:encodeURIComponent(s);}function decode(s){return config.raw?s:decodeURIComponent(s);}function stringifyCookieValue(value){return encode(config.json?JSON.stringify(value):String(value));}function parseCookieValue(s){if(s.indexOf('"')===0){s=s.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,'\\');}try{s=decodeURIComponent(s.replace(pluses,' '));return config.json?JSON.parse(s):s;}catch(e){}}function read(s,converter){var value=config.raw?s:parseCookieValue(s);return $.isFunction(converter)?converter(value):value;}var config=$.cookie=function(key,value,options){if(arguments.length>1&&!$.isFunction(value)){options=$.extend({},config.defaults,options);if(typeof options.expires==='number'){var days=options.expires,t=options.expires=new Date();t.setTime(+t+days*864e+5);}return(document.cookie=[encode(key),'=',stringifyCookieValue(value),options.expires?'; expires='+options.expires.toUTCString():'', +options.path?'; path='+options.path:'',options.domain?'; domain='+options.domain:'',options.secure?'; secure':''].join(''));}var result=key?undefined:{};var cookies=document.cookie?document.cookie.split('; '):[];for(var i=0,l=cookies.length;i1?_len-1:0),_key=1;_key<_len;_key++){args[_key-1]=arguments[_key];}for(var _iterator=callbacks,_isArray=true,_i=0,_iterator=_isArray?_iterator:_iterator[Symbol.iterator]();;){var _ref;if(_isArray){if(_i>=_iterator.length)break;_ref=_iterator[_i++];}else{_i=_iterator.next();if(_i.done)break;_ref=_i.value;}var callback=_ref;callback.apply(this,args);}}return this;}},{key:"off",value:function off(event,fn){if(!this._callbacks||arguments.length===0){this._callbacks={};return this;}var callbacks=this._callbacks[event];if(!callbacks){return this;}if(arguments.length===1){delete this._callbacks[event];return this;}for(var i=0;i=_iterator2.length)break;_ref2=_iterator2[_i2++];}else{_i2=_iterator2.next();if(_i2.done)break;_ref2=_i2.value;}var child=_ref2; +if(/(^| )dz-message($| )/.test(child.className)){messageElement=child;child.className="dz-message";break;}}if(!messageElement){messageElement=Dropzone.createElement("
");this.element.appendChild(messageElement);}var span=messageElement.getElementsByTagName("span")[0];if(span){if(span.textContent!=null){span.textContent=this.options.dictFallbackMessage;}else if(span.innerText!=null){span.innerText=this.options.dictFallbackMessage;}}return this.element.appendChild(this.getFallbackForm());},resize:function resize(file,width,height,resizeMethod){var info={srcX:0,srcY:0,srcWidth:file.width,srcHeight:file.height};var srcRatio=file.width/file.height;if(width==null&&height==null){width=info.srcWidth;height=info.srcHeight;}else if(width==null){width=height*srcRatio;}else if(height==null){height=width/srcRatio;}width=Math.min(width,info.srcWidth);height=Math.min(height,info.srcHeight);var trgRatio=width/height;if(info.srcWidth>width||info.srcHeight>height){ +if(resizeMethod==='crop'){if(srcRatio>trgRatio){info.srcHeight=file.height;info.srcWidth=info.srcHeight*trgRatio;}else{info.srcWidth=file.width;info.srcHeight=info.srcWidth/trgRatio;}}else if(resizeMethod==='contain'){if(srcRatio>trgRatio){height=width/srcRatio;}else{width=height*srcRatio;}}else{throw new Error("Unknown resizeMethod '"+resizeMethod+"'");}}info.srcX=(file.width-info.srcWidth)/2;info.srcY=(file.height-info.srcHeight)/2;info.trgWidth=width;info.trgHeight=height;return info;},transformFile:function transformFile(file,done){if((this.options.resizeWidth||this.options.resizeHeight)&&file.type.match(/image.*/)){return this.resizeImage(file,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,done);}else{return done(file);}},previewTemplate:"
\n
\n
\n
\n
\n
\n
\n
\n
\n \n Check\n \n \n \n \n \n
\n
\n \n Error\n \n \n \n \n \n \n \n
\n
", +drop:function drop(e){return this.element.classList.remove("dz-drag-hover");},dragstart:function dragstart(e){},dragend:function dragend(e){return this.element.classList.remove("dz-drag-hover");},dragenter:function dragenter(e){return this.element.classList.add("dz-drag-hover");},dragover:function dragover(e){return this.element.classList.add("dz-drag-hover");},dragleave:function dragleave(e){return this.element.classList.remove("dz-drag-hover");},paste:function paste(e){},reset:function reset(){return this.element.classList.remove("dz-started");},addedfile:function addedfile(file){var _this2=this;if(this.element===this.previewsContainer){this.element.classList.add("dz-started");}if(this.previewsContainer){file.previewElement=Dropzone.createElement(this.options.previewTemplate.trim());file.previewTemplate=file.previewElement;this.previewsContainer.appendChild(file.previewElement);for(var _iterator3=file.previewElement.querySelectorAll("[data-dz-name]"),_isArray3=true,_i3=0,_iterator3=_isArray3?_iterator3:_iterator3[Symbol.iterator]();;){ +var _ref3;if(_isArray3){if(_i3>=_iterator3.length)break;_ref3=_iterator3[_i3++];}else{_i3=_iterator3.next();if(_i3.done)break;_ref3=_i3.value;}var node=_ref3;node.textContent=file.name;}for(var _iterator4=file.previewElement.querySelectorAll("[data-dz-size]"),_isArray4=true,_i4=0,_iterator4=_isArray4?_iterator4:_iterator4[Symbol.iterator]();;){if(_isArray4){if(_i4>=_iterator4.length)break;node=_iterator4[_i4++];}else{_i4=_iterator4.next();if(_i4.done)break;node=_i4.value;}node.innerHTML=this.filesize(file.size);}if(this.options.addRemoveLinks){file._removeLink=Dropzone.createElement(""+this.options.dictRemoveFile+"");file.previewElement.appendChild(file._removeLink);}var removeFileEvent=function removeFileEvent(e){e.preventDefault();e.stopPropagation();if(file.status===Dropzone.UPLOADING){return Dropzone.confirm(_this2.options.dictCancelUploadConfirmation,function(){return _this2.removeFile(file);});}else{if(_this2.options.dictRemoveFileConfirmation){ +return Dropzone.confirm(_this2.options.dictRemoveFileConfirmation,function(){return _this2.removeFile(file);});}else{return _this2.removeFile(file);}}};for(var _iterator5=file.previewElement.querySelectorAll("[data-dz-remove]"),_isArray5=true,_i5=0,_iterator5=_isArray5?_iterator5:_iterator5[Symbol.iterator]();;){var _ref4;if(_isArray5){if(_i5>=_iterator5.length)break;_ref4=_iterator5[_i5++];}else{_i5=_iterator5.next();if(_i5.done)break;_ref4=_i5.value;}var removeLink=_ref4;removeLink.addEventListener("click",removeFileEvent);}}},removedfile:function removedfile(file){if(file.previewElement!=null&&file.previewElement.parentNode!=null){file.previewElement.parentNode.removeChild(file.previewElement);}return this._updateMaxFilesReachedClass();},thumbnail:function thumbnail(file,dataUrl){if(file.previewElement){file.previewElement.classList.remove("dz-file-preview");for(var _iterator6=file.previewElement.querySelectorAll("[data-dz-thumbnail]"),_isArray6=true,_i6=0,_iterator6=_isArray6?_iterator6:_iterator6[Symbol.iterator]();;){ +var _ref5;if(_isArray6){if(_i6>=_iterator6.length)break;_ref5=_iterator6[_i6++];}else{_i6=_iterator6.next();if(_i6.done)break;_ref5=_i6.value;}var thumbnailElement=_ref5;thumbnailElement.alt=file.name;thumbnailElement.src=dataUrl;}return setTimeout(function(){return file.previewElement.classList.add("dz-image-preview");},1);}},error:function error(file,message){if(file.previewElement){file.previewElement.classList.add("dz-error");if(typeof message!=="String"&&message.error){message=message.error;}for(var _iterator7=file.previewElement.querySelectorAll("[data-dz-errormessage]"),_isArray7=true,_i7=0,_iterator7=_isArray7?_iterator7:_iterator7[Symbol.iterator]();;){var _ref6;if(_isArray7){if(_i7>=_iterator7.length)break;_ref6=_iterator7[_i7++];}else{_i7=_iterator7.next();if(_i7.done)break;_ref6=_i7.value;}var node=_ref6;node.textContent=message;}}},errormultiple:function errormultiple(){},processing:function processing(file){if(file.previewElement){file.previewElement.classList.add("dz-processing"); +if(file._removeLink){return file._removeLink.innerHTML=this.options.dictCancelUpload;}}},processingmultiple:function processingmultiple(){},uploadprogress:function uploadprogress(file,progress,bytesSent){if(file.previewElement){for(var _iterator8=file.previewElement.querySelectorAll("[data-dz-uploadprogress]"),_isArray8=true,_i8=0,_iterator8=_isArray8?_iterator8:_iterator8[Symbol.iterator]();;){var _ref7;if(_isArray8){if(_i8>=_iterator8.length)break;_ref7=_iterator8[_i8++];}else{_i8=_iterator8.next();if(_i8.done)break;_ref7=_i8.value;}var node=_ref7;node.nodeName==='PROGRESS'?node.value=progress:node.style.width=progress+"%";}}},totaluploadprogress:function totaluploadprogress(){},sending:function sending(){},sendingmultiple:function sendingmultiple(){},success:function success(file){if(file.previewElement){return file.previewElement.classList.add("dz-success");}},successmultiple:function successmultiple(){},canceled:function canceled(file){return this.emit("error",file,this.options.dictUploadCanceled); +},canceledmultiple:function canceledmultiple(){},complete:function complete(file){if(file._removeLink){file._removeLink.innerHTML=this.options.dictRemoveFile;}if(file.previewElement){return file.previewElement.classList.add("dz-complete");}},completemultiple:function completemultiple(){},maxfilesexceeded:function maxfilesexceeded(){},maxfilesreached:function maxfilesreached(){},queuecomplete:function queuecomplete(){},addedfiles:function addedfiles(){}};this.prototype._thumbnailQueue=[];this.prototype._processingThumbnail=false;}},{key:"extend",value:function extend(target){for(var _len2=arguments.length,objects=Array(_len2>1?_len2-1:0),_key2=1;_key2<_len2;_key2++){objects[_key2-1]=arguments[_key2];}for(var _iterator9=objects,_isArray9=true,_i9=0,_iterator9=_isArray9?_iterator9:_iterator9[Symbol.iterator]();;){var _ref8;if(_isArray9){if(_i9>=_iterator9.length)break;_ref8=_iterator9[_i9++];}else{_i9=_iterator9.next();if(_i9.done)break;_ref8=_i9.value;}var object=_ref8;for(var key in object){ +var val=object[key];target[key]=val;}}return target;}}]);function Dropzone(el,options){_classCallCheck(this,Dropzone);var _this=_possibleConstructorReturn(this,(Dropzone.__proto__||Object.getPrototypeOf(Dropzone)).call(this));var fallback=void 0,left=void 0;_this.element=el;_this.version=Dropzone.version;_this.defaultOptions.previewTemplate=_this.defaultOptions.previewTemplate.replace(/\n*/g,"");_this.clickableElements=[];_this.listeners=[];_this.files=[];if(typeof _this.element==="string"){_this.element=document.querySelector(_this.element);}if(!_this.element||_this.element.nodeType==null){throw new Error("Invalid dropzone element.");}if(_this.element.dropzone){throw new Error("Dropzone already attached.");}Dropzone.instances.push(_this);_this.element.dropzone=_this;var elementOptions=(left=Dropzone.optionsForElement(_this.element))!=null?left:{};_this.options=Dropzone.extend({},_this.defaultOptions,elementOptions,options!=null?options:{});if(_this.options.forceFallback||!Dropzone.isBrowserSupported()){ +var _ret;return _ret=_this.options.fallback.call(_this),_possibleConstructorReturn(_this,_ret);}if(_this.options.url==null){_this.options.url=_this.element.getAttribute("action");}if(!_this.options.url){throw new Error("No URL provided.");}if(_this.options.acceptedFiles&&_this.options.acceptedMimeTypes){throw new Error("You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.");}if(_this.options.uploadMultiple&&_this.options.chunking){throw new Error('You cannot set both: uploadMultiple and chunking.');}if(_this.options.acceptedMimeTypes){_this.options.acceptedFiles=_this.options.acceptedMimeTypes;delete _this.options.acceptedMimeTypes;}if(_this.options.renameFilename!=null){_this.options.renameFile=function(file){return _this.options.renameFilename.call(_this,file.name,file);};}_this.options.method=_this.options.method.toUpperCase();if((fallback=_this.getExistingFallback())&&fallback.parentNode){fallback.parentNode.removeChild(fallback);}if(_this.options.previewsContainer!==false){ +if(_this.options.previewsContainer){_this.previewsContainer=Dropzone.getElement(_this.options.previewsContainer,"previewsContainer");}else{_this.previewsContainer=_this.element;}}if(_this.options.clickable){if(_this.options.clickable===true){_this.clickableElements=[_this.element];}else{_this.clickableElements=Dropzone.getElements(_this.options.clickable,"clickable");}}_this.init();return _this;}_createClass(Dropzone,[{key:"getAcceptedFiles",value:function getAcceptedFiles(){return this.files.filter(function(file){return file.accepted;}).map(function(file){return file;});}},{key:"getRejectedFiles",value:function getRejectedFiles(){return this.files.filter(function(file){return!file.accepted;}).map(function(file){return file;});}},{key:"getFilesWithStatus",value:function getFilesWithStatus(status){return this.files.filter(function(file){return file.status===status;}).map(function(file){return file;});}},{key:"getQueuedFiles",value:function getQueuedFiles(){return this.getFilesWithStatus(Dropzone.QUEUED); +}},{key:"getUploadingFiles",value:function getUploadingFiles(){return this.getFilesWithStatus(Dropzone.UPLOADING);}},{key:"getAddedFiles",value:function getAddedFiles(){return this.getFilesWithStatus(Dropzone.ADDED);}},{key:"getActiveFiles",value:function getActiveFiles(){return this.files.filter(function(file){return file.status===Dropzone.UPLOADING||file.status===Dropzone.QUEUED;}).map(function(file){return file;});}},{key:"init",value:function init(){var _this3=this;if(this.element.tagName==="form"){this.element.setAttribute("enctype","multipart/form-data");}if(this.element.classList.contains("dropzone")&&!this.element.querySelector(".dz-message")){this.element.appendChild(Dropzone.createElement("
"+this.options.dictDefaultMessage+"
"));}if(this.clickableElements.length){var setupHiddenFileInput=function setupHiddenFileInput(){if(_this3.hiddenFileInput){_this3.hiddenFileInput.parentNode.removeChild(_this3.hiddenFileInput);}_this3.hiddenFileInput=document.createElement("input"); +_this3.hiddenFileInput.setAttribute("type","file");if(_this3.options.maxFiles===null||_this3.options.maxFiles>1){_this3.hiddenFileInput.setAttribute("multiple","multiple");}_this3.hiddenFileInput.className="dz-hidden-input";if(_this3.options.acceptedFiles!==null){_this3.hiddenFileInput.setAttribute("accept",_this3.options.acceptedFiles);}if(_this3.options.capture!==null){_this3.hiddenFileInput.setAttribute("capture",_this3.options.capture);}_this3.hiddenFileInput.style.visibility="hidden";_this3.hiddenFileInput.style.position="absolute";_this3.hiddenFileInput.style.top="0";_this3.hiddenFileInput.style.left="0";_this3.hiddenFileInput.style.height="0";_this3.hiddenFileInput.style.width="0";Dropzone.getElement(_this3.options.hiddenInputContainer,'hiddenInputContainer').appendChild(_this3.hiddenFileInput);return _this3.hiddenFileInput.addEventListener("change",function(){var files=_this3.hiddenFileInput.files;if(files.length){for(var _iterator10=files,_isArray10=true,_i10=0,_iterator10=_isArray10?_iterator10:_iterator10[Symbol.iterator]();;){ +var _ref9;if(_isArray10){if(_i10>=_iterator10.length)break;_ref9=_iterator10[_i10++];}else{_i10=_iterator10.next();if(_i10.done)break;_ref9=_i10.value;}var file=_ref9;_this3.addFile(file);}}_this3.emit("addedfiles",files);return setupHiddenFileInput();});};setupHiddenFileInput();}this.URL=window.URL!==null?window.URL:window.webkitURL;for(var _iterator11=this.events,_isArray11=true,_i11=0,_iterator11=_isArray11?_iterator11:_iterator11[Symbol.iterator]();;){var _ref10;if(_isArray11){if(_i11>=_iterator11.length)break;_ref10=_iterator11[_i11++];}else{_i11=_iterator11.next();if(_i11.done)break;_ref10=_i11.value;}var eventName=_ref10;this.on(eventName,this.options[eventName]);}this.on("uploadprogress",function(){return _this3.updateTotalUploadProgress();});this.on("removedfile",function(){return _this3.updateTotalUploadProgress();});this.on("canceled",function(file){return _this3.emit("complete",file);});this.on("complete",function(file){if(_this3.getAddedFiles().length===0&&_this3.getUploadingFiles().length===0&&_this3.getQueuedFiles().length===0){ +return setTimeout(function(){return _this3.emit("queuecomplete");},0);}});var noPropagation=function noPropagation(e){e.stopPropagation();if(e.preventDefault){return e.preventDefault();}else{return e.returnValue=false;}};this.listeners=[{element:this.element,events:{"dragstart":function dragstart(e){return _this3.emit("dragstart",e);},"dragenter":function dragenter(e){noPropagation(e);return _this3.emit("dragenter",e);},"dragover":function dragover(e){var efct=void 0;try{efct=e.dataTransfer.effectAllowed;}catch(error){}e.dataTransfer.dropEffect='move'===efct||'linkMove'===efct?'move':'copy';noPropagation(e);return _this3.emit("dragover",e);},"dragleave":function dragleave(e){return _this3.emit("dragleave",e);},"drop":function drop(e){noPropagation(e);return _this3.drop(e);},"dragend":function dragend(e){return _this3.emit("dragend",e);}}}];this.clickableElements.forEach(function(clickableElement){return _this3.listeners.push({element:clickableElement,events:{"click":function click(evt){ +if(clickableElement!==_this3.element||evt.target===_this3.element||Dropzone.elementInside(evt.target,_this3.element.querySelector(".dz-message"))){_this3.hiddenFileInput.click();}return true;}}});});this.enable();return this.options.init.call(this);}},{key:"destroy",value:function destroy(){this.disable();this.removeAllFiles(true);if(this.hiddenFileInput!=null?this.hiddenFileInput.parentNode:undefined){this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput);this.hiddenFileInput=null;}delete this.element.dropzone;return Dropzone.instances.splice(Dropzone.instances.indexOf(this),1);}},{key:"updateTotalUploadProgress",value:function updateTotalUploadProgress(){var totalUploadProgress=void 0;var totalBytesSent=0;var totalBytes=0;var activeFiles=this.getActiveFiles();if(activeFiles.length){for(var _iterator12=this.getActiveFiles(),_isArray12=true,_i12=0,_iterator12=_isArray12?_iterator12:_iterator12[Symbol.iterator]();;){var _ref11;if(_isArray12){if(_i12>=_iterator12.length)break; +_ref11=_iterator12[_i12++];}else{_i12=_iterator12.next();if(_i12.done)break;_ref11=_i12.value;}var file=_ref11;totalBytesSent+=file.upload.bytesSent;totalBytes+=file.upload.total;}totalUploadProgress=100*totalBytesSent/totalBytes;}else{totalUploadProgress=100;}return this.emit("totaluploadprogress",totalUploadProgress,totalBytes,totalBytesSent);}},{key:"_getParamName",value:function _getParamName(n){if(typeof this.options.paramName==="function"){return this.options.paramName(n);}else{return""+this.options.paramName+(this.options.uploadMultiple?"["+n+"]":"");}}},{key:"_renameFile",value:function _renameFile(file){if(typeof this.options.renameFile!=="function"){return file.name;}return this.options.renameFile(file);}},{key:"getFallbackForm",value:function getFallbackForm(){var existingFallback=void 0,form=void 0;if(existingFallback=this.getExistingFallback()){return existingFallback;}var fieldsString="
";if(this.options.dictFallbackText){fieldsString+="

"+this.options.dictFallbackText+"

"; +}fieldsString+="
";var fields=Dropzone.createElement(fieldsString);if(this.element.tagName!=="FORM"){form=Dropzone.createElement("
");form.appendChild(fields);}else{this.element.setAttribute("enctype","multipart/form-data");this.element.setAttribute("method",this.options.method);}return form!=null?form:fields;}},{key:"getExistingFallback",value:function getExistingFallback(){var getFallback=function getFallback(elements){for(var _iterator13=elements,_isArray13=true,_i13=0,_iterator13=_isArray13?_iterator13:_iterator13[Symbol.iterator]();;){var _ref12;if(_isArray13){if(_i13>=_iterator13.length)break;_ref12=_iterator13[_i13++];}else{_i13=_iterator13.next();if(_i13.done)break;_ref12=_i13.value;}var el=_ref12;if(/(^| )fallback($| )/.test(el.className)){ +return el;}}};var _arr=["div","form"];for(var _i14=0;_i14<_arr.length;_i14++){var tagName=_arr[_i14];var fallback;if(fallback=getFallback(this.element.getElementsByTagName(tagName))){return fallback;}}}},{key:"setupEventListeners",value:function setupEventListeners(){return this.listeners.map(function(elementListeners){return function(){var result=[];for(var event in elementListeners.events){var listener=elementListeners.events[event];result.push(elementListeners.element.addEventListener(event,listener,false));}return result;}();});}},{key:"removeEventListeners",value:function removeEventListeners(){return this.listeners.map(function(elementListeners){return function(){var result=[];for(var event in elementListeners.events){var listener=elementListeners.events[event];result.push(elementListeners.element.removeEventListener(event,listener,false));}return result;}();});}},{key:"disable",value:function disable(){var _this4=this;this.clickableElements.forEach(function(element){return element.classList.remove("dz-clickable"); +});this.removeEventListeners();this.disabled=true;return this.files.map(function(file){return _this4.cancelUpload(file);});}},{key:"enable",value:function enable(){delete this.disabled;this.clickableElements.forEach(function(element){return element.classList.add("dz-clickable");});return this.setupEventListeners();}},{key:"filesize",value:function filesize(size){var selectedSize=0;var selectedUnit="b";if(size>0){var units=['tb','gb','mb','kb','b'];for(var i=0;i=cutoff){selectedSize=size/Math.pow(this.options.filesizeBase,4-i);selectedUnit=unit;break;}}selectedSize=Math.round(10*selectedSize)/10;}return""+selectedSize+" "+this.options.dictFileSizeUnits[selectedUnit];}},{key:"_updateMaxFilesReachedClass",value:function _updateMaxFilesReachedClass(){if(this.options.maxFiles!=null&&this.getAcceptedFiles().length>=this.options.maxFiles){if(this.getAcceptedFiles().length===this.options.maxFiles){ +this.emit('maxfilesreached',this.files);}return this.element.classList.add("dz-max-files-reached");}else{return this.element.classList.remove("dz-max-files-reached");}}},{key:"drop",value:function drop(e){if(!e.dataTransfer){return;}this.emit("drop",e);var files=[];for(var i=0;i=_iterator14.length)break; +_ref13=_iterator14[_i15++];}else{_i15=_iterator14.next();if(_i15.done)break;_ref13=_i15.value;}var file=_ref13;this.addFile(file);}}},{key:"_addFilesFromItems",value:function _addFilesFromItems(items){var _this5=this;return function(){var result=[];for(var _iterator15=items,_isArray15=true,_i16=0,_iterator15=_isArray15?_iterator15:_iterator15[Symbol.iterator]();;){var _ref14;if(_isArray15){if(_i16>=_iterator15.length)break;_ref14=_iterator15[_i16++];}else{_i16=_iterator15.next();if(_i16.done)break;_ref14=_i16.value;}var item=_ref14;var entry;if(item.webkitGetAsEntry!=null&&(entry=item.webkitGetAsEntry())){if(entry.isFile){result.push(_this5.addFile(item.getAsFile()));}else if(entry.isDirectory){result.push(_this5._addFilesFromDirectory(entry,entry.name));}else{result.push(undefined);}}else if(item.getAsFile!=null){if(item.kind==null||item.kind==="file"){result.push(_this5.addFile(item.getAsFile()));}else{result.push(undefined);}}else{result.push(undefined);}}return result;}();}},{key:"_addFilesFromDirectory", +value:function _addFilesFromDirectory(directory,path){var _this6=this;var dirReader=directory.createReader();var errorHandler=function errorHandler(error){return __guardMethod__(console,'log',function(o){return o.log(error);});};var readEntries=function readEntries(){return dirReader.readEntries(function(entries){if(entries.length>0){for(var _iterator16=entries,_isArray16=true,_i17=0,_iterator16=_isArray16?_iterator16:_iterator16[Symbol.iterator]();;){var _ref15;if(_isArray16){if(_i17>=_iterator16.length)break;_ref15=_iterator16[_i17++];}else{_i17=_iterator16.next();if(_i17.done)break;_ref15=_i17.value;}var entry=_ref15;if(entry.isFile){entry.file(function(file){if(_this6.options.ignoreHiddenFiles&&file.name.substring(0,1)==='.'){return;}file.fullPath=path+"/"+file.name;return _this6.addFile(file);});}else if(entry.isDirectory){_this6._addFilesFromDirectory(entry,path+"/"+entry.name);}}readEntries();}return null;},errorHandler);};return readEntries();}},{key:"accept",value:function accept(file,done){ +if(this.options.maxFilesize&&file.size>this.options.maxFilesize*1024*1024){return done(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(file.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize));}else if(!Dropzone.isValidFile(file,this.options.acceptedFiles)){return done(this.options.dictInvalidFileType);}else if(this.options.maxFiles!=null&&this.getAcceptedFiles().length>=this.options.maxFiles){done(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles));return this.emit("maxfilesexceeded",file);}else{return this.options.accept.call(this,file,done);}}},{key:"addFile",value:function addFile(file){var _this7=this;file.upload={uuid:Dropzone.uuidv4(),progress:0,total:file.size,bytesSent:0,filename:this._renameFile(file),chunked:this.options.chunking&&(this.options.forceChunking||file.size>this.options.chunkSize),totalChunkCount:Math.ceil(file.size/this.options.chunkSize)};this.files.push(file);file.status=Dropzone.ADDED;this.emit("addedfile",file); +this._enqueueThumbnail(file);return this.accept(file,function(error){if(error){file.accepted=false;_this7._errorProcessing([file],error);}else{file.accepted=true;if(_this7.options.autoQueue){_this7.enqueueFile(file);}}return _this7._updateMaxFilesReachedClass();});}},{key:"enqueueFiles",value:function enqueueFiles(files){for(var _iterator17=files,_isArray17=true,_i18=0,_iterator17=_isArray17?_iterator17:_iterator17[Symbol.iterator]();;){var _ref16;if(_isArray17){if(_i18>=_iterator17.length)break;_ref16=_iterator17[_i18++];}else{_i18=_iterator17.next();if(_i18.done)break;_ref16=_i18.value;}var file=_ref16;this.enqueueFile(file);}return null;}},{key:"enqueueFile",value:function enqueueFile(file){var _this8=this;if(file.status===Dropzone.ADDED&&file.accepted===true){file.status=Dropzone.QUEUED;if(this.options.autoProcessQueue){return setTimeout(function(){return _this8.processQueue();},0);}}else{throw new Error("This file can't be queued because it has already been processed or was rejected."); +}}},{key:"_enqueueThumbnail",value:function _enqueueThumbnail(file){var _this9=this;if(this.options.createImageThumbnails&&file.type.match(/image.*/)&&file.size<=this.options.maxThumbnailFilesize*1024*1024){this._thumbnailQueue.push(file);return setTimeout(function(){return _this9._processThumbnailQueue();},0);}}},{key:"_processThumbnailQueue",value:function _processThumbnailQueue(){var _this10=this;if(this._processingThumbnail||this._thumbnailQueue.length===0){return;}this._processingThumbnail=true;var file=this._thumbnailQueue.shift();return this.createThumbnail(file,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,true,function(dataUrl){_this10.emit("thumbnail",file,dataUrl);_this10._processingThumbnail=false;return _this10._processThumbnailQueue();});}},{key:"removeFile",value:function removeFile(file){if(file.status===Dropzone.UPLOADING){this.cancelUpload(file);}this.files=without(this.files,file);this.emit("removedfile",file);if(this.files.length===0){ +return this.emit("reset");}}},{key:"removeAllFiles",value:function removeAllFiles(cancelIfNecessary){if(cancelIfNecessary==null){cancelIfNecessary=false;}for(var _iterator18=this.files.slice(),_isArray18=true,_i19=0,_iterator18=_isArray18?_iterator18:_iterator18[Symbol.iterator]();;){var _ref17;if(_isArray18){if(_i19>=_iterator18.length)break;_ref17=_iterator18[_i19++];}else{_i19=_iterator18.next();if(_i19.done)break;_ref17=_i19.value;}var file=_ref17;if(file.status!==Dropzone.UPLOADING||cancelIfNecessary){this.removeFile(file);}}return null;}},{key:"resizeImage",value:function resizeImage(file,width,height,resizeMethod,callback){var _this11=this;return this.createThumbnail(file,width,height,resizeMethod,true,function(dataUrl,canvas){if(canvas==null){return callback(file);}else{var resizeMimeType=_this11.options.resizeMimeType;if(resizeMimeType==null){resizeMimeType=file.type;}var resizedDataURL=canvas.toDataURL(resizeMimeType,_this11.options.resizeQuality);if(resizeMimeType==='image/jpeg'||resizeMimeType==='image/jpg'){ +resizedDataURL=ExifRestore.restore(file.dataURL,resizedDataURL);}return callback(Dropzone.dataURItoBlob(resizedDataURL));}});}},{key:"createThumbnail",value:function createThumbnail(file,width,height,resizeMethod,fixOrientation,callback){var _this12=this;var fileReader=new FileReader();fileReader.onload=function(){file.dataURL=fileReader.result;if(file.type==="image/svg+xml"){if(callback!=null){callback(fileReader.result);}return;}return _this12.createThumbnailFromUrl(file,width,height,resizeMethod,fixOrientation,callback);};return fileReader.readAsDataURL(file);}},{key:"createThumbnailFromUrl",value:function createThumbnailFromUrl(file,width,height,resizeMethod,fixOrientation,callback,crossOrigin){var _this13=this;var img=document.createElement("img");if(crossOrigin){img.crossOrigin=crossOrigin;}img.onload=function(){var loadExif=function loadExif(callback){return callback(1);};if(typeof EXIF!=='undefined'&&EXIF!==null&&fixOrientation){loadExif=function loadExif(callback){return EXIF.getData(img,function(){ +return callback(EXIF.getTag(this,'Orientation'));});};}return loadExif(function(orientation){file.width=img.width;file.height=img.height;var resizeInfo=_this13.options.resize.call(_this13,file,width,height,resizeMethod);var canvas=document.createElement("canvas");var ctx=canvas.getContext("2d");canvas.width=resizeInfo.trgWidth;canvas.height=resizeInfo.trgHeight;if(orientation>4){canvas.width=resizeInfo.trgHeight;canvas.height=resizeInfo.trgWidth;}switch(orientation){case 2:ctx.translate(canvas.width,0);ctx.scale(-1,1);break;case 3:ctx.translate(canvas.width,canvas.height);ctx.rotate(Math.PI);break;case 4:ctx.translate(0,canvas.height);ctx.scale(1,-1);break;case 5:ctx.rotate(0.5*Math.PI);ctx.scale(1,-1);break;case 6:ctx.rotate(0.5*Math.PI);ctx.translate(0,-canvas.width);break;case 7:ctx.rotate(0.5*Math.PI);ctx.translate(canvas.height,-canvas.width);ctx.scale(-1,1);break;case 8:ctx.rotate(-0.5*Math.PI);ctx.translate(-canvas.height,0);break;}drawImageIOSFix(ctx,img,resizeInfo.srcX!=null?resizeInfo.srcX:0,resizeInfo.srcY!=null?resizeInfo.srcY:0,resizeInfo.srcWidth,resizeInfo.srcHeight,resizeInfo.trgX!=null?resizeInfo.trgX:0,resizeInfo.trgY!=null?resizeInfo.trgY:0,resizeInfo.trgWidth,resizeInfo.trgHeight); +var thumbnail=canvas.toDataURL("image/png");if(callback!=null){return callback(thumbnail,canvas);}});};if(callback!=null){img.onerror=callback;}return img.src=file.dataURL;}},{key:"processQueue",value:function processQueue(){var parallelUploads=this.options.parallelUploads;var processingLength=this.getUploadingFiles().length;var i=processingLength;if(processingLength>=parallelUploads){return;}var queuedFiles=this.getQueuedFiles();if(!(queuedFiles.length>0)){return;}if(this.options.uploadMultiple){return this.processFiles(queuedFiles.slice(0,parallelUploads-processingLength));}else{while(i=_iterator19.length)break; +_ref18=_iterator19[_i20++];}else{_i20=_iterator19.next();if(_i20.done)break;_ref18=_i20.value;}var file=_ref18;file.processing=true;file.status=Dropzone.UPLOADING;this.emit("processing",file);}if(this.options.uploadMultiple){this.emit("processingmultiple",files);}return this.uploadFiles(files);}},{key:"_getFilesWithXhr",value:function _getFilesWithXhr(xhr){var files=void 0;return files=this.files.filter(function(file){return file.xhr===xhr;}).map(function(file){return file;});}},{key:"cancelUpload",value:function cancelUpload(file){if(file.status===Dropzone.UPLOADING){var groupedFiles=this._getFilesWithXhr(file.xhr);for(var _iterator20=groupedFiles,_isArray20=true,_i21=0,_iterator20=_isArray20?_iterator20:_iterator20[Symbol.iterator]();;){var _ref19;if(_isArray20){if(_i21>=_iterator20.length)break;_ref19=_iterator20[_i21++];}else{_i21=_iterator20.next();if(_i21.done)break;_ref19=_i21.value;}var groupedFile=_ref19;groupedFile.status=Dropzone.CANCELED;}if(typeof file.xhr!=='undefined'){ +file.xhr.abort();}for(var _iterator21=groupedFiles,_isArray21=true,_i22=0,_iterator21=_isArray21?_iterator21:_iterator21[Symbol.iterator]();;){var _ref20;if(_isArray21){if(_i22>=_iterator21.length)break;_ref20=_iterator21[_i22++];}else{_i22=_iterator21.next();if(_i22.done)break;_ref20=_i22.value;}var _groupedFile=_ref20;this.emit("canceled",_groupedFile);}if(this.options.uploadMultiple){this.emit("canceledmultiple",groupedFiles);}}else if(file.status===Dropzone.ADDED||file.status===Dropzone.QUEUED){file.status=Dropzone.CANCELED;this.emit("canceled",file);if(this.options.uploadMultiple){this.emit("canceledmultiple",[file]);}}if(this.options.autoProcessQueue){return this.processQueue();}}},{key:"resolveOption",value:function resolveOption(option){if(typeof option==='function'){for(var _len3=arguments.length,args=Array(_len3>1?_len3-1:0),_key3=1;_key3<_len3;_key3++){args[_key3-1]=arguments[_key3];}return option.apply(this,args);}return option;}},{key:"uploadFile",value:function uploadFile(file){ +return this.uploadFiles([file]);}},{key:"uploadFiles",value:function uploadFiles(files){var _this14=this;this._transformFiles(files,function(transformedFiles){if(files[0].upload.chunked){var file=files[0];var transformedFile=transformedFiles[0];var startedChunkCount=0;file.upload.chunks=[];var handleNextChunk=function handleNextChunk(){var chunkIndex=0;while(file.upload.chunks[chunkIndex]!==undefined){chunkIndex++;}if(chunkIndex>=file.upload.totalChunkCount)return;startedChunkCount++;var start=chunkIndex*_this14.options.chunkSize;var end=Math.min(start+_this14.options.chunkSize,file.size);var dataBlock={name:_this14._getParamName(0),data:transformedFile.webkitSlice?transformedFile.webkitSlice(start,end):transformedFile.slice(start,end),filename:file.upload.filename,chunkIndex:chunkIndex};file.upload.chunks[chunkIndex]={file:file,index:chunkIndex,dataBlock:dataBlock,status:Dropzone.UPLOADING,progress:0,retries:0};_this14._uploadData(files,[dataBlock]);};file.upload.finishedChunkUpload=function(chunk){ +var allFinished=true;chunk.status=Dropzone.SUCCESS;chunk.dataBlock=null;chunk.xhr=null;for(var i=0;i=_iterator22.length)break;_ref21=_iterator22[_i24++];}else{_i24=_iterator22.next();if(_i24.done)break;_ref21=_i24.value;}var file=_ref21;file.xhr=xhr;}if(files[0].upload.chunked){files[0].upload.chunks[dataBlocks[0].chunkIndex].xhr=xhr;}var method=this.resolveOption(this.options.method,files);var url=this.resolveOption(this.options.url,files);xhr.open(method,url,true);xhr.timeout=this.resolveOption(this.options.timeout,files);xhr.withCredentials=!!this.options.withCredentials;xhr.onload=function(e){_this15._finishedUploading(files,xhr,e);};xhr.onerror=function(){_this15._handleUploadError(files,xhr);};var progressObj=xhr.upload!=null?xhr.upload:xhr;progressObj.onprogress=function(e){return _this15._updateFilesUploadProgress(files,xhr,e);};var headers={"Accept":"application/json", +"Cache-Control":"no-cache","X-Requested-With":"XMLHttpRequest"};if(this.options.headers){Dropzone.extend(headers,this.options.headers);}for(var headerName in headers){var headerValue=headers[headerName];if(headerValue){xhr.setRequestHeader(headerName,headerValue);}}var formData=new FormData();if(this.options.params){var additionalParams=this.options.params;if(typeof additionalParams==='function'){additionalParams=additionalParams.call(this,files,xhr,files[0].upload.chunked?this._getChunk(files[0],xhr):null);}for(var key in additionalParams){var value=additionalParams[key];formData.append(key,value);}}for(var _iterator23=files,_isArray23=true,_i25=0,_iterator23=_isArray23?_iterator23:_iterator23[Symbol.iterator]();;){var _ref22;if(_isArray23){if(_i25>=_iterator23.length)break;_ref22=_iterator23[_i25++];}else{_i25=_iterator23.next();if(_i25.done)break;_ref22=_i25.value;}var _file=_ref22;this.emit("sending",_file,xhr,formData);}if(this.options.uploadMultiple){this.emit("sendingmultiple",files,xhr,formData); +}this._addFormElementData(formData);for(var i=0;i=_iterator24.length)break;_ref23=_iterator24[_i26++];}else{_i26=_iterator24.next();if(_i26.done)break; +_ref23=_i26.value;}var input=_ref23;var inputName=input.getAttribute("name");var inputType=input.getAttribute("type");if(inputType)inputType=inputType.toLowerCase();if(typeof inputName==='undefined'||inputName===null)continue;if(input.tagName==="SELECT"&&input.hasAttribute("multiple")){for(var _iterator25=input.options,_isArray25=true,_i27=0,_iterator25=_isArray25?_iterator25:_iterator25[Symbol.iterator]();;){var _ref24;if(_isArray25){if(_i27>=_iterator25.length)break;_ref24=_iterator25[_i27++];}else{_i27=_iterator25.next();if(_i27.done)break;_ref24=_i27.value;}var option=_ref24;if(option.selected){formData.append(inputName,option.value);}}}else if(!inputType||inputType!=="checkbox"&&inputType!=="radio"||input.checked){formData.append(inputName,input.value);}}}}},{key:"_updateFilesUploadProgress",value:function _updateFilesUploadProgress(files,xhr,e){var progress=void 0;if(typeof e!=='undefined'){progress=100*e.loaded/e.total;if(files[0].upload.chunked){var file=files[0];var chunk=this._getChunk(file,xhr); +chunk.progress=progress;chunk.total=e.total;chunk.bytesSent=e.loaded;var fileProgress=0,fileTotal=void 0,fileBytesSent=void 0;file.upload.progress=0;file.upload.total=0;file.upload.bytesSent=0;for(var i=0;i=_iterator26.length)break;_ref25=_iterator26[_i28++];}else{_i28=_iterator26.next();if(_i28.done)break;_ref25=_i28.value;}var _file2=_ref25;_file2.upload.progress=progress;_file2.upload.total=e.total;_file2.upload.bytesSent=e.loaded;}}for(var _iterator27=files,_isArray27=true,_i29=0,_iterator27=_isArray27?_iterator27:_iterator27[Symbol.iterator]();;){ +var _ref26;if(_isArray27){if(_i29>=_iterator27.length)break;_ref26=_iterator27[_i29++];}else{_i29=_iterator27.next();if(_i29.done)break;_ref26=_i29.value;}var _file3=_ref26;this.emit("uploadprogress",_file3,_file3.upload.progress,_file3.upload.bytesSent);}}else{var allFilesFinished=true;progress=100;for(var _iterator28=files,_isArray28=true,_i30=0,_iterator28=_isArray28?_iterator28:_iterator28[Symbol.iterator]();;){var _ref27;if(_isArray28){if(_i30>=_iterator28.length)break;_ref27=_iterator28[_i30++];}else{_i30=_iterator28.next();if(_i30.done)break;_ref27=_i30.value;}var _file4=_ref27;if(_file4.upload.progress!==100||_file4.upload.bytesSent!==_file4.upload.total){allFilesFinished=false;}_file4.upload.progress=progress;_file4.upload.bytesSent=_file4.upload.total;}if(allFilesFinished){return;}for(var _iterator29=files,_isArray29=true,_i31=0,_iterator29=_isArray29?_iterator29:_iterator29[Symbol.iterator]();;){var _ref28;if(_isArray29){if(_i31>=_iterator29.length)break;_ref28=_iterator29[_i31++]; +}else{_i31=_iterator29.next();if(_i31.done)break;_ref28=_i31.value;}var _file5=_ref28;this.emit("uploadprogress",_file5,progress,_file5.upload.bytesSent);}}}},{key:"_finishedUploading",value:function _finishedUploading(files,xhr,e){var response=void 0;if(files[0].status===Dropzone.CANCELED){return;}if(xhr.readyState!==4){return;}if(xhr.responseType!=='arraybuffer'&&xhr.responseType!=='blob'){response=xhr.responseText;if(xhr.getResponseHeader("content-type")&&~xhr.getResponseHeader("content-type").indexOf("application/json")){try{response=JSON.parse(response);}catch(error){e=error;response="Invalid JSON response from server.";}}}this._updateFilesUploadProgress(files);if(!(200<=xhr.status&&xhr.status<300)){this._handleUploadError(files,xhr,response);}else{if(files[0].upload.chunked){files[0].upload.finishedChunkUpload(this._getChunk(files[0],xhr));}else{this._finished(files,response,e);}}}},{key:"_handleUploadError",value:function _handleUploadError(files,xhr,response){if(files[0].status===Dropzone.CANCELED){ +return;}if(files[0].upload.chunked&&this.options.retryChunks){var chunk=this._getChunk(files[0],xhr);if(chunk.retries++=_iterator30.length)break;_ref29=_iterator30[_i32++];}else{_i32=_iterator30.next();if(_i32.done)break;_ref29=_i32.value;}var file=_ref29;this._errorProcessing(files,response||this.options.dictResponseError.replace("{{statusCode}}",xhr.status),xhr);}}},{key:"submitRequest",value:function submitRequest(xhr,formData,files){xhr.send(formData);}},{key:"_finished",value:function _finished(files,responseText,e){for(var _iterator31=files,_isArray31=true,_i33=0,_iterator31=_isArray31?_iterator31:_iterator31[Symbol.iterator]();;){var _ref30;if(_isArray31){if(_i33>=_iterator31.length)break; +_ref30=_iterator31[_i33++];}else{_i33=_iterator31.next();if(_i33.done)break;_ref30=_i33.value;}var file=_ref30;file.status=Dropzone.SUCCESS;this.emit("success",file,responseText,e);this.emit("complete",file);}if(this.options.uploadMultiple){this.emit("successmultiple",files,responseText,e);this.emit("completemultiple",files);}if(this.options.autoProcessQueue){return this.processQueue();}}},{key:"_errorProcessing",value:function _errorProcessing(files,message,xhr){for(var _iterator32=files,_isArray32=true,_i34=0,_iterator32=_isArray32?_iterator32:_iterator32[Symbol.iterator]();;){var _ref31;if(_isArray32){if(_i34>=_iterator32.length)break;_ref31=_iterator32[_i34++];}else{_i34=_iterator32.next();if(_i34.done)break;_ref31=_i34.value;}var file=_ref31;file.status=Dropzone.ERROR;this.emit("error",file,message,xhr);this.emit("complete",file);}if(this.options.uploadMultiple){this.emit("errormultiple",files,message,xhr);this.emit("completemultiple",files);}if(this.options.autoProcessQueue){ +return this.processQueue();}}}],[{key:"uuidv4",value:function uuidv4(){return'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(c){var r=Math.random()*16|0,v=c==='x'?r:r&0x3|0x8;return v.toString(16);});}}]);return Dropzone;}(Emitter);Dropzone.initClass();Dropzone.version="5.5.1";Dropzone.options={};Dropzone.optionsForElement=function(element){if(element.getAttribute("id")){return Dropzone.options[camelize(element.getAttribute("id"))];}else{return undefined;}};Dropzone.instances=[];Dropzone.forElement=function(element){if(typeof element==="string"){element=document.querySelector(element);}if((element!=null?element.dropzone:undefined)==null){throw new Error("No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.");}return element.dropzone;};Dropzone.autoDiscover=true;Dropzone.discover=function(){var dropzones=void 0;if(document.querySelectorAll){ +dropzones=document.querySelectorAll(".dropzone");}else{dropzones=[];var checkElements=function checkElements(elements){return function(){var result=[];for(var _iterator33=elements,_isArray33=true,_i35=0,_iterator33=_isArray33?_iterator33:_iterator33[Symbol.iterator]();;){var _ref32;if(_isArray33){if(_i35>=_iterator33.length)break;_ref32=_iterator33[_i35++];}else{_i35=_iterator33.next();if(_i35.done)break;_ref32=_i35.value;}var el=_ref32;if(/(^| )dropzone($| )/.test(el.className)){result.push(dropzones.push(el));}else{result.push(undefined);}}return result;}();};checkElements(document.getElementsByTagName("div"));checkElements(document.getElementsByTagName("form"));}return function(){var result=[];for(var _iterator34=dropzones,_isArray34=true,_i36=0,_iterator34=_isArray34?_iterator34:_iterator34[Symbol.iterator]();;){var _ref33;if(_isArray34){if(_i36>=_iterator34.length)break;_ref33=_iterator34[_i36++];}else{_i36=_iterator34.next();if(_i36.done)break;_ref33=_i36.value;}var dropzone=_ref33; +if(Dropzone.optionsForElement(dropzone)!==false){result.push(new Dropzone(dropzone));}else{result.push(undefined);}}return result;}();};Dropzone.blacklistedBrowsers=[/opera.*(Macintosh|Windows Phone).*version\/12/i];Dropzone.isBrowserSupported=function(){var capableBrowser=true;if(window.File&&window.FileReader&&window.FileList&&window.Blob&&window.FormData&&document.querySelector){if(!("classList"in document.createElement("a"))){capableBrowser=false;}else{for(var _iterator35=Dropzone.blacklistedBrowsers,_isArray35=true,_i37=0,_iterator35=_isArray35?_iterator35:_iterator35[Symbol.iterator]();;){var _ref34;if(_isArray35){if(_i37>=_iterator35.length)break;_ref34=_iterator35[_i37++];}else{_i37=_iterator35.next();if(_i37.done)break;_ref34=_i37.value;}var regex=_ref34;if(regex.test(navigator.userAgent)){capableBrowser=false;continue;}}}}else{capableBrowser=false;}return capableBrowser;};Dropzone.dataURItoBlob=function(dataURI){var byteString=atob(dataURI.split(',')[1]);var mimeString=dataURI.split(',')[0].split(':')[1].split(';')[0]; +var ab=new ArrayBuffer(byteString.length);var ia=new Uint8Array(ab);for(var i=0,end=byteString.length,asc=0<=end;asc?i<=end:i>=end;asc?i++:i--){ia[i]=byteString.charCodeAt(i);}return new Blob([ab],{type:mimeString});};var without=function without(list,rejectedItem){return list.filter(function(item){return item!==rejectedItem;}).map(function(item){return item;});};var camelize=function camelize(str){return str.replace(/[\-_](\w)/g,function(match){return match.charAt(1).toUpperCase();});};Dropzone.createElement=function(string){var div=document.createElement("div");div.innerHTML=string;return div.childNodes[0];};Dropzone.elementInside=function(element,container){if(element===container){return true;}while(element=element.parentNode){if(element===container){return true;}}return false;};Dropzone.getElement=function(el,name){var element=void 0;if(typeof el==="string"){element=document.querySelector(el);}else if(el.nodeType!=null){element=el;}if(element==null){throw new Error("Invalid `"+name+"` option provided. Please provide a CSS selector or a plain HTML element."); +}return element;};Dropzone.getElements=function(els,name){var el=void 0,elements=void 0;if(els instanceof Array){elements=[];try{for(var _iterator36=els,_isArray36=true,_i38=0,_iterator36=_isArray36?_iterator36:_iterator36[Symbol.iterator]();;){if(_isArray36){if(_i38>=_iterator36.length)break;el=_iterator36[_i38++];}else{_i38=_iterator36.next();if(_i38.done)break;el=_i38.value;}elements.push(this.getElement(el,name));}}catch(e){elements=null;}}else if(typeof els==="string"){elements=[];for(var _iterator37=document.querySelectorAll(els),_isArray37=true,_i39=0,_iterator37=_isArray37?_iterator37:_iterator37[Symbol.iterator]();;){if(_isArray37){if(_i39>=_iterator37.length)break;el=_iterator37[_i39++];}else{_i39=_iterator37.next();if(_i39.done)break;el=_i39.value;}elements.push(el);}}else if(els.nodeType!=null){elements=[els];}if(elements==null||!elements.length){throw new Error("Invalid `"+name+"` option provided. Please provide a CSS selector, a plain HTML element or a list of those.");} +return elements;};Dropzone.confirm=function(question,accepted,rejected){if(window.confirm(question)){return accepted();}else if(rejected!=null){return rejected();}};Dropzone.isValidFile=function(file,acceptedFiles){if(!acceptedFiles){return true;}acceptedFiles=acceptedFiles.split(",");var mimeType=file.type;var baseMimeType=mimeType.replace(/\/.*$/,"");for(var _iterator38=acceptedFiles,_isArray38=true,_i40=0,_iterator38=_isArray38?_iterator38:_iterator38[Symbol.iterator]();;){var _ref35;if(_isArray38){if(_i40>=_iterator38.length)break;_ref35=_iterator38[_i40++];}else{_i40=_iterator38.next();if(_i40.done)break;_ref35=_i40.value;}var validType=_ref35;validType=validType.trim();if(validType.charAt(0)==="."){if(file.name.toLowerCase().indexOf(validType.toLowerCase(),file.name.length-validType.length)!==-1){return true;}}else if(/\/\*$/.test(validType)){if(baseMimeType===validType.replace(/\/.*$/,"")){return true;}}else{if(mimeType===validType){return true;}}}return false;};if(typeof jQuery!=='undefined'&&jQuery!==null){ +jQuery.fn.dropzone=function(options){return this.each(function(){return new Dropzone(this,options);});};}if(typeof module!=='undefined'&&module!==null){module.exports=Dropzone;}else{window.Dropzone=Dropzone;}Dropzone.ADDED="added";Dropzone.QUEUED="queued";Dropzone.ACCEPTED=Dropzone.QUEUED;Dropzone.UPLOADING="uploading";Dropzone.PROCESSING=Dropzone.UPLOADING;Dropzone.CANCELED="canceled";Dropzone.ERROR="error";Dropzone.SUCCESS="success";var detectVerticalSquash=function detectVerticalSquash(img){var iw=img.naturalWidth;var ih=img.naturalHeight;var canvas=document.createElement("canvas");canvas.width=1;canvas.height=ih;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);var _ctx$getImageData=ctx.getImageData(1,0,1,ih),data=_ctx$getImageData.data;var sy=0;var ey=ih;var py=ih;while(py>sy){var alpha=data[(py-1)*4+3];if(alpha===0){ey=py;}else{sy=py;}py=ey+sy>>1;}var ratio=py/ih;if(ratio===0){return 1;}else{return ratio;}};var drawImageIOSFix=function drawImageIOSFix(ctx,img,sx,sy,sw,sh,dx,dy,dw,dh){ +var vertSquashRatio=detectVerticalSquash(img);return ctx.drawImage(img,sx,sy,sw,sh,dx,dy,dw,dh/vertSquashRatio);};var ExifRestore=function(){function ExifRestore(){_classCallCheck(this,ExifRestore);}_createClass(ExifRestore,null,[{key:"initClass",value:function initClass(){this.KEY_STR='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';}},{key:"encode64",value:function encode64(input){var output='';var chr1=undefined;var chr2=undefined;var chr3='';var enc1=undefined;var enc2=undefined;var enc3=undefined;var enc4='';var i=0;while(true){chr1=input[i++];chr2=input[i++];chr3=input[i++];enc1=chr1>>2;enc2=(chr1&3)<<4|chr2>>4;enc3=(chr2&15)<<2|chr3>>6;enc4=chr3&63;if(isNaN(chr2)){enc3=enc4=64;}else if(isNaN(chr3)){enc4=64;}output=output+this.KEY_STR.charAt(enc1)+this.KEY_STR.charAt(enc2)+this.KEY_STR.charAt(enc3)+this.KEY_STR.charAt(enc4);chr1=chr2=chr3='';enc1=enc2=enc3=enc4='';if(!(irawImageArray.length){break;}}return segments;}},{key:"decode64",value:function decode64(input){var output='';var chr1=undefined;var chr2=undefined;var chr3='';var enc1=undefined;var enc2=undefined;var enc3=undefined;var enc4='';var i=0;var buf=[];var base64test=/[^A-Za-z0-9\+\/\=]/g;if(base64test.exec(input)){console.warn('There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, \'+\', \'/\',and \'=\'\nExpect errors in decoding.'); +}input=input.replace(/[^A-Za-z0-9\+\/\=]/g,'');while(true){enc1=this.KEY_STR.indexOf(input.charAt(i++));enc2=this.KEY_STR.indexOf(input.charAt(i++));enc3=this.KEY_STR.indexOf(input.charAt(i++));enc4=this.KEY_STR.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;buf.push(chr1);if(enc3!==64){buf.push(chr2);}if(enc4!==64){buf.push(chr3);}chr1=chr2=chr3='';enc1=enc2=enc3=enc4='';if(!(i=0){newClass=newClass.replace(' '+className+' ',' ');}elem.className=newClass.replace(/^\s+|\s+$/g,'');}},escapeHtml=function(str){var div=document.createElement('div');div.appendChild(document.createTextNode(str)); +return div.innerHTML;},_show=function(elem){elem.style.opacity='';elem.style.display='block';},show=function(elems){if(elems&&!elems.length){return _show(elems);}for(var i=0;i0){setTimeout(tick,interval);}else{elem.style.display='none';}};tick();},fireClick=function(node){if(MouseEvent){var mevt=new MouseEvent('click',{view:window,bubbles:false,cancelable:true});node.dispatchEvent(mevt);}else if(document.createEvent){var evt=document.createEvent('MouseEvents');evt.initEvent('click',false,false);node.dispatchEvent(evt);}else if(document.createEventObject){node.fireEvent('onclick');}else if(typeof node.onclick==='function'){node.onclick();}},stopEventPropagation=function(e){if(typeof e.stopPropagation==='function'){e.stopPropagation();e.preventDefault();}else if(window.event&&window.event.hasOwnProperty('cancelBubble')){window.event.cancelBubble=true;}};var previousActiveElement, +previousDocumentClick,previousWindowKeyDown,lastFocusedButton;window.sweetAlertInitialize=function(){var sweetHTML='

Title

Text

',sweetWrap=document.createElement('div');sweetWrap.innerHTML=sweetHTML;document.body.appendChild(sweetWrap);} +window.sweetAlert=window.swal=function(){if(arguments[0]===undefined){window.console.error('sweetAlert expects at least 1 attribute!');return false;}var params=extend({},defaultParams);switch(typeof arguments[0]){case'string':params.title=arguments[0];params.text=arguments[1]||'';params.type=arguments[2]||'';break;case'object':if(arguments[0].title===undefined){window.console.error('Missing "title" argument!');return false;}params.title=arguments[0].title;params.text=arguments[0].text||defaultParams.text;params.type=arguments[0].type||defaultParams.type;params.allowOutsideClick=arguments[0].allowOutsideClick||defaultParams.allowOutsideClick;params.showCancelButton=arguments[0].showCancelButton!==undefined?arguments[0].showCancelButton:defaultParams.showCancelButton;params.showConfirmButton=arguments[0].showConfirmButton!==undefined?arguments[0].showConfirmButton:defaultParams.showConfirmButton;params.closeOnConfirm=arguments[0].closeOnConfirm!==undefined?arguments[0].closeOnConfirm:defaultParams.closeOnConfirm; +params.closeOnCancel=arguments[0].closeOnCancel!==undefined?arguments[0].closeOnCancel:defaultParams.closeOnCancel;params.timer=arguments[0].timer||defaultParams.timer;params.confirmButtonText=(defaultParams.showCancelButton)?'Confirm':defaultParams.confirmButtonText;params.confirmButtonText=arguments[0].confirmButtonText||defaultParams.confirmButtonText;params.confirmButtonClass=arguments[0].confirmButtonClass||(arguments[0].type?'btn-'+arguments[0].type:null)||defaultParams.confirmButtonClass;params.cancelButtonText=arguments[0].cancelButtonText||defaultParams.cancelButtonText;params.cancelButtonClass=arguments[0].cancelButtonClass||defaultParams.cancelButtonClass;params.containerClass=arguments[0].containerClass||defaultParams.containerClass;params.titleClass=arguments[0].titleClass||defaultParams.titleClass;params.textClass=arguments[0].textClass||defaultParams.textClass;params.imageUrl=arguments[0].imageUrl||defaultParams.imageUrl;params.imageSize=arguments[0].imageSize||defaultParams.imageSize; +params.doneFunction=arguments[1]||null;break;default:window.console.error('Unexpected type of argument! Expected "string" or "object", got '+typeof arguments[0]);return false;}setParameters(params);fixVerticalPosition();openModal();var modal=getModal();var onButtonEvent=function(e){var target=e.target||e.srcElement,targetedConfirm=(target.className.indexOf('confirm')>-1),modalIsVisible=hasClass(modal,'visible'),doneFunctionExists=(params.doneFunction&&modal.getAttribute('data-has-done-function')==='true');switch(e.type){case("click"):if(targetedConfirm&&doneFunctionExists&&modalIsVisible){params.doneFunction(true);if(params.closeOnConfirm){closeModal();}}else if(doneFunctionExists&&modalIsVisible){var functionAsStr=String(params.doneFunction).replace(/\s/g,'');var functionHandlesCancel=functionAsStr.substring(0,9)==="function("&&functionAsStr.substring(9,10)!==")";if(functionHandlesCancel){params.doneFunction(false);}if(params.closeOnCancel){closeModal();}}else{closeModal();}break;}}; +var $buttons=modal.querySelectorAll('button');for(var i=0;i<$buttons.length;i++){$buttons[i].onclick=onButtonEvent;}previousDocumentClick=document.onclick;document.onclick=function(e){var target=e.target||e.srcElement;var clickedOnModal=(modal===target),clickedOnModalChild=isDescendant(modal,e.target),modalIsVisible=hasClass(modal,'visible'),outsideClickIsAllowed=modal.getAttribute('data-allow-ouside-click')==='true';if(!clickedOnModal&&!clickedOnModalChild&&modalIsVisible&&outsideClickIsAllowed){closeModal();}};var $okButton=modal.querySelector('button.confirm'),$cancelButton=modal.querySelector('button.cancel'),$modalButtons=modal.querySelectorAll('button:not([type=hidden])');function handleKeyDown(e){var keyCode=e.keyCode||e.which;if([9,13,32,27].indexOf(keyCode)===-1){return;}var $targetElement=e.target||e.srcElement;var btnIndex=-1;for(var i=0;i<$modalButtons.length;i++){if($targetElement===$modalButtons[i]){btnIndex=i;break;}}if(keyCode===9){if(btnIndex===-1){$targetElement=$okButton; +}else{if(btnIndex===$modalButtons.length-1){$targetElement=$modalButtons[0];}else{$targetElement=$modalButtons[btnIndex+1];}}stopEventPropagation(e);$targetElement.focus();}else{if(keyCode===13||keyCode===32){if(btnIndex===-1){$targetElement=$okButton;}else{$targetElement=undefined;}}else if(keyCode===27&&!($cancelButton.hidden||$cancelButton.style.display==='none')){$targetElement=$cancelButton;}else{$targetElement=undefined;}if($targetElement!==undefined){fireClick($targetElement,e);}}}previousWindowKeyDown=window.onkeydown;window.onkeydown=handleKeyDown;function handleOnBlur(e){var $targetElement=e.target||e.srcElement,$focusElement=e.relatedTarget,modalIsVisible=hasClass(modal,'visible'),bootstrapModalIsVisible=document.querySelector('.control-popup.modal')||false;if(bootstrapModalIsVisible){return;}if(modalIsVisible){var btnIndex=-1;if($focusElement!==null){for(var i=0;i<$modalButtons.length;i++){if($focusElement===$modalButtons[i]){btnIndex=i;break;}}if(btnIndex===-1){ +$targetElement.focus();}}else{lastFocusedButton=$targetElement;}}}$okButton.onblur=handleOnBlur;$cancelButton.onblur=handleOnBlur;window.onfocus=function(){window.setTimeout(function(){if(lastFocusedButton!==undefined){lastFocusedButton.focus();lastFocusedButton=undefined;}},0);};};window.swal.setDefaults=function(userParams){if(!userParams){throw new Error('userParams is required');}if(typeof userParams!=='object'){throw new Error('userParams has to be a object');}extend(defaultParams,userParams);};window.swal.close=function(){closeModal();} +function setParameters(params){var modal=getModal();var $title=modal.querySelector('h2'),$text=modal.querySelector('p'),$cancelBtn=modal.querySelector('button.cancel'),$confirmBtn=modal.querySelector('button.confirm');$title.innerHTML=escapeHtml(params.title).split("\n").join("
");$text.innerHTML=escapeHtml(params.text||'').split("\n").join("
");if(params.text){show($text);}hide(modal.querySelectorAll('.icon'));if(params.type){var validType=false;for(var i=0;iw)&&w>0){nw=w;nh=(w/$obj.width())*$obj.height();}if((nh>h)&&h>0){nh=h;nw=(h/$obj.height())*$obj.width();}xscale=$obj.width()/nw;yscale=$obj.height()/nh;$obj.width(nw).height(nh);}function unscale(c){return{x:c.x*xscale,y:c.y*yscale,x2:c.x2*xscale,y2:c.y2*yscale,w:c.w*xscale,h:c.h*yscale};}function doneSelect(pos){var c=Coords.getFixed();if((c.w>options.minSelect[0])&&(c.h>options.minSelect[1])){Selection.enableHandles();Selection.done();}else{Selection.release();}Tracker.setCursor(options.allowSelect?'crosshair':'default');}function newSelection(e){if(options.disabled){ +return false;}if(!options.allowSelect){return false;}btndown=true;docOffset=getPos($img);Selection.disableHandles();Tracker.setCursor('crosshair');var pos=mouseAbs(e);Coords.setPressed(pos);Selection.update();Tracker.activateHandlers(selectDrag,doneSelect,e.type.substring(0,5)==='touch');KeyManager.watchKeys();e.stopPropagation();e.preventDefault();return false;}function selectDrag(pos){Coords.setCurrent(pos);Selection.update();}function newTracker(){var trk=$('
').addClass(cssClass('tracker'));if(is_msie){trk.css({opacity:0,backgroundColor:'white'});}return trk;}if(typeof(obj)!=='object'){obj=$(obj)[0];}if(typeof(opt)!=='object'){opt={};}setOptions(opt);var img_css={border:'none',visibility:'visible',margin:0,padding:0,position:'absolute',top:0,left:0};var $origimg=$(obj),img_mode=true;if(obj.tagName=='IMG'){if($origimg[0].width!=0&&$origimg[0].height!=0){$origimg.width($origimg[0].width);$origimg.height($origimg[0].height);}else{var tempImage=new Image();tempImage.src=$origimg[0].src; +$origimg.width(tempImage.width);$origimg.height(tempImage.height);}var $img=$origimg.clone().removeAttr('id').css(img_css).show();$img.width($origimg.width());$img.height($origimg.height());$origimg.after($img).hide();}else{$img=$origimg.css(img_css).show();img_mode=false;if(options.shade===null){options.shade=true;}}presize($img,options.boxWidth,options.boxHeight);var boundx=$img.width(),boundy=$img.height(),$div=$('
').width(boundx).height(boundy).addClass(cssClass('holder')).css({position:'relative',backgroundColor:options.bgColor}).insertAfter($origimg).append($img);if(options.addClass){$div.addClass(options.addClass);}var $img2=$('
'),$img_holder=$('
').width('100%').height('100%').css({zIndex:310,position:'absolute',overflow:'hidden'}),$hdl_holder=$('
').width('100%').height('100%').css('zIndex',320),$sel=$('
').css({position:'absolute',zIndex:600}).dblclick(function(){var c=Coords.getFixed();options.onDblClick.call(api,c);}).insertBefore($img).append($img_holder,$hdl_holder); +if(img_mode){$img2=$('').attr('src',$img.attr('src')).css(img_css).width(boundx).height(boundy),$img_holder.append($img2);}if(ie6mode){$sel.css({overflowY:'hidden'});}var bound=options.boundary;var $trk=newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)).css({position:'absolute',top:px(-bound),left:px(-bound),zIndex:290}).mousedown(newSelection);var bgcolor=options.bgColor,bgopacity=options.bgOpacity,xlimit,ylimit,xmin,ymin,xscale,yscale,enabled=true,btndown,animating,shift_down;docOffset=getPos($img);var Touch=(function(){function hasTouchSupport(){var support={},events=['touchstart','touchmove','touchend'],el=document.createElement('div'),i;try{for(i=0;ix1+ox){ox-=ox+x1;}if(0>y1+oy){oy-=oy+y1;}if(boundyboundx){xx=boundx;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}}else{xx=x2;h=rwa/aspect;yy=rh<0?y1-h:y1+h;if(yy<0){yy=0;w=Math.abs((yy-y1)*aspect); +xx=rw<0?x1-w:w+x1;}else if(yy>boundy){yy=boundy;w=Math.abs(yy-y1)*aspect;xx=rw<0?x1-w:w+x1;}}if(xx>x1){if(xx-x1max_x){xx=x1+max_x;}if(yy>y1){yy=y1+(xx-x1)/aspect;}else{yy=y1-(xx-x1)/aspect;}}else if(xxmax_x){xx=x1-max_x;}if(yy>y1){yy=y1+(x1-xx)/aspect;}else{yy=y1-(x1-xx)/aspect;}}if(xx<0){x1-=xx;xx=0;}else if(xx>boundx){x1-=xx-boundx;xx=boundx;}if(yy<0){y1-=yy;yy=0;}else if(yy>boundy){y1-=yy-boundy;yy=boundy;}return makeObj(flipCoords(x1,y1,xx,yy));}function rebound(p){if(p[0]<0)p[0]=0;if(p[1]<0)p[1]=0;if(p[0]>boundx)p[0]=boundx;if(p[1]>boundy)p[1]=boundy;return[Math.round(p[0]),Math.round(p[1])];}function flipCoords(x1,y1,x2,y2){var xa=x1,xb=x2,ya=y1,yb=y2;if(x2xlimit)){x2=(xsize>0)?(x1+xlimit):(x1-xlimit);}if(ylimit&&(Math.abs(ysize)>ylimit)){y2=(ysize>0)?(y1+ylimit):(y1-ylimit); +}if(ymin/yscale&&(Math.abs(ysize)0)?(y1+ymin/yscale):(y1-ymin/yscale);}if(xmin/xscale&&(Math.abs(xsize)0)?(x1+xmin/xscale):(x1-xmin/xscale);}if(x1<0){x2-=x1;x1-=x1;}if(y1<0){y2-=y1;y1-=y1;}if(x2<0){x1-=x2;x2-=x2;}if(y2<0){y1-=y2;y2-=y2;}if(x2>boundx){delta=x2-boundx;x1-=delta;x2-=delta;}if(y2>boundy){delta=y2-boundy;y1-=delta;y2-=delta;}if(x1>boundx){delta=x1-boundy;y2-=delta;y1-=delta;}if(y1>boundy){delta=y1-boundy;y2-=delta;y1-=delta;}return makeObj(flipCoords(x1,y1,x2,y2));}function makeObj(a){return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]};}return{flipCoords:flipCoords,setPressed:setPressed,setCurrent:setCurrent,getOffset:getOffset,moveOffset:moveOffset,getCorner:getCorner,getFixed:getFixed};}());var Shade=(function(){var enabled=false,holder=$('
').css({position:'absolute',zIndex:240,opacity:0}),shades={top:createShade(),left:createShade().height(boundy),right:createShade().height(boundy),bottom:createShade()}; +function resizeShades(w,h){shades.left.css({height:px(h)});shades.right.css({height:px(h)});}function updateAuto(){return updateShade(Coords.getFixed());}function updateShade(c){shades.top.css({left:px(c.x),width:px(c.w),height:px(c.y)});shades.bottom.css({top:px(c.y2),left:px(c.x),width:px(c.w),height:px(boundy-c.y2)});shades.right.css({left:px(c.x2),width:px(boundx-c.x2)});shades.left.css({width:px(c.x)});}function createShade(){return $('
').css({position:'absolute',backgroundColor:options.shadeColor||options.bgColor}).appendTo(holder);}function enableShade(){if(!enabled){enabled=true;holder.insertBefore($img);updateAuto();Selection.setBgOpacity(1,0,1);$img2.hide();setBgColor(options.shadeColor||options.bgColor,1);if(Selection.isAwake()){setOpacity(options.bgOpacity,1);}else setOpacity(1,1);}}function setBgColor(color,now){colorChangeMacro(getShades(),color,now);}function disableShade(){if(enabled){holder.remove();$img2.show();enabled=false;if(Selection.isAwake()){Selection.setBgOpacity(options.bgOpacity,1,1); +}else{Selection.setBgOpacity(1,1,1);Selection.disableHandles();}colorChangeMacro($div,0,1);}}function setOpacity(opacity,now){if(enabled){if(options.bgFade&&!now){holder.animate({opacity:1-opacity},{queue:false,duration:options.fadeTime});}else holder.css({opacity:1-opacity});}}function refreshAll(){options.shade?enableShade():disableShade();if(Selection.isAwake())setOpacity(options.bgOpacity);}function getShades(){return holder.children();}return{update:updateAuto,updateRaw:updateShade,getShades:getShades,setBgColor:setBgColor,enable:enableShade,disable:disableShade,resize:resizeShades,refresh:refreshAll,opacity:setOpacity};}());var Selection=(function(){var awake,hdep=370,borders={},handle={},dragbar={},seehandles=false;function insertBorder(type){var jq=$('
').css({position:'absolute',opacity:options.borderOpacity}).addClass(cssClass(type));$img_holder.append(jq);return jq;}function dragDiv(ord,zi){var jq=$('
').mousedown(createDragger(ord)).css({cursor:ord+'-resize', +position:'absolute',zIndex:zi}).addClass('ord-'+ord);if(Touch.support){jq.bind('touchstart.jcrop',Touch.createDragger(ord));}$hdl_holder.append(jq);return jq;}function insertHandle(ord){var hs=options.handleSize,div=dragDiv(ord,hdep++).css({opacity:options.handleOpacity}).addClass(cssClass('handle'));if(hs){div.width(hs).height(hs);}return div;}function insertDragbar(ord){return dragDiv(ord,hdep++).addClass('jcrop-dragbar');}function createDragbars(li){var i;for(i=0;i').css({position:'fixed',left:'-120px',width:'12px'}).addClass('jcrop-keymgr'),$keywrap=$('
').css({position:'absolute',overflow:'hidden'}).append($keymgr);function watchKeys(){if(options.keySupport){$keymgr.show();$keymgr.focus();}}function onBlur(e){$keymgr.hide();}function doNudge(e,x,y){if(options.allowMove){Coords.moveOffset([x,y]);Selection.updateVisible(true);}e.preventDefault();e.stopPropagation();}function parseKey(e){if(e.ctrlKey||e.metaKey){return true;}shift_down=e.shiftKey?true:false;var nudge=shift_down?10:1;switch(e.keyCode){case 37:doNudge(e,-nudge,0);break;case 39:doNudge(e,nudge,0);break; +case 38:doNudge(e,0,-nudge);break;case 40:doNudge(e,0,nudge);break;case 27:if(options.allowSelect)Selection.release();break;case 9:return true;}return false;}if(options.keySupport){$keymgr.keydown(parseKey).blur(onBlur);if(ie6mode||!options.fixedSupport){$keymgr.css({position:'absolute',left:'-20px'});$keywrap.append($keymgr).insertBefore($img);}else{$keymgr.insertBefore($img);}}return{watchKeys:watchKeys};}());function setClass(cname){$div.removeClass().addClass(cssClass('holder')).addClass(cname);}function animateTo(a,callback){var x1=a[0]/xscale,y1=a[1]/yscale,x2=a[2]/xscale,y2=a[3]/yscale;if(animating){return;}var animto=Coords.flipCoords(x1,y1,x2,y2),c=Coords.getFixed(),initcr=[c.x,c.y,c.x2,c.y2],animat=initcr,interv=options.animationDelay,ix1=animto[0]-initcr[0],iy1=animto[1]-initcr[1],ix2=animto[2]-initcr[2],iy2=animto[3]-initcr[3],pcent=0,velocity=options.swingSpeed;x1=animat[0];y1=animat[1];x2=animat[2];y2=animat[3];Selection.animMode(true);var anim_timer;function queueAnimator(){ +window.setTimeout(animator,interv);}var animator=(function(){return function(){pcent+=(100-pcent)/velocity;animat[0]=Math.round(x1+((pcent/100)*ix1));animat[1]=Math.round(y1+((pcent/100)*iy1));animat[2]=Math.round(x2+((pcent/100)*ix2));animat[3]=Math.round(y2+((pcent/100)*iy2));if(pcent>=99.8){pcent=100;}if(pcent<100){setSelectRaw(animat);queueAnimator();}else{Selection.done();Selection.animMode(false);if(typeof(callback)==='function'){callback.call(api);}}};}());queueAnimator();}function setSelect(rect){setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]);options.onSelect.call(api,unscale(Coords.getFixed()));Selection.enableHandles();}function setSelectRaw(l){Coords.setPressed([l[0],l[1]]);Coords.setCurrent([l[2],l[3]]);Selection.update();}function tellSelect(){return unscale(Coords.getFixed());}function tellScaled(){return Coords.getFixed();}function setOptionsNew(opt){setOptions(opt);interfaceUpdate();}function disableCrop(){options.disabled=true;Selection.disableHandles(); +Selection.setCursor('default');Tracker.setCursor('default');}function enableCrop(){options.disabled=false;interfaceUpdate();}function cancelCrop(){Selection.done();Tracker.activateHandlers(null,null);}function destroy(){$(document).unbind('touchstart.jcrop-ios',Touch.fixTouchSupport);$div.remove();$origimg.show();$origimg.css('visibility','visible');$(obj).removeData('Jcrop');}function setImage(src,callback){Selection.release();disableCrop();var img=new Image();img.onload=function(){var iw=img.width;var ih=img.height;var bw=options.boxWidth;var bh=options.boxHeight;$img.width(iw).height(ih);$img.attr('src',src);$img2.attr('src',src);presize($img,bw,bh);boundx=$img.width();boundy=$img.height();$img2.width(boundx).height(boundy);$trk.width(boundx+(bound*2)).height(boundy+(bound*2));$div.width(boundx).height(boundy);Shade.resize(boundx,boundy);enableCrop();if(typeof(callback)==='function'){callback.call(api);}};img.src=src;}function colorChangeMacro($obj,color,now){var mycolor=color||options.bgColor; +if(options.bgFade&&supportsColorFade()&&options.fadeTime&&!now){$obj.animate({backgroundColor:mycolor},{queue:false,duration:options.fadeTime});}else{$obj.css('backgroundColor',mycolor);}}function interfaceUpdate(alt){if(options.allowResize){if(alt){Selection.enableOnly();}else{Selection.enableHandles();}}else{Selection.disableHandles();}Tracker.setCursor(options.allowSelect?'crosshair':'default');Selection.setCursor(options.allowMove?'move':'default');if(options.hasOwnProperty('trueSize')){xscale=options.trueSize[0]/boundx;yscale=options.trueSize[1]/boundy;}if(options.hasOwnProperty('setSelect')){setSelect(options.setSelect);Selection.done();delete(options.setSelect);}Shade.refresh();if(options.bgColor!=bgcolor){colorChangeMacro(options.shade?Shade.getShades():$div,options.shade?(options.shadeColor||options.bgColor):options.bgColor);bgcolor=options.bgColor;}if(bgopacity!=options.bgOpacity){bgopacity=options.bgOpacity;if(options.shade)Shade.refresh();else Selection.setBgOpacity(bgopacity); +}xlimit=options.maxSize[0]||0;ylimit=options.maxSize[1]||0;xmin=options.minSize[0]||0;ymin=options.minSize[1]||0;if(options.hasOwnProperty('outerImage')){$img.attr('src',options.outerImage);delete(options.outerImage);}Selection.refresh();}if(Touch.support)$trk.bind('touchstart.jcrop',Touch.newSelection);$hdl_holder.hide();interfaceUpdate(true);var api={setImage:setImage,animateTo:animateTo,setSelect:setSelect,setOptions:setOptionsNew,tellSelect:tellSelect,tellScaled:tellScaled,setClass:setClass,disable:disableCrop,enable:enableCrop,cancel:cancelCrop,release:Selection.release,destroy:destroy,focus:KeyManager.watchKeys,getBounds:function(){return[boundx*xscale,boundy*yscale];},getWidgetSize:function(){return[boundx,boundy];},getScaleFactor:function(){return[xscale,yscale];},getOptions:function(){return options;},ui:{holder:$div,selection:$sel}};if(is_msie)$div.bind('selectstart',function(){return false;});$origimg.data('Jcrop',api);return api;};$.fn.Jcrop=function(options,callback){var api; +this.each(function(){if($(this).data('Jcrop')){if(options==='api')return $(this).data('Jcrop');else $(this).data('Jcrop').setOptions(options);}else{if(this.tagName=='IMG')$.Jcrop.Loader(this,function(){$(this).css({display:'block',visibility:'hidden'});api=$.Jcrop(this,options);if($.isFunction(callback))callback.call(api);});else{$(this).css({display:'block',visibility:'hidden'});api=$.Jcrop(this,options);if($.isFunction(callback))callback.call(api);}}});return this;};$.Jcrop.Loader=function(imgobj,success,error){var $img=$(imgobj),img=$img[0];function completeCheck(){if(img.complete){$img.unbind('.jcloader');if($.isFunction(success))success.call(img);}else window.setTimeout(completeCheck,50);}$img.bind('load.jcloader',completeCheck).bind('error.jcloader',function(e){$img.unbind('.jcloader');if($.isFunction(error))error.call(img);});if(img.complete&&$.isFunction(success)){$img.unbind('.jcloader');success.call(img);}};$.Jcrop.defaults={allowSelect:true,allowMove:true,allowResize:true, +trackDocument:true,baseClass:'jcrop',addClass:null,bgColor:'black',bgOpacity:0.6,bgFade:false,borderOpacity:0.4,handleOpacity:0.5,handleSize:null,aspectRatio:0,keySupport:true,createHandles:['n','s','e','w','nw','ne','se','sw'],createDragbars:['n','s','e','w'],createBorders:['n','s','e','w'],drawBorders:true,dragEdges:true,fixedSupport:true,touchSupport:null,shade:null,boxWidth:0,boxHeight:0,boundary:2,fadeTime:400,animationDelay:20,swingSpeed:3,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){},onDblClick:function(){},onRelease:function(){}};}(jQuery));!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),e=[],a= +b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;ah[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.length;c=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d.push(["com", +/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+"]|\\x5C"+s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/, +q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b(a,c){var d=c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"], +O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/, +V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/], +["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:R}),["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);p(v({keywords:Q, +hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]);p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="
"+a+"
";b=b.firstChild;g&&J(b,g,!0);K({h:d,j:g,c:b,i:1}); +return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i') +this.registerHandlers()} +MediaManagerPopup.prototype.registerHandlers=function(){this.$popupRootElement.one('hide.oc.popup',this.proxy(this.onPopupHidden)) +this.$popupRootElement.one('shown.oc.popup',this.proxy(this.onPopupShown))} +MediaManagerPopup.prototype.unregisterHandlers=function(){this.$popupElement.off('popupcommand',this.proxy(this.onPopupCommand)) +this.$popupRootElement.off('popupcommand',this.proxy(this.onPopupCommand))} +MediaManagerPopup.prototype.show=function(){var data={bottomToolbar:this.options.bottomToolbar?1:0,cropAndInsertButton:this.options.cropAndInsertButton?1:0,mode:this.options.mode||'all',} +this.$popupRootElement.popup({extraData:data,size:'adaptive',adaptiveHeight:true,handler:this.options.alias+'::onLoadPopup'})} +MediaManagerPopup.prototype.hide=function(){if(this.$popupElement)this.$popupElement.trigger('close.oc.popup')} +MediaManagerPopup.prototype.getMediaManagerElement=function(){return this.$popupElement.find('[data-control="media-manager"]')} +MediaManagerPopup.prototype.insertMedia=function(){var items=this.getMediaManagerElement().mediaManager('getSelectedItems') +if(this.options.onInsert!==undefined)this.options.onInsert.call(this,items)} +MediaManagerPopup.prototype.insertCroppedImage=function(imageItem){if(this.options.onInsert!==undefined)this.options.onInsert.call(this,[imageItem])} +MediaManagerPopup.prototype.onPopupHidden=function(event,element,popup){var mediaManager=this.getMediaManagerElement() +mediaManager.mediaManager('dispose') +mediaManager.remove() +$(document).trigger('mousedown') +this.dispose() +if(this.options.onClose!==undefined)this.options.onClose.call(this)} +MediaManagerPopup.prototype.onPopupShown=function(event,element,popup){this.$popupElement=popup +this.$popupElement.on('popupcommand',this.proxy(this.onPopupCommand)) +this.getMediaManagerElement().mediaManager('selectFirstItem')} +MediaManagerPopup.prototype.onPopupCommand=function(ev,command,param){switch(command){case'insert':this.insertMedia() +break;case'insert-cropped':this.insertCroppedImage(param) +break;}return false} +MediaManagerPopup.DEFAULTS={alias:undefined,bottomToolbar:true,cropAndInsertButton:false,onInsert:undefined,onClose:undefined} +$.wn.mediaManager.popup=MediaManagerPopup}(window.jQuery);if($.wn===undefined)$.wn={} +if($.oc===undefined)$.oc=$.wn +if($.wn.langMessages===undefined)$.wn.langMessages={} +$.wn.lang=(function(lang,messages){lang.load=function(locale){if(messages[locale]===undefined){messages[locale]={}}lang.loadedMessages=messages[locale]} +lang.get=function(name,defaultValue){if(!name)return +var result=lang.loadedMessages +if(!defaultValue)defaultValue=name +$.each(name.split('.'),function(index,value){if(result[value]===undefined){result=defaultValue +return false}result=result[value]}) +return result} +if(lang.locale===undefined){lang.locale=$('html').attr('lang')||'en'}if(lang.loadedMessages===undefined){lang.load(lang.locale)}return lang})($.wn.lang||{},$.wn.langMessages);(function($){if($.wn===undefined)$.wn={} +if($.oc===undefined)$.oc=$.wn +$.wn.alert=function alert(message){swal({title:message,confirmButtonClass:'btn-primary'})} +$.wn.confirm=function confirm(message,callback){swal({title:message,showCancelButton:true,confirmButtonClass:'btn-primary'},callback)}})(jQuery);$(window).on('ajaxErrorMessage',function(event,message){if(!message)return +$.wn.alert(message) +event.preventDefault()}) +$(window).on('ajaxConfirmMessage',function(event,message){if(!message)return +$.wn.confirm(message,function(isConfirm){isConfirm?event.promise.resolve():event.promise.reject()}) +event.preventDefault() +return true}) +$(document).ready(function(){if(!window.swal)return +var swal=window.swal +window.sweetAlert=window.swal=function(message,callback){if(typeof message==='object'){message.confirmButtonText=message.confirmButtonText||$.wn.lang.get('alert.confirm_button_text') +message.cancelButtonText=message.cancelButtonText||$.wn.lang.get('alert.cancel_button_text')}else{message={title:message,confirmButtonText:$.wn.lang.get('alert.confirm_button_text'),cancelButtonText:$.wn.lang.get('alert.cancel_button_text')}}swal(message,callback)}})+function($){"use strict";var Base=$.wn.foundation.base,BaseProto=Base.prototype +var Scrollpad=function(element,options){this.$el=$(element) +this.scrollbarElement=null +this.dragHandleElement=null +this.scrollContentElement=null +this.contentElement=null +this.options=options +this.scrollbarSize=null +this.updateScrollbarTimer=null +this.dragOffset=null +Base.call(this) +this.init() +$.wn.foundation.controlUtils.markDisposable(element)} +Scrollpad.prototype=Object.create(BaseProto) +Scrollpad.prototype.constructor=Scrollpad +Scrollpad.prototype.dispose=function(){this.unregisterHandlers() +this.$el.get(0).removeChild(this.scrollbarElement) +this.$el.removeData('oc.scrollpad') +this.$el=null +this.scrollbarElement=null +this.dragHandleElement=null +this.scrollContentElement=null +this.contentElement=null +BaseProto.dispose.call(this)} +Scrollpad.prototype.scrollToStart=function(){var scrollAttr=this.options.direction=='vertical'?'scrollTop':'scrollLeft' +this.scrollContentElement[scrollAttr]=0} +Scrollpad.prototype.update=function(){this.updateScrollbarSize()} +Scrollpad.prototype.init=function(){this.build() +this.setScrollContentSize() +this.registerHandlers()} +Scrollpad.prototype.build=function(){var el=this.$el.get(0) +this.scrollContentElement=el.children[0] +this.contentElement=this.scrollContentElement.children[0] +this.$el.prepend('
') +this.scrollbarElement=el.querySelector('.scrollpad-scrollbar') +this.dragHandleElement=el.querySelector('.scrollpad-scrollbar > .drag-handle')} +Scrollpad.prototype.registerHandlers=function(){this.$el.on('mouseenter',this.proxy(this.onMouseEnter)) +this.$el.on('mouseleave',this.proxy(this.onMouseLeave)) +this.$el.one('dispose-control',this.proxy(this.dispose)) +this.scrollContentElement.addEventListener('scroll',this.proxy(this.onScroll)) +this.dragHandleElement.addEventListener('mousedown',this.proxy(this.onStartDrag))} +Scrollpad.prototype.unregisterHandlers=function(){this.$el.off('mouseenter',this.proxy(this.onMouseEnter)) +this.$el.off('mouseleave',this.proxy(this.onMouseLeave)) +this.$el.off('dispose-control',this.proxy(this.dispose)) +this.scrollContentElement.removeEventListener('scroll',this.proxy(this.onScroll)) +this.dragHandleElement.removeEventListener('mousedown',this.proxy(this.onStartDrag)) +document.removeEventListener('mousemove',this.proxy(this.onMouseMove)) +document.removeEventListener('mouseup',this.proxy(this.onEndDrag))} +Scrollpad.prototype.setScrollContentSize=function(){var scrollbarSize=this.getScrollbarSize() +if(this.options.direction=='vertical')this.scrollContentElement.setAttribute('style','margin-right: -'+scrollbarSize+'px') +else this.scrollContentElement.setAttribute('style','margin-bottom: -'+scrollbarSize+'px')} +Scrollpad.prototype.getScrollbarSize=function(){if(this.scrollbarSize!==null)return this.scrollbarSize +var testerElement=document.createElement('div') +testerElement.setAttribute('class','scrollpad-scrollbar-size-tester') +testerElement.appendChild(document.createElement('div')) +document.body.appendChild(testerElement) +var width=testerElement.offsetWidth,innerWidth=testerElement.querySelector('div').offsetWidth +document.body.removeChild(testerElement) +if(width===innerWidth&&navigator.userAgent.toLowerCase().indexOf('firefox')>-1)return this.scrollbarSize=17 +return this.scrollbarSize=width-innerWidth} +Scrollpad.prototype.updateScrollbarSize=function(){this.scrollbarElement.removeAttribute('data-hidden') +var contentSize=this.options.direction=='vertical'?this.contentElement.scrollHeight:this.contentElement.scrollWidth,scrollOffset=this.options.direction=='vertical'?this.scrollContentElement.scrollTop:this.scrollContentElement.scrollLeft,scrollbarSize=this.options.direction=='vertical'?this.scrollbarElement.offsetHeight:this.scrollbarElement.offsetWidth,scrollbarRatio=scrollbarSize/contentSize,handleOffset=Math.round(scrollbarRatio*scrollOffset)+2,handleSize=Math.floor(scrollbarRatio*(scrollbarSize-2))-2;if(scrollbarSize1)dragPerc=1 +var scrollPos=dragPerc*contentSize;this.scrollContentElement[scrollAttr]=scrollPos} +Scrollpad.prototype.onEndDrag=function(ev){document.removeEventListener('mousemove',this.proxy(this.onMouseMove)) +document.removeEventListener('mouseup',this.proxy(this.onEndDrag))} +Scrollpad.DEFAULTS={direction:'vertical'} +var old=$.fn.scrollpad +$.fn.scrollpad=function(option){var args=Array.prototype.slice.call(arguments,1),result=undefined +this.each(function(){var $this=$(this) +var data=$this.data('oc.scrollpad') +var options=$.extend({},Scrollpad.DEFAULTS,$this.data(),typeof option=='object'&&option) +if(!data)$this.data('oc.scrollpad',(data=new Scrollpad(this,options))) +if(typeof option=='string')result=data[option].apply(data,args) +if(typeof result!='undefined')return false}) +return result?result:this} +$.fn.scrollpad.Constructor=Scrollpad +$.fn.scrollpad.noConflict=function(){$.fn.scrollpad=old +return this} +$(document).on('render',function(){$('div[data-control=scrollpad]').scrollpad()})}(window.jQuery);+function($){"use strict";var VerticalMenu=function(element,toggle,options){this.$el=$(element) +this.body=$('body') +this.toggle=$(toggle) +this.options=options||{} +this.options=$.extend({},VerticalMenu.DEFAULTS,this.options) +this.wrapper=$(this.options.contentWrapper) +this.breakpoint=options.breakpoint +this.menuPanel=$('
').appendTo('body').addClass(this.options.collapsedMenuClass).css('width',0) +this.menuContainer=$('
').appendTo(this.menuPanel).css('display','none') +this.menuElement=this.$el.clone().appendTo(this.menuContainer).css('width','auto') +var self=this +this.toggle.click(function(){if(!self.body.hasClass(self.options.bodyMenuOpenClass)){var wrapperWidth=self.wrapper.outerWidth() +self.menuElement.dragScroll('goToStart') +self.wrapper.css({'position':'absolute','min-width':self.wrapper.width(),'height':'100%'}) +self.body.addClass(self.options.bodyMenuOpenClass) +self.menuContainer.css('display','block') +self.wrapper.animate({'left':self.options.menuWidth},{duration:200,queue:false}) +self.menuPanel.animate({'width':self.options.menuWidth},{duration:200,queue:false,complete:function(){self.menuElement.css('width',self.options.menuWidth)}})}else{closeMenu()}return false}) +this.wrapper.click(function(){if(self.body.hasClass(self.options.bodyMenuOpenClass)){closeMenu() +return false}}) +$(window).resize(function(){if(self.body.hasClass(self.options.bodyMenuOpenClass)){if($(window).width()>self.breakpoint){hideMenu()}}}) +this.menuElement.dragScroll({vertical:true,useNative:true,start:function(){self.menuElement.addClass('drag')},stop:function(){self.menuElement.removeClass('drag')},scrollClassContainer:self.menuPanel,scrollMarkerContainer:self.menuContainer}) +this.menuElement.on('click',function(){if(self.menuElement.hasClass('drag'))return false}) +function hideMenu(){self.body.removeClass(self.options.bodyMenuOpenClass) +self.wrapper.css({'position':'static','min-width':0,'right':0,'height':'100%'}) +self.menuPanel.css('width',0) +self.menuElement.css('width','auto') +self.menuContainer.css('display','none')}function closeMenu(){self.wrapper.animate({'left':0},{duration:200,queue:false}) +self.menuPanel.animate({'width':0},{duration:200,queue:false,complete:hideMenu}) +self.menuElement.animate({'width':0},{duration:200,queue:false})}} +VerticalMenu.DEFAULTS={menuWidth:230,breakpoint:769,bodyMenuOpenClass:'mainmenu-open',collapsedMenuClass:'mainmenu-collapsed',contentWrapper:'#layout-canvas'} +var old=$.fn.verticalMenu +$.fn.verticalMenu=function(toggleSelector,option){return this.each(function(){var $this=$(this) +var data=$this.data('oc.verticalMenu') +var options=typeof option=='object'&&option +if(!data)$this.data('oc.verticalMenu',(data=new VerticalMenu(this,toggleSelector,options))) +if(typeof option=='string')data[option].call($this)})} +$.fn.verticalMenu.Constructor=VerticalMenu +$.fn.verticalMenu.noConflict=function(){$.fn.verticalMenu=old +return this}}(window.jQuery);(function($){$(document).ready(function(){$('nav.navbar').each(function(){var navbar=$(this),nav=$('ul.nav',navbar),collapseMode=navbar.hasClass('navbar-mode-collapse'),isMobile=$('html').hasClass('mobile') +nav.verticalMenu($('a.menu-toggle',navbar),{breakpoint:collapseMode?Infinity:769}) +$('li.with-tooltip:not(.active) > a',navbar).tooltip({container:'body',placement:'bottom',template:''}).on('show.bs.tooltip',function(e){if(isMobile)e.preventDefault()}) +var dragScroll=$('[data-control=toolbar]',navbar).data('oc.dragScroll') +if(dragScroll){dragScroll.goToElement($('ul.nav > li.active',navbar),undefined,{'duration':0})}})})})(jQuery);+function($){"use strict";if($.wn===undefined)$.wn={} +if($.oc===undefined)$.oc=$.wn +var SideNav=function(element,options){this.options=options +this.$el=$(element) +this.$list=$('ul',this.$el) +this.$items=$('li',this.$list) +this.init();} +SideNav.DEFAULTS={activeClass:'active'} +SideNav.prototype.init=function(){var self=this +this.$list.dragScroll({vertical:true,useNative:true,start:function(){self.$list.addClass('drag')},stop:function(){self.$list.removeClass('drag')},scrollClassContainer:self.$el,scrollMarkerContainer:self.$el}) +this.$list.on('click',function(){if(self.$list.hasClass('drag')){return false}})} +SideNav.prototype.unsetActiveItem=function(itemId){this.$items.removeClass(this.options.activeClass)} +SideNav.prototype.setActiveItem=function(itemId){if(!itemId){return}this.$items.removeClass(this.options.activeClass).filter('[data-menu-item='+itemId+']').addClass(this.options.activeClass)} +SideNav.prototype.setCounter=function(itemId,value){var $counter=$('span.counter[data-menu-id="'+itemId+'"]',this.$el) +$counter.removeClass('empty') +$counter.toggleClass('empty',value==0) +$counter.text(value) +return this} +SideNav.prototype.increaseCounter=function(itemId,value){var $counter=$('span.counter[data-menu-id="'+itemId+'"]',this.$el) +var originalValue=parseInt($counter.text()) +if(isNaN(originalValue))originalValue=0 +var newValue=value+originalValue +$counter.toggleClass('empty',newValue==0) +$counter.text(newValue) +return this} +SideNav.prototype.dropCounter=function(itemId){this.setCounter(itemId,0) +return this} +var old=$.fn.sideNav +$.fn.sideNav=function(option){var args=Array.prototype.slice.call(arguments,1),result +this.each(function(){var $this=$(this) +var data=$this.data('oc.sideNav') +var options=$.extend({},SideNav.DEFAULTS,$this.data(),typeof option=='object'&&option) +if(!data)$this.data('oc.sideNav',(data=new SideNav(this,options))) +if(typeof option=='string')result=data[option].apply(data,args) +if(typeof result!='undefined')return false +if($.wn.sideNav===undefined)$.wn.sideNav=data}) +return result?result:this} +$.fn.sideNav.Constructor=SideNav +$.fn.sideNav.noConflict=function(){$.fn.sideNav=old +return this} +$(document).ready(function(){$('[data-control="sidenav"]').sideNav()})}(window.jQuery);+function($){"use strict";var Base=$.wn.foundation.base,BaseProto=Base.prototype +var Scrollbar=function(element,options){var $el=this.$el=$(element),el=$el.get(0),self=this,options=this.options=options||{},sizeName=this.sizeName=options.vertical?'height':'width',isNative=$('html').hasClass('mobile'),isTouch=this.isTouch=Modernizr.touchevents,isScrollable=this.isScrollable=false,isLocked=this.isLocked=false,eventElementName=options.vertical?'pageY':'pageX',dragStart=0,startOffset=0;$.wn.foundation.controlUtils.markDisposable(element) +Base.call(this) +this.$el.one('dispose-control',this.proxy(this.dispose)) +if(isNative){return}this.$scrollbar=$('
').addClass('scrollbar-scrollbar') +this.$track=$('
').addClass('scrollbar-track').appendTo(this.$scrollbar) +this.$thumb=$('
').addClass('scrollbar-thumb').appendTo(this.$track) +$el.addClass('drag-scrollbar').addClass(options.vertical?'vertical':'horizontal').prepend(this.$scrollbar) +if(isTouch){this.$el.on('touchstart',function(event){var touchEvent=event.originalEvent;if(touchEvent.touches.length==1){startDrag(touchEvent.touches[0]) +event.stopPropagation()}})}else{this.$thumb.on('mousedown',function(event){startDrag(event)}) +this.$track.on('mouseup',function(event){moveDrag(event)})}$el.mousewheel(function(event){var offset=self.options.vertical?((event.deltaFactor*event.deltaY)*-1):(event.deltaFactor*event.deltaX) +return!scrollWheel(offset*self.options.scrollSpeed)}) +$el.on('oc.scrollbar.gotoStart',function(event){self.options.vertical?$el.scrollTop(0):$el.scrollLeft(0) +self.update() +event.stopPropagation()}) +$(window).on('resize',$.proxy(this.update,this)) +$(window).on('oc.updateUi',$.proxy(this.update,this)) +function startDrag(event){$('body').addClass('drag-noselect') +$el.trigger('oc.scrollStart') +dragStart=event[eventElementName] +startOffset=self.options.vertical?$el.scrollTop():$el.scrollLeft() +if(isTouch){$(window).on('touchmove.scrollbar',function(event){var touchEvent=event.originalEvent +if(moveDrag(touchEvent.touches[0]))event.preventDefault();});$el.on('touchend.scrollbar',stopDrag)}else{$(window).on('mousemove.scrollbar',function(event){moveDrag(event) +return false}) +$(window).on('mouseup.scrollbar',function(){stopDrag() +return false})}}function moveDrag(event){self.isLocked=true;var offset,dragTo=event[eventElementName] +if(self.isTouch){offset=dragStart-dragTo}else{var ratio=self.getCanvasSize()/self.getViewportSize() +offset=(dragTo-dragStart)*ratio}self.options.vertical?$el.scrollTop(startOffset+offset):$el.scrollLeft(startOffset+offset) +self.setThumbPosition() +return self.options.vertical?el.scrollTop!=startOffset:el.scrollLeft!=startOffset}function stopDrag(){$('body').removeClass('drag-noselect') +$el.trigger('oc.scrollEnd') +$(window).off('.scrollbar')}var isWebkit=$(document.documentElement).hasClass('webkit') +function scrollWheel(offset){startOffset=self.options.vertical?el.scrollTop:el.scrollLeft +$el.trigger('oc.scrollStart') +self.options.vertical?$el.scrollTop(startOffset+offset):$el.scrollLeft(startOffset+offset) +var scrolled=self.options.vertical?el.scrollTop!=startOffset:el.scrollLeft!=startOffset +self.setThumbPosition() +if(!isWebkit){if(self.endScrollTimeout!==undefined){clearTimeout(self.endScrollTimeout) +self.endScrollTimeout=undefined}self.endScrollTimeout=setTimeout(function(){$el.trigger('oc.scrollEnd') +self.endScrollTimeout=undefined},50)}else{$el.trigger('oc.scrollEnd')}return scrolled}setTimeout(function(){self.update()},1);} +Scrollbar.prototype=Object.create(BaseProto) +Scrollbar.prototype.constructor=Scrollbar +Scrollbar.prototype.dispose=function(){this.unregisterHandlers() +BaseProto.dispose.call(this)} +Scrollbar.prototype.unregisterHandlers=function(){} +Scrollbar.DEFAULTS={vertical:true,scrollSpeed:2,animation:true,start:function(){},drag:function(){},stop:function(){}} +Scrollbar.prototype.update=function(){if(!this.$scrollbar)return +this.$scrollbar.hide() +this.setThumbSize() +this.setThumbPosition() +this.$scrollbar.show()} +Scrollbar.prototype.setThumbSize=function(){var properties=this.calculateProperties() +this.isScrollable=!(properties.thumbSizeRatio>=1);this.$scrollbar.toggleClass('disabled',!this.isScrollable) +if(this.options.vertical){this.$track.height(properties.canvasSize) +this.$thumb.height(properties.thumbSize)}else{this.$track.width(properties.canvasSize) +this.$thumb.width(properties.thumbSize)}} +Scrollbar.prototype.setThumbPosition=function(){var properties=this.calculateProperties() +if(this.options.vertical)this.$thumb.css({top:properties.thumbPosition}) +else this.$thumb.css({left:properties.thumbPosition})} +Scrollbar.prototype.calculateProperties=function(){var $el=this.$el,properties={};properties.viewportSize=this.getViewportSize() +properties.canvasSize=this.getCanvasSize() +properties.scrollAmount=(this.options.vertical)?$el.scrollTop():$el.scrollLeft() +properties.thumbSizeRatio=properties.viewportSize/properties.canvasSize +properties.thumbSize=properties.viewportSize*properties.thumbSizeRatio +properties.thumbPositionRatio=properties.scrollAmount/(properties.canvasSize-properties.viewportSize) +properties.thumbPosition=((properties.viewportSize-properties.thumbSize)*properties.thumbPositionRatio)+properties.scrollAmount +if(isNaN(properties.thumbPosition))properties.thumbPosition=0 +return properties;} +Scrollbar.prototype.getViewportSize=function(){return(this.options.vertical)?this.$el.height():this.$el.width();} +Scrollbar.prototype.getCanvasSize=function(){return(this.options.vertical)?this.$el.get(0).scrollHeight:this.$el.get(0).scrollWidth;} +Scrollbar.prototype.gotoElement=function(element,callback){var $el=$(element) +if(!$el.length)return;var self=this,offset=0,animated=false,params={duration:300,queue:false,complete:function(){if(callback!==undefined)callback()}} +if(!this.options.vertical){offset=$el.get(0).offsetLeft-this.$el.scrollLeft() +if(offset<0){this.$el.animate({'scrollLeft':$el.get(0).offsetLeft},params) +animated=true}else{offset=$el.get(0).offsetLeft+$el.outerWidth()-(this.$el.scrollLeft()+this.$el.outerWidth()) +if(offset>0){this.$el.animate({'scrollLeft':$el.get(0).offsetLeft+$el.outerWidth()-this.$el.outerWidth()},params) +animated=true}}}else{offset=$el.get(0).offsetTop-this.$el.scrollTop() +if(this.options.animation){if(offset<0){this.$el.animate({'scrollTop':$el.get(0).offsetTop},params) +animated=true}else{offset=$el.get(0).offsetTop-(this.$el.scrollTop()+this.$el.outerHeight()) +if(offset>0){this.$el.animate({'scrollTop':$el.get(0).offsetTop+$el.outerHeight()-this.$el.outerHeight()},params) +animated=true}}}else{if(offset<0){this.$el.scrollTop($el.get(0).offsetTop)}else{offset=$el.get(0).offsetTop-(this.$el.scrollTop()+this.$el.outerHeight()) +if(offset>0)this.$el.scrollTop($el.get(0).offsetTop+$el.outerHeight()-this.$el.outerHeight())}}}if(!animated&&callback!==undefined)callback() +return this} +Scrollbar.prototype.dispose=function(){this.$el=null +this.$scrollbar=null +this.$track=null +this.$thumb=null} +var old=$.fn.scrollbar +$.fn.scrollbar=function(option){return this.each(function(){var $this=$(this) +var data=$this.data('oc.scrollbar') +var options=$.extend({},Scrollbar.DEFAULTS,$this.data(),typeof option=='object'&&option) +if(!data)$this.data('oc.scrollbar',(data=new Scrollbar(this,options))) +if(typeof option=='string')data[option].call($this)})} +$.fn.scrollbar.Constructor=Scrollbar +$.fn.scrollbar.noConflict=function(){$.fn.scrollbar=old +return this} +$(document).render(function(){$('[data-control=scrollbar]').scrollbar()})}(window.jQuery);+function($){"use strict";var FileList=function(element,options){this.options=options +this.$el=$(element) +this.init();} +FileList.DEFAULTS={ignoreItemClick:false} +FileList.prototype.init=function(){var self=this +this.$el.on('click','li.group > h4 > a, li.group > div.group',function(){self.toggleGroup($(this).closest('li')) +return false;});if(!this.options.ignoreItemClick){this.$el.on('click','li.item > a',function(event){var e=$.Event('open.oc.list',{relatedTarget:$(this).parent().get(0),clickEvent:event}) +self.$el.trigger(e,this) +return false})}this.$el.on('ajaxUpdate',$.proxy(this.update,this))} +FileList.prototype.toggleGroup=function(group){var $group=$(group);$group.attr('data-status')=='expanded'?this.collapseGroup($group):this.expandGroup($group)} +FileList.prototype.collapseGroup=function(group){var $list=$('> ul, > div.subitems',group),self=this;$list.css('overflow','hidden') +$list.animate({'height':0},{duration:100,queue:false,complete:function(){$list.css({'overflow':'visible','display':'none'}) +$(group).attr('data-status','collapsed') +$(window).trigger('resize')}}) +this.sendGroupStatusRequest(group,0);} +FileList.prototype.expandGroup=function(group){var $list=$('> ul, > div.subitems',group),self=this;$list.css({'overflow':'hidden','display':'block','height':0}) +$list.animate({'height':$list[0].scrollHeight},{duration:100,queue:false,complete:function(){$list.css({'overflow':'visible','height':'auto'}) +$(group).attr('data-status','expanded') +$(window).trigger('resize')}}) +this.sendGroupStatusRequest(group,1);} +FileList.prototype.sendGroupStatusRequest=function(group,status){if(this.options.groupStatusHandler!==undefined){var groupId=$(group).data('group-id') +if(groupId===undefined)groupId=$('> h4 a',group).text();$(group).request(this.options.groupStatusHandler,{data:{group:groupId,status:status}})}} +FileList.prototype.markActive=function(dataId){$('li.item',this.$el).removeClass('active') +if(dataId)$('li.item[data-id="'+dataId+'"]',this.$el).addClass('active') +this.dataId=dataId} +FileList.prototype.update=function(){if(this.dataId!==undefined)this.markActive(this.dataId)} +var old=$.fn.fileList +$.fn.fileList=function(option){var args=arguments;return this.each(function(){var $this=$(this) +var data=$this.data('oc.fileList') +var options=$.extend({},FileList.DEFAULTS,$this.data(),typeof option=='object'&&option) +if(!data)$this.data('oc.fileList',(data=new FileList(this,options))) +if(typeof option=='string'){var methodArgs=[];for(var i=1;i0){fixedWidth=0 +$children.each(function(){$el=$(this) +margin=$el.data('oc.layoutMargin') +if(margin===undefined){margin=parseInt($el.css('marginRight'))+parseInt($el.css('marginLeft')) +$el.data('oc.layoutMargin',margin)}fixedWidth+=$el.get(0).offsetWidth+margin}) +$(this).width(fixedWidth) +$(this).trigger('oc.widthFixed')}})} +WinterLayout.prototype.toggleAccountMenu=function(el){var self=this,$el=$(el),$parent=$(el).parent(),$menu=$el.next() +$el.tooltip('hide') +if($menu.hasClass('active')){self.$accountMenuOverlay.remove() +$parent.removeClass('highlight') +$menu.removeClass('active')}else{self.$accountMenuOverlay=$('
').addClass('popover-overlay') +$(document.body).append(self.$accountMenuOverlay) +$parent.addClass('highlight') +$menu.addClass('active') +self.$accountMenuOverlay.one('click',function(){self.$accountMenuOverlay.remove() +$menu.removeClass('active') +$parent.removeClass('highlight')})}} +if($.wn===undefined)$.wn={} +if($.oc===undefined)$.oc=$.wn +$.wn.layout=new WinterLayout() +$(document).ready(function(){$.wn.layout.updateLayout() +window.setTimeout($.wn.layout.updateLayout,100)}) +$(window).on('resize',function(){$.wn.layout.updateLayout()}) +$(window).on('oc.updateUi',function(){$.wn.layout.updateLayout()})})(jQuery);+function($){"use strict";var SidePanelTab=function(element,options){this.options=options +this.$el=$(element) +this.init()} +SidePanelTab.prototype.init=function(){var self=this +this.tabOpenDelay=200 +this.tabOpenTimeout=undefined +this.panelOpenTimeout=undefined +this.$sideNav=$('#layout-sidenav') +this.$sideNavItems=$('ul li',this.$sideNav) +this.$sidePanelItems=$('[data-content-id]',this.$el) +this.sideNavWidth=this.$sideNavItems.outerWidth() +this.mainNavHeight=$('#layout-mainmenu').outerHeight() +this.panelVisible=false +this.visibleItemId=false +this.$fixButton=$('') +this.$fixButton.click(function(){self.fixPanel() +return false}) +$('.fix-button-container',this.$el).append(this.$fixButton) +this.$sideNavItems.click(function(){if($(this).data('no-side-panel')){return}if(Modernizr.touchevents&&$(window).width()this.options.breakpoint&&this.panelFixed()){this.hideSidePanel()}} +SidePanelTab.prototype.updateActiveTab=function(){if($.wn.sideNav===undefined){return}if(!this.panelVisible&&($(window).width() ul, > ol').sortable(sortableOptions)}if($el.hasClass('is-scrollable')){$el.wrapInner($('
').addClass('control-scrollbar')) +var $scrollbar=$el.find('>.control-scrollbar:first') +$scrollbar.scrollbar()}} +SimpleList.DEFAULTS={sortableHandle:null} +var old=$.fn.simplelist +$.fn.simplelist=function(option){return this.each(function(){var $this=$(this) +var data=$this.data('oc.simplelist') +var options=$.extend({},SimpleList.DEFAULTS,$this.data(),typeof option=='object'&&option) +if(!data)$this.data('oc.simplelist',(data=new SimpleList(this,options)))})} +$.fn.simplelist.Constructor=SimpleList +$.fn.simplelist.noConflict=function(){$.fn.simplelist=old +return this} +$(document).render(function(){$('[data-control="simplelist"]').simplelist()})}(window.jQuery);+function($){"use strict";var Base=$.wn.foundation.base,BaseProto=Base.prototype +var TreeListWidget=function(element,options){this.$el=$(element) +this.options=options||{};Base.call(this) +$.wn.foundation.controlUtils.markDisposable(element) +this.init()} +TreeListWidget.prototype=Object.create(BaseProto) +TreeListWidget.prototype.constructor=TreeListWidget +TreeListWidget.prototype.init=function(){var sortableOptions={handle:this.options.handle,nested:this.options.nested,onDrop:this.proxy(this.onDrop),afterMove:this.proxy(this.onAfterMove)} +this.$el.find('> ol').sortable($.extend(sortableOptions,this.options)) +if(!this.options.nested)this.$el.find('> ol ol').sortable($.extend(sortableOptions,this.options)) +this.$el.one('dispose-control',this.proxy(this.dispose))} +TreeListWidget.prototype.dispose=function(){this.unbind() +BaseProto.dispose.call(this)} +TreeListWidget.prototype.unbind=function(){this.$el.off('dispose-control',this.proxy(this.dispose)) +this.$el.find('> ol').sortable('destroy') +if(!this.options.nested){this.$el.find('> ol ol').sortable('destroy')}this.$el.removeData('oc.treelist') +this.$el=null +this.options=null} +TreeListWidget.DEFAULTS={handle:null,nested:true} +TreeListWidget.prototype.onDrop=function($item,container,_super){if(!this.$el){return}this.$el.trigger('move.oc.treelist',{item:$item,container:container}) +_super($item,container)} +TreeListWidget.prototype.onAfterMove=function($placeholder,container,$closestEl){if(!this.$el){return}this.$el.trigger('aftermove.oc.treelist',{placeholder:$placeholder,container:container,closestEl:$closestEl})} +var old=$.fn.treeListWidget +$.fn.treeListWidget=function(option){var args=arguments,result +this.each(function(){var $this=$(this) +var data=$this.data('oc.treelist') +var options=$.extend({},TreeListWidget.DEFAULTS,$this.data(),typeof option=='object'&&option) +if(!data)$this.data('oc.treelist',(data=new TreeListWidget(this,options))) +if(typeof option=='string')result=data[option].call(data) +if(typeof result!='undefined')return false}) +return result?result:this} +$.fn.treeListWidget.Constructor=TreeListWidget +$.fn.treeListWidget.noConflict=function(){$.fn.treeListWidget=old +return this} +$(document).render(function(){$('[data-control="treelist"]').treeListWidget();})}(window.jQuery);+function($){"use strict";var SidenavTree=function(element,options){this.options=options +this.$el=$(element) +this.init()} +SidenavTree.DEFAULTS={treeName:'sidenav_tree'} +SidenavTree.prototype.init=function(){var self=this +$(document.body).addClass('has-sidenav-tree') +this.statusCookieName=this.options.treeName+'groupStatus' +this.searchCookieName=this.options.treeName+'search' +this.$searchInput=$(this.options.searchInput) +this.$el.on('click','li > div.group',function(){self.toggleGroup($(this).closest('li')) +return false}) +this.$searchInput.on('input',function(){self.handleSearchChange()}) +var searchTerm=$.cookie(this.searchCookieName) +if(searchTerm!==undefined&&searchTerm.length>0){this.$searchInput.val(searchTerm) +this.applySearch()}var scrollbar=$('[data-control=scrollbar]',this.$el).data('oc.scrollbar'),active=$('li.active',this.$el) +if(active.length>0){scrollbar.gotoElement(active)}} +SidenavTree.prototype.toggleGroup=function(group){var $group=$(group),status=$group.attr('data-status') +status===undefined||status=='expanded'?this.collapseGroup($group):this.expandGroup($group)} +SidenavTree.prototype.collapseGroup=function(group){var $list=$('> ul',group),self=this +$list.css('overflow','hidden') +$list.animate({'height':0},{duration:100,queue:false,complete:function(){$list.css({'overflow':'visible','display':'none'}) +$(group).attr('data-status','collapsed') +$(window).trigger('oc.updateUi') +self.saveGroupStatus($(group).data('group-code'),true)}})} +SidenavTree.prototype.expandGroup=function(group,duration){var $list=$('> ul',group),self=this +duration=duration===undefined?100:duration +$list.css({'overflow':'hidden','height':0}) +$list.animate({'height':$list[0].scrollHeight},{duration:duration,queue:false,complete:function(){$list.css({'overflow':'visible','height':'auto','display':''}) +$(group).attr('data-status','expanded') +$(window).trigger('oc.updateUi') +self.saveGroupStatus($(group).data('group-code'),false)}})} +SidenavTree.prototype.saveGroupStatus=function(groupCode,collapsed){var collapsedGroups=$.cookie(this.statusCookieName),updatedGroups=[] +if(collapsedGroups===undefined){collapsedGroups=''}collapsedGroups=collapsedGroups.split('|') +$.each(collapsedGroups,function(){if(groupCode!=this)updatedGroups.push(this)}) +if(collapsed){updatedGroups.push(groupCode)}$.cookie(this.statusCookieName,updatedGroups.join('|'),{expires:30,path:'/'})} +SidenavTree.prototype.handleSearchChange=function(){var lastValue=this.$searchInput.data('oc.lastvalue');if(lastValue!==undefined&&lastValue==this.$searchInput.val()){return}this.$searchInput.data('oc.lastvalue',this.$searchInput.val()) +if(this.dataTrackInputTimer!==undefined){window.clearTimeout(this.dataTrackInputTimer)}var self=this +this.dataTrackInputTimer=window.setTimeout(function(){self.applySearch()},300);$.cookie(this.searchCookieName,$.trim(this.$searchInput.val()),{expires:30,path:'/'})} +SidenavTree.prototype.applySearch=function(){var query=$.trim(this.$searchInput.val()),words=query.toLowerCase().split(' '),visibleGroups=[],visibleItems=[],self=this +if(query.length==0){$('li',this.$el).removeClass('hidden') +return}$('ul.top-level > li',this.$el).each(function(){var $li=$(this) +if(self.textContainsWords($('div.group h3',$li).text(),words)){visibleGroups.push($li.get(0)) +$('ul li',$li).each(function(){visibleItems.push(this)})}else{$('ul li',$li).each(function(){if(self.textContainsWords($(this).text(),words)||self.textContainsWords($(this).data('keywords'),words)){visibleGroups.push($li.get(0)) +visibleItems.push(this)}})}}) +$('ul.top-level > li',this.$el).each(function(){var $li=$(this),groupIsVisible=$.inArray(this,visibleGroups)!==-1 +$li.toggleClass('hidden',!groupIsVisible) +if(groupIsVisible)self.expandGroup($li,0) +$('ul li',$li).each(function(){var $itemLi=$(this) +$itemLi.toggleClass('hidden',$.inArray(this,visibleItems)==-1)})}) +return false} +SidenavTree.prototype.textContainsWords=function(text,words){text=text.toLowerCase() +for(var i=0;i':'>','"':'"',"'":''','/':'/'},htmlEscaper=/[&<>"'\/]/g +return(''+string).replace(htmlEscaper,function(match){return htmlEscapes[match];})} +if(!!window.MSInputMethodContext&&!!document.documentMode){$(window).on('resize',function(){fixMediaManager() +fixSidebar()}) +function fixMediaManager(){var $el=$('div[data-control="media-manager"] .control-scrollpad') +$el.height($el.parent().height())}function fixSidebar(){$('#layout-sidenav').height(Math.max($('#layout-body').innerHeight(),$(window).height()-$('#layout-mainmenu').height()))}} \ No newline at end of file diff --git a/modules/backend/assets/js/winter.alert.js b/modules/backend/assets/js/winter.alert.js new file mode 100644 index 0000000..6a3558d --- /dev/null +++ b/modules/backend/assets/js/winter.alert.js @@ -0,0 +1,92 @@ +/* + * Alerts + * + * Displays alert and confirmation dialogs + * + * JavaScript API: + * $.wn.alert() + * $.wn.confirm() + * + * Dependences: + * - Sweet Alert + * - Translations (winter.lang.js) + */ +(function($){ + + if ($.wn === undefined) + $.wn = {} + if ($.oc === undefined) + $.oc = $.wn + + $.wn.alert = function alert(message) { + swal({ + title: message, + confirmButtonClass: 'btn-primary' + }) + } + + $.wn.confirm = function confirm(message, callback) { + + swal({ + title: message, + showCancelButton: true, + confirmButtonClass: 'btn-primary' + }, callback) + + } + +})(jQuery); + +/* + * Implement alerts with AJAX framework + */ + +$(window).on('ajaxErrorMessage', function(event, message){ + if (!message) return + + $.wn.alert(message) + + // Prevent the default alert() message + event.preventDefault() +}) + +$(window).on('ajaxConfirmMessage', function(event, message){ + if (!message) return + + $.wn.confirm(message, function(isConfirm){ + isConfirm + ? event.promise.resolve() + : event.promise.reject() + }) + + // Prevent the default confirm() message + event.preventDefault() + return true +}) + +/* + * Override "Sweet Alert" functions to translate default buttons + */ + +$(document).ready(function(){ + if (!window.swal) return + + var swal = window.swal + + window.sweetAlert = window.swal = function(message, callback) { + if (typeof message === 'object') { + // Do not override if texts are provided + message.confirmButtonText = message.confirmButtonText || $.wn.lang.get('alert.confirm_button_text') + message.cancelButtonText = message.cancelButtonText || $.wn.lang.get('alert.cancel_button_text') + } + else { + message = { + title: message, + confirmButtonText: $.wn.lang.get('alert.confirm_button_text'), + cancelButtonText: $.wn.lang.get('alert.cancel_button_text') + } + } + + swal(message, callback) + } +}) diff --git a/modules/backend/assets/js/winter.datetime.js b/modules/backend/assets/js/winter.datetime.js new file mode 100644 index 0000000..8bab57a --- /dev/null +++ b/modules/backend/assets/js/winter.datetime.js @@ -0,0 +1,175 @@ +/* + * Date time converter. + * See moment.js for format options. + * http://momentjs.com/docs/#/displaying/format/ + * + * Usage: + * + * + * + * Alias options: + * + * time -> 6:28 AM + * timeLong -> 6:28:01 AM + * date -> 04/23/2016 + * dateMin -> 4/23/2016 + * dateLong -> April 23, 2016 + * dateLongMin -> Apr 23, 2016 + * dateTime -> April 23, 2016 6:28 AM + * dateTimeMin -> Apr 23, 2016 6:28 AM + * dateTimeLong -> Saturday, April 23, 2016 6:28 AM + * dateTimeLongMin -> Sat, Apr 23, 2016 6:29 AM + * + */ ++function ($) { "use strict"; + var Base = $.wn.foundation.base, + BaseProto = Base.prototype + + var DateTimeConverter = function (element, options) { + this.$el = $(element) + this.options = options || {} + + $.wn.foundation.controlUtils.markDisposable(element) + Base.call(this) + this.init() + } + + DateTimeConverter.prototype = Object.create(BaseProto) + DateTimeConverter.prototype.constructor = DateTimeConverter + + DateTimeConverter.prototype.init = function() { + this.initDefaults() + + this.$el.text(this.getDateTimeValue()) + + this.$el.one('dispose-control', this.proxy(this.dispose)) + } + + DateTimeConverter.prototype.initDefaults = function() { + if (!this.options.timezone) { + this.options.timezone = $('meta[name="backend-timezone"]').attr('content') + } + + if (!this.options.locale) { + this.options.locale = $('meta[name="backend-locale"]').attr('content') + } + + if (!this.options.format) { + this.options.format = 'llll' + } + + if (this.options.formatAlias) { + this.options.format = this.getFormatFromAlias(this.options.formatAlias) + } + + this.appTimezone = $('meta[name="app-timezone"]').attr('content') + if (!this.appTimezone) { + this.appTimezone = 'UTC' + } + } + + DateTimeConverter.prototype.getDateTimeValue = function() { + this.datetime = this.$el.attr('datetime') + + if (this.$el.get(0).hasAttribute('data-ignore-timezone')) { + this.appTimezone = 'UTC' + this.options.timezone = 'UTC' + } + + var momentObj = moment.tz(this.datetime, this.appTimezone), + result + + if (this.options.locale) { + momentObj = momentObj.locale(this.options.locale) + } + + if (this.options.timezone) { + momentObj = momentObj.tz(this.options.timezone) + } + + if (this.options.timeSince) { + result = momentObj.fromNow() + } + else if (this.options.timeTense) { + result = momentObj.calendar() + } + else { + result = momentObj.format(this.options.format) + } + + return result + } + + DateTimeConverter.prototype.getFormatFromAlias = function(alias) { + var map = { + time: 'LT', + timeLong: 'LTS', + date: 'L', + dateMin: 'l', + dateLong: 'LL', + dateLongMin: 'll', + dateTime: 'LLL', + dateTimeMin: 'lll', + dateTimeLong: 'LLLL', + dateTimeLongMin: 'llll' + } + + return map[alias] ? map[alias] : 'llll' + } + + DateTimeConverter.prototype.dispose = function() { + this.$el.off('dispose-control', this.proxy(this.dispose)) + this.$el.removeData('oc.dateTimeConverter') + + this.$el = null + this.options = null + + BaseProto.dispose.call(this) + } + + DateTimeConverter.DEFAULTS = { + format: null, + formatAlias: null, + timezone: null, + locale: null, + timeTense: false, + timeSince: false + } + + // PLUGIN DEFINITION + // ============================ + + var old = $.fn.dateTimeConverter + + $.fn.dateTimeConverter = function (option) { + var args = Array.prototype.slice.call(arguments, 1), items, result + + items = this.each(function () { + var $this = $(this) + var data = $this.data('oc.dateTimeConverter') + var options = $.extend({}, DateTimeConverter.DEFAULTS, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('oc.dateTimeConverter', (data = new DateTimeConverter(this, options))) + if (typeof option == 'string') result = data[option].apply(data, args) + if (typeof result != 'undefined') return false + }) + + return result ? result : items + } + + $.fn.dateTimeConverter.Constructor = DateTimeConverter + + $.fn.dateTimeConverter.noConflict = function () { + $.fn.dateTimeConverter = old + return this + } + + $(document).render(function (){ + $('time[data-datetime-control]').dateTimeConverter() + }) + +}(window.jQuery); diff --git a/modules/backend/assets/js/winter.filelist.js b/modules/backend/assets/js/winter.filelist.js new file mode 100644 index 0000000..9796372 --- /dev/null +++ b/modules/backend/assets/js/winter.filelist.js @@ -0,0 +1,169 @@ +/* + * File List + * + * Creates a tree list of clickable folders and files. + * + * Data attributes: + * - data-control="filelist" - enables the file list plugin + * - data-group-status-handler - AJAX handler to execute when a group is collapsed or expanded by a user + * + * JavaScript API: + * $('#list').fileList() + * + * Events + * - open.oc.list - this event is triggered on the list element when an item is clicked. + * + * Dependences: + * - Null + */ + ++function ($) { "use strict"; + + // FILELIST CLASS DEFINITION + // ============================ + + var FileList = function(element, options) { + this.options = options + this.$el = $(element) + + this.init(); + } + + FileList.DEFAULTS = { + ignoreItemClick: false + } + + FileList.prototype.init = function (){ + var self = this + + this.$el.on('click', 'li.group > h4 > a, li.group > div.group', function() { + self.toggleGroup($(this).closest('li')) + + return false; + }); + + if (!this.options.ignoreItemClick) { + this.$el.on('click', 'li.item > a', function(event) { + var e = $.Event('open.oc.list', {relatedTarget: $(this).parent().get(0), clickEvent: event}) + self.$el.trigger(e, this) + + return false + }) + } + + this.$el.on('ajaxUpdate', $.proxy(this.update, this)) + } + + FileList.prototype.toggleGroup = function(group) { + var $group = $(group); + + $group.attr('data-status') == 'expanded' ? + this.collapseGroup($group) : + this.expandGroup($group) + } + + FileList.prototype.collapseGroup = function(group) { + var + $list = $('> ul, > div.subitems', group), + self = this; + + $list.css('overflow', 'hidden') + $list.animate({'height': 0}, { duration: 100, queue: false, complete: function() { + $list.css({ + 'overflow': 'visible', + 'display': 'none' + }) + $(group).attr('data-status', 'collapsed') + $(window).trigger('resize') + } }) + + this.sendGroupStatusRequest(group, 0); + } + + FileList.prototype.expandGroup = function(group) { + var + $list = $('> ul, > div.subitems', group), + self = this; + + $list.css({ + 'overflow': 'hidden', + 'display': 'block', + 'height': 0 + }) + $list.animate({'height': $list[0].scrollHeight}, { duration: 100, queue: false, complete: function() { + $list.css({ + 'overflow': 'visible', + 'height': 'auto' + }) + $(group).attr('data-status', 'expanded') + $(window).trigger('resize') + } }) + + this.sendGroupStatusRequest(group, 1); + } + + FileList.prototype.sendGroupStatusRequest = function(group, status) { + if (this.options.groupStatusHandler !== undefined) { + var groupId = $(group).data('group-id') + if (groupId === undefined) + groupId = $('> h4 a', group).text(); + + $(group).request(this.options.groupStatusHandler, {data: {group: groupId, status: status}}) + } + } + + FileList.prototype.markActive = function(dataId) { + $('li.item', this.$el).removeClass('active') + if (dataId) + $('li.item[data-id="'+dataId+'"]', this.$el).addClass('active') + + this.dataId = dataId + } + + FileList.prototype.update = function() { + if (this.dataId !== undefined) + this.markActive(this.dataId) + } + + // FILELIST PLUGIN DEFINITION + // ============================ + + var old = $.fn.fileList + + $.fn.fileList = function (option) { + var args = arguments; + + return this.each(function () { + var $this = $(this) + var data = $this.data('oc.fileList') + var options = $.extend({}, FileList.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('oc.fileList', (data = new FileList(this, options))) + if (typeof option == 'string') { + var methodArgs = []; + for (var i=1; i .layout-cell'), + $flyout = this.$el.find('> .flyout') + + $('[data-control=layout-sidepanel]').sidePanelTab('hideSidePanel') + + this.removeOverlay() + + for (var i = 0; i < $cells.length; i++) { + var $cell = $($cells[i]), + width = $cell.width() + + $cell.css('width', width) + } + + this.createOverlay() + + window.setTimeout(this.proxy(this.setBodyClass), 1) + $flyout.css('width', this.options.flyoutWidth) + + this.hideToggle() + } + + Flyout.prototype.hide = function() { + var $cells = this.$el.find('> .layout-cell'), + $flyout = this.$el.find('> .flyout') + + for (var i = 0; i < $cells.length; i++) { + var $cell = $($cells[i]) + + $cell.css('width', '') + } + + $flyout.css('width', 0) + + window.setTimeout(this.proxy(this.removeBodyClass), 1) + window.setTimeout(this.proxy(this.removeOverlayAndShowToggle), 300) + } + + // FLYOUT INTERNAL METHODS + // ============================ + + Flyout.prototype.init = function() { + this.build() + } + + Flyout.prototype.build = function() { + if (this.options.flyoutToggle) { + this.buildToggle() + } + } + + Flyout.prototype.buildToggle = function() { + var $toggleContainer = $(this.options.flyoutToggle), + $toggle = $('
') + + $toggle.on('click', this.proxy(this.show)) + $toggleContainer.append($toggle) + } + + Flyout.prototype.removeToggle = function() { + var $toggle = this.getToggle() + + $toggle.off('click', this.proxy(this.show)) + $toggle.remove() + } + + Flyout.prototype.hideToggle = function() { + if (!this.options.flyoutToggle) { + return + } + + this.getToggle().hide() + } + + Flyout.prototype.showToggle = function() { + if (!this.options.flyoutToggle) { + return + } + + this.getToggle().show() + } + + Flyout.prototype.getToggle = function() { + var $toggleContainer = $(this.options.flyoutToggle) + + return $toggleContainer.find('.flyout-toggle') + } + + Flyout.prototype.setBodyClass = function() { + $(document.body).addClass('flyout-visible') + } + + Flyout.prototype.removeBodyClass = function() { + $(document.body).removeClass('flyout-visible') + } + + Flyout.prototype.createOverlay = function() { + this.$overlay = $('
') + + var position = this.$el.offset() + + this.$overlay.css({ + top: position.top, + left: this.options.flyoutWidth + }) + + this.$overlay.on('click', this.proxy(this.onOverlayClick)) + $(document.body).on('keydown', this.proxy(this.onDocumentKeydown)) + + $(document.body).append(this.$overlay) + } + + Flyout.prototype.removeOverlay = function() { + if (!this.$overlay) { + return + } + + this.$overlay.off('click', this.proxy(this.onOverlayClick)) + $(document.body).off('keydown', this.proxy(this.onDocumentKeydown)) + + this.$overlay.remove() + this.$overlay = null + } + + Flyout.prototype.removeOverlayAndShowToggle = function() { + this.removeOverlay() + this.showToggle() + } + + // EVENT HANDLERS + // ============================ + + Flyout.prototype.onOverlayClick = function() { + this.hide() + } + + Flyout.prototype.onDocumentKeydown = function(ev) { + if (ev.key === 'Escape') { + this.hide(); + } + } + + // FLYOUT PLUGIN DEFINITION + // ============================ + + Flyout.DEFAULTS = { + flyoutWidth: 400, + flyoutToggle: null + } + + var old = $.fn.flyout + + $.fn.flyout = function (option) { + var args = Array.prototype.slice.call(arguments, 1), + result = undefined + + this.each(function () { + var $this = $(this) + var data = $this.data('oc.flyout') + var options = $.extend({}, Flyout.DEFAULTS, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('oc.flyout', (data = new Flyout(this, options))) + if (typeof option == 'string') result = data[option].apply(data, args) + if (typeof result != 'undefined') return false + }) + + return result ? result : this + } + + $.fn.flyout.Constructor = Flyout + + // FLYOUT NO CONFLICT + // ================= + + $.fn.flyout.noConflict = function () { + $.fn.flyout = old + return this + } + + // FLYOUT DATA-API + // =============== + + // Currently flyouts don't use the document render event + // and can't be created dynamically (performance considerations). + $(document).ready(function(){ + $('div[data-control=flyout]').flyout() + }) +}(window.jQuery); \ No newline at end of file diff --git a/modules/backend/assets/js/winter.js b/modules/backend/assets/js/winter.js new file mode 100644 index 0000000..f05a4bc --- /dev/null +++ b/modules/backend/assets/js/winter.js @@ -0,0 +1,35 @@ +/* + * This is a bundle file, you can compile this by running + * + * php artisan winter:util compile assets + * + * @see winter-min.js + * + +=require vendor/jquery.touchwipe.js +=require vendor/jquery.autoellipsis.js +=require vendor/jquery.waterfall.js +=require vendor/jquery.cookie.js +=require ../vendor/dropzone/dropzone.js +=require ../vendor/sweet-alert/sweet-alert.js +=require ../vendor/jcrop/js/jquery.Jcrop.js +=require ../../../system/assets/vendor/prettify/prettify.js +=require ../../widgets/mediamanager/assets/js/mediamanager-global.js + +=require winter.lang.js +=require winter.alert.js +=require winter.scrollpad.js +=require winter.verticalmenu.js +=require winter.navbar.js +=require winter.sidenav.js +=require winter.scrollbar.js +=require winter.filelist.js +=require winter.layout.js +=require winter.sidepaneltab.js +=require winter.simplelist.js +=require winter.treelist.js +=require winter.sidenav-tree.js +=require winter.datetime.js + +=require backend.js +*/ diff --git a/modules/backend/assets/js/winter.lang.js b/modules/backend/assets/js/winter.lang.js new file mode 100644 index 0000000..cefd146 --- /dev/null +++ b/modules/backend/assets/js/winter.lang.js @@ -0,0 +1,52 @@ +/* + * Client side translations + */ + +if ($.wn === undefined) + $.wn = {} +if ($.oc === undefined) + $.oc = $.wn + +if ($.wn.langMessages === undefined) + $.wn.langMessages = {} + +$.wn.lang = (function(lang, messages) { + + lang.load = function(locale) { + if (messages[locale] === undefined) { + messages[locale] = {} + } + + lang.loadedMessages = messages[locale] + } + + lang.get = function(name, defaultValue) { + if (!name) return + + var result = lang.loadedMessages + + if (!defaultValue) defaultValue = name + + $.each(name.split('.'), function(index, value) { + if (result[value] === undefined) { + result = defaultValue + return false + } + + result = result[value] + }) + + return result + } + + if (lang.locale === undefined) { + lang.locale = $('html').attr('lang') || 'en' + } + + if (lang.loadedMessages === undefined) { + lang.load(lang.locale) + } + + return lang + +})($.wn.lang || {}, $.wn.langMessages); \ No newline at end of file diff --git a/modules/backend/assets/js/winter.layout.js b/modules/backend/assets/js/winter.layout.js new file mode 100644 index 0000000..d2276c7 --- /dev/null +++ b/modules/backend/assets/js/winter.layout.js @@ -0,0 +1,86 @@ +(function($){ + var WinterLayout = function() { + this.$accountMenuOverlay = null + } + + WinterLayout.prototype.setPageTitle = function(title) { + var $title = $('title') + + if (this.pageTitleTemplate === undefined) + this.pageTitleTemplate = $title.data('titleTemplate') + + $title.text(this.pageTitleTemplate.replace('%s', title)) + } + + WinterLayout.prototype.updateLayout = function(title) { + var $children, $el, fixedWidth, margin + + $('[data-calculate-width]').each(function(){ + $children = $(this).children() + + if ($children.length > 0) { + fixedWidth = 0 + + $children.each(function() { + $el = $(this) + margin = $el.data('oc.layoutMargin') + + if (margin === undefined) { + margin = parseInt($el.css('marginRight')) + parseInt($el.css('marginLeft')) + $el.data('oc.layoutMargin', margin) + } + fixedWidth += $el.get(0).offsetWidth + margin + }) + + $(this).width(fixedWidth) + $(this).trigger('oc.widthFixed') + } + }) + } + + WinterLayout.prototype.toggleAccountMenu = function(el) { + var self = this, + $el = $(el), + $parent = $(el).parent(), + $menu = $el.next() + + $el.tooltip('hide') + + if ($menu.hasClass('active')) { + self.$accountMenuOverlay.remove() + $parent.removeClass('highlight') + $menu.removeClass('active') + } + else { + self.$accountMenuOverlay = $('
').addClass('popover-overlay') + $(document.body).append(self.$accountMenuOverlay) + $parent.addClass('highlight') + $menu.addClass('active') + + self.$accountMenuOverlay.one('click', function(){ + self.$accountMenuOverlay.remove() + $menu.removeClass('active') + $parent.removeClass('highlight') + }) + } + } + + if ($.wn === undefined) + $.wn = {} + if ($.oc === undefined) + $.oc = $.wn + + $.wn.layout = new WinterLayout() + + $(document).ready(function(){ + $.wn.layout.updateLayout() + + window.setTimeout($.wn.layout.updateLayout, 100) + }) + $(window).on('resize', function() { + $.wn.layout.updateLayout() + }) + $(window).on('oc.updateUi', function() { + $.wn.layout.updateLayout() + }) +})(jQuery); \ No newline at end of file diff --git a/modules/backend/assets/js/winter.navbar.js b/modules/backend/assets/js/winter.navbar.js new file mode 100644 index 0000000..37c1cde --- /dev/null +++ b/modules/backend/assets/js/winter.navbar.js @@ -0,0 +1,41 @@ +/* + * Top navigation bar. Features of the bar: + * - Hide content if the display width is less than 768px. In this case the menu icon is displayed. + * When the icon is clicked, the menu content is displayed on the left side of the page. + * - If the content doesn't fit the navbar, it can be dragged left and right. + * + * Dependences: + * - DragScroll (winter.dragscroll.js) + * - VerticalMenu (winter.verticalmenu.js) + */ + +(function($){ + $(document).ready(function(){ + $('nav.navbar').each(function(){ + var + navbar = $(this), + nav = $('ul.nav', navbar), + collapseMode = navbar.hasClass('navbar-mode-collapse'), + isMobile = $('html').hasClass('mobile') + + nav.verticalMenu($('a.menu-toggle', navbar), { + breakpoint: collapseMode ? Infinity : 769 + }) + + $('li.with-tooltip:not(.active) > a', navbar).tooltip({ + container: 'body', + placement: 'bottom', + template: '' + }) + .on('show.bs.tooltip', function (e) { + if (isMobile) e.preventDefault() + }) + + // Scroll to the currently active nav item. + var dragScroll = $('[data-control=toolbar]', navbar).data('oc.dragScroll') + if (dragScroll) { + dragScroll.goToElement($('ul.nav > li.active', navbar), undefined, {'duration': 0}) + } + }) + }) +})(jQuery); diff --git a/modules/backend/assets/js/winter.scrollbar.js b/modules/backend/assets/js/winter.scrollbar.js new file mode 100644 index 0000000..39b6e11 --- /dev/null +++ b/modules/backend/assets/js/winter.scrollbar.js @@ -0,0 +1,409 @@ +/* + * Creates a scrollbar in a container. + * + * Note the element must have a height set for vertical, + * and a width set for horizontal. + * + * Data attributes: + * - data-control="scrollbar" - enables the scrollbar plugin + * + * JavaScript API: + * $('#area').scrollbar() + * + * Dependences: + * - Mouse Wheel plugin (mousewheel.js) + */ ++function ($) { "use strict"; + var Base = $.wn.foundation.base, + BaseProto = Base.prototype + + var Scrollbar = function (element, options) { + + var + $el = this.$el = $(element), + el = $el.get(0), + self = this, + options = this.options = options || {}, + sizeName = this.sizeName = options.vertical ? 'height' : 'width', + isNative = $('html').hasClass('mobile'), + isTouch = this.isTouch = Modernizr.touchevents, + isScrollable = this.isScrollable = false, + isLocked = this.isLocked = false, + eventElementName = options.vertical ? 'pageY' : 'pageX', + dragStart = 0, + startOffset = 0; + + $.wn.foundation.controlUtils.markDisposable(element) + + Base.call(this) + + this.$el.one('dispose-control', this.proxy(this.dispose)) + + /* + * Native (mobile) environments use overflow auto in CSS + */ + if (isNative) { + return + } + + /* + * Create Scrollbar + */ + this.$scrollbar = $('
').addClass('scrollbar-scrollbar') + this.$track = $('
').addClass('scrollbar-track').appendTo(this.$scrollbar) + this.$thumb = $('
').addClass('scrollbar-thumb').appendTo(this.$track) + + $el + .addClass('drag-scrollbar') + .addClass(options.vertical ? 'vertical' : 'horizontal') + .prepend(this.$scrollbar) + + /* + * Bind events + */ + if (isTouch) { + this.$el.on('touchstart', function (event){ + var touchEvent = event.originalEvent; + if (touchEvent.touches.length == 1) { + startDrag(touchEvent.touches[0]) + event.stopPropagation() + } + }) + } + else { + this.$thumb.on('mousedown', function (event){ + startDrag(event) + }) + this.$track.on('mouseup', function (event){ + moveDrag(event) + }) + } + + $el.mousewheel(function (event){ + var offset = self.options.vertical + ? ((event.deltaFactor * event.deltaY) * -1) + : (event.deltaFactor * event.deltaX) + + return !scrollWheel(offset * self.options.scrollSpeed) + }) + + $el.on('oc.scrollbar.gotoStart', function(event){ + self.options.vertical + ? $el.scrollTop(0) + : $el.scrollLeft(0) + + self.update() + event.stopPropagation() + }) + + $(window).on('resize', $.proxy(this.update, this)) + $(window).on('oc.updateUi', $.proxy(this.update, this)) + + /* + * Internal event, drag has started + */ + function startDrag(event) { + $('body').addClass('drag-noselect') + $el.trigger('oc.scrollStart') + + dragStart = event[eventElementName] + startOffset = self.options.vertical ? $el.scrollTop() : $el.scrollLeft() + + if (isTouch) { + $(window).on('touchmove.scrollbar', function(event) { + var touchEvent = event.originalEvent + if (moveDrag(touchEvent.touches[0])) + event.preventDefault(); + }); + + $el.on('touchend.scrollbar', stopDrag) + } + else { + $(window).on('mousemove.scrollbar', function(event){ + moveDrag(event) + return false + }) + + $(window).on('mouseup.scrollbar', function(){ + stopDrag() + return false + }) + } + } + + /* + * Internal event, drag is active + */ + function moveDrag(event) { + self.isLocked = true; + + var + offset, + dragTo = event[eventElementName] + + // Touch devices use an inverse scrolling interface + // with a 1:1 ratio + if (self.isTouch) { + offset = dragStart - dragTo + } + // Mouse devices use a natural scrolling interface + // with a track:canvas ratio + else { + var ratio = self.getCanvasSize() / self.getViewportSize() + offset = (dragTo - dragStart) * ratio + } + + self.options.vertical + ? $el.scrollTop(startOffset + offset) + : $el.scrollLeft(startOffset + offset) + + self.setThumbPosition() + + return self.options.vertical + ? el.scrollTop != startOffset + : el.scrollLeft != startOffset + } + + /* + * Internal event, drag has ended + */ + function stopDrag() { + $('body').removeClass('drag-noselect') + $el.trigger('oc.scrollEnd') + + $(window).off('.scrollbar') + } + + /* + * Scroll wheel has moved by supplied offset + */ + + var isWebkit = $(document.documentElement).hasClass('webkit') + + function scrollWheel(offset) { + startOffset = self.options.vertical ? el.scrollTop : el.scrollLeft + $el.trigger('oc.scrollStart') + + self.options.vertical + ? $el.scrollTop(startOffset + offset) + : $el.scrollLeft(startOffset + offset) + + var scrolled = self.options.vertical + ? el.scrollTop != startOffset + : el.scrollLeft != startOffset + + self.setThumbPosition() + if (!isWebkit) { + if (self.endScrollTimeout !== undefined) { + clearTimeout(self.endScrollTimeout) + self.endScrollTimeout = undefined + } + + self.endScrollTimeout = setTimeout(function() { + $el.trigger('oc.scrollEnd') + self.endScrollTimeout = undefined + }, 50) + } else { + $el.trigger('oc.scrollEnd') + } + + return scrolled + } + + /* + * Give the DOM a second, then set the track and thumb size + */ + setTimeout(function() { self.update() }, 1); + } + + Scrollbar.prototype = Object.create(BaseProto) + Scrollbar.prototype.constructor = Scrollbar + + Scrollbar.prototype.dispose = function() { + this.unregisterHandlers() + + BaseProto.dispose.call(this) + } + + Scrollbar.prototype.unregisterHandlers = function() { + + } + + Scrollbar.DEFAULTS = { + vertical: true, + scrollSpeed: 2, + animation: true, + start: function() {}, + drag: function() {}, + stop: function() {} + } + + Scrollbar.prototype.update = function() { + if (!this.$scrollbar) + return + + this.$scrollbar.hide() + this.setThumbSize() + this.setThumbPosition() + this.$scrollbar.show() + } + + Scrollbar.prototype.setThumbSize = function() { + var properties = this.calculateProperties() + + this.isScrollable = !(properties.thumbSizeRatio >= 1); + this.$scrollbar.toggleClass('disabled', !this.isScrollable) + + if (this.options.vertical) { + this.$track.height(properties.canvasSize) + this.$thumb.height(properties.thumbSize) + } + else { + this.$track.width(properties.canvasSize) + this.$thumb.width(properties.thumbSize) + } + } + + Scrollbar.prototype.setThumbPosition = function() { + var properties = this.calculateProperties() + + if (this.options.vertical) + this.$thumb.css({top: properties.thumbPosition}) + else + this.$thumb.css({left: properties.thumbPosition}) + } + + Scrollbar.prototype.calculateProperties = function() { + + var $el = this.$el, + properties = {}; + + properties.viewportSize = this.getViewportSize() + properties.canvasSize = this.getCanvasSize() + properties.scrollAmount = (this.options.vertical) ? $el.scrollTop() : $el.scrollLeft() + + properties.thumbSizeRatio = properties.viewportSize / properties.canvasSize + properties.thumbSize = properties.viewportSize * properties.thumbSizeRatio + + properties.thumbPositionRatio = properties.scrollAmount / (properties.canvasSize - properties.viewportSize) + properties.thumbPosition = ((properties.viewportSize - properties.thumbSize) * properties.thumbPositionRatio) + properties.scrollAmount + + if (isNaN(properties.thumbPosition)) + properties.thumbPosition = 0 + + return properties; + } + + Scrollbar.prototype.getViewportSize = function() { + return (this.options.vertical) + ? this.$el.height() + : this.$el.width(); + } + + Scrollbar.prototype.getCanvasSize = function() { + return (this.options.vertical) + ? this.$el.get(0).scrollHeight + : this.$el.get(0).scrollWidth; + } + + Scrollbar.prototype.gotoElement = function(element, callback) { + var $el = $(element) + if (!$el.length) + return; + + var self = this, + offset = 0, + animated = false, + params = { + duration: 300, + queue: false, + complete: function(){ + if (callback !== undefined) + callback() + } + } + + if (!this.options.vertical) { + offset = $el.get(0).offsetLeft - this.$el.scrollLeft() + + if (offset < 0) { + this.$el.animate({'scrollLeft': $el.get(0).offsetLeft}, params) + animated = true + } else { + offset = $el.get(0).offsetLeft + $el.outerWidth() - (this.$el.scrollLeft() + this.$el.outerWidth()) + if (offset > 0) { + this.$el.animate({'scrollLeft': $el.get(0).offsetLeft + $el.outerWidth() - this.$el.outerWidth()}, params) + animated = true + } + } + } else { + offset = $el.get(0).offsetTop - this.$el.scrollTop() + + if (this.options.animation) { + if (offset < 0) { + this.$el.animate({'scrollTop': $el.get(0).offsetTop}, params) + animated = true + } else { + offset = $el.get(0).offsetTop - (this.$el.scrollTop() + this.$el.outerHeight()) + if (offset > 0) { + this.$el.animate({'scrollTop': $el.get(0).offsetTop + $el.outerHeight() - this.$el.outerHeight()}, params) + animated = true + } + } + } else { + if (offset < 0) { + this.$el.scrollTop($el.get(0).offsetTop) + } else { + offset = $el.get(0).offsetTop - (this.$el.scrollTop() + this.$el.outerHeight()) + if (offset > 0) + this.$el.scrollTop($el.get(0).offsetTop + $el.outerHeight() - this.$el.outerHeight()) + } + } + } + + if (!animated && callback !== undefined) + callback() + + return this + } + + Scrollbar.prototype.dispose = function() { + this.$el = null + this.$scrollbar = null + this.$track = null + this.$thumb = null + } + + // SCROLLBAR PLUGIN DEFINITION + // ============================ + + var old = $.fn.scrollbar + + $.fn.scrollbar = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('oc.scrollbar') + var options = $.extend({}, Scrollbar.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('oc.scrollbar', (data = new Scrollbar(this, options))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.scrollbar.Constructor = Scrollbar + + // SCROLLBAR NO CONFLICT + // ================= + + $.fn.scrollbar.noConflict = function () { + $.fn.scrollbar = old + return this + } + + // SCROLLBAR DATA-API + // =============== + $(document).render(function(){ + $('[data-control=scrollbar]').scrollbar() + }) + +}(window.jQuery); \ No newline at end of file diff --git a/modules/backend/assets/js/winter.scrollpad.js b/modules/backend/assets/js/winter.scrollpad.js new file mode 100644 index 0000000..3935f24 --- /dev/null +++ b/modules/backend/assets/js/winter.scrollpad.js @@ -0,0 +1,310 @@ +/* + * ScrollPad plugin. + * + * This plugin creates a scrollable area with features similar (but more limited) + * to winter.scrollbar.js, with virtual scroll bars. This plugin is more lightweight + * in terms of calculations and more responsive. It doesn't use scripting for scrolling, + * instead it uses the native scrolling and listens for the onscroll event to update + * the virtual scroll bars. + * + * The plugin is partially based on Trackpad Scroll Emulator + * https://github.com/jnicol/trackpad-scroll-emulator, cleaned up for the better CPU and + * memory (DOM references) management. + * + * Expected markup: + *
+ *
+ *
+ * The content goes here. The two wrapping + * DIV elements are required. + *
+ *
+ *
+ * + * Data attributes: + * - data-control="scrollpad" - enables the plugin. + * - data-direction="vertical|horizontal" - sets the scrolling direction. + * + * JavaScript API: + * $('#area').scrollpad({direction: 'vertical'}) + * $('#area').scrollpad('dispose') + * $('#area').scrollpad('scrollToStart') + * + * TODO: In FireFox the control in the horizontal mode displays the native scrollbars, + * because negative margin-bottom in the scrollable element doesn't work for some reason. + * Try to align the scrollable element with absolute positioning (negative right and bottom) + * instead of negative margins. + * + */ ++function ($) { "use strict"; + + var Base = $.wn.foundation.base, + BaseProto = Base.prototype + + // SCROLLPAD CLASS DEFINITION + // ============================ + + var Scrollpad = function(element, options) { + this.$el = $(element) + this.scrollbarElement = null + this.dragHandleElement = null + this.scrollContentElement = null + this.contentElement = null + this.options = options + this.scrollbarSize = null + this.updateScrollbarTimer = null + this.dragOffset = null + + Base.call(this) + + // + // Initialization + // + + this.init() + + $.wn.foundation.controlUtils.markDisposable(element) + } + + Scrollpad.prototype = Object.create(BaseProto) + Scrollpad.prototype.constructor = Scrollpad + + Scrollpad.prototype.dispose = function() { + this.unregisterHandlers() + + this.$el.get(0).removeChild(this.scrollbarElement) + this.$el.removeData('oc.scrollpad') + this.$el = null + + this.scrollbarElement = null + this.dragHandleElement = null + this.scrollContentElement = null + this.contentElement = null + + BaseProto.dispose.call(this) + } + + Scrollpad.prototype.scrollToStart = function() { + var scrollAttr = this.options.direction == 'vertical' ? 'scrollTop' : 'scrollLeft' + this.scrollContentElement[scrollAttr] = 0 + } + + Scrollpad.prototype.update = function() { + this.updateScrollbarSize() + } + + // SCROLLPAD INTERNAL METHODS + // ============================ + + Scrollpad.prototype.init = function() { + this.build() + this.setScrollContentSize() + this.registerHandlers() + } + + Scrollpad.prototype.build = function() { + var el = this.$el.get(0) + + this.scrollContentElement = el.children[0] + this.contentElement = this.scrollContentElement.children[0] + this.$el.prepend('
') + this.scrollbarElement = el.querySelector('.scrollpad-scrollbar') + this.dragHandleElement = el.querySelector('.scrollpad-scrollbar > .drag-handle') + } + + Scrollpad.prototype.registerHandlers = function() { + this.$el.on('mouseenter', this.proxy(this.onMouseEnter)) + this.$el.on('mouseleave', this.proxy(this.onMouseLeave)) + + this.$el.one('dispose-control', this.proxy(this.dispose)) + + this.scrollContentElement.addEventListener('scroll', this.proxy(this.onScroll)) + this.dragHandleElement.addEventListener('mousedown', this.proxy(this.onStartDrag)) + } + + Scrollpad.prototype.unregisterHandlers = function() { + this.$el.off('mouseenter', this.proxy(this.onMouseEnter)) + this.$el.off('mouseleave', this.proxy(this.onMouseLeave)) + this.$el.off('dispose-control', this.proxy(this.dispose)) + this.scrollContentElement.removeEventListener('scroll', this.proxy(this.onScroll)) + this.dragHandleElement.removeEventListener('mousedown', this.proxy(this.onStartDrag)) + + document.removeEventListener('mousemove', this.proxy(this.onMouseMove)) + document.removeEventListener('mouseup', this.proxy(this.onEndDrag)) + } + + Scrollpad.prototype.setScrollContentSize = function() { + var scrollbarSize = this.getScrollbarSize() + + if (this.options.direction == 'vertical') + this.scrollContentElement.setAttribute('style', 'margin-right: -' + scrollbarSize + 'px') + else + this.scrollContentElement.setAttribute('style', 'margin-bottom: -' + scrollbarSize + 'px') + } + + Scrollpad.prototype.getScrollbarSize = function() { + if (this.scrollbarSize !== null) + return this.scrollbarSize + + var testerElement = document.createElement('div') + testerElement.setAttribute('class', 'scrollpad-scrollbar-size-tester') + testerElement.appendChild(document.createElement('div')) + + document.body.appendChild(testerElement) + + var width = testerElement.offsetWidth, + innerWidth = testerElement.querySelector('div').offsetWidth + + document.body.removeChild(testerElement) + + // Some magic for FireFox, see + // https://github.com/jnicol/trackpad-scroll-emulator/blob/master/jquery.trackpad-scroll-emulator.js + if (width === innerWidth && navigator.userAgent.toLowerCase().indexOf('firefox') > -1) + return this.scrollbarSize = 17 + + return this.scrollbarSize = width - innerWidth + } + + Scrollpad.prototype.updateScrollbarSize = function() { + this.scrollbarElement.removeAttribute('data-hidden') + + var contentSize = this.options.direction == 'vertical' ? this.contentElement.scrollHeight : this.contentElement.scrollWidth, + scrollOffset = this.options.direction == 'vertical' ? this.scrollContentElement.scrollTop : this.scrollContentElement.scrollLeft, + scrollbarSize = this.options.direction == 'vertical' ? this.scrollbarElement.offsetHeight : this.scrollbarElement.offsetWidth, + scrollbarRatio = scrollbarSize / contentSize, + handleOffset = Math.round(scrollbarRatio * scrollOffset) + 2, + handleSize = Math.floor(scrollbarRatio * (scrollbarSize - 2)) - 2; + + if (scrollbarSize < contentSize) { + if (this.options.direction == 'vertical') + this.dragHandleElement.setAttribute('style', 'top: ' + handleOffset + 'px; height: ' + handleSize + 'px') + else + this.dragHandleElement.setAttribute('style', 'left: ' + handleOffset + 'px; width: ' + handleSize + 'px') + + this.scrollbarElement.removeAttribute('data-hidden') + } + else + this.scrollbarElement.setAttribute('data-hidden', true) + } + + Scrollpad.prototype.displayScrollbar = function() { + this.clearUpdateScrollbarTimer() + + this.updateScrollbarSize() + this.scrollbarElement.setAttribute('data-visible', 'true') + } + + Scrollpad.prototype.hideScrollbar = function() { + this.scrollbarElement.removeAttribute('data-visible') + } + + Scrollpad.prototype.clearUpdateScrollbarTimer = function() { + if (this.updateScrollbarTimer === null) + return + + clearTimeout(this.updateScrollbarTimer) + this.updateScrollbarTimer = null + } + + // EVENT HANDLERS + // ============================ + + Scrollpad.prototype.onMouseEnter = function() { + this.displayScrollbar() + } + + Scrollpad.prototype.onMouseLeave = function() { + this.hideScrollbar() + } + + Scrollpad.prototype.onScroll = function() { + if (this.updateScrollbarTimer !== null) + return + + this.updateScrollbarTimer = setTimeout(this.proxy(this.displayScrollbar), 10) + } + + Scrollpad.prototype.onStartDrag = function(ev) { + $.wn.foundation.event.stop(ev) + + var pageCoords = $.wn.foundation.event.pageCoordinates(ev), + eventOffset = this.options.direction == 'vertical' ? pageCoords.y : pageCoords.x, + handleCoords = $.wn.foundation.element.absolutePosition(this.dragHandleElement), + handleOffset = this.options.direction == 'vertical' ? handleCoords.top : handleCoords.left + + this.dragOffset = eventOffset - handleOffset + + document.addEventListener('mousemove', this.proxy(this.onMouseMove)) + document.addEventListener('mouseup', this.proxy(this.onEndDrag)) + } + + Scrollpad.prototype.onMouseMove = function(ev) { + $.wn.foundation.event.stop(ev) + + var eventCoordsAttr = this.options.direction == 'vertical' ? 'y' : 'x', + elementCoordsAttr = this.options.direction == 'vertical' ? 'top' : 'left', + offsetAttr = this.options.direction == 'vertical' ? 'offsetHeight' : 'offsetWidth', + scrollAttr = this.options.direction == 'vertical' ? 'scrollTop' : 'scrollLeft' + + var eventOffset = $.wn.foundation.event.pageCoordinates(ev)[eventCoordsAttr], + scrollbarOffset = $.wn.foundation.element.absolutePosition(this.scrollbarElement)[elementCoordsAttr], + dragPos = eventOffset - scrollbarOffset - this.dragOffset, + scrollbarSize = this.scrollbarElement[offsetAttr], + contentSize = this.contentElement[offsetAttr], + dragPerc = dragPos / scrollbarSize + + if (dragPerc > 1) + dragPerc = 1 + + var scrollPos = dragPerc * contentSize; + + this.scrollContentElement[scrollAttr] = scrollPos + } + + Scrollpad.prototype.onEndDrag = function(ev) { + document.removeEventListener('mousemove', this.proxy(this.onMouseMove)) + document.removeEventListener('mouseup', this.proxy(this.onEndDrag)) + } + + // SCROLLPAD PLUGIN DEFINITION + // ============================ + + Scrollpad.DEFAULTS = { + direction: 'vertical' + } + + var old = $.fn.scrollpad + + $.fn.scrollpad = function (option) { + var args = Array.prototype.slice.call(arguments, 1), + result = undefined + + this.each(function () { + var $this = $(this) + var data = $this.data('oc.scrollpad') + var options = $.extend({}, Scrollpad.DEFAULTS, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('oc.scrollpad', (data = new Scrollpad(this, options))) + if (typeof option == 'string') result = data[option].apply(data, args) + if (typeof result != 'undefined') return false + }) + + return result ? result : this + } + + $.fn.scrollpad.Constructor = Scrollpad + + // SCROLLPAD NO CONFLICT + // ================= + + $.fn.scrollpad.noConflict = function () { + $.fn.scrollpad = old + return this + } + + // SCROLLPAD DATA-API + // =============== + + $(document).on('render', function(){ + $('div[data-control=scrollpad]').scrollpad() + }) +}(window.jQuery); \ No newline at end of file diff --git a/modules/backend/assets/js/winter.sidenav-tree.js b/modules/backend/assets/js/winter.sidenav-tree.js new file mode 100644 index 0000000..4415486 --- /dev/null +++ b/modules/backend/assets/js/winter.sidenav-tree.js @@ -0,0 +1,268 @@ +/* + * Side navigation tree + * + * Data attributes: + * - data-control="sidenav-tree" - enables the plugin + * - data-tree-name - unique name of the tree control. The name is used for storing user configuration in the browser cookies. + * + * JavaScript API: + * $('#tree').sidenavTree() + * + * Dependences: + * - Null + */ + ++function ($) { "use strict"; + + // SIDENAVTREE CLASS DEFINITION + // ============================ + + var SidenavTree = function(element, options) { + this.options = options + this.$el = $(element) + + this.init() + } + + SidenavTree.DEFAULTS = { + treeName: 'sidenav_tree' + } + + SidenavTree.prototype.init = function (){ + var self = this + + $(document.body).addClass('has-sidenav-tree') + + this.statusCookieName = this.options.treeName + 'groupStatus' + this.searchCookieName = this.options.treeName + 'search' + this.$searchInput = $(this.options.searchInput) + + this.$el.on('click', 'li > div.group', function() { + self.toggleGroup($(this).closest('li')) + return false + }) + + this.$searchInput.on('input', function(){ + self.handleSearchChange() + }) + + var searchTerm = $.cookie(this.searchCookieName) + if (searchTerm !== undefined && searchTerm.length > 0) { + this.$searchInput.val(searchTerm) + this.applySearch() + } + + var scrollbar = $('[data-control=scrollbar]', this.$el).data('oc.scrollbar'), + active = $('li.active', this.$el) + + if (active.length > 0) { + scrollbar.gotoElement(active) + } + } + + SidenavTree.prototype.toggleGroup = function(group) { + var $group = $(group), + status = $group.attr('data-status') + + status === undefined || status == 'expanded' + ? this.collapseGroup($group) + : this.expandGroup($group) + } + + SidenavTree.prototype.collapseGroup = function(group) { + var + $list = $('> ul', group), + self = this + + $list.css('overflow', 'hidden') + $list.animate({ 'height': 0 }, { + duration: 100, + queue: false, + complete: function() { + $list.css({ + 'overflow': 'visible', + 'display': 'none' + }) + + $(group).attr('data-status', 'collapsed') + $(window).trigger('oc.updateUi') + self.saveGroupStatus($(group).data('group-code'), true) + } + }) + } + + SidenavTree.prototype.expandGroup = function(group, duration) { + var + $list = $('> ul', group), + self = this + + duration = duration === undefined ? 100 : duration + + $list.css({ + 'overflow': 'hidden', + 'height': 0 + }) + $list.animate({'height': $list[0].scrollHeight}, { duration: duration, queue: false, complete: function() { + $list.css({ + 'overflow': 'visible', + 'height': 'auto', + 'display': '' + }) + $(group).attr('data-status', 'expanded') + $(window).trigger('oc.updateUi') + self.saveGroupStatus($(group).data('group-code'), false) + } }) + } + + SidenavTree.prototype.saveGroupStatus = function(groupCode, collapsed) { + var collapsedGroups = $.cookie(this.statusCookieName), + updatedGroups = [] + + if (collapsedGroups === undefined) { + collapsedGroups = '' + } + + collapsedGroups = collapsedGroups.split('|') + $.each(collapsedGroups, function() { + if (groupCode != this) + updatedGroups.push(this) + }) + + if (collapsed) { + updatedGroups.push(groupCode) + } + + $.cookie(this.statusCookieName, updatedGroups.join('|'), { expires: 30, path: '/' }) + } + + SidenavTree.prototype.handleSearchChange = function() { + var lastValue = this.$searchInput.data('oc.lastvalue'); + + if (lastValue !== undefined && lastValue == this.$searchInput.val()) { + return + } + + this.$searchInput.data('oc.lastvalue', this.$searchInput.val()) + + if (this.dataTrackInputTimer !== undefined) { + window.clearTimeout(this.dataTrackInputTimer) + } + + var self = this + this.dataTrackInputTimer = window.setTimeout(function(){ + self.applySearch() + }, 300); + + $.cookie(this.searchCookieName, $.trim(this.$searchInput.val()), { expires: 30, path: '/' }) + } + + SidenavTree.prototype.applySearch = function() { + var query = $.trim(this.$searchInput.val()), + words = query.toLowerCase().split(' '), + visibleGroups = [], + visibleItems = [], + self = this + + if (query.length == 0) { + $('li', this.$el).removeClass('hidden') + + return + } + + /* + * Find visible groups and items + */ + $('ul.top-level > li', this.$el).each(function() { + var $li = $(this) + + if (self.textContainsWords($('div.group h3', $li).text(), words)) { + visibleGroups.push($li.get(0)) + + $('ul li', $li).each(function(){ + visibleItems.push(this) + }) + } + else { + $('ul li', $li).each(function(){ + if (self.textContainsWords($(this).text(), words) || self.textContainsWords($(this).data('keywords'), words)) { + visibleGroups.push($li.get(0)) + visibleItems.push(this) + } + }) + } + }) + + /* + * Hide invisible groups and items + */ + $('ul.top-level > li', this.$el).each(function() { + var $li = $(this), + groupIsVisible = $.inArray(this, visibleGroups) !== -1 + + $li.toggleClass('hidden', !groupIsVisible) + if (groupIsVisible) + self.expandGroup($li, 0) + + $('ul li', $li).each(function(){ + var $itemLi = $(this) + + $itemLi.toggleClass('hidden', $.inArray(this, visibleItems) == -1) + }) + }) + + return false + } + + SidenavTree.prototype.textContainsWords = function(text, words) { + text = text.toLowerCase() + + for (var i = 0; i < words.length; i++) { + if (text.indexOf(words[i]) === -1) + return false + } + + return true + } + + // SIDENAVTREE PLUGIN DEFINITION + // ============================ + + var old = $.fn.sidenavTree + + $.fn.sidenavTree = function (option) { + var args = arguments; + + return this.each(function () { + var $this = $(this) + var data = $this.data('oc.sidenavTree') + var options = $.extend({}, SidenavTree.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('oc.sidenavTree', (data = new SidenavTree(this, options))) + if (typeof option == 'string') { + var methodArgs = []; + for (var i=1; i') + + this.$fixButton.click(function() { + self.fixPanel() + return false + }) + $('.fix-button-container', this.$el).append(this.$fixButton) + + this.$sideNavItems.click(function() { + if ($(this).data('no-side-panel')) { + return + } + + if (Modernizr.touchevents && $(window).width() < self.options.breakpoint) { + if ($(this).data('menu-item') == self.visibleItemId && self.panelVisible) { + self.hideSidePanel() + return + } + else { + self.displaySidePanel() + } + } + + self.displayTab(this) + + return false + }) + + if (!Modernizr.touchevents) { + // The side panel now opens only when a menu item is hovered and + // when the item doesn't have the "data-no-side-panel" attribute. + // TODO: remove the comment and the code below if no issues noticed. + // self.$sideNav.mouseenter(function() { + // if ($(window).width() < self.options.breakpoint || !self.panelFixed()) { + // self.panelOpenTimeout = setTimeout(function() { + // self.displaySidePanel() + // }, self.tabOpenDelay) + // } + // }) + + self.$sideNav.mouseleave(function() { + clearTimeout(self.panelOpenTimeout) + }) + + self.$el.mouseleave(function() { + self.hideSidePanel() + }) + + self.$sideNavItems.mouseenter(function() { + if ($(window).width() < self.options.breakpoint || !self.panelFixed()) { + if ($(this).data('no-side-panel')) { + self.hideSidePanel() + return + } + + var _this = this + self.tabOpenTimeout = setTimeout(function() { + self.displaySidePanel() + self.displayTab(_this) + }, self.tabOpenDelay) + } + }) + + self.$sideNavItems.mouseleave(function() { + clearTimeout(self.tabOpenTimeout) + }) + + $(window).resize(function() { + self.updatePanelPosition() + self.updateActiveTab() + }) + } + else { + $('#layout-body').click(function() { + if (self.panelVisible) { + self.hideSidePanel() + return false + } + }) + + self.$el.on('close.oc.sidePanel', function() { + self.hideSidePanel() + }) + } + + this.updateActiveTab() + } + + SidePanelTab.prototype.displayTab = function(menuItem) { + var menuItemId = $(menuItem).data('menu-item') + + this.visibleItemId = menuItemId + + if ($.wn.sideNav !== undefined) { + $.wn.sideNav.setActiveItem(menuItemId) + } + + this.$sidePanelItems.each(function() { + var $el = $(this) + $el.toggleClass('hide', $el.data('content-id') != menuItemId) + }) + + $(window).trigger('resize') + } + + SidePanelTab.prototype.displaySidePanel = function() { + $(document.body).addClass('display-side-panel') + + this.$el.appendTo('#layout-canvas') + this.panelVisible = true + this.$el.css({ + left: this.sideNavWidth, + top: this.mainNavHeight + }) + + this.updatePanelPosition() + $(window).trigger('resize') + } + + SidePanelTab.prototype.hideSidePanel = function() { + $(document.body).removeClass('display-side-panel') + if (this.$el.next('#layout-body').length == 0) { + $('#layout-body').before(this.$el) + } + + this.panelVisible = false + + this.updateActiveTab() + } + + SidePanelTab.prototype.updatePanelPosition = function() { + if (!this.panelFixed() || Modernizr.touchevents) { + this.$el.height($(document).height() - this.mainNavHeight) + } + else { + this.$el.css('height', '') + } + + if (this.panelVisible && $(window).width() > this.options.breakpoint && this.panelFixed()) { + this.hideSidePanel() + } + } + + SidePanelTab.prototype.updateActiveTab = function() { + if ($.wn.sideNav === undefined) { + return + } + + if (!this.panelVisible && ($(window).width() < this.options.breakpoint || !this.panelFixed())) { + $.wn.sideNav.unsetActiveItem() + } + else { + $.wn.sideNav.setActiveItem(this.visibleItemId) + } + } + + SidePanelTab.prototype.panelFixed = function() { + return !($(window).width() < this.options.breakpoint) && + !$(document.body).hasClass('side-panel-not-fixed') + } + + SidePanelTab.prototype.fixPanel = function() { + $(document.body).toggleClass('side-panel-not-fixed') + + var self = this + + window.setTimeout(function() { + var fixed = self.panelFixed() + + if (fixed) { + self.updateActiveTab() + $(document.body).addClass('side-panel-fix-shadow') + } else { + $(document.body).removeClass('side-panel-fix-shadow') + self.hideSidePanel() + } + + if (typeof(localStorage) !== 'undefined') + localStorage.ocSidePanelFixed = fixed ? 1 : 0 + }, 0) + } + + SidePanelTab.DEFAULTS = { + breakpoint: 769 + } + + // PLUGIN DEFINITION + // ============================ + + var old = $.fn.sidePanelTab + + $.fn.sidePanelTab = function (option) { + return this.each(function() { + var $this = $(this) + var data = $this.data('oc.sidePanelTab') + var options = $.extend({}, SidePanelTab.DEFAULTS, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('oc.sidePanelTab', (data = new SidePanelTab(this, options))) + if (typeof option == 'string') data[option].call(data) + }) + } + + $.fn.sidePanelTab.Constructor = SidePanelTab + + // NO CONFLICT + // ================= + + $.fn.sidePanelTab.noConflict = function() { + $.fn.sidePanelTab = old + return this + } + + // DATA-API + // ============ + + $(document).ready(function(){ + $('[data-control=layout-sidepanel]').sidePanelTab() + }) + + // STORED PREFERENCES + // ==================== + + $(document).ready(function() { + if (Modernizr.touchevents || (typeof(localStorage) !== 'undefined')) { + if (localStorage.ocSidePanelFixed == 0) { + $(document.body).addClass('side-panel-not-fixed') + $(window).trigger('resize') + } + else if (localStorage.ocSidePanelFixed == 1) { + $(document.body).removeClass('side-panel-not-fixed') + $(window).trigger('resize') + } + } + }) +}(window.jQuery); diff --git a/modules/backend/assets/js/winter.simplelist.js b/modules/backend/assets/js/winter.simplelist.js new file mode 100644 index 0000000..f1158c7 --- /dev/null +++ b/modules/backend/assets/js/winter.simplelist.js @@ -0,0 +1,81 @@ +/* + * SimpleList control. + * + * Data attributes: + * - data-control="simplelist" - enables the simplelist plugin + * + * JavaScript API: + * $('#simplelist').simplelist() + * + * Dependences: + * - Sortable (jquery-sortable.js) + */ ++function ($) { "use strict"; + + var SimpleList = function (element, options) { + + var $el = this.$el = $(element) + + this.options = options || {} + + if ($el.hasClass('is-sortable')) { + + /* + * Make each list inside sortable + */ + var sortableOptions = { + distance: 10 + } + if (this.options.sortableHandle) + sortableOptions[handle] = this.options.sortableHandle + + $el.find('> ul, > ol').sortable(sortableOptions) + } + + if ($el.hasClass('is-scrollable')) { + + /* + * Inject a scrollbar container + */ + $el.wrapInner($('
').addClass('control-scrollbar')) + var $scrollbar = $el.find('>.control-scrollbar:first') + $scrollbar.scrollbar() + } + } + + SimpleList.DEFAULTS = { + sortableHandle: null + } + + // SIMPLE LIST PLUGIN DEFINITION + // ============================ + + var old = $.fn.simplelist + + $.fn.simplelist = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('oc.simplelist') + var options = $.extend({}, SimpleList.DEFAULTS, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('oc.simplelist', (data = new SimpleList(this, options))) + }) + } + + $.fn.simplelist.Constructor = SimpleList + + // SIMPLE LIST NO CONFLICT + // ================= + + $.fn.simplelist.noConflict = function () { + $.fn.simplelist = old + return this + } + + // SIMPLE LIST DATA-API + // =============== + + $(document).render(function(){ + $('[data-control="simplelist"]').simplelist() + }) + +}(window.jQuery); diff --git a/modules/backend/assets/js/winter.tabformexpandcontrols.js b/modules/backend/assets/js/winter.tabformexpandcontrols.js new file mode 100644 index 0000000..f1195f0 --- /dev/null +++ b/modules/backend/assets/js/winter.tabformexpandcontrols.js @@ -0,0 +1,163 @@ +/* + * Extends the fancy tabs layout with expand controls in the tab + * form sections. See main Builder page for example. + * TODO: A similar layout is used in the CMS, Pages and Builder areas, + * but only Builder uses this class. + */ ++function ($) { "use strict"; + var Base = $.wn.foundation.base, + BaseProto = Base.prototype + + var TabFormExpandControls = function ($tabsControlElement, options) { + this.$tabsControlElement = $tabsControlElement + this.options = $.extend(TabFormExpandControls.DEFAULTS, typeof options == 'object' && options) + this.tabsControlId = null + + Base.call(this) + this.init() + } + + TabFormExpandControls.prototype = Object.create(BaseProto) + TabFormExpandControls.prototype.constructor = TabFormExpandControls + + TabFormExpandControls.prototype.init = function() { + this.tabsControlId = this.$tabsControlElement.attr('id') + + if (!this.tabsControlId) { + throw new Error('The tab controls element should have the id attribute value.') + } + + this.registerHandlers() + } + + TabFormExpandControls.prototype.dispose = function() { + this.unregisterHandlers() + + this.$tabsControlElement = null + + BaseProto.dispose.call(this) + } + + TabFormExpandControls.prototype.registerHandlers = function() { + this.$tabsControlElement.on('initTab.oc.tab', this.proxy(this.initTab)) + this.$tabsControlElement.on('click', '[data-control="tabless-collapse-icon"]', this.proxy(this.tablessCollapseClicked)) + this.$tabsControlElement.on('click', '[data-control="primary-collapse-icon"]', this.proxy(this.primaryCollapseClicked)) + } + + TabFormExpandControls.prototype.unregisterHandlers = function() { + this.$tabsControlElement.off('initTab.oc.tab', this.proxy(this.initTab)) + this.$tabsControlElement.off('click', '[data-control="tabless-collapse-icon"]', this.proxy(this.tablessCollapseClicked)) + this.$tabsControlElement.off('click', '[data-control="primary-collapse-icon"]', this.proxy(this.primaryCollapseClicked)) + } + + TabFormExpandControls.prototype.initTab = function(ev, data) { + if ($(ev.target).attr('id') != this.tabsControlId) + return + + var $primaryPanel = this.findPrimaryPanel(data.pane), + $panel = $('.form-tabless-fields', data.pane), + $secondaryPanel = this.findSecondaryPanel(data.pane), + hasSecondaryTabs = $secondaryPanel.length > 0 + + $secondaryPanel.addClass('secondary-content-tabs') + $panel.append(this.createTablessCollapseIcon()) + + if (!hasSecondaryTabs) { + $('.tab-pane', $primaryPanel).addClass('pane-compact') + } + + $('.nav-tabs', $primaryPanel).addClass('master-area') + + if ($primaryPanel.length > 0) { + $secondaryPanel.append(this.createPrimaryCollapseIcon()) + } else { + $secondaryPanel.addClass('primary-collapsed') + } + + if (!$('a', data.tab).hasClass('new-template') && this.getLocalStorageValue('tabless', 0) == 1) { + $panel.addClass('collapsed') + } + + if (this.getLocalStorageValue('primary', 0) == 1 && hasSecondaryTabs) { + $primaryPanel.addClass('collapsed') + $secondaryPanel.addClass('primary-collapsed') + } + + if (this.options.onInitTab) { + this.options.onInitTab($('form', data.pane)) + } + } + + TabFormExpandControls.prototype.tablessCollapseClicked = function(ev) { + var $panel = $(ev.target).closest('.form-tabless-fields') + + $panel.toggleClass('collapsed') + this.setLocalStorageValue('tabless', $panel.hasClass('collapsed') ? 1 : 0) + window.setTimeout(this.proxy(this.updateUi), 500) + + ev.stopPropagation() + return false + } + + TabFormExpandControls.prototype.primaryCollapseClicked = function(ev) { + var $pane = $(ev.target).closest('.tab-pane'), + $primaryPanel = this.findPrimaryPanel($pane), + $secondaryPanel = this.findSecondaryPanel($pane) + + $primaryPanel.toggleClass('collapsed') + $secondaryPanel.toggleClass('primary-collapsed') + + this.updateUi() + this.setLocalStorageValue('primary', $primaryPanel.hasClass('collapsed') ? 1 : 0) + + return false + } + + TabFormExpandControls.prototype.updateUi = function() { + $(window).trigger('oc.updateUi') + } + + TabFormExpandControls.prototype.createTablessCollapseIcon = function() { + return $('') + } + + TabFormExpandControls.prototype.createPrimaryCollapseIcon = function() { + return $('') + } + + TabFormExpandControls.prototype.generateStorageKey = function(section) { + return 'oc' + section + this.tabsControlId.replace('-', '') + 'collapsed' + } + + TabFormExpandControls.prototype.findPrimaryPanel = function(pane) { + return $(pane).find('.control-tabs.primary-tabs') + } + + TabFormExpandControls.prototype.findSecondaryPanel = function(pane) { + return $(pane).find('.control-tabs.secondary-tabs') + } + + TabFormExpandControls.prototype.getLocalStorageValue = function(section, defaultValue) { + var key = this.generateStorageKey(section) + + if (typeof(localStorage) !== 'undefined') { + return localStorage[key] + } + + return defaultValue + } + + TabFormExpandControls.prototype.setLocalStorageValue = function(section, value) { + var key = this.generateStorageKey(section) + + if (typeof(localStorage) !== 'undefined') { + localStorage[key] = value + } + } + + TabFormExpandControls.DEFAULTS = { + onInitTab: null + } + + $.wn.tabFormExpandControls = TabFormExpandControls +}(window.jQuery); \ No newline at end of file diff --git a/modules/backend/assets/js/winter.treelist.js b/modules/backend/assets/js/winter.treelist.js new file mode 100644 index 0000000..10290ac --- /dev/null +++ b/modules/backend/assets/js/winter.treelist.js @@ -0,0 +1,133 @@ +/* + * TreeList Widget + * + * Supported options: + * - handle - class name to use as a handle + * - nested - set to false if sorting should be kept within each OL container, if using + * a handle it should be focused enough to exclude nested handles. + * + * Events: + * - move.oc.treelist - triggered when a node on the tree is moved. + * + * Dependences: + * - Sortable Plugin (winter.sortable.js) + */ ++function ($) { "use strict"; + var Base = $.wn.foundation.base, + BaseProto = Base.prototype + + var TreeListWidget = function (element, options) { + this.$el = $(element) + this.options = options || {}; + + Base.call(this) + + $.wn.foundation.controlUtils.markDisposable(element) + this.init() + } + + TreeListWidget.prototype = Object.create(BaseProto) + TreeListWidget.prototype.constructor = TreeListWidget + + TreeListWidget.prototype.init = function() { + var sortableOptions = { + handle: this.options.handle, + nested: this.options.nested, + onDrop: this.proxy(this.onDrop), + afterMove: this.proxy(this.onAfterMove) + } + + this.$el.find('> ol').sortable($.extend(sortableOptions, this.options)) + + if (!this.options.nested) + this.$el.find('> ol ol').sortable($.extend(sortableOptions, this.options)) + + this.$el.one('dispose-control', this.proxy(this.dispose)) + } + + TreeListWidget.prototype.dispose = function() { + this.unbind() + BaseProto.dispose.call(this) + } + + TreeListWidget.prototype.unbind = function() { + this.$el.off('dispose-control', this.proxy(this.dispose)) + + this.$el.find('> ol').sortable('destroy') + + if (!this.options.nested) { + this.$el.find('> ol ol').sortable('destroy') + } + + this.$el.removeData('oc.treelist') + + this.$el = null + this.options = null + } + + TreeListWidget.DEFAULTS = { + handle: null, + nested: true + } + + // TREELIST EVENT HANDLERS + // ============================ + + TreeListWidget.prototype.onDrop = function($item, container, _super) { + // The event handler could be registered after the + // sortable is destroyed. This should be fixed later. + if (!this.$el) { + return + } + + this.$el.trigger('move.oc.treelist', { item: $item, container: container }) + _super($item, container) + } + + TreeListWidget.prototype.onAfterMove = function($placeholder, container, $closestEl) { + if (!this.$el) { + return + } + + this.$el.trigger('aftermove.oc.treelist', { placeholder: $placeholder, container: container, closestEl: $closestEl }) + } + + // TREELIST WIDGET PLUGIN DEFINITION + // ============================ + + var old = $.fn.treeListWidget + + $.fn.treeListWidget = function (option) { + var args = arguments, + result + + this.each(function () { + var $this = $(this) + var data = $this.data('oc.treelist') + var options = $.extend({}, TreeListWidget.DEFAULTS, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('oc.treelist', (data = new TreeListWidget(this, options))) + if (typeof option == 'string') result = data[option].call(data) + if (typeof result != 'undefined') return false + }) + + return result ? result : this + } + + $.fn.treeListWidget.Constructor = TreeListWidget + + // TREELIST WIDGET NO CONFLICT + // ================= + + $.fn.treeListWidget.noConflict = function () { + $.fn.treeListWidget = old + return this + } + + // TREELIST WIDGET DATA-API + // ============== + + $(document).render(function(){ + $('[data-control="treelist"]').treeListWidget(); + }) + +}(window.jQuery); \ No newline at end of file diff --git a/modules/backend/assets/js/winter.treeview.js b/modules/backend/assets/js/winter.treeview.js new file mode 100644 index 0000000..f2cef65 --- /dev/null +++ b/modules/backend/assets/js/winter.treeview.js @@ -0,0 +1,437 @@ +/* + * TreeView Widget. Represents a sortable and draggable tree view. This widget was first used in the Pages plugin, for the sidebar page tree. + * + * Data attributes: + * - data-group-status-handler - AJAX handler to execute when an item is collapsed or expanded by a user + * - data-reorder-handler - AJAX handler to execute when items are reordered + * + * Events + * - open.oc.treeview - this event is triggered on the list element when an item is clicked. + * + * Dependences: + * - Tree list (winter.treelist.js) + * + */ ++function ($) { "use strict"; + var Base = $.wn.foundation.base, + BaseProto = Base.prototype + + var TreeView = function (element, options) { + this.$el = $(element) + this.options = options + this.$allItems = null + this.$scrollbar = null + + Base.call(this) + + $.wn.foundation.controlUtils.markDisposable(element) + this.init() + } + + TreeView.prototype = Object.create(BaseProto) + TreeView.prototype.constructor = TreeView + + TreeView.prototype.init = function () { + this.$allItems = $('li', this.$el) + this.$scrollbar = this.$el.closest('[data-control=scrollbar]') + + /* + * Init the sortable + */ + + this.initSortable() + + /* + * Create expand/collapse icons and drag handles + */ + + this.createItemControls() + + /* + * Bind the click events + */ + + this.$el.on('click.treeview', 'li > div > ul.submenu li a', this.proxy(this.onOpenSubmenu)) + this.$el.on('click.treeview', 'li > div > a', this.proxy(this.onOpen)) + this.$el.on('click.treeview', 'li span.expand', this.proxy(this.onItemExpandClick)) + + /* + * Listen for the AJAX updates and dispose the widget + */ + + this.$el.one('dispose-control', this.proxy(this.dispose)) + + /* + * Mark previously active item, if it was set + */ + var dataId = this.$el.data('oc.active-item') + if (dataId !== undefined) { + this.markActive(dataId) + } + + this.$scrollbar.on('oc.scrollEnd', this.proxy(this.onScroll)) + } + + TreeView.prototype.dispose = function() { + this.unregisterHandlers() + this.clearScrollTimeout() + + this.options = null + this.$el.removeData('oc.treeView') + this.$el = null + this.$allItems = null + this.$scrollbar = null + + BaseProto.dispose.call(this) + } + + TreeView.prototype.unregisterHandlers = function() { + this.$scrollbar.off('oc.scrollEnd', this.proxy(this.onScroll)) + this.$el.off('.treeview') + this.$el.off('move.oc.treelist', this.proxy(this.onNodeMove)) + this.$el.off('aftermove.oc.treelist', this.proxy(this.onAfterNodeMove)) + this.$el.off('dispose-control', this.proxy(this.dispose)) + } + + TreeView.prototype.createItemControls = function() { + $('li', this.$el).each(function() { + var $container = $('> div', this), + $expand = $('> span.expand', $container) + + if ($expand.length > 0) + return + + $expand = $('Expand') + + $container.prepend($expand) + + if (!$('.drag-handle', $container).length) + $container.append($('Drag')) + + $container.append($('')) + + if ($(this).attr('data-no-drag-mode') !== undefined) + $('span.drag-handle', this).attr('title', 'Dragging is disabled when the Search is active') + }) + } + + TreeView.prototype.collapseGroup = function($group) { + var $subitems = $('> ol', $group) + + $subitems.css({ + 'overflow': 'hidden' + }) + + $subitems.animate({'height': 0}, { duration: 100, queue: false, complete: function() { + $subitems.css({ + 'overflow': 'visible', + 'display': 'none', + 'height' : 'auto' + }) + $group.attr('data-status', 'collapsed') + $(window).trigger('resize') + } }) + + this.sendGroupStatusRequest($group, 0) + } + + TreeView.prototype.expandGroup = function($group) { + var $subitems = $('> ol', $group) + + $subitems.css({ + 'overflow': 'hidden', + 'display': 'block', + 'height': 0 + }) + + $group.attr('data-status', 'expanded') + $subitems.animate({'height': $subitems[0].scrollHeight}, { duration: 100, queue: false, complete: function() { + $subitems.css({ + 'overflow': 'visible', + 'height': 'auto' + }) + $(window).trigger('resize') + } }) + + this.sendGroupStatusRequest($group, 1); + } + + TreeView.prototype.fixSubItems = function() { + $('li', this.$el).each(function(){ + var $li = $(this), + $subitems = $('> ol > li', $li) + $li.toggleClass('has-subitems', $subitems.length > 0) + }) + } + + TreeView.prototype.toggleGroup = function(group) { + var $group = $(group); + + $group.attr('data-status') == 'expanded' + ? this.collapseGroup($group) + : this.expandGroup($group) + } + + TreeView.prototype.sendGroupStatusRequest = function($group, status) { + if (this.options.groupStatusHandler !== undefined) { + var groupId = $group.data('group-id') + + $group.request(this.options.groupStatusHandler, {data: {group: groupId, status: status}}) + } + } + + TreeView.prototype.sendReorderRequest = function() { + if (this.options.reorderHandler === undefined) + return + + var groups = {} + + function iterator($container, node) { + $('> li', $container).each(function(){ + var subnodes = {} + iterator($('> ol', this), subnodes) + + node[$(this).data('groupId')] = subnodes + }) + } + + iterator($('> ol', this.$el), groups) + + this.$el.request(this.options.reorderHandler, {data: {structure: JSON.stringify(groups)}}) + } + + TreeView.prototype.initSortable = function() { + var $noDragItems = $('[data-no-drag-mode]', this.$el) + + if ($noDragItems.length > 0) + return + + if (this.$el.data('oc.treelist')) + this.$el.treeListWidget('unbind') + + this.$el.treeListWidget({ + tweakCursorAdjustment: this.proxy(this.tweakCursorAdjustment), + isValidTarget: this.proxy(this.isValidTarget), + useAnimation: false, + usePlaceholderClone: true, + handle: 'span.drag-handle', + onDrag: this.proxy(this.onDrag), + tolerance: -20 // Give 20px of carry between containers + }) + + this.$el.on('move.oc.treelist', this.proxy(this.onNodeMove)) + this.$el.on('aftermove.oc.treelist', this.proxy(this.onAfterNodeMove)) + } + + TreeView.prototype.markActive = function(dataId) { + $('li', this.$el).removeClass('active') + + if (dataId) + $('li[data-id="'+dataId+'"]', this.$el).addClass('active') + + this.$el.data('oc.active-item', dataId) + } + + // It seems the method is not used anymore as we re-create the control + // instead of updating it. Remove later if nothing weird is noticed. + // -ab Apr 26 2015 + // + TreeView.prototype.update = function() { + this.$allItems = $('li', this.$el) + this.createItemControls() + //this.initSortable() + + var dataId = this.$el.data('oc.active-item') + if (dataId !== undefined) { + this.markActive(dataId) + } + } + + TreeView.prototype.handleMovedNode = function() { + this.$el.trigger('change') + this.$allItems.removeClass('drop-target') + this.fixSubItems() + this.sendReorderRequest() + } + + TreeView.prototype.tweakCursorAdjustment = function(adjustment) { + if (!adjustment) { + return adjustment + } + + if (this.$scrollbar.length > 0) { + adjustment.top -= this.$scrollbar.scrollTop() + } + + return adjustment + } + + TreeView.prototype.isValidTarget = function($item, container) { + return $(container.el).closest('li').attr('data-status') != 'collapsed' + } + + TreeView.DEFAULTS = { + + } + + // TREEVIEW EVENT HANDLERS + // ============================ + + TreeView.prototype.onOpenSubmenu = function(ev) { + var e = $.Event('submenu.oc.treeview', {relatedTarget: ev.currentTarget, clickEvent: ev}) + this.$el.trigger(e, this) + + return false + } + + TreeView.prototype.onOpen = function(ev) { + var e = $.Event('open.oc.treeview', {relatedTarget: $(ev.currentTarget).closest('li').get(0), clickEvent: ev}) + this.$el.trigger(e, ev.currentTarget) + + return false + } + + TreeView.prototype.onNodeMove = function() { + setTimeout(this.proxy(this.handleMovedNode), 50) + } + + TreeView.prototype.onAfterNodeMove = function(ev, data) { + this.$allItems.removeClass('drop-target') + data.container.el.closest('li').addClass('drop-target') + } + + TreeView.prototype.onItemExpandClick = function(ev) { + this.toggleGroup($(ev.currentTarget).closest('li')) + return false + } + + // TREEVIEW SCROLL ON DRAG + // ============================ + + TreeView.prototype.onScroll = function () { + if (!$('body').hasClass('dragging')) { + return + } + + var changed = this.lastScrollPos - this.$scrollbar.scrollTop() + + this.$el.children('ol').each(function() { + var sortable = $(this).data('oc.sortable') + sortable.refresh() + sortable.cursorAdjustment.top += changed // Keep cursor adjustment in sync with scroll + }); + + this.dragCallback() + + this.lastScrollPos = this.$scrollbar.scrollTop() + } + + TreeView.prototype.onDrag = function ($item, position, _super, event) { + this.lastScrollPos = this.$scrollbar.scrollTop() + + this.dragCallback = function() { + _super($item, position, null, event) + }; + + this.clearScrollTimeout() + this.dragCallback() + + if (!this.$scrollbar || this.$scrollbar.length === 0) + return + + if (position.top < 0) { + this.scrollOffset = -10 + Math.floor(position.top / 5) + } + else if (position.top > this.$scrollbar.height()) { + this.scrollOffset = 10 + Math.ceil((position.top - this.$scrollbar.height()) / 5) + } + else { + return + } + + this.dragScroll() + } + + TreeView.prototype.scrollMax = function() { + return this.$el.height() - this.$scrollbar.height() + } + + TreeView.prototype.dragScroll = function() { + var startScrollTop = this.$scrollbar.scrollTop() + var changed + + this.scrollTimeout = null + + this.$scrollbar.scrollTop(Math.min(startScrollTop + this.scrollOffset, this.scrollMax())) + + changed = this.$scrollbar.scrollTop() - startScrollTop + if (changed === 0) { + return + } + + this.$el.children('ol').each(function() { + var sortable = $(this).data('oc.sortable') + sortable.refresh() + sortable.cursorAdjustment.top -= changed // Keep cursor adjustment in sync with scroll + }); + + this.dragCallback() + + this.$scrollbar.data('oc.scrollbar').setThumbPosition() // Update scrollbar position + + this.scrollTimeout = window.setTimeout(this.proxy(this.dragScroll), 100) + } + + TreeView.prototype.clearScrollTimeout = function() { + if (this.scrollTimeout) { + window.clearTimeout(this.scrollTimeout) + this.scrollTimeout = null + } + } + + // TREEVIEW PLUGIN DEFINITION + // ============================ + + var old = $.fn.treeView + + $.fn.treeView = function (option) { + var args = arguments + + return this.each(function () { + var $this = $(this) + var data = $this.data('oc.treeView') + var options = $.extend({}, TreeView.DEFAULTS, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('oc.treeView', (data = new TreeView(this, options))) + + if (typeof option == 'string' && data) { + var methodArgs = []; + for (var i=1; i
').appendTo('body').addClass(this.options.collapsedMenuClass).css('width', 0) + this.menuContainer = $('
').appendTo(this.menuPanel).css('display', 'none') + this.menuElement = this.$el.clone().appendTo(this.menuContainer).css('width', 'auto') + + var self = this + + /* + * Handle the menu toggle click + */ + this.toggle.click(function() { + if (!self.body.hasClass(self.options.bodyMenuOpenClass)) { + var wrapperWidth = self.wrapper.outerWidth() + + self.menuElement.dragScroll('goToStart') + + self.wrapper.css({ + 'position': 'absolute', + 'min-width': self.wrapper.width(), + 'height': '100%' + }) + self.body.addClass(self.options.bodyMenuOpenClass) + self.menuContainer.css('display', 'block') + + self.wrapper.animate({'left': self.options.menuWidth}, { duration: 200, queue: false }) + self.menuPanel.animate({'width': self.options.menuWidth}, { + duration: 200, + queue: false, + complete: function() { + self.menuElement.css('width', self.options.menuWidth) + } + }) + } + else { + closeMenu() + } + + return false + }) + + this.wrapper.click(function() { + if (self.body.hasClass(self.options.bodyMenuOpenClass)) { + closeMenu() + return false + } + }) + + /* + * Disable the menu if the window is wider than the breakpoint width + */ + $(window).resize(function() { + if (self.body.hasClass(self.options.bodyMenuOpenClass)) { + if ($(window).width() > self.breakpoint) { + hideMenu() + } + } + }) + + /* + * Make the menu draggable + */ + this.menuElement.dragScroll({ + vertical: true, + useNative: true, + start: function(){self.menuElement.addClass('drag')}, + stop: function(){self.menuElement.removeClass('drag')}, + scrollClassContainer: self.menuPanel, + scrollMarkerContainer: self.menuContainer + }) + + this.menuElement.on('click', function() { + // Do not handle menu item clicks while dragging + if (self.menuElement.hasClass('drag')) + return false + }) + + /* + * Internal event, completely hides the menu + */ + function hideMenu() { + self.body.removeClass(self.options.bodyMenuOpenClass) + self.wrapper.css({ + 'position': 'static', + 'min-width': 0, + 'right': 0, + 'height': '100%' + }) + self.menuPanel.css('width', 0) + self.menuElement.css('width', 'auto') + self.menuContainer.css('display', 'none') + } + + /* + * Internal event, smoothly collapses the menu + */ + function closeMenu() { + self.wrapper.animate({'left': 0}, { duration: 200, queue: false}) + self.menuPanel.animate({'width': 0}, { duration: 200, queue: false, complete: hideMenu }) + self.menuElement.animate({'width': 0}, { duration: 200, queue: false }) + } + } + + VerticalMenu.DEFAULTS = { + menuWidth: 230, + breakpoint: 769, + bodyMenuOpenClass: 'mainmenu-open', + collapsedMenuClass: 'mainmenu-collapsed', + contentWrapper: '#layout-canvas' + } + + // VERTICAL MENU PLUGIN DEFINITION + // ============================ + + var old = $.fn.verticalMenu + + $.fn.verticalMenu = function (toggleSelector, option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('oc.verticalMenu') + var options = typeof option == 'object' && option + + if (!data) $this.data('oc.verticalMenu', (data = new VerticalMenu(this, toggleSelector, options))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.verticalMenu.Constructor = VerticalMenu + + // VERTICAL MENU NO CONFLICT + // ================= + + $.fn.verticalMenu.noConflict = function () { + $.fn.verticalMenu = old + return this + } + +}(window.jQuery); diff --git a/modules/backend/assets/less/.gitignore b/modules/backend/assets/less/.gitignore new file mode 100644 index 0000000..2318862 --- /dev/null +++ b/modules/backend/assets/less/.gitignore @@ -0,0 +1 @@ +*.css \ No newline at end of file diff --git a/modules/backend/assets/less/controls/alert.less b/modules/backend/assets/less/controls/alert.less new file mode 100644 index 0000000..6143c46 --- /dev/null +++ b/modules/backend/assets/less/controls/alert.less @@ -0,0 +1,37 @@ +// +// Custom alerts (Based on Sweet Alert) +// -------------------------------------------------- + +.sweet-overlay { + background-color: @overlay-background; + z-index: @zindex-alert - 1; +} + +.sweet-alert { + text-align: right; + border-radius: @border-radius-base; + .box-shadow(@popup-box-shadow); + z-index: @zindex-alert; + + h2 { + word-break: break-word; + word-wrap: break-word; + max-height: 350px; + overflow-y: auto; + + margin: 10px 0 17px 0; + color: #2b3e50; + text-align: left; + font-size: 15px; + line-height: 23px; + } + + p { + margin: 0; + } + + p.text-muted { + margin-bottom: 20px; + color: #555555; + } +} diff --git a/modules/backend/assets/less/controls/common.less b/modules/backend/assets/less/controls/common.less new file mode 100644 index 0000000..2c8ac65 --- /dev/null +++ b/modules/backend/assets/less/controls/common.less @@ -0,0 +1,66 @@ +// +// Common control styles +// -------------------------------------------------- + +// +// The scroll panel can host a scrollbar control. It has a right border that covers +// the scrollbar to satisfy the design requirements. +// +.control-scrollpanel { + position: relative; + background: @color-panel-light; + + .control-scrollbar { + &.vertical > .scrollbar-scrollbar {right: 0;} + } +} + +.tooltip { + .tooltip-inner { + text-align: left; + padding: 5px 8px; + } + + &.in { + .opacity(1); + } +} + +// +// Logos +// + +.wn-logo-white, .oc-logo-white { + background-image: url(../images/winter-logo-white.svg); + background-position: 50% 50%; + background-repeat: no-repeat; + background-size: contain; +} + +.wn-logo, .oc-logo { + background-image: url(../images/winter-logo.svg); + background-position: 50% 50%; + background-repeat: no-repeat; + background-size: contain; +} + +.layout.control-tabs.wn-logo-transparent:not(.has-tabs), .layout.control-tabs.oc-logo-transparent:not(.has-tabs), +.flex-layout-column.wn-logo-transparent:not(.has-tabs), .flex-layout-column.oc-logo-transparent:not(.has-tabs), +.layout-cell.wn-logo-transparent, .layout-cell.oc-logo-transparent { + background-size: 50% auto; + background-repeat: no-repeat; + background-image: url(../images/winter-logo.svg); + background-position: 50% 50%; + position: relative; + + &:after { + content: ''; + display: table-cell; + position: absolute; + left: 0; + top: 0; + height: 100%; + width: 100%; + background: rgba(249,249,249,0.7); + } +} diff --git a/modules/backend/assets/less/controls/filelist.less b/modules/backend/assets/less/controls/filelist.less new file mode 100644 index 0000000..37ba76c --- /dev/null +++ b/modules/backend/assets/less/controls/filelist.less @@ -0,0 +1,427 @@ +// +// File list control +// -------------------------------------------------- + +.control-filelist { + .listPaddings (@level, @offset-base) when (@level > 0) { + > li.group { + > ul { + > li > a { + padding-left: (@level+2)*@offset-base; + margin-left: -1*@level*@offset-base; + } + + .listPaddings(@level - 1, @offset-base); + } + } + } + .listPaddings (0, 27px) {} + + p.no-data { + padding: 22px 0; + margin: 0; + color: @color-filelist-norecords-text; + font-size: @font-size-base; + text-align: center; + font-weight: normal; + .border-radius(@border-radius-base); + } + + ul { + padding: 0; + margin: 0; + + li { + font-weight: normal; + line-height: 150%; + position: relative; + list-style: none; + + a:hover { + background: @color-list-hover; + } + + &.active > a { + background: @color-list-active; + position: relative; + &:after { + position: absolute; + height: 100%; + width: 4px; + left: 0; + top: 0; + background: @color-list-active-border; + display: block; + content: ' '; + } + } + + a { + display: block; + padding: 10px 45px 10px 20px; + outline: none; + + &:hover, &:focus, &:active {text-decoration: none;} + + span { + display: block; + + &.title { + font-weight: normal; + color: @color-text-title; + font-size: @font-size-base; + } + + &.description { + color: @color-text-description; + font-size: @font-size-base - 2; + white-space: nowrap; + font-weight: normal; + overflow: hidden; + text-overflow: ellipsis; + + strong { + color: @color-text-title; + font-weight: normal; + } + } + } + } + + &.group { + > h4, > div.group > h4 { + font-weight: normal; + font-size: @font-size-base; + margin-top: 0; + margin-bottom: 0; + position: relative; + + a { + padding: 10px 20px 10px 53px; + color: @color-text-title; + position: relative; + outline: none; + + &:hover { background: transparent; } + + &:before, &:after { + width: 10px; + height: 10px; + display: block; + position: absolute; + top: 1px; + } + + &:after { + left: 33px; + top: 9px; + .icon(@folder); + color: @color-list-icon; + font-size: 16px; + } + + &:before { + left: 20px; + top: 9px; + color: @color-list-arrow; + .icon(@caret-right); + .transform( ~'rotate(90deg) translate(5px, 0)' ); + .transition(all 0.1s ease); + } + } + } + + > ul { + > li > a { + padding-left: 52px; + } + + > li.group { + padding-left: 20px; + } + + .listPaddings(10, 27px); + } + + &[data-status=collapsed] { + > h4 a:before, > div.group > h4 a:before { + .transform(~'rotate(0deg) translate(3px, 0)'); + } + + & > ul, & > div.subitems { + display: none; + } + } + } + + > div.controls { + position: absolute; + right: 19px; + top: 6px; + + .dropdown { + width: 14px; + height: 21px; + + &.open a.control { + display: block!important; + &:before { + visibility: visible; + display: block; + } + } + } + + a.control { + color: @color-text-title; + font-size: @font-size-base; + visibility: hidden; + overflow: hidden; + width: 14px; + height: 21px; + display: none; + text-decoration: none; + cursor: pointer; + padding: 0; + .opacity(0.5); + &:before { + visibility: visible; + display: block; + margin-right: 0; + } + + &:hover { + .opacity(1); + } + } + } + + &:hover { + > div.controls, > a.control { + display: block!important; + + > a.control { + display: block!important; + } + } + } + + .checkbox { + position: absolute; + top: -5px; + right: 0; + + label { + margin-right: 0; + + &:before { + border-color: @color-filelist-cb-border; + } + } + } + } + } + + &.single-line { + ul { + li a span.title { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } + } + } + + // + // Templates have emphasis + // + + &.filelist-hero { + .a-hover() { + background: @color-filelist-hero-hover-bg; + border-bottom: 1px solid @color-filelist-hero-hover-bg !important; + span.title, span.description { + color: @color-filelist-hero-hover-text !important; + } + + .list-icon { + color: @color-filelist-hero-hover-text !important; + } + } + + .a-active() { + background: @color-filelist-hero-active-bg; + border-bottom: 1px solid @color-filelist-hero-active-bg !important; + span.title, span.description { + color: @color-filelist-hero-active-text !important; + } + + .list-icon { + color: @color-filelist-hero-active-text !important; + } + } + + ul { + li { + background: @color-filelist-hero-item-bg; + border-bottom: none; + + > a { + padding: 11px 45px 10px 50px; + font-size: @font-size-base - 1; + border-bottom: 1px solid @color-panel-light; + + span.title { + font-size: @font-size-base; + font-weight: normal; + color: @color-filelist-title-hero; + } + + span.description { + font-size: @font-size-base - 1; + } + + .list-icon { + position: absolute; + left: 14px; + top: 50%; + transform: translateY(-50%); + font-size: 22px; + color: #b7c0c2; + } + + &:hover { + .a-hover(); + } + + &:active { + .a-active(); + } + } + + .checkbox { + top: -2px; + right: 0; + } + + &.active { + > a { + border-bottom: 1px solid @color-list-active; + + &:after { + top: -1px; + bottom: -1px; + height: auto; + } + + > span.borders { + &:before { + content: ' '; + position: absolute; + width: 100%; + height: 1px; + display: block; + left: 0; + background-color: @color-list-active; + } + + &:before {top: -1px;} + } + + &:hover > span.borders:before { + background-color: @color-filelist-hero-hover-bg; + } + + &:active > span.borders:before { + background-color: @color-filelist-hero-active-bg; + } + } + } + + > h4 { + padding-top: 7px; + padding-bottom: 6px; + border-bottom: 1px solid @color-panel-light; + } + + > div.controls { + display: none; + position: absolute; + right: 16px; + top: 15px; + + > a.control { + width: 16px; + height: 23px; + background: transparent; + overflow: hidden; + display: inline-block; + color: @color-filelist-hero-hover-text!important; + padding: 0; + + &:before { + font-size: 17px; + } + } + } + + &:hover > div.controls { + display: block; + } + + &.separator { + position: relative; + border-bottom: 1px solid #95a5a6; + padding: 12px 15px 13px 15px; + + &:before { + z-index: 31; + .triangle(down, 19px, 11px, white); + position: absolute; + left: 13px; + bottom: -8px; + } + + &:after { + z-index: 30; + .triangle(down, 17px, 9px, #95a5a6); + position: absolute; + left: 14px; + bottom: -9px; + } + + h5 { + color: #2b3e50; + font-size: @font-size-base; + margin: 0; + font-weight: normal; + padding: 0; + } + } + } + + > li.group { + > ul > li > a { + padding-left: 66px; + } + } + } + + &.single-level { + ul li:hover { + background: @color-filelist-hero-hover-bg; + + > a { + .a-hover(); + } + } + ul li:active { + background: @color-filelist-hero-active-bg; + + > a { + .a-active(); + } + } + } + } +} diff --git a/modules/backend/assets/less/controls/global-notice.less b/modules/backend/assets/less/controls/global-notice.less new file mode 100644 index 0000000..8264e6a --- /dev/null +++ b/modules/backend/assets/less/controls/global-notice.less @@ -0,0 +1,25 @@ +.global-notice { + position: sticky; + top: 0; + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 0.5em; + justify-content: space-between; + z-index: 10500; + background: #ab2a1c; + color: #FFF; + padding: 0.5em 0.75em; + + .notice-icon { + font-size: 1.5em; + vertical-align: bottom; + display: inline-block; + margin-right: .25em; + } + + .notice-text { + display: inline-block; + vertical-align:middle; + } +} diff --git a/modules/backend/assets/less/controls/namevaluelist.less b/modules/backend/assets/less/controls/namevaluelist.less new file mode 100644 index 0000000..afd6c1e --- /dev/null +++ b/modules/backend/assets/less/controls/namevaluelist.less @@ -0,0 +1,27 @@ +table.name-value-list { + border-collapse: collapse; + font-size: 13px; + + th, td { + padding: 4px 0 4px 0; + vertical-align: top; + } + + tr:first-child { + th, td { + padding-top: 0; + } + } + + th { + font-weight: 600; + color: #95a5a6; + padding-right: 15px; + text-transform: uppercase; + } + + td { + color: #2b3e50; + word-wrap: break-word; + } +} \ No newline at end of file diff --git a/modules/backend/assets/less/controls/panels.less b/modules/backend/assets/less/controls/panels.less new file mode 100644 index 0000000..02c2312 --- /dev/null +++ b/modules/backend/assets/less/controls/panels.less @@ -0,0 +1,77 @@ +div.panel { + @panel-border-color: #e8eaeb; + + padding: 20px; + + &.no-padding { + padding: 0; + } + + &.no-padding-bottom { + padding-bottom: 0; + } + + &.padding-top { + padding-top: 20px; + } + + &.padding-less { + padding: 15px; + } + + &.transparent { + background: transparent; + } + + &.border-left { + border-left: 1px solid @panel-border-color; + } + + &.border-right { + border-right: 1px solid @panel-border-color; + } + + &.border-bottom { + border-bottom: 1px solid @panel-border-color; + } + + &.border-top { + border-top: 1px solid @panel-border-color; + } + + &.triangle-down { + position: relative; + + &:after { + .triangle(down, 15px, 8px, white); + position: absolute; + left: 15px; + bottom: -8px; + z-index: 101; + } + + &:before { + .triangle(down, 17px, 9px, #e8eaeb); + position: absolute; + left: 14px; + bottom: -9px; + z-index: 100; + } + } + + /* + * Panel sections + */ + + h3.section, > label { + text-transform: uppercase; + color: #95a5a6; + font-size: 13px; + font-weight: 600; + margin: 0 0 15px 0; + } + + > label { + margin-bottom: 5px; + } +} diff --git a/modules/backend/assets/less/controls/record-navigation.less b/modules/backend/assets/less/controls/record-navigation.less new file mode 100644 index 0000000..a9501da --- /dev/null +++ b/modules/backend/assets/less/controls/record-navigation.less @@ -0,0 +1,69 @@ +// +// Record navigation +// +// Previous/next navigation shown in the breadcrumb row of a form, letting the +// user step through the sibling records of the controller's list (respecting +// its active filters, search and sorting). Rendered by the FormController +// behavior via formcontroller/partials/_record_navigation.php. +// ======================================================================== + +.control-breadcrumb { + position: relative; +} + +.form-record-nav { + position: absolute; + top: 0; + bottom: 0; + right: 20px; + display: flex; + align-items: center; + gap: 9px; + font-size: 12px; + + .form-record-nav-position { + color: #5a6b7b; + font-weight: 600; + letter-spacing: .3px; + white-space: nowrap; + } + + .form-record-nav-group { + display: inline-flex; + align-items: center; + background: rgba(255, 255, 255, .55); + border: 1px solid rgba(0, 0, 0, .09); + border-radius: 6px; + overflow: hidden; + box-shadow: 0 1px 1px rgba(0, 0, 0, .03); + } + + .form-record-nav-btn { + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 24px; + color: #5a6b7b; + text-decoration: none; + transition: background-color .12s ease, color .12s ease; + + & + .form-record-nav-btn { + border-left: 1px solid rgba(0, 0, 0, .09); + } + + &:not(.is-disabled):hover { + background-color: #fff; + color: #1f2d3d; + } + + &.is-disabled { + color: #b6bfc7; + cursor: default; + } + + svg { + display: block; + } + } +} diff --git a/modules/backend/assets/less/controls/reportwidgets.less b/modules/backend/assets/less/controls/reportwidgets.less new file mode 100644 index 0000000..983762b --- /dev/null +++ b/modules/backend/assets/less/controls/reportwidgets.less @@ -0,0 +1,51 @@ +.report-widget { + padding: 15px; + background: white; + .box-sizing(border-box); + .border-radius(@border-radius-base); + font-size: @font-size-base - 1; + + h3 { + font-size: @font-size-base; + color: @color-report-widget-title; + text-transform: uppercase; + font-weight: 600; + margin-top: 0; + margin-bottom: 30px; + } + + .height-100 { height: 100px; } + .height-200 { height: 200px; } + .height-300 { height: 300px; } + .height-400 { height: 400px; } + .height-500 { height: 500px; } + + p.report-description { + margin-bottom: 0; + margin-top: 15px; + font-size: 12px; + line-height: 190%; + color: @color-report-widget-description; + } + + a:not(.btn) { + color: @color-report-widget-link; + text-decoration: none; + &:hover { + color: @link-color; + text-decoration: none; + } + } + + p.flash-message.static { + margin-bottom: 0; + } + + .icon-circle { + &.success { color: @brand-success; } + &.primary { color: @brand-primary; } + &.warning { color: @brand-warning; } + &.danger { color: @brand-danger; } + &.info { color: @brand-info; } + } +} \ No newline at end of file diff --git a/modules/backend/assets/less/controls/scrollbar.less b/modules/backend/assets/less/controls/scrollbar.less new file mode 100644 index 0000000..d4966e5 --- /dev/null +++ b/modules/backend/assets/less/controls/scrollbar.less @@ -0,0 +1,125 @@ +// +// Scrollbar +// -------------------------------------------------- + +.drag-noselect { + .user-select(none); +} + +@scrollbar-thumb-size: 6px; + +.control-scrollbar { + position: relative; + overflow: hidden; + height: 100%; + + >.scrollbar-scrollbar { + position: absolute; + z-index: 100; + .scrollbar-track { + background-color: @color-scrollbar-track; + position: relative; + .border-radius(5px); + + .scrollbar-thumb { + background-color: @color-scrollbar-thumb; + .border-radius(5px); + cursor: pointer; + overflow: hidden; + position: absolute; + } + } + + &.disabled { + display: none !important; + } + } + + &.vertical { + >.scrollbar-scrollbar { + right: 0; + margin-right: 5px; + width: @scrollbar-thumb-size; + .scrollbar-track { + height: 100%; + width: @scrollbar-thumb-size; + .scrollbar-thumb { + height: 20px; + width: @scrollbar-thumb-size; + top: 0; + left: 0; + } + } + + &:active, &:hover { + width: @scrollbar-thumb-size + 2px; + .transition(width .3s); + .scrollbar-track, + .scrollbar-thumb { + width: @scrollbar-thumb-size + 2px; + .transition(width .3s); + } + } + } + } + + &.horizontal { + >.scrollbar-scrollbar { + margin: 0 0 5px; + clear: both; + height: @scrollbar-thumb-size; + .scrollbar-track { + width: 100%; + height: @scrollbar-thumb-size; + .scrollbar-thumb { + height: @scrollbar-thumb-size; + margin: 2px 0; + left: 0; + top: 0; + } + } + + &:active, &:hover { + height: @scrollbar-thumb-size + 2px; + .transition(height .3s); + .scrollbar-track, + .scrollbar-thumb { + height: @scrollbar-thumb-size + 2px; + .transition(height .3s); + } + } + } + } +} + +html.mobile { + .control-scrollbar { + overflow: auto; + -webkit-overflow-scrolling: touch; + } +} + +.no-touch .control-scrollbar { + >.scrollbar-scrollbar { + opacity: 0; + .transition(opacity 0.3s); + } + + &:active >.scrollbar-scrollbar, + &:hover >.scrollbar-scrollbar {opacity: 1;} +} + +@media (max-width: @screen-sm) { + &.responsive-sidebar { + > .layout-cell:last-child { + .control-scrollbar { + overflow: visible; + height: auto; + + .scrollbar-scrollbar { + display: none!important; + } + } + } + } +} diff --git a/modules/backend/assets/less/controls/scrollpad.less b/modules/backend/assets/less/controls/scrollpad.less new file mode 100644 index 0000000..a364d54 --- /dev/null +++ b/modules/backend/assets/less/controls/scrollpad.less @@ -0,0 +1,98 @@ +.scrollpad-scrollbar-size-tester { + width: 50px; + height: 50px; + overflow-y: scroll; + position: absolute; + top: -200px; + left: -200px; + + div { + height: 100px; + } + + &::-webkit-scrollbar { + width: 0; + height: 0; + } +} + +div.control-scrollpad { + position: relative; + width: 100%; + height: 100%; + overflow: hidden; + + > div { + overflow: hidden; + overflow-y: scroll; + height: 100%; + + &::-webkit-scrollbar { + width: 0; + height: 0; + } + } + + &[data-direction=horizontal] > div { + overflow-x: scroll; + overflow-y: hidden; + width: 100%; + + &::-webkit-scrollbar { + width: auto; + height: 0; + } + } + + > .scrollpad-scrollbar { + z-index: 199; // Be careful here + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 11px; + background-color: @color-scrollbar-track; + opacity: 0; + overflow: hidden; + .border-radius(5px); + .transition(opacity 0.3s); + + .drag-handle { + position: absolute; + right: 2px; + min-height: 10px; + width: 7px; + background-color: @color-scrollbar-thumb; + .border-radius(5px); + } + + &:hover { + .opacity(.7); + .transition(opacity 0 linear); + } + + &[data-visible] { + .opacity(.7); + } + + &[data-hidden] { + display: none; + } + } + + &[data-direction=horizontal] > .scrollpad-scrollbar { + top: auto; + left: 0; + width: auto; + height: 11px; + + .drag-handle { + right: auto; + top: 2px; + height: 7px; + min-height: 0; + min-width: 10px; + width: auto; + } + } +} \ No newline at end of file diff --git a/modules/backend/assets/less/controls/selector-group.less b/modules/backend/assets/less/controls/selector-group.less new file mode 100644 index 0000000..4651cdb --- /dev/null +++ b/modules/backend/assets/less/controls/selector-group.less @@ -0,0 +1,35 @@ +.nav.selector-group { + font-size: 13px; + letter-spacing: 0.01em; + margin-bottom: 20px; + + li { + a { + padding: 7px 20px 7px 23px; + color: #95a5a6; + } + + &.active { + border-left: 3px solid #e6802b; + padding-left: 0; + + a { + padding-left: 20px; + color: #2b3e50; + } + } + + i[class^="icon-"] { + font-size: 17px; + margin-right: 6px; + position: relative; + top: 1px; + } + } +} + +div.panel { + .nav.selector-group { + margin: 0 -20px 20px -20px; + } +} \ No newline at end of file diff --git a/modules/backend/assets/less/controls/sidenav-tree.less b/modules/backend/assets/less/controls/sidenav-tree.less new file mode 100644 index 0000000..334eecb --- /dev/null +++ b/modules/backend/assets/less/controls/sidenav-tree.less @@ -0,0 +1,270 @@ +.sidenav-tree { + width: 300px; + + .control-toolbar { + padding: 0; + + .toolbar-item { + display: block; + } + + input.form-control { + border: none; + outline: none; + padding: 12px 13px 13px; + .border-radius(0); + .box-shadow(inset -3px 0 3px rgba(0,0,0,0.1)); + + &.search { + background-position: right -78px; + } + } + } + + ul { + padding: 0; + margin: 0; + list-style: none; + } + + div.scrollbar-thumb { + background: rgba(0,0,0,.2) !important; + } + + ul.top-level > li { + &[data-status=collapsed] { + > div.group { + h3:before { + .transform(~'rotate(0deg) translate(2px, -2px)'); + } + + // Hide triangle + &:before, &:after { + display: none; + } + } + + ul { + display: none; + } + } + + > div.group { + position: relative; + + h3 { + background: @color-sidebarnav-tree-group-bg; + color: @color-sidebarnav-tree-group; + text-transform: uppercase; + font-size: 15px; + padding: 15px 15px 15px 40px; + margin: 0; + position: relative; + cursor: pointer; + font-weight: 400; + + &:before { + display: block; + position: absolute; + width: 10px; + height: 10px; + left: 16px; + top: 15px; + color: @color-list-arrow; + .icon(@angle-right); + .transform(~'rotate(90deg) translate(5px, -3px)'); + .transition(all 0.1s ease); + font-size: 16px; + } + } + + // Use two triangles to achieve the darkening effect + &:before, + &:after { + .triangle(down, 15px, 8px, @brand-primary); + position: absolute; + left: 15px; + bottom: -8px; + z-index: 101; + } + + &:after { + .triangle(down, 15px, 8px, @color-sidebarnav-tree-group-bg); + } + } + + > ul { + li { + + a { + display: block; + position: relative; + padding: 18px 25px 18px 55px; + background: @color-sidebarnav-tree-inactive-bg; + border-bottom: 1px solid @color-sidebarnav-tree-group-bg; + color: @color-sidebarnav-tree-inactive-text; + text-decoration: none !important; + .opacity(.65); + + &:active, + &:hover { + .opacity(1); + text-decoration: none; + } + + i { + position: absolute; + left: 16px; + top: 18px; + font-size: 22px; + } + + span { + display: block; + line-height: 150%; + + &.header { + color: @color-sidebarnav-tree-inactive-header; + font-size: @font-size-base + 1; + margin-bottom: 5px; + } + + &.description { + color: @color-sidebarnav-tree-inactive-desc; + font-size: @font-size-base - 1; + } + } + } + + &:hover a, + &.active a { + .opacity(1); + } + + &.active { + border-left: 5px solid @brand-secondary; + + a { + color: @color-sidebarnav-tree-active-text; + padding-right: 20px; + + span.header { + color: @color-sidebarnav-tree-active-header; + } + + span.description { + color: @color-sidebarnav-tree-active-text; + } + } + } + + // &:last-child a { + // border-bottom: none; + // } + } + } + } + + .back-link { + display: none; + } +} + +@media (min-width: @screen-sm-min) { + .sidenav-tree-root .sidenav-tree { + width: 600px; + + ul.top-level > li > ul { + font-size: 0; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + align-items: stretch; + align-content: stretch; + + > li { + display: inline-block; + // flex-grow: 1; + width: 300px; + + a { + height: 100%; + } + } + } + } +} + +@media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + .sidenav-tree-root .sidenav-tree { + width: 100%; + + ul.top-level > li > ul > li { + width: 50%; + } + } +} + +@media (min-width: @screen-lg-min) { + .sidenav-tree-root .sidenav-tree { + width: 900px; + } +} + +@media (max-width: @screen-sm) { + .sidenav-tree { + width: 100%; + height: auto !important; + display: block !important; + + > .layout { + display: none; + } + } + + .sidenav-tree-root { + .sidenav-tree { + width: 100% !important; + height: 100% !important; + display: table-cell !important; + + .back-link { + display: none !important; + } + + > .layout { + display: table !important; + } + } + + #layout-body { + display: none; + } + } + + body.has-sidenav-tree { + .sidenav-tree { + .back-link { + display: block; + padding: 13px 15px; + background: @color-sidebarnav-back-link-bg; + color: @color-sidebarnav-back-link-text; + font-size: 14px; + line-height: 14px; + text-transform: uppercase; + i { + display: inline-block; + margin-right: 10px; + } + &:hover { + text-decoration: none; + } + } + } + + #layout-body { + display: block !important; + } + } +} diff --git a/modules/backend/assets/less/controls/simplelist.less b/modules/backend/assets/less/controls/simplelist.less new file mode 100644 index 0000000..355ff28 --- /dev/null +++ b/modules/backend/assets/less/controls/simplelist.less @@ -0,0 +1,265 @@ +// +// Simple List +// -------------------------------------------------- +// Usage (bullets): +//
+//
    +//
  • Hello friend
  • +//
+//
+// +// With icons (no bullets): +//
+//
    +//
  • Hello friend
  • +//
+//
+// +// With checkboxes: +//
+//
    +//
  • +//
    +// +// +//
    +//
  • +//
+//
+// +// Divided (basic): +//
+//
    +//
  • Hello friend
  • +//
+//
+// +// Selectable: +// +// +// Selectable (box): +// +// + +.control-simplelist { + font-size: 13px; + padding: 20px 20px 2px 20px; + margin-bottom: @padding-standard; + background: @color-form-checkboxlist-background; + .border-radius(@border-radius-base); + + ul { padding-left: 15px; } + + &.form-control { + ul { margin-bottom: 0; } + li { + padding-top: 5px; + padding-bottom: 5px; + } + } + + &.with-icons, + &.with-checkboxes, + &.is-divided, + &.is-selectable { + ul { + list-style-type: none; + padding-left: 0; + } + } + + &.with-checkboxes { + li { + margin-top: -5px; + + &:first-child { + margin-top: 0; + } + + &:last-child { + div.custom-checkbox { + margin-bottom: 0; + + label { + margin-bottom: 5px; + } + } + } + } + } + + &.is-sortable { + + li.placeholder { + position: relative; + &:before { + top: -10px; + position: absolute; + .triangle(right, 5px, 9px, @color-sortable-caret); + } + } + + li.dragged { + position: absolute; + .opacity(.5); + z-index: 2000; + color: @color-sortable-active; + + width: auto !important; // Prevent browser scrollbars + } + } + + &.is-scrollable { + height: 200px; + &.size-tiny { min-height: @size-tiny + 200; } + &.size-small { min-height: @size-small + 200; } + &.size-large { min-height: @size-large + 200; } + &.size-huge { min-height: @size-huge + 200; } + &.size-giant { min-height: @size-giant + 200; } + } + + &.is-divided, + &.is-selectable, + &.is-selectable-box { + padding: 0; + + li { + .heading { + font-size: 14px; + font-weight: 500; + } + + .description {} + } + } + + &.is-divided, + &.is-selectable { + li { + padding: 5px 10px; + border-bottom: 1px solid @color-list-border; + + &:last-child { + border-bottom: none; + } + } + } + + &.is-selectable { + li { + a { + padding: 5px 10px; + margin: -5px -10px; + display: block; + color: @text-color; + } + &:hover { + background: @color-list-hover-bg; + cursor: pointer; + &, a { color: white; } + a { text-decoration: none; } + } + + &.active { + a { + background: #f0f0f0; + &:hover { + background: @color-list-hover-bg; + } + } + } + } + } + + &.is-selectable-box { + padding-top: 15px; + margin-bottom: 0; + + li { + width: 155px; + margin: 8px; + display: inline-block; + text-align: center; + vertical-align: top; + + a { + text-decoration: none; + display: block; + color: @text-color; + + .box { + display: block; + width: 155px; + height: 155px; + border: 3px solid rgba(0,0,0,.1); + position: relative; + .transition(border .3s ease); + } + + .image { + display: block; + width: 56px; + height: 56px; + position: absolute; + top: 50%; + left: 50%; + margin-top: -28px; + margin-left: -28px; + + > i { + font-size: 56px; + color: rgba(0,0,0,.25); + } + } + + .heading { + margin: 7px 0; + padding: 0; + } + + .description { + font-size: 12px; + } + + &:hover { + .box { + border-color: rgba(0,0,0,.2); + } + + .image > i { + color: rgba(0,0,0,.45); + } + } + } + } + } +} + +.list-preview .control-simplelist { + &.is-selectable { + ul { + margin-bottom: 0; + } + } +} diff --git a/modules/backend/assets/less/controls/svg-icons.less b/modules/backend/assets/less/controls/svg-icons.less new file mode 100644 index 0000000..6e82b89 --- /dev/null +++ b/modules/backend/assets/less/controls/svg-icons.less @@ -0,0 +1,33 @@ +.svg-icon-container { + img.svg-icon { + // SVG icons are invisible until SVG support is detected + // with JavaScript to reduce flickering on page load. + // This should be overridden in a specific control, + // inside html.svg {} + display: none; + } + + &.svg-active-effects { + img.svg-icon { + -webkit-filter: grayscale(100%); + filter: grayscale(100%); + .opacity(0.6); + } + + &:hover, &.active { + img.svg-icon { + -webkit-filter: none; + filter: none; + .opacity(1); + } + } + } +} + +html.svg { + .svg-icon-container { + i.svg-replace { + display: none; + } + } +} diff --git a/modules/backend/assets/less/controls/tree-path.less b/modules/backend/assets/less/controls/tree-path.less new file mode 100644 index 0000000..c2422be --- /dev/null +++ b/modules/backend/assets/less/controls/tree-path.less @@ -0,0 +1,61 @@ +ul.tree-path { + list-style: none; + padding: 0; + margin-bottom: 0; + + li { + display: inline-block; + margin-right: 1px; + font-size: 13px; + + &:after { + .icon(@angle-right); + display: inline-block; + font-size: 13px; + margin-left: 5px; + position: relative; + top: 1px; + color: #95a5a6; + } + + &:last-child { + a { + cursor: default; + } + + &:after { + display: none; + } + } + + &.go-up { + font-size: 12px; + margin-right: 7px; + + a { + color: #95a5a6; + + &:hover { + color: @link-color; + } + } + + &:after { + display: none; + } + } + + &.root a { + font-weight: 600; + color: #405261; + } + + a { + color: #95a5a6; + + &:hover { + text-decoration: none; + } + } + } +} \ No newline at end of file diff --git a/modules/backend/assets/less/controls/treelist.less b/modules/backend/assets/less/controls/treelist.less new file mode 100644 index 0000000..b0dfec8 --- /dev/null +++ b/modules/backend/assets/less/controls/treelist.less @@ -0,0 +1,93 @@ +// +// Tree List +// -------------------------------------------------- + +.control-treelist { + ol { + padding: 0; + margin: 0; + list-style: none; + + ol { + margin: 0; + margin-left: 15px; + padding-left: 15px; + border-left: 1px solid #dbdee0; + } + } + + > ol > li > div.record:before { + display: none; + } + + li { + margin: 0; + padding: 0; + > div.record { + margin: 0; + font-size: 12px; + margin-bottom: 5px; + position: relative; + display: block; + + &:before { + color: #bdc3c7; + .icon(@circle); + font-size: 6px; + position: absolute; + left: -18px; + top: 11px; + } + + > a.move { + display: inline-block; + padding: 7px 0 7px 10px; + text-decoration: none; + color: #bdc3c7; + &:hover { + color: @color-list-hover-bg; + } + &:before { .icon(@bars); } + } + > span { + color: @color-list-text; + display: inline-block; + padding: 7px 15px 7px 5px; + } + } + + &.dragged { + position: absolute; + z-index: 2000; + width: auto !important; // Prevent browser scrollbars + height: auto !important; + > div.record { + .opacity(.5); + background: @color-list-hover-bg !important; + > a.move:before, > span { color: white; } + + &:before { + display: none; + } + } + } + + &.placeholder { + display: inline-block; + position: relative; + background: @color-list-hover-bg !important; + height: 25px; + margin-bottom: 5px; + &:before { + display: block; + position: absolute; + .icon(@chevron-left); + color: #d35714; + left: -10px; + top: 8px; + z-index: 2000; + } + } + + } +} diff --git a/modules/backend/assets/less/controls/treeview.less b/modules/backend/assets/less/controls/treeview.less new file mode 100644 index 0000000..c9da29a --- /dev/null +++ b/modules/backend/assets/less/controls/treeview.less @@ -0,0 +1,630 @@ +.control-treeview { + margin-bottom: 40px; + + .no-data() { + padding: 18px 0; + margin: 0; + color: @color-filelist-norecords-text; + font-size: @font-size-base; + text-align: center; + font-weight: 400; + } + + ol { + margin: 0; + padding: 0; + list-style: none; + background: @color-treeview-item-bg; + + > li { + .transition(width 1s); + + > div { + font-size: @font-size-base; + font-weight: normal; + background: @color-treeview-item-bg; + border-bottom: 1px solid @color-panel-light; + position: relative; + + > a { + color: @color-treeview-item-title; + padding: 11px 45px 10px 61px; + display: block; + line-height: 150%; + text-decoration: none; + .box-sizing(border-box); + } + + &:before { + content: ' '; + background-image: url(../images/treeview-icons.png); + background-position: 0px -28px; + background-repeat: no-repeat; + background-size: 42px auto; + + position: absolute; + width: 21px; + height: 22px; + left: 28px; + top: 15px; + } + + span.comment { + display: block; + font-weight: 400; + color: @color-treeview-item-comment; + font-size: @font-size-base - 1; + margin-top: 2px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + > span.expand { + .hide-text(); + display: none; + position: absolute; + width: 20px; + height: 20px; + top: 19px; + left: 2px; + cursor: pointer; + color: @color-treeview-control; + .transition(transform 0.1s ease); + + &:before { + .icon(@caret-right); + line-height: 100%; + font-size: @font-size-base + 1; + + position: relative; + left: 8px; + top: 2px; + } + } + + > span.drag-handle { + .hide-text(); + .transition(opacity 0.4s); + + position: absolute; + right: 9px; + bottom: 0; + width: 18px; + height: 19px; + cursor: move; + color: @color-treeview-control; + .opacity(0); + + &:before { + .icon(@bars); + font-size: 18px; + } + } + + span.borders { + font-size: 0; + } + + > ul.submenu { + position: absolute; + left: 20px; + bottom: -36.9px; + padding: 0; + list-style: none; + z-index: 200; + height: 37px; + display: none; + margin-left: 15px; + + background: transparent url(../images/treeview-submenu-tabs.png) repeat-x left -39px; + + &:before, &:after { + background: transparent url(../images/treeview-submenu-tabs.png) no-repeat left top; + content: ' '; + display: block; + width: 20px; + height: 37px; + position: absolute; + top: 0; + } + + &:before { + left: -20px; + } + + &:after { + background-position: -100px top; + right: -20px; + } + + li { + font-size: @font-size-base - 2; + + a { + display: block; + padding: 4px 3px 0 3px; + color: @color-treeview-submenu-text; + text-decoration: none; + outline: none; + + i { + margin-right: 5px; + } + } + } + } + + &:hover { + > ul.submenu { + display: block; + } + } + + &:active { + > ul.submenu { + background-position: left -116px; + + &:before { + background-position: left -77px; + } + &:after { + background-position: -100px -77px; + } + } + } + + .checkbox { + position: absolute; + top: -2px; + right: 0; + + label { + margin-right: 0; + + &:before { + border-color: @color-filelist-cb-border; + } + } + } + + &.popover-highlight { + background-color: @color-treeview-hover-bg !important; + + &:before { + background-position: 0px -80px; + } + + > a { + color: @color-treeview-hover-text !important; + cursor: default; + } + + span { + color: @color-treeview-hover-text !important; + } + + > ul.submenu, > span.drag-handle { + display: none!important; + } + } + } + + &.dragged div, > div:hover { + background-color: @color-treeview-hover-bg !important; + + > a { + color: @color-treeview-hover-text !important; + } + + &:before { + background-position: 0px -80px; + } + + &:after { + top: 0 !important; + bottom: 0 !important; + } + + span { + color: @color-treeview-hover-text !important; + + &.drag-handle { + cursor: move; + .opacity(1); + } + + &.borders { + display: none; + } + } + } + + > div:active { + background-color: @color-treeview-active-bg !important; + + > a { + color: @color-treeview-active-text !important; + } + } + + &[data-no-drag-mode] div:hover { + span.drag-handle { + cursor: default!important; + .opacity(.3)!important; + } + } + + &.dragged { + li.has-subitems, &.has-subitems { + > div:before { + background-position: 0px -52px; + } + } + + div > ul.submenu { + display: none!important; + } + } + + > ol { + padding-left: 20px; + padding-right: 20px; + } + + &[data-status=collapsed] > ol { + display: none; + } + + &.has-subitems { + > div { + &:before { + background-position: 0 0; + width: 23px; + height: 26px; + left: 26px; + } + + &:hover, &.popover-highlight { + &:before { background-position: 0px -52px; } + } + + span.expand { + display: block; + } + } + } + + &.placeholder { + position: relative; + .opacity(.5); + + ol { + display: none; + } + } + + &.dragged { + position: absolute; + z-index: 2000; + .opacity(.25); + + > div { + .border-radius(3px); + } + + ol { + display: none; + } + } + + &.drop-target { + > div { + background-color: #2581b8!important; + + > a { + color: @color-treeview-hover-text; + > span.comment { + color: @color-treeview-hover-text; + } + } + + &:before { + background-position: 0px -80px; + } + } + + &.has-subitems > div:before { + background-position: 0px -52px; + } + } + + &[data-status=expanded] > div > span.expand { + .transform( ~'rotate(90deg) translate(0, 0)' ); + } + + &.drag-ghost { + background-color: transparent; + box-sizing: content-box; + } + + &.active { + > div { + background: @color-list-active; + + &:after { + position: absolute; + width: 4px; + left: 0; + top: -1px; + bottom: -1px; + background: @color-list-active-border; + display: block; + content: ' '; + } + + > span.comment, > span.expand { + color: @color-treeview-item-active-comment; + } + + > span.borders { + &:before, &:after { + content: ' '; + position: absolute; + width: 100%; + height: 1px; + display: block; + left: 0; + background-color: @color-list-active; + } + + &:before {top: -1px;} + &:after {bottom: -1px;} + } + } + } + + &.no-data { + .no-data(); + } + } + + @max-level: 10; + + .tree-view-paddings (@level) when (@level > 0) { + > li { + > ol { + > li > div { + margin-left: -20-(@max-level - @level)*20px; + margin-right: -20-(@max-level - @level)*20px; + padding-left: 61+(@max-level - @level + 1)*10px; + + > a { + margin-left: -61-(@max-level - @level + 1)*10px; + padding-left: 61+(@max-level - @level + 1)*10px; + } + + &:before { + margin-left: (@max-level - @level + 1)*10px; + } + + > span.expand { + left: 2+(@max-level - @level + 1)*10px; + } + } + + .tree-view-paddings(@level - 1); + } + } + } + + .tree-view-paddings (@max-level); + } + + p.no-data { + .no-data(); + } + + a.menu-control { + display: block; + margin: 20px; + padding: 13px 15px; + border: dotted 2px #ebebeb; + color: #bdc3c7; + font-size: @font-size-base - 2; + font-weight: 600; + text-transform: uppercase; + border-radius: 5px; + vertical-align: middle; + + &:hover, &:focus { + text-decoration: none; + background-color: @color-treeview-hover-bg; + color: @color-treeview-hover-text; + border: none; + padding: 15px 17px; + } + + &:active { + background: @color-treeview-active-bg; + color: @color-treeview-active-text; + } + + i { + margin-right: 10px; + font-size: 14px; + } + } + + /* + * Light version of the treeview - transparent background, no bottom borders, + * smaller paddings, inline submenu + */ + &.treeview-light { + margin-bottom: 0; + margin-top: 20px; + + ol { + background-color: transparent; + > li { + > div { + background-color: transparent; + border-bottom: none; + + &:before { + top: 15px; + } + + > a { + padding-top: 10px; + padding-bottom: 10px; + } + + span.expand { + top: 19px; + } + + > span.drag-handle { + top: 0; + right: 0; + bottom: auto; + height: 100%; + width: 60px; + background: @color-treeview-light-submenu-bg; + .transition(none)!important; + + &:before { + position: absolute; + left: 50%; + top: 50%; + margin-left: -6px; + } + } + + > ul.submenu { + right: 60px; + left: auto; + bottom: auto; + top: 0; + height: 100%; + margin: 0; + background: transparent; + white-space: nowrap; + font-size: 0; + + &:before, &:after { + display: none; + } + + li { + height: 100%; + display: inline-block; + background: @color-treeview-light-submenu-bg; + border-right: 1px solid @color-treeview-light-submenu-border; + + p { + display: table; + height: 100%; + padding: 0; + margin: 0; + + a { + display: table-cell; + vertical-align: middle; + height: 100%; + padding: 0 20px; + font-size: @font-size-base - 1; + .box-sizing(border-box); + + i.control-icon { + font-size: 22px; + margin-right: 0; + } + } + } + } + } + } + } + } + } +} + +// +// Sorting guides +// + +body.dragging .control-treeview { + ol.dragging, ol.dragging ol { + background: #ccc; + padding-right: 0; + + > li { + > div { + margin-right: 0; + .transition(margin 1s); + + .custom-checkbox { + .transition(opacity .5s); + .opacity(0); + } + } + } + } + + &.treeview-light { + ol.dragging, ol.dragging ol { + > li > div { + background-color: #f9f9f9; + } + } + } +} + +// +// Retina +// + +@media only screen and (min--moz-device-pixel-ratio: 1.5), only screen and (-o-min-device-pixel-ratio: 3/2), only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-devicepixel-ratio: 1.5), only screen and (min-resolution: 1.5dppx) { + .control-treeview { + ol { + > li { + > div{ + &:before { + background-position: 0px -79px; + background-size: 21px auto; + } + } + + &.has-subitems > div { + &:before {background-position: 0px -52px;} + &:hover, &.popover-highlight { + &:before {background-position: 0px -102px;} + } + } + + &.dragged > div, &.dragged li > div, > div:hover, > div.popover-highlight { + &:before {background-position: 0px -129px;} + } + + &.dragged { + li.has-subitems, &.has-subitems { + > div:before { + background-position: 0px -102px; + } + } + } + + &.drop-target { + > div:before { + background-position: 0px -129px; + } + + &.has-subitems > div:before { + background-position: 0px -102px; + } + } + } + } + } +} diff --git a/modules/backend/assets/less/core/animations.less b/modules/backend/assets/less/core/animations.less new file mode 100644 index 0000000..c0f7fe0 --- /dev/null +++ b/modules/backend/assets/less/core/animations.less @@ -0,0 +1,363 @@ +// +// Fade In +// + +@-webkit-keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; +} + +// +// Fade In Down +// + +@-webkit-keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + -ms-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + -ms-transform: none; + transform: none; + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} + +// +// Fade In Left +// + +@-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + -ms-transform: none; + transform: none; + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} + +// +// Fade In Right +// + +@-webkit-keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + -ms-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + -ms-transform: none; + transform: none; + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} + +// +// Fade In Up +// + +@-webkit-keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + -ms-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + -ms-transform: none; + transform: none; + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; +} + +@-webkit-keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +// +// Fade Out +// + +@-webkit-keyframes fadeOut { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +@keyframes fadeOut { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +// +// Fade Out Down +// + +@-webkit-keyframes fadeOutDown { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes fadeOutDown { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + -ms-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} + +// +// Fade Out Left +// + +@-webkit-keyframes fadeOutLeft { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes fadeOutLeft { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} + +// +// Fade Out Right +// + +@-webkit-keyframes fadeOutRight { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes fadeOutRight { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + -ms-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} + +// +// Fade Out Up +// + +@-webkit-keyframes fadeOutUp { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes fadeOutUp { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + -ms-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} diff --git a/modules/backend/assets/less/core/boot.less b/modules/backend/assets/less/core/boot.less new file mode 100644 index 0000000..659749e --- /dev/null +++ b/modules/backend/assets/less/core/boot.less @@ -0,0 +1,11 @@ +// +// Boots the Core LESS +// +// Includes non-output LESS files such as mixins and variables +// + +// Core variables and mixins +@import "../../../../system/assets/ui/less/global.less"; + +@import "variables.less"; +@import "mixins.less"; diff --git a/modules/backend/assets/less/core/mixins.less b/modules/backend/assets/less/core/mixins.less new file mode 100644 index 0000000..e3e0d69 --- /dev/null +++ b/modules/backend/assets/less/core/mixins.less @@ -0,0 +1,165 @@ +// -------------------------------------------------- +// Flexbox LESS mixins +// The spec: http://www.w3.org/TR/css3-flexbox +// -------------------------------------------------- + +// Flexbox display +// flex or inline-flex +.flex-display() { + display: ~"-webkit-box"; + display: ~"-webkit-flex"; + display: ~"-moz-flex"; + display: ~"-ms-flexbox"; // IE10 uses -ms-flexbox + display: ~"-ms-flex"; // IE11 + display: flex; +} + +// The 'flex: 0 0 auto' shorthand +.flex-fix() { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -moz-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; +} + +// The 'flex: 1 1 auto' shorthand +.flex-stretch() { + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + -moz-flex: 1 1 auto; + -ms-flex: 1 1 auto; + flex: 1 1 auto; +} + +// The 'flex: 1' shorthand +.flex-stretch-constrain() { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; +} + +// Flex Flow Direction Column +// - applies to: flex containers +.flex-direction-column() { + -webkit-flex-direction: column; + -moz-flex-direction: column; + -webkit-box-orient: vertical; + -ms-flex-direction: column; + flex-direction: column; +} + +// Flex Flow Direction Row +// - applies to: flex containers +.flex-direction-row() { + -webkit-flex-direction: row; + -moz-flex-direction: row; + -webkit-box-orient: horizontal; + -ms-flex-direction: row; + flex-direction: row; +} + +// Flex Line Wrapping +// - applies to: flex containers +// nowrap | wrap | wrap-reverse +.flex-wrap(@wrap: nowrap) { + -webkit-flex-wrap: @wrap; + -moz-flex-wrap: @wrap; + -ms-flex-wrap: @wrap; + flex-wrap: @wrap; +} + +// Flex Direction and Wrap +// - applies to: flex containers +// || +.flex-flow(@flow) { + -webkit-flex-flow: @flow; + -moz-flex-flow: @flow; + -ms-flex-flow: @flow; + flex-flow: @flow; +} + +// Display Order +// - applies to: flex items +// +.flex-order(@order: 0) { + -webkit-order: @order; + -moz-order: @order; + -ms-order: @order; + order: @order; +} + +// Flex grow factor +// - applies to: flex items +// +.flex-grow(@grow: 0) { + -webkit-flex-grow: @grow; + -moz-flex-grow: @grow; + -ms-flex-grow: @grow; + flex-grow: @grow; +} + +// Flex shr +// - applies to: flex itemsink factor +// +.flex-shrink(@shrink: 1) { + -webkit-flex-shrink: @shrink; + -moz-flex-shrink: @shrink; + -ms-flex-shrink: @shrink; + flex-shrink: @shrink; +} + +// Flex basis +// - the initial main size of the flex item +// - applies to: flex itemsnitial main size of the flex item +// +.flex-basis(@width: auto) { + -webkit-flex-basis: @width; + -moz-flex-basis: @width; + -ms-flex-basis: @width; + flex-basis: @width; +} + +// Axis Alignment +// - applies to: flex containers +// flex-start | flex-end | center | space-between | space-around +.justify-content(@justify: flex-start) { + -webkit-justify-content: @justify; + -moz-justify-content: @justify; + -ms-justify-content: @justify; + -webkit-box-pack: @justify; + justify-content: @justify; +} + +// Packing Flex Lines +// - applies to: multi-line flex containers +// flex-start | flex-end | center | space-between | space-around | stretch +.align-content(@align: stretch) { + -webkit-align-content: @align; + -moz-align-content: @align; + -webkit-box-align: @align; + -ms-align-content: @align; + align-content: @align; +} + +// Cross-axis Alignment +// - applies to: flex containers +// flex-start | flex-end | center | baseline | stretch +.align-items(@align: stretch) { + -webkit-align-items: @align; + -moz-align-items: @align; + -ms-align-items: @align; + align-items: @align; +} + +// Cross-axis Alignment +// - applies to: flex items +// auto | flex-start | flex-end | center | baseline | stretch +.align-self(@align: auto) { + -webkit-align-self: @align; + -moz-align-self: @align; + -ms-align-self: @align; + align-self: @align; +} \ No newline at end of file diff --git a/modules/backend/assets/less/core/variables.less b/modules/backend/assets/less/core/variables.less new file mode 100644 index 0000000..5ade13a --- /dev/null +++ b/modules/backend/assets/less/core/variables.less @@ -0,0 +1,153 @@ +// +// Override UI variables +// -------------------------------------------------- + +@font-family-base: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + +// +// Paths +// -------------------------------------------------- + +@type-font-path: "../font"; + +// +// Colors +// -------------------------------------------------- + +@color-border: #cccccc; +@color-border-light: #e1e1e1; + +@color-mainmenu: #151515; +@color-mainmenu-inactive: rgba(255,255,255,.6); +@color-mainmenu-active: #ffffff; +@color-mainmenu-active-bg: #262626; +@color-mainmenu-collapsed: #000000; + +@color-accountmenu-bg: #f9f9f9; +@color-accountmenu-text: #666666; +@color-accountmenu-divider: #e0e0e0; + +@color-footer: rgba(255,255,255,.8); +@color-footer-border: #dfdfdf; +@color-footer-text: #666666; + +@color-sidebarnav-active-text: #ffffff; +@color-sidebarnav-active-icon: #ffffff; +@color-sidebarnav-inactive-text: rgba(255,255,255,.6); +@color-sidebarnav-inactive-icon: rgba(255,255,255,.6); +@color-sidebarnav-counter-bg: #d9350f; +@color-sidebarnav-counter-text: #ffffff; + +@color-sidebarnav-tree-group: #ecf0f1; +@color-sidebarnav-tree-group-bg: rgba(0,0,0,.15); +@color-sidebarnav-tree-inactive-header: #ffffff; +@color-sidebarnav-tree-inactive-desc: rgba(255,255,255,.6); +@color-sidebarnav-tree-inactive-text: #ffffff; +@color-sidebarnav-tree-active-header: #ffffff; +@color-sidebarnav-tree-inactive-bg: transparent; +@color-sidebarnav-tree-active-text: rgba(255,255,255,.91); +@color-sidebarnav-tree-active-marker: @brand-secondary; +@color-sidebarnav-back-link-bg: #2b3e50; +@color-sidebarnav-back-link-text: #bdc3c7; + +@color-scrollbar-track: transparent; +@color-scrollbar-thumb: rgba(0,0,0,.35); +@color-scrollpanel-border: #efefef; +@color-scrollpanel-fix-button: #aaaaaa; +@color-scrollpanel-fix-button-light: #eeeeee; +@color-scroll-indicator: #bbbbbb; + +@color-panel-light: #ECF0F1; + +@color-outer-muted-text: rgba(255,255,255,.44); +@color-outer-heading: #feffff; +@color-outer-description: #999999; +@color-outer-bg: #2b3e50; +@color-outer-header: @body-bg; +@color-outer-form-label: #666666; + +@color-breadcrumb-text-active: #9da3a7; +@color-breadcrumb-text: #9B9B9B; +@color-breadcrumb-background: #2b343d; + +@color-custom-input-icon: #666666; +@color-custom-input-border: #999999; + +@color-input-sidebar-control: #C4C4C4; + +@color-switch-input-bg: #f6f6f6; +@color-switch-input-on: #8da85e; +@color-switch-input-off: #cc3300; + +@color-custom-select-border: #b2b9be; +@color-custom-select-bg: #f6f6f6; +@color-custom-select-bg-hover: #4da7e8; + +@color-filelist-norecords-text: #666666; +@color-filelist-norecords-bg: #eeeeee; +@color-filelist-cb-border: #cccccc; +@color-filelist-title-hero: #2b3e50; +@color-filelist-hero-item-bg: #ffffff; +@color-filelist-hero-hover-bg: @highlight-hover-bg; +@color-filelist-hero-hover-text: @highlight-hover-text; +@color-filelist-hero-active-bg: @highlight-active-bg; +@color-filelist-hero-active-text: @highlight-active-text; + +@color-fancy-master-tabs-bg: @brand-secondary-darker; +@color-fancy-master-tabs-active-text: #ffffff; +@color-fancy-master-tabs-inactive-text: rgba(255, 255, 255, .35); +@color-fancy-master-panel-bg: @brand-secondary-darker; + +@color-fancy-secondary-tabs-bg: #475354; +@color-fancy-secondary-tabs-active-text: #ffffff; +@color-fancy-secondary-tabs-inactive-text: #919898; + +@color-fancy-primary-tabs-bg: #7F8C8D; +@color-fancy-primary-tabs-inactive-text: #95a5a6; +@color-fancy-primary-tabs-active-text: #808c8d; +@color-fancy-primary-tabs-active-bg: #fafafa; +@color-fancy-primary-tabs-inactive-bg: #d5d9d8; + +@color-fancy-form-tabless-fields-bg: @brand-secondary; +@color-fancy-form-label: rgba(255, 255, 255, .5); +@color-fancy-form-text: #ffffff; +@color-fancy-form-text-selection: @brand-secondary-darker; +@color-fancy-form-placeholder: rgba(255, 255, 255, .5); +@color-fancy-form-inactive-tab: #2c9cb9; + +@color-sortable-caret: #999999; +@color-sortable-active: @brand-secondary; + +@color-report-widget-title: #7e8c8d; +@color-report-widget-control-inactive: #b6b6b6; +@color-report-widget-description: @color-report-widget-title; +@color-report-widget-link: @color-report-widget-title; + +@color-treeview-item-bg: #ffffff; +@color-treeview-item-title: #2b3e50; +@color-treeview-item-comment: #95a5a6; +@color-treeview-control: #bdc3c7; +@color-treeview-hover-bg: @highlight-hover-bg; +@color-treeview-hover-text: @highlight-hover-text; +@color-treeview-active-bg: @highlight-active-bg; +@color-treeview-active-text: @highlight-active-text; +@color-treeview-item-active-comment: #8f8f8f; +@color-treeview-submenu-text: #ffffff; +@color-treeview-light-submenu-bg: #2581b8; +@color-treeview-light-submenu-border: #328ec8; + +// +// Sizes +// -------------------------------------------------- +@size-tiny: 50px; +@size-small: 100px; +@size-large: 200px; +@size-huge: 250px; +@size-giant: 350px; + +// +// Media breakpoints +// -------------------------------------------------- + +@menu-breakpoint-min: 770px; +@menu-breakpoint-max: (@menu-breakpoint-min - 1); diff --git a/modules/backend/assets/less/dashboard/dashboard.less b/modules/backend/assets/less/dashboard/dashboard.less new file mode 100644 index 0000000..8b30885 --- /dev/null +++ b/modules/backend/assets/less/dashboard/dashboard.less @@ -0,0 +1,17 @@ +@import "../../../../backend/assets/less/core/boot.less"; + +.dashboard-container > .report-container { + &.loading { + position: absolute; + width: 100%; + height: 100%; + + .loading-indicator-container { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + } + } +} diff --git a/modules/backend/assets/less/layout/fancylayout.less b/modules/backend/assets/less/layout/fancylayout.less new file mode 100644 index 0000000..21c8c02 --- /dev/null +++ b/modules/backend/assets/less/layout/fancylayout.less @@ -0,0 +1,733 @@ +// +// FANCY LAYOUT +// Applies branding colours to the Backend UI. +// + +// +// --- TABS +// + +// Master tabs +body.fancy-layout .master-tabs.control-tabs, +.master-tabs.control-tabs.fancy-layout { + overflow: hidden; + + &:before, &:after { + top: 13px; + font-size: 14px; + color: @color-fancy-master-tabs-inactive-text; + } + &:before { left: 8px; } + &:after { right: 8px; } + &.scroll-before:before { color: @color-fancy-master-tabs-active-text; } + &.scroll-after:after { color: @color-fancy-master-tabs-active-text; } + + > div > div.tabs-container { + background: @color-fancy-master-tabs-bg; + padding-left: 20px; + padding-right: 20px; + + > ul.nav-tabs { + margin-left: -8px; + > li { + margin-left: -5px; + top: 1px; + padding-top: 3px; + + span.tab-close { + top: 14px; + right: -3px; + left: auto; + z-index: 110; + font-family: sans-serif; + + i { + top: 4px; + right: 1px; + color: rgba(255, 255, 255, 0.3) !important; + font-style: normal; + font-weight: bold; + font-size: 16px; + + &:hover { color: @color-fancy-master-tabs-active-text !important; } + } + } + + a { + border-bottom: none; + background: transparent; + font-size: 14px; + color: @color-fancy-master-tabs-inactive-text; + padding: 6px 0 0 24px!important; + overflow: visible; + + > span.title { + position: relative; + display: inline-block; + padding: 12px 5px 0 5px; + height: 38px; + font-size: 14px; + z-index: 100; + background-color: @color-fancy-form-inactive-tab; + + &:before, &:after { + content: ' '; + position: absolute; + width: 20px; + display: block; + height: 37px; + top: 0; + z-index: 100; + background-color: @color-fancy-form-inactive-tab; + } + + &:before { + left: -14px; + .border-radius(8px 0 0 0); + .transform( ~'skewX(-20deg)'); + + } + + &:after { + right: -14px; + .border-radius(0 8px 0 0); + .transform( ~'skewX(20deg)'); + } + + span { + border-top: none; + padding: 0; + margin-top: 0; + overflow: visible; + } + } + + &:before { + z-index: 110; + position: absolute; + top: 18px; + left: 22px; + } + + &[class*=icon] > span.title { + padding-left: 18px; + } + } + + &.active { + a { + z-index: 107; + color: @color-fancy-master-tabs-active-text; + } + span.tab-close i { color: @color-fancy-master-tabs-active-text; } + + a > span.title { + background-color: @color-fancy-form-tabless-fields-bg; + z-index: 105; + &:before { + z-index: 107; + background-color: @color-fancy-form-tabless-fields-bg; + } + &:after { + background-color: @color-fancy-form-tabless-fields-bg; + z-index: 107; + } + } + } + + &[data-modified] { + span.tab-close i { + top: 5px; + .hide-text(); + + &:before { + .icon(@circle); + font-size: 9px; + } + } + } + + &:first-child { + margin-left: 0; + } + } + } + } + + &[data-closable] { + > div > div.tabs-container { + > ul.nav-tabs { + > li { + a > span.title { + padding-right: 10px; + } + } + } + } + } + + &.has-tabs { + &:before, &:after {display: block;} + } + + &.has-tabs { + > div.tab-content { + background: @body-bg; + } + } + + > .tab-content > .tab-pane { + padding: 0; + + &.padded-pane { + padding: @padding-standard @padding-standard 0 @padding-standard; + } + } +} + +// Primary Tabs +.fancy-layout *:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .control-tabs.primary-tabs, +*:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .control-tabs.fancy-layout.primary-tabs { + &.master-area { + > div > ul.nav-tabs { + .transition(background-color 0.5s); + background: @color-fancy-form-tabless-fields-bg; + } + } + + > div > ul.nav-tabs { + background: @color-fancy-primary-tabs-bg; + margin-left: 0!important; + margin-right: 0!important; + + &:before { + display: none; + } + + > li { + background: transparent; + border-right: none; + margin-right: -8px; + + &:first-child { + margin-left: -5px; + } + + a { + background: transparent; + border: none; + padding: 12px 16px 0px; + font-size: 14px; + font-weight: 400; + color: @color-fancy-primary-tabs-inactive-text; + + span.title { + background: @color-fancy-primary-tabs-inactive-bg; + border-top: none; + padding: 5px 5px 3px 5px; + + &:before, &:after { + background: @color-fancy-primary-tabs-inactive-bg; + border-width: 0; + top: 0; + } + + &:before { + left: -20px; + } + + &:after { + right: -20px; + } + + span { + border-width: 0; + vertical-align: top; + } + } + } + + &.active { + a { + color: @color-fancy-primary-tabs-active-text; + &:before { + display: none; + } + + span.title { + background: @color-fancy-primary-tabs-active-bg; + + &:before, &:after { + background: @color-fancy-primary-tabs-active-bg; + } + } + } + } + } + } + + > .tab-content > .tab-pane { + padding: @padding-standard @padding-standard 0 @padding-standard; + + &.pane-compact { + padding: 0; + } + } + + &.collapsed { + display: none; + } + + &.has-tabs { + > div.tab-content { + background: @body-bg; + } + } +} + +// Secondary tabs +.fancy-layout *:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .control-tabs.secondary-tabs { + // Target horizontal scroll indicators + &:before { + left: 5px; + } + &:after { + right: 5px; + } + > div > ul.nav-tabs { + background: @color-fancy-secondary-tabs-bg; + > li { + border-right: none; + padding-right: 0; + margin-right: 0; + a { + background: transparent; + border: none; + padding: 12px 10px 13px 10px; + font-size: 14px; + font-weight: normal; + line-height: 14px; + color: @color-fancy-secondary-tabs-inactive-text; + + span { + span { + overflow: visible; + border-top: none; + margin-top: 0; + padding-top: 0; + } + } + } + + &:first-child { + padding-left: 15px; // Will cause issues when first child is hidden + } + + &.active { + a {color: @color-fancy-secondary-tabs-active-text;} + } + } + } + + .tab-collapse-icon { + position: absolute; + display: block; + text-decoration: none; + outline: none; + .opacity(0.6); + .transition(all 0.3s); + font-size: 12px; + color: @color-fancy-master-tabs-active-text; + right: 11px; + + &:hover { + text-decoration: none; + .opacity(1); + } + + &.primary { + color: @color-fancy-master-tabs-active-text; + top: 12px; + right: 11px; + bottom: auto; + z-index: 100; + .scaleAxes(1, -1); + + i { + position: relative; + display: block; + } + } + } + + &.primary-collapsed { + .tab-collapse-icon.primary { + .scaleAxes(1, 1); + } + } + + &.secondary-content-tabs { + > div > ul.nav-tabs { + background: @body-bg; + + > li { + margin-left: -19px; + + &:first-child { + margin-left: 0; + padding-left: 8px; + } + + a { + padding: 8px 16px 0 16px; + font-weight: 400; + height: 36px; + color: #2b3e50; + .opacity(0.6); + + > span.title { + position: relative; + display: inline-block; + padding: 8px 5px 9px 5px; + font-size: 14px; + z-index: 100; + height: 27px!important; + background-color: transparent; + + &:before, &:after { + content: ' '; + position: absolute; + background-color: white; + width: 15px; + height: 28px; + top: 0; + z-index: 100; + display: none; + } + + &:before { + left: -11px; + .border-radius(8px 0 0 0); + .transform( ~'skewX(-20deg)'); + } + + &:after { + right: -11px; + .border-radius(0 8px 0 0); + .transform( ~'skewX(20deg)'); + } + + span { + height: 18px; + font-size: 14px; + } + } + } + + &.active a { + .opacity(1); + + > span.title { + background-color: white; + &:before, &:after { + display: block; + } + } + } + } + } + + .tab-collapse-icon.primary { + color: #000000; + } + + &.primary-collapsed { + .tab-collapse-icon.primary { + color: @color-fancy-master-tabs-active-text; + } + + > div > ul.nav-tabs { + background: @color-fancy-form-tabless-fields-bg; + + > li { + a { + color: white; + + > span.title { + &:before, &:after { + background-color: white; + } + } + } + + &.active a { + color: #2b3e50; + } + } + } + } + } + + &.has-tabs { + > div.tab-content { + background: @body-bg; + } + } + + > .tab-content > .tab-pane { + padding: 0; + + &.padded-pane { + padding: @padding-standard @padding-standard 0 @padding-standard; + } + } +} + +// Tabless (outside) fields +.fancy-layout *:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .form-tabless-fields { + .clearfix(); + position: relative; + background: @color-fancy-form-tabless-fields-bg; + padding: 18px 23px 0 23px; + .transition(all 0.5s); + + label { + text-transform: uppercase; + color: @color-fancy-form-label; + margin-bottom: 0; + } + + .form-control[disabled] { + background-color: rgba(29, 29, 29, 0.11) !important; + } + + input[type=text] { + background: transparent; + border: none; + color: @color-fancy-form-text; + font-size: 35px; + font-weight: 100; + height: auto; + padding: 0; + .placeholder(@color-fancy-form-placeholder); + .box-shadow(none); + + &:focus, &:hover { + background-color: rgba(255, 255, 255, 0.1); + } + } + + .form-group { + padding-bottom: 0; + + &.is-required { + > label:after { + display: none; + } + } + } + + .tab-collapse-icon { + position: absolute; + display: block; + text-decoration: none; + outline: none; + .opacity(0.6); + .transition(all 0.3s); + font-size: 12px; + color: @color-fancy-master-tabs-active-text; + right: 11px; + + &:hover { + text-decoration: none; + .opacity(1); + } + + &.primary { + color: @color-fancy-master-tabs-active-text; + top: 12px; + right: 11px; + bottom: auto; + z-index: 100; + .scaleAxes(1, -1); + + i { + position: relative; + display: block; + } + } + + &.tabless { + top: 14px; + } + } + + &.collapsed { + padding: 5px 23px 0 10px; + + .tab-collapse-icon { + &.tabless { + .scaleAxes(1, -1); + } + } + + .form-group:not(.collapse-visible) { + display: none; + } + + .form-buttons { + margin-left: 10px; + padding-bottom: 0; + } + } + + .loading-indicator-container { + .loading-indicator { + background-color: @color-fancy-form-tabless-fields-bg; + padding: 0 0 0 30px; + color: @color-fancy-form-label; + margin-top: 1px; + height: 90%; + font-size: 12px; + line-height: 100%; + > span { + left: -10px; + top: 18px; + } + } + } +} + +// +// --- FANCY BREADCRUMBS +// + +body.breadcrumb-fancy .control-breadcrumb, +.control-breadcrumb.breadcrumb-fancy { + margin-bottom: 0; + + background-color: mix(black, saturate(@color-fancy-form-tabless-fields-bg, 20%), 16%); + + li { + background-color: mix(black, saturate(@color-fancy-form-tabless-fields-bg, 20%), 31%); + color: rgba(255,255,255, .5); + + a { + opacity: .5; + .transition(all 0.3s ease); + &:hover { + opacity: 1; + + } + } + + &:not(:last-child)::before { + border-left-color: @color-fancy-form-tabless-fields-bg; + opacity: .5; + } + + &:after { + border-left-color: mix(black, saturate(@color-fancy-form-tabless-fields-bg, 20%), 31%); + } + + &:last-child { + background-color: mix(black, saturate(@color-fancy-form-tabless-fields-bg, 20%), 16%); + + &:before { + opacity: 1; + border-left-color: mix(black, saturate(@color-fancy-form-tabless-fields-bg, 20%), 16%); + } + } + } +} + +// +// --- FORM BUTTONS +// + +.fancy-layout *:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .control-tabs .form-buttons:not(.normalized), +.fancy-layout *:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .form-tabless-fields .form-buttons:not(.normalized) { + .transition(all 0.5s); + padding-top: 14px; + padding-bottom: 5px; + + .btn { + padding: 0; + margin-right: 5px; + margin-top: -6px; + margin-right: 30px; + background: transparent; + color: @color-fancy-master-tabs-active-text; + font-weight: normal; + .box-shadow(none); + + .opacity(0.5); + .transition(all 0.3s ease); + + &:hover { + .opacity(1); + } + + &:last-child { + margin-right: 0; + } + + &[class^="wn-icon-"], + &[class*=" wn-icon-"], + &[class^="oc-icon-"], + &[class*=" oc-icon-"] { + &:before { + opacity: 1; + } + } + } +} + +.fancy-layout form[class$="-data-changed"] *:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .control-tabs .btn.save { + .opacity(1); +} + +// +// --- FIELDS AND WIDGETS +// + +// Code editor +.fancy-layout *:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .control-tabs > .tab-content > .tab-pane > .form-group > .field-codeeditor { + border: none !important; + .border-radius(0); + + .editor-code { + .border-radius(0); + } +} + +// Rich editor +.fancy-layout *:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .control-tabs > .tab-content > .tab-pane > .form-group > .field-richeditor { + border: none; + border-left: 1px solid @color-form-field-border !important; + + &, .fr-toolbar, .fr-wrapper { + .border-radius(0); + .border-top-radius(0); + } +} + +// Rich editor in a secondary content tab +.fancy-layout *:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .control-tabs.secondary-content-tabs > .tab-content > .tab-pane > .form-group > .field-richeditor { + .fr-toolbar { + background: white; + } +} + +// Rich editor when the side panel is not fixed +body.side-panel-not-fixed .fancy-layout *:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .control-tabs > .tab-content > .tab-pane > .form-group > .field-richeditor, +body.side-panel-not-fixed.fancy-layout *:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .control-tabs > .tab-content > .tab-pane > .form-group > .field-richeditor { + border-left: none; +} + +// Loading indicator +html.cssanimations .fancy-layout *:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .form-tabless-fields .loading-indicator-container .loading-indicator > span { + .animation(spin 1s linear infinite); + background-image: url('../../../system/assets/ui/images/loader-white.svg'); + background-size: 20px 20px; +} diff --git a/modules/backend/assets/less/layout/flexlayout.less b/modules/backend/assets/less/layout/flexlayout.less new file mode 100644 index 0000000..fe00e05 --- /dev/null +++ b/modules/backend/assets/less/layout/flexlayout.less @@ -0,0 +1,50 @@ +.flex-layout-column { + .flex-display(); + .flex-direction-column(); + + &.full-height-strict { + height: 100%; + } + + &.absolute { + position: absolute!important; + } + + &.fill-container { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + } +} + +.flex-layout-row { + .flex-display(); + .flex-direction-row(); +} + +.flex-layout-column, .flex-layout-row { + &.justify-center {.justify-content(center);} + &.align-center { + .align-items(center); + .align-content(center); + } + + &.full-height { + min-height: 100%; + // height: 100%; + } +} + +.flex-layout-item { + margin: 0; + &.fix { .flex-fix(); } + &.stretch { .flex-stretch(); } + &.stretch-constrain { .flex-stretch-constrain(); } + &.center { .align-self(center); } + + &.relative { position: relative; } + + &.layout-container { max-width: none; } +} diff --git a/modules/backend/assets/less/layout/flyout.less b/modules/backend/assets/less/layout/flyout.less new file mode 100644 index 0000000..a276396 --- /dev/null +++ b/modules/backend/assets/less/layout/flyout.less @@ -0,0 +1,48 @@ +.flyout-container { + > .flyout { + overflow: hidden; + width: 0; + left: 0!important; + .transition(width 0.1s); + } +} + +.flyout-overlay { + width: 100%; + height: 100%; + top: 0; + z-index: 5000; + position: absolute; + background-color: rgba(0,0,0,0); + .transition(background-color 0.3s); +} + +.flyout-toggle { + position: absolute; + top: 20px; + left: 0; + width: 23px; + height: 25px; + background: #2b3e50; + cursor: pointer; + .border-right-radius(4px); + color: #bdc3c7; + font-size: 10px; + + i { + margin: 7px 0 0 6px; + display: inline-block; + } + + &:hover i { + color: #ffffff; + } +} + +body.flyout-visible { + overflow: hidden; + + .flyout-overlay { + background-color: rgba(0,0,0,0.3); + } +} \ No newline at end of file diff --git a/modules/backend/assets/less/layout/footer.less b/modules/backend/assets/less/layout/footer.less new file mode 100644 index 0000000..f3ae25f --- /dev/null +++ b/modules/backend/assets/less/layout/footer.less @@ -0,0 +1,32 @@ +@footer-zindex: 100; +@footer-height: 60; + +#layout-footer { + width: 100%; + z-index: @footer-zindex; + height: @footer-height + 0px; + position: fixed; + bottom: 0; + color: @color-footer-text; + background-color: @color-footer; + border-top: 1px solid @color-footer-border; + + .brand, .tagline { + margin: 10px; + height: (@footer-height - 20) + 0px; + line-height: (@footer-height - 20) + 0px; + } + + .brand { + float: left; + font-size: 16px; + .logo { margin: 0 10px; } + .name { } + } + + .tagline { + float: right; + p { color: lighten(@color-footer-text, 20%); } + } +} + diff --git a/modules/backend/assets/less/layout/layout.less b/modules/backend/assets/less/layout/layout.less new file mode 100644 index 0000000..7dc5739 --- /dev/null +++ b/modules/backend/assets/less/layout/layout.less @@ -0,0 +1,234 @@ +// +// Common layout elements +// -------------------------------------------------- + +html:not(.mobile) body.drag * { + cursor: grab !important; + cursor: -webkit-grab !important; + cursor: -moz-grab !important; +} + +// Used by sortable plugin +body.dragging, body.dragging * { + cursor: move !important; +} + +body.loading, body.loading * { + cursor: wait !important; +} + +body.no-select { + .user-select(none); + cursor: default !important; +} + +// +// Layout canvas +// + +html, +body { + height: 100%; + /* The html and body elements cannot have any padding or margin. */ +} + +body { + font-family: @font-family-base; + background: @body-bg; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +#layout-canvas { + min-height: 100%; + height: 100%; +} + +// +// Font +// + +// Removed for performance reasons +// +// @import url(https://fonts.googleapis.com/css?family=Noto+Sans:400,400italic,700,700italic); +// +// body { +// font-family: 'Noto Sans', sans-serif; +// } + +// +// Tabs override for Layout +// Primary tabs should use inset by default, unless otherwise specified +// -------------------------------------------------- + +.control-tabs.primary-tabs { + > ul.nav-tabs, > div > ul.nav-tabs, > div > div > ul.nav-tabs { + margin-left: -(@padding-standard); + margin-right: -(@padding-standard); + } + + &.tabs-no-inset { + > ul.nav-tabs, > div > ul.nav-tabs, > div > div > ul.nav-tabs { + margin-left: 0; + margin-right: 0; + } + } +} + +// +// Flexible layout system +// -------------------------------------------------- + +.layout { + .layout-cell() { + display: table-cell; + vertical-align: top; + height: 100%; + + &.layout-container, .layout-container, &.padded-container, .padded-container { + padding: @padding-standard @padding-standard 0 @padding-standard; + + // Container to sit flush to the element above + .container-flush { + padding-top: 0; + } + } + + .layout-relative { + position: relative; + height: 100%; + } + + .layout-absolute { + position: absolute; + height: 100%; + width: 100%; + } + + &.min-size { + width: 0; + } + + &.min-height { + height: 0; + } + + &.center { + text-align: center; + } + + &.middle { + vertical-align: middle; + } + } + + display: table; + table-layout: fixed; + height: 100%; + width: 100%; + + > .layout-row { + display: table-row; + vertical-align: top; + height: 100%; + + > .layout-cell { + .layout-cell(); + } + + &.min-size { + height: 0.1px; + } + } + + > .layout-cell { + .layout-cell(); + } +} + +.whiteboard { + background: white; +} + +.layout-fill-container { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +// +// Calculated fixed width +// + +[data-calculate-width] { + > form, > div { + display: inline-block; + } +} + +// +// Layout styles +// + +body.compact-container { + .layout { + &.layout-container, .layout-container { padding: 0 !important; } + } +} + +body.slim-container { + .layout { + &.layout-container, .layout-container { padding-left: 0 !important; padding-right: 0 !important; } + } +} + +// +// Screen specific +// + +@media (max-width: @screen-sm) { + .layout { + .hide-on-small { + display: none; + } + + // + // Layout with a responsive sidebar + // + + &.responsive-sidebar { + > .layout-cell:first-child { + display: table-footer-group; + height: auto; + + .control-breadcrumb { + display: none; + } + } + + > .layout-cell:last-child { + display: table-header-group; + width: auto; + height: auto; + + .layout-absolute { + position: static; + } + } + } + } +} + +// +// Browser specific +// + +// Remove focus outline for mouse clicks, keep for keyboard navigation +@supports (-moz-appearance: none) { + a:focus:not(:focus-visible) { + outline: none; + } +} + diff --git a/modules/backend/assets/less/layout/mainmenu.less b/modules/backend/assets/less/layout/mainmenu.less new file mode 100644 index 0000000..f4b8c37 --- /dev/null +++ b/modules/backend/assets/less/layout/mainmenu.less @@ -0,0 +1,680 @@ +// +// Top navigation bar +// -------------------------------------------------- + +@mainmenu-mode-tile-height: 78px; +@mainmenu-mode-inline-height: 60px; +@mainmenu-mode-collapse-height: 45px; + +@mainmenu-icon-dimension: 30px; +@mainmenu-tile-dimension: 65px; +@mainmenu-tile-label-height: 20px; +@mainmenu-tile-label-width: 100px; + +body.mainmenu-open { + overflow: hidden; + position: fixed; +} + +.mainmenu-item-link() { + display: inline-block; + font-size: @font-size-base; + color: inherit; + + &:hover { + background-color: transparent; + } + + &:active, &:focus { + text-decoration: none; + color: @color-mainmenu-inactive; + } + + i { + line-height: 1; + font-size: 30px; + vertical-align: middle; + } +} + +.mainmenu-item-link-active() { + // background: @color-mainmenu-active-bg; + // .border-radius(3px); + // .box-shadow(inset 0 -2px 0 rgba(0,0,0,.25)); +} + +.mainmenu-set-height(@height) { + height: @height; + + ul.mainmenu-toolbar { + li.mainmenu-quick-action { + a { + height: @height; + line-height: @height; + } + } + + li.mainmenu-account { + > a { + height: @height; + line-height: @height; + } + } + } + + ul li .mainmenu-accountmenu { + top: @height + 10; + } +} + +.mainmenu-tooltip { + .tooltip-inner { + font-size: @font-size-base - 1; + padding: 6px 16px; + } +} + +ul.mainmenu-nav { + font-size: @font-size-base; + + li { + /* Fix for SVG icons not rendering on initial page load until repaint (hover, move, etc) */ + .svg-icon { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + } + + span.counter { + display: block; + position: absolute; + top: .143em; + right: 0; + padding: .143em .429em .214em .286em; + background-color: @color-sidebarnav-counter-bg; + color: @color-sidebarnav-counter-text; + font-size: .786em; + line-height: 100%; + .border-radius(3px); + .opacity(1); + .scale(1); + .transition(all 0.3s); + + &.empty { + .opacity(0); + .scale(0); + } + } + } +} + +nav#layout-mainmenu { + background-color: @color-mainmenu; + padding: 0 0 0 20px; + line-height: 0; + white-space: nowrap; + display: flex; + + a { + text-decoration: none; + &:focus { + background: transparent; + } + } + + ul { + margin: 0; + padding: 0; + list-style: none; + float: left; + white-space: nowrap; + overflow: hidden; + + li { + color: @color-mainmenu-inactive; + display: inline-block; + vertical-align: top; + position: relative; + margin-right: 30px; + + a { + .mainmenu-item-link(); + padding: 14px 0 10px; + + img.svg-icon { + height: 30px; + width: 30px; + margin-right: 10px; + position: relative; + top: 0; + } + } + } + + &.nav { + display: inline-block; + } + } + + .toolbar-item { + flex: 1 1 auto; + display: block; + padding-right: 0; + overflow: hidden; + + &-account { + flex: 0 0 auto; + } + + &:before, &:after { + margin-top: 0; + } + + &:before { + left: -12px; + } + + &:after { + right: -12px; + } + + &.scroll-active-before:before { + color: @color-mainmenu-active; + } + + &.scroll-active-after:after { + color: @color-mainmenu-active; + } + } + + // + // Toolbar + // + + ul.mainmenu-toolbar { + li.mainmenu-quick-action { + margin: 0; + + &:first-child { + margin-left: 21px; + } + + i { + font-size: 20px; + } + + a { + position: relative; + padding: 0 10px; + top: -1px; + } + } + + li.mainmenu-account { + margin-right: 0; + + > a { + padding: 0 15px 0 10px; + font-size: @font-size-base - 1; + position: relative; + } + + &.highlight > a { + z-index: @zindex-popover; + } + + img.account-avatar { + width: 45px; + height: 45px; + } + + .account-name { + //font-weight: bold; + margin-right: 15px; + } + + ul { + line-height: 23px; + } + } + } + + // + // Fading animation (disabled) + // + + &:hover { + ul.mainmenu-nav li { + //.transition(opacity .15s ease); + //.opacity(1); + } + } + + ul.mainmenu-nav li { + //.opacity(.65); + //.transition(opacity 5s ease); + //.transition-delay(5s); + + &.active { + //.opacity(1); + } + } +} + +// +// SVG support +// + +html.svg { + nav#layout-mainmenu, + .mainmenu-collapsed { + img.svg-icon { + display: inline-block; + } + } +} + +// +// User account menu +// + +nav#layout-mainmenu ul li .mainmenu-accountmenu { + position: fixed; + top: 0; // See mode for this value + right: @padding-standard; + background: @color-accountmenu-bg; + z-index: @zindex-popover; + display: none; + .box-shadow(@overlay-box-shadow); + border-radius: @border-radius-base; + + &.active { + display: block; + } + + &:after { + .triangle(up, 17px, 7px, @color-accountmenu-bg); + right: 9px; + top: -7px; + position: absolute; + } + + ul { + float: none; + display: block; + overflow: visible; + } + + li { + padding: 0; + margin: 0; + font-weight: normal; + text-align: left; + display: block; + + a { + display: block; + padding: (@padding-standard * 0.5) (@padding-standard * 1.5); + text-align: left; + font-size: @font-size-base; + color: @color-accountmenu-text; + + &:hover, &:focus { + background: @highlight-hover-bg; + color: @highlight-hover-text; + } + + &:active { + background: @highlight-active-bg; + color: @highlight-active-text; + } + } + + &:first-child a { + &:hover, &:focus, &:active { + &:after { + .triangle(up, 17px, 7px, @highlight-hover-bg); + position: absolute; + right: 9px; + top: -7px; + z-index: 102; + } + } + &:active { + &:after { + .triangle(up, 17px, 7px, @highlight-active-bg); + } + } + } + } + + li.divider { + height: 1px; + width: 100%; + background-color: @color-accountmenu-divider; + } +} + +// +// Navbar (Inline mode) +// + +nav#layout-mainmenu.navbar-mode-inline, +nav#layout-mainmenu.navbar-mode-inline_no_icons { + .mainmenu-set-height(@mainmenu-mode-inline-height); + + ul.mainmenu-nav { + li { + margin: 5px 0; + + a { + padding: 10px 15px; + + .nav-icon { + position: relative; + top: -1px; + margin-right: 5px; + width: @mainmenu-icon-dimension; + height: @mainmenu-icon-dimension; + i, img { margin: 0; } + } + .nav-label { + line-height: @mainmenu-icon-dimension; + } + } + + &:first-child { + margin-left: -13px; + } + + &:last-child { + margin-right: 0; + } + } + + li.active { + .mainmenu-item-link-active(); + + // &:first-child { + // margin-left: 0; + // } + } + + } +} + +// +// Navbar (Inline no icons mode) +// +nav#layout-mainmenu.navbar-mode-inline_no_icons .nav-icon { + display: none !important; +} + +// +// Navbar (Tiles mode) +// + +nav#layout-mainmenu.navbar-mode-tile { + .mainmenu-set-height(@mainmenu-mode-tile-height); + .mainmenu-navbar-tiles(); +} + +.mainmenu-navbar-tiles() { + ul.mainmenu-nav { + li a { + position: relative; + width: @mainmenu-tile-dimension; + height: @mainmenu-tile-dimension; + + // Offset from bottom + @tile-bottom-offset: 4; + + .nav-icon { + text-align: center; + display: block; + position: absolute; + top: 50%; + left: 50%; + margin-left: -(@mainmenu-icon-dimension / 2); + margin-top: -((@mainmenu-tile-dimension - @mainmenu-tile-label-height) / 2) - @tile-bottom-offset; + width: @mainmenu-icon-dimension; + height: @mainmenu-icon-dimension; + i, img { margin: 0; } + } + + .nav-label { + display: block; + width: @mainmenu-tile-label-width; + height: @mainmenu-tile-label-height; + line-height: @mainmenu-tile-label-height; + position: absolute; + bottom: @tile-bottom-offset + 0px; + left: 50%; + padding: 0 5px; + margin-left: -(@mainmenu-tile-label-width / 2); + overflow: hidden; + text-overflow: ellipsis; + text-align: center; + } + } + + li { + padding: 0 15px; + margin: 7px 0 0; + + &:first-child { + margin-left: -7px; + } + + &:hover { + .nav-label { + width: auto; + min-width: @mainmenu-tile-label-width; + text-overflow: all; + overflow: visible; + z-index: 2; + } + } + + } + + li.active { + .mainmenu-item-link-active(); + + a { + // font-weight: bold; + } + + &:first-child { + margin-left: 0; + } + } + } +} + +// +// Mobile (Collapsed mode) +// + +nav#layout-mainmenu { + .menu-toggle { + height: @mainmenu-mode-collapse-height; + line-height: @mainmenu-mode-collapse-height; + font-size: @font-size-base + 2; + display: none; + + .menu-toggle-icon { + background: #333; + display: inline-block; + height: @mainmenu-mode-collapse-height; + line-height: @mainmenu-mode-collapse-height; + width: @mainmenu-mode-collapse-height; + text-align: center; + opacity: .7; + + i { + line-height: @mainmenu-mode-collapse-height; + font-size: 20px; + vertical-align: bottom; + } + } + + .menu-toggle-title { + margin-left: 10px; + } + + &:hover { + .menu-toggle-icon { + opacity: 1; + } + } + } +} + +body.mainmenu-open { + nav#layout-mainmenu { + .menu-toggle-icon { + opacity: 1; + } + } +} + +nav#layout-mainmenu.navbar-mode-collapse { + .mainmenu-navbar-collapse(); +} + +@media (max-width: @menu-breakpoint-max) { + nav#layout-mainmenu.navbar { + .mainmenu-navbar-collapse(); + } +} + +.mainmenu-navbar-collapse() { + padding-left: 0; + + .mainmenu-set-height(@mainmenu-mode-collapse-height); + + ul.mainmenu-toolbar li.mainmenu-account > a { + padding-right: 0; + } + + ul li .mainmenu-accountmenu:after { + right: 13px; + } + + ul.nav { display: none; } + + .menu-toggle { + display: inline-block; + color: @color-mainmenu-active !important; + // font-weight: bold; + } +} + +.mainmenu-collapsed { + position: absolute; + height: 100%; + top: 0; + left: 0; + margin: 0; + background: @color-mainmenu-collapsed; + + > div { + display: block; + height: 100%; + + .mainmenu-navbar-tiles(); + + ul.mainmenu-nav li:first-child { + margin-left: 0; + } + + ul { + margin: 0; + padding: 5px 0 15px 15px; + overflow: hidden; + } + + ul li { + color: @color-mainmenu-inactive; + display: inline-block; + vertical-align: top; + position: relative; + margin-right: 30px; + } + + ul li a { + .mainmenu-item-link(); + + img.svg-icon { + height: 30px; + width: 30px; + position: relative; + top: 0; + } + } + } + + .vertical-scroll-marker(@color-mainmenu-inactive); +} + +body.mainmenu-open .mainmenu-collapsed ul { + position: absolute; + left: 0; + top: 10px; + bottom: 10px; +} + +html.mobile { + .mainmenu-collapsed ul { + overflow: auto; + -webkit-overflow-scrolling: touch; + } +} + +// +// Misc +// + +nav#layout-mainmenu.navbar ul li:hover, +.mainmenu-collapsed li:hover { + a { + &:active, &:focus { + color: @color-mainmenu-active !important; + } + } +} + +.touch .mainmenu-collapsed li a:hover { + color: @color-mainmenu-inactive; +} + +nav#layout-mainmenu.navbar ul li, +.mainmenu-collapsed li { + + // Used by account menu + &.highlight > a { + color: @color-mainmenu-active !important; + } + + &.active { + color: @color-mainmenu-active !important; + + a { + color: @color-mainmenu-active !important; + } + } + + &:hover { + color: @color-mainmenu-active; + background: transparent; + } +} + +body.drag { + nav#layout-mainmenu.navbar ul.nav li, + .mainmenu-collapsed ul li { + &:hover { + color: @color-mainmenu-inactive; + } + } +} diff --git a/modules/backend/assets/less/layout/outerlayout.less b/modules/backend/assets/less/layout/outerlayout.less new file mode 100644 index 0000000..34aa513 --- /dev/null +++ b/modules/backend/assets/less/layout/outerlayout.less @@ -0,0 +1,147 @@ + +// Layout for "Outside" pages, such as the Login screen +// + +body.outer { + background: @color-outer-bg; + + .layout { + > .layout-row { + &.layout-head { + text-align: center; + background: @color-outer-header; + + > .layout-cell { + height: 40%; + padding: 50px 0; + .box-sizing(border-box); + vertical-align: middle; + position: relative; + + &:after { + .triangle(down, 56px, 20px, @color-outer-header); + position: absolute; + bottom: -20px; + left: 50%; + margin-left: -28px; + } + + h1.wn-logo, + h1.oc-logo { + .hide-text(); + display: inline-block; + width: 100%; + max-width: 450px; + height: 170px; + min-height: 72px; + } + } + } + + > .layout-cell { + vertical-align: top; + + .outer-form-container { + margin: 0 auto; + width: 436px; + padding: (@padding-standard * 2) 0; + + h2 { + font-size: 18px; + margin: 20px 0; + color: @color-outer-heading; + } + + .horizontal-form { + font-size: 0; + .flex-display(); + + input { + vertical-align: top; + margin-right: 9px; + display: inline-block; + border: none; + .border-radius(2px); + } + + button { + background: @link-color; + text-align: center; + font-size: 13px; + font-weight: 600; + height: 40px; + vertical-align: top; + .box-sizing(border-box); + } + } + + .remember { + label { + color: @color-outer-muted-text; + } + input#remember { + display: none; + } + } + + .forgot-password { + margin-top: 30px; + font-size: 13px; + top: 8px; + + a { + color: @color-outer-muted-text; + } + + &:before { + color: @color-outer-muted-text; + font-size: 14px; + position: relative; + margin-right: 5px; + } + } + } + } + } + } +} + +html.csstransitions { + body.outer { + .outer-form-container { + .transition(all 0.5s ease-out); + .scaleAxes(1, 1); + } + + &.preload { + .outer-form-container { + .scaleAxes(0.2, 0.2); + } + } + } +} + +@media (max-width: @screen-sm) { + body.outer .layout > .layout-row { + &.layout-head { + > .layout-cell { + padding: 50px @padding-standard; + } + } + + > .layout-cell .outer-form-container { + width: auto; + padding: @padding-standard * 2; + + .horizontal-form { + display: block; + + input { + display: block; + width: 100% !important; + margin-bottom: @padding-standard; + } + } + } + } +} diff --git a/modules/backend/assets/less/layout/sidenav.less b/modules/backend/assets/less/layout/sidenav.less new file mode 100644 index 0000000..259bc4f --- /dev/null +++ b/modules/backend/assets/less/layout/sidenav.less @@ -0,0 +1,116 @@ +// +// Side navigation bar +// -------------------------------------------------- + +.layout-sidenav-container { + width: 120px; +} + +#layout-sidenav { + position: absolute; + height: 100%; + width: 100%; + .box-sizing(border-box); + font-size: @font-size-base; + + ul { + position: relative; + margin: 0; + padding: 0; + height: 100%; + overflow: hidden; + + li { + display: block; + text-align: center; + position: relative; + + a { + padding: 1.429em .714em; + display: block; + font-size: .929em; + color: @color-sidebarnav-inactive-text; + font-weight: normal; + position: relative; + + &:hover { + text-decoration: none; + background-color: transparent; + } + + &:focus { + background: transparent; + } + + i { + color: @color-sidebarnav-inactive-icon; + display: block; + margin-bottom: 5px; + font-size: 2em; + } + } + + &:first-child a { + padding-top: 2.143em; + } + + &.active a, a:hover { + color: @color-sidebarnav-active-text; + i { color: @color-sidebarnav-active-icon; } + } + + span.counter { + display: block; + position: absolute; + top: 1.071em; + right: 1.071em; + padding: .143em .429em .214em .286em; + background-color: @color-sidebarnav-counter-bg; + color: @color-sidebarnav-counter-text; + font-size: .786em; + line-height: 100%; + .border-radius(3px); + .opacity(1); + .scale(1); + .transition(all 0.3s); + + &.empty { + .opacity(0); + .scale(0); + } + } + } + } +} + +@media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + #layout-sidenav { + font-size: 12px; + } + .layout-sidenav-container { + width: 100px; + } +} + +@media (max-width: @screen-xs-max) { + #layout-sidenav { + font-size: 10px; + } + .layout-sidenav-container { + width: 80px; + } +} + +html.mobile { + #layout-sidenav ul { + overflow: auto; + -webkit-overflow-scrolling: touch; + } +} + +#layout-sidenav.layout-sidenav ul.drag li:not(.active) a:hover, +.touch #layout-sidenav.layout-sidenav li:not(.active) a:hover { + color: @color-sidebarnav-inactive-text !important; + i { color: @color-sidebarnav-inactive-icon !important; } + &:after { display: none !important; } +} diff --git a/modules/backend/assets/less/layout/sidepanel.less b/modules/backend/assets/less/layout/sidepanel.less new file mode 100644 index 0000000..3771e83 --- /dev/null +++ b/modules/backend/assets/less/layout/sidepanel.less @@ -0,0 +1,97 @@ +// +// Side panel +// -------------------------------------------------- + +#layout-side-panel { + .fix-button { + position: absolute; + right: -25px; + top: 0; + display: none; + width: 25px; + height: 25px; + font-size: 13px; + background: #ecf0f1; + z-index: 120; + .opacity(0.5); + .border-radius(~'0 4px 4px 0'); + + i { + display: block; + text-align: center; + margin-top: 5px; + color: @color-scrollpanel-fix-button; + } + + &:hover { + text-decoration: none; + display: block; + .opacity(1)!important; + } + } + + &:hover { + .fix-button { + display: block; + } + } + + .fix-button-content-header .fix-button { + top: 46px; + } + + .sidepanel-content-header { + background: @brand-secondary-darker; + color: white; + font-size: 15px; + padding: 12px 20px 13px; + position: relative; + + &:after { + .triangle(down, 15px, 8px, @brand-secondary-darker); + position: absolute; + left: 14px; + bottom: -8px; + } + } +} + +body.side-panel-not-fixed { + #layout-side-panel { + display: none; + + .fix-button { + .opacity(0.5); + } + } +} + +body.display-side-panel { + #layout-side-panel { + display: block; + position: absolute; + // This needs to be higher than the dropdown overlay, otherwise the + // mouseout event fires and sidebar hides when opening a dropdown. + z-index: @zindex-dropdown; + width: 350px; + .box-shadow(3px 0px 3px 0 rgba(0, 0, 0, 0.1)); + } +} + +@media (min-width: @screen-md-min) { + body.side-panel-fix-shadow { + #layout-side-panel { + .box-shadow(none); + } + } +} + +.touch #layout-side-panel .fix-button { + display: none; +} + +@media (max-width: @screen-sm) { + #layout-side-panel .fix-button { + display: none; + } +} diff --git a/modules/backend/assets/less/winter.less b/modules/backend/assets/less/winter.less new file mode 100644 index 0000000..8c4bb2e --- /dev/null +++ b/modules/backend/assets/less/winter.less @@ -0,0 +1,56 @@ +// Vendor +@import "../vendor/sweet-alert/sweet-alert.less"; +@import "../vendor/jcrop/css/jquery.Jcrop.min.css"; +@import "../../../system/assets/vendor/prettify/prettify.css"; +@import "../../../system/assets/vendor/prettify/theme-desert.css"; + +// +// Winter Controls +// + +@import "core/boot.less"; +@import "controls/alert.less"; +@import "controls/global-notice.less"; +@import "controls/simplelist.less"; +@import "controls/scrollbar.less"; +@import "controls/filelist.less"; +@import "controls/common.less"; +@import "controls/reportwidgets.less"; +@import "controls/treelist.less"; +@import "controls/treeview.less"; +@import "controls/sidenav-tree.less"; +@import "controls/panels.less"; +@import "controls/selector-group.less"; +@import "controls/tree-path.less"; +@import "controls/namevaluelist.less"; +@import "controls/scrollpad.less"; +@import "controls/svg-icons.less"; +@import "controls/record-navigation.less"; + +// +// Winter Storm UI +// + +@import "../../../system/assets/ui/less/global.less"; + +// +// Combines layout and vendor styles +// + +// Core (shared elements) +@import "core/animations.less"; + +// Boot variables and mixins +@import "core/variables.less"; +@import "core/mixins.less"; + +// Layout +@import "layout/layout.less"; +@import "layout/flexlayout.less"; +@import "layout/mainmenu.less"; +@import "layout/sidenav.less"; +@import "layout/sidepanel.less"; +@import "layout/footer.less"; +@import "layout/outerlayout.less"; +@import "layout/fancylayout.less"; +@import "layout/flyout.less"; diff --git a/modules/backend/assets/ui/js/ajax/Handler.js b/modules/backend/assets/ui/js/ajax/Handler.js new file mode 100644 index 0000000..c7ea886 --- /dev/null +++ b/modules/backend/assets/ui/js/ajax/Handler.js @@ -0,0 +1,130 @@ +import { delegate } from 'jquery-events-to-dom-events'; + +/** + * Backend AJAX handler. + * + * This is a utility script that resolves some backwards-compatibility issues with the functionality + * that relies on the old framework, and ensures that Snowboard works well within the Backend + * environment. + * + * Functions: + * - Adds the "render" jQuery event to Snowboard requests that widgets use to initialise. + * - Ensures the CSRF token is included in requests. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +export default class Handler extends Snowboard.Singleton { + /** + * Event listeners. + * + * @returns {Object} + */ + listens() { + return { + ready: 'ready', + ajaxFetchOptions: 'ajaxFetchOptions', + ajaxUpdateComplete: 'ajaxUpdateComplete', + }; + } + + /** + * Ready handler. + * + * Fires off a "render" event. + */ + ready() { + if (!window.jQuery) { + return; + } + delegate('render'); + + // Add global event for rendering in Snowboard + delegate('render'); + document.addEventListener('$render', () => { + this.snowboard.globalEvent('render'); + }); + + // Add "render" event for backwards compatibility + window.jQuery(document).trigger('render'); + + // Add global event for rendering in Snowboard + document.addEventListener('$render', () => { + this.snowboard.globalEvent('render'); + }); + } + + /** + * Adds the jQuery AJAX prefilter that the old framework uses to inject the CSRF token in AJAX + * calls. + */ + addPrefilter() { + if (!window.jQuery) { + return; + } + + window.jQuery.ajaxPrefilter((options) => { + if (this.hasToken()) { + if (!options.headers) { + options.headers = {}; + } + options.headers['X-CSRF-TOKEN'] = this.getToken(); + } + }); + } + + /** + * Fetch options handler. + * + * Ensures that the CSRF token is included in Snowboard requests. + * + * @param {Object} options + */ + ajaxFetchOptions(options) { + if (this.hasToken()) { + options.headers['X-CSRF-TOKEN'] = this.getToken(); + } + } + + /** + * Update complete handler. + * + * Fires off a "render" event when partials are updated so that any widgets included in + * responses are correctly initialised. + */ + ajaxUpdateComplete() { + if (!window.jQuery) { + return; + } + + // Add "render" event for backwards compatibility + window.jQuery(document).trigger('render'); + } + + /** + * Determines if a CSRF token is available. + * + * @returns {Boolean} + */ + hasToken() { + const tokenElement = document.querySelector('meta[name="csrf-token"]'); + + if (!tokenElement) { + return false; + } + if (!tokenElement.hasAttribute('content')) { + return false; + } + + return true; + } + + /** + * Gets the CSRF token. + * + * @returns {String} + */ + getToken() { + return document.querySelector('meta[name="csrf-token"]').getAttribute('content'); + } +} diff --git a/modules/backend/assets/ui/js/build/backend.js b/modules/backend/assets/ui/js/build/backend.js new file mode 100644 index 0000000..fc5e4ef --- /dev/null +++ b/modules/backend/assets/ui/js/build/backend.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_wintercms_wn_backend_module=self.webpackChunk_wintercms_wn_backend_module||[]).push([[476],{286:function(e,t,n){var i=n(35),r=n(171);class s extends Snowboard.Singleton{listens(){return{ready:"ready",ajaxFetchOptions:"ajaxFetchOptions",ajaxUpdateComplete:"ajaxUpdateComplete"}}ready(){window.jQuery&&((0,r.M)("render"),(0,r.M)("render"),document.addEventListener("$render",()=>{this.snowboard.globalEvent("render")}),window.jQuery(document).trigger("render"),document.addEventListener("$render",()=>{this.snowboard.globalEvent("render")}))}addPrefilter(){window.jQuery&&window.jQuery.ajaxPrefilter(e=>{this.hasToken()&&(e.headers||(e.headers={}),e.headers["X-CSRF-TOKEN"]=this.getToken())})}ajaxFetchOptions(e){this.hasToken()&&(e.headers["X-CSRF-TOKEN"]=this.getToken())}ajaxUpdateComplete(){window.jQuery&&window.jQuery(document).trigger("render")}hasToken(){const e=document.querySelector('meta[name="csrf-token"]');return!!e&&!!e.hasAttribute("content")}getToken(){return document.querySelector('meta[name="csrf-token"]').getAttribute("content")}}class a extends Snowboard.PluginBase{construct(e,t){if(e instanceof Snowboard.PluginBase==!1)throw new Error("Event handling can only be applied to Snowboard classes.");if(!t)throw new Error("Event prefix is required.");this.instance=e,this.eventPrefix=t,this.events=[]}on(e,t){this.events.push({event:e,callback:t})}off(e,t){this.events=this.events.filter(n=>n.event!==e||n.callback!==t)}once(e,t){const n=this.events.push({event:e,callback:(...e)=>{t(...e),this.events.splice(n-1,1)}})}fire(e,...t){const n=this.events.filter(t=>t.event===e);let i=!1;n.forEach(e=>{i||!1===e.callback(...t)&&(i=!0)}),i||this.snowboard.globalEvent(`${this.eventPrefix}.${e}`,...t)}firePromise(e,...t){const n=this.events.filter(t=>t.event===e),i=n.filter(e=>null!==e,n.map(e=>e.callback(...t)));Promise.all(i).then(()=>{this.snowboard.globalPromiseEvent(`${this.eventPrefix}.${e}`,...t)})}}class o extends Snowboard.Singleton{construct(){this.registeredWidgets=[],this.elements=[],this.events={mutate:e=>this.onMutation(e)},this.observer=null}listens(){return{ready:"onReady",render:"onRender",ajaxUpdate:"onAjaxUpdate"}}register(e,t,n){this.registeredWidgets.push({control:e,widget:t,callback:n})}unregister(e){this.registeredWidgets=this.registeredWidgets.filter(t=>t.control!==e)}onReady(){this.initializeWidgets(document.body),this.observer||(this.observer=new MutationObserver(this.events.mutate),this.observer.observe(document.body,{childList:!0,subtree:!0}))}onRender(){this.initializeWidgets(document.body)}onAjaxUpdate(e){this.initializeWidgets(e)}initializeWidgets(e){this.registeredWidgets.forEach(t=>{const n=e.querySelectorAll(`[data-control="${t.control}"]:not([data-widget-initialized])`);n.length&&n.forEach(e=>{if(e.dataset.widgetInitialized)return;const n=this.snowboard[t.widget](e);this.elements.push({element:e,instance:n}),e.dataset.widgetInitialized=!0,this.snowboard.globalEvent("backend.widget.initialized",e,n),"function"==typeof t.callback&&t.callback(n,e)})})}getWidget(e){const t=this.elements.find(t=>t.element===e);return t?t.instance:null}onMutation(e){const t=e.filter(e=>e.removedNodes.length).map(e=>Array.from(e.removedNodes)).flat();t.length&&t.forEach(e=>{const t=this.elements.filter(t=>e.contains(t.element));t.length&&t.forEach(e=>{e.instance.destruct(),this.elements=this.elements.filter(t=>t!==e)})})}}if(void 0===window.Snowboard)throw new Error("Snowboard must be loaded in order to use the Backend UI.");(e=>{e.addPlugin("backend.ajax.handler",s),e.addPlugin("backend.ui.eventHandler",a),e.addPlugin("backend.ui.widgetHandler",o),e["backend.ajax.handler"]().addPrefilter(),window.AssetManager={load:(t,n)=>{e.assetLoader().load(t).then(()=>{n&&"function"==typeof n&&n()})}},window.assetManager=window.AssetManager})(window.Snowboard),window.Vue=i}},function(e){e.O(0,[810],function(){return t=286,e(e.s=t);var t});e.O()}]); \ No newline at end of file diff --git a/modules/backend/assets/ui/js/build/manifest.js b/modules/backend/assets/ui/js/build/manifest.js new file mode 100644 index 0000000..97118a3 --- /dev/null +++ b/modules/backend/assets/ui/js/build/manifest.js @@ -0,0 +1 @@ +!function(){"use strict";var n,e={},r={};function t(n){var o=r[n];if(void 0!==o)return o.exports;var i=r[n]={id:n,exports:{}};return e[n](i,i.exports,t),i.exports}t.m=e,n=[],t.O=function(e,r,o,i){if(!r){var u=1/0;for(l=0;l=i)&&Object.keys(t.O).every(function(n){return t.O[n](r[c])})?r.splice(c--,1):(f=!1,i0&&n[l-1][2]>i;l--)n[l]=n[l-1];n[l]=[r,o,i]},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,{a:e}),e},t.d=function(n,e){for(var r in e)t.o(e,r)&&!t.o(n,r)&&Object.defineProperty(n,r,{enumerable:!0,get:e[r]})},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},function(){var n={624:0};t.O.j=function(e){return 0===n[e]};var e=function(e,r){var o,i,u=r[0],f=r[1],c=r[2],a=0;if(u.some(function(e){return 0!==n[e]})){for(o in f)t.o(f,o)&&(t.m[o]=f[o]);if(c)var l=c(t)}for(e&&e(r);ae in t}n.r(r),n.d(r,{BaseTransition:function(){return xr},BaseTransitionPropsValidators:function(){return _r},Comment:function(){return Ci},DeprecationTypes:function(){return Fc},EffectScope:function(){return be},ErrorCodes:function(){return kn},ErrorTypeStrings:function(){return Oc},Fragment:function(){return Si},KeepAlive:function(){return no},ReactiveEffect:function(){return ke},Static:function(){return Ti},Suspense:function(){return mi},Teleport:function(){return dr},Text:function(){return xi},TrackOpTypes:function(){return fn},Transition:function(){return Gc},TransitionGroup:function(){return zl},TriggerOpTypes:function(){return dn},VueElement:function(){return Fl},assertNumber:function(){return Tn},callWithAsyncErrorHandling:function(){return An},callWithErrorHandling:function(){return wn},camelize:function(){return M},capitalize:function(){return L},cloneVNode:function(){return qi},compatUtils:function(){return $c},computed:function(){return kc},createApp:function(){return Ca},createBlock:function(){return Pi},createCommentVNode:function(){return Ki},createElementBlock:function(){return Mi},createElementVNode:function(){return Bi},createHydrationRenderer:function(){return Vs},createPropsRestProxy:function(){return es},createRenderer:function(){return Fs},createSSRApp:function(){return Ta},createSlots:function(){return Oo},createStaticVNode:function(){return zi},createTextVNode:function(){return Wi},createVNode:function(){return Ui},customRef:function(){return rn},defineAsyncComponent:function(){return Zr},defineComponent:function(){return Nr},defineCustomElement:function(){return Dl},defineEmits:function(){return Ho},defineExpose:function(){return jo},defineModel:function(){return zo},defineOptions:function(){return qo},defineProps:function(){return Uo},defineSSRCustomElement:function(){return Ll},defineSlots:function(){return Wo},devtools:function(){return Mc},effect:function(){return Fe},effectScope:function(){return Se},getCurrentInstance:function(){return rc},getCurrentScope:function(){return xe},getCurrentWatcher:function(){return gn},getTransitionRawChildren:function(){return Ar},guardReactiveProps:function(){return ji},h:function(){return Ec},handleError:function(){return Nn},hasInjectionContext:function(){return bs},hydrate:function(){return xa},hydrateOnIdle:function(){return Jr},hydrateOnInteraction:function(){return Xr},hydrateOnMediaQuery:function(){return Gr},hydrateOnVisible:function(){return Yr},initCustomFormatter:function(){return wc},initDirectivesForSSR:function(){return Aa},inject:function(){return _s},isMemoSame:function(){return Nc},isProxy:function(){return Ut},isReactive:function(){return Ft},isReadonly:function(){return Vt},isRef:function(){return zt},isRuntimeOnly:function(){return mc},isShallow:function(){return Bt},isVNode:function(){return Di},markRaw:function(){return jt},mergeDefaults:function(){return Qo},mergeModels:function(){return Zo},mergeProps:function(){return Xi},nextTick:function(){return $n},normalizeClass:function(){return X},normalizeProps:function(){return Q},normalizeStyle:function(){return z},onActivated:function(){return oo},onBeforeMount:function(){return po},onBeforeUnmount:function(){return vo},onBeforeUpdate:function(){return mo},onDeactivated:function(){return so},onErrorCaptured:function(){return xo},onMounted:function(){return ho},onRenderTracked:function(){return So},onRenderTriggered:function(){return bo},onScopeDispose:function(){return Ce},onServerPrefetch:function(){return _o},onUnmounted:function(){return yo},onUpdated:function(){return go},onWatcherCleanup:function(){return vn},openBlock:function(){return wi},popScopeId:function(){return Qn},provide:function(){return ys},proxyRefs:function(){return tn},pushScopeId:function(){return Xn},queuePostFlushCb:function(){return Bn},reactive:function(){return Mt},readonly:function(){return Dt},ref:function(){return Kt},registerRuntimeCompiler:function(){return hc},render:function(){return Sa},renderList:function(){return Ro},renderSlot:function(){return Mo},resolveComponent:function(){return ko},resolveDirective:function(){return Ao},resolveDynamicComponent:function(){return wo},resolveFilter:function(){return Lc},resolveTransitionHooks:function(){return Tr},setBlockTracking:function(){return Ri},setDevtoolsHook:function(){return Pc},setTransitionHooks:function(){return wr},shallowReactive:function(){return Pt},shallowReadonly:function(){return Lt},shallowRef:function(){return Jt},ssrContextKey:function(){return Ks},ssrUtils:function(){return Dc},stop:function(){return Ve},toDisplayString:function(){return he},toHandlerKey:function(){return $},toHandlers:function(){return Do},toRaw:function(){return Ht},toRef:function(){return ln},toRefs:function(){return on},toValue:function(){return Zt},transformVNodeArgs:function(){return $i},triggerRef:function(){return Xt},unref:function(){return Qt},useAttrs:function(){return Yo},useCssModule:function(){return Ul},useCssVars:function(){return ml},useHost:function(){return Vl},useId:function(){return Ir},useModel:function(){return ni},useSSRContext:function(){return Js},useShadowRoot:function(){return Bl},useSlots:function(){return Jo},useTemplateRef:function(){return Or},useTransitionState:function(){return vr},vModelCheckbox:function(){return ta},vModelDynamic:function(){return la},vModelRadio:function(){return ra},vModelSelect:function(){return oa},vModelText:function(){return ea},vShow:function(){return dl},version:function(){return Ic},warn:function(){return Rc},watch:function(){return Qs},watchEffect:function(){return Ys},watchPostEffect:function(){return Gs},watchSyncEffect:function(){return Xs},withAsyncContext:function(){return ts},withCtx:function(){return er},withDefaults:function(){return Ko},withDirectives:function(){return tr},withKeys:function(){return ma},withMemo:function(){return Ac},withModifiers:function(){return pa},withScopeId:function(){return Zn}});const s={},i=[],c=()=>{},l=()=>!1,a=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),u=e=>e.startsWith("onUpdate:"),f=Object.assign,d=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},p=Object.prototype.hasOwnProperty,h=(e,t)=>p.call(e,t),m=Array.isArray,g=e=>"[object Map]"===k(e),v=e=>"[object Set]"===k(e),y=e=>"[object Date]"===k(e),_=e=>"function"==typeof e,b=e=>"string"==typeof e,S=e=>"symbol"==typeof e,x=e=>null!==e&&"object"==typeof e,C=e=>(x(e)||_(e))&&_(e.then)&&_(e.catch),T=Object.prototype.toString,k=e=>T.call(e),E=e=>k(e).slice(8,-1),w=e=>"[object Object]"===k(e),A=e=>b(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,N=o(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),I=o("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),R=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},O=/-(\w)/g,M=R(e=>e.replace(O,(e,t)=>t?t.toUpperCase():"")),P=/\B([A-Z])/g,D=R(e=>e.replace(P,"-$1").toLowerCase()),L=R(e=>e.charAt(0).toUpperCase()+e.slice(1)),$=R(e=>e?`on${L(e)}`:""),F=(e,t)=>!Object.is(e,t),V=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},U=e=>{const t=parseFloat(e);return isNaN(t)?e:t},H=e=>{const t=b(e)?Number(e):NaN;return isNaN(t)?e:t};let j;const q=()=>j||(j="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==n.g?n.g:{});const W=o("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol");function z(e){if(m(e)){const t={};for(let n=0;n{if(e){const n=e.split(J);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function X(e){let t="";if(b(e))t=e;else if(m(e))for(let n=0;n?@[\\\]^`{|}~]/g;function ue(e,t){return e.replace(ae,e=>t?'"'===e?'\\\\\\"':`\\\\${e}`:`\\${e}`)}function fe(e,t){if(e===t)return!0;let n=y(e),r=y(t);if(n||r)return!(!n||!r)&&e.getTime()===t.getTime();if(n=S(e),r=S(t),n||r)return e===t;if(n=m(e),r=m(t),n||r)return!(!n||!r)&&function(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&rfe(e,t))}const pe=e=>!(!e||!0!==e.__v_isRef),he=e=>b(e)?e:null==e?"":m(e)||x(e)&&(e.toString===T||!_(e.toString))?pe(e)?he(e.value):JSON.stringify(e,me,2):String(e),me=(e,t)=>pe(t)?me(e,t.value):g(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],r)=>(e[ge(t,r)+" =>"]=n,e),{})}:v(t)?{[`Set(${t.size})`]:[...t.values()].map(e=>ge(e))}:S(t)?ge(t):!x(t)||m(t)||w(t)?t:String(t),ge=(e,t="")=>{var n;return S(e)?`Symbol(${null!=(n=e.description)?n:t})`:e};function ve(e){return null==e?"initial":"string"==typeof e?""===e?" ":e:("number"==typeof e&&Number.isFinite(e),String(e))}let ye,_e;class be{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=ye,!e&&ye&&(this.index=(ye.scopes||(ye.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){let e,t;if(this._isPaused=!0,this.scopes)for(e=0,t=this.scopes.length;e0&&0===--this._on&&(ye=this.prevScope,this.prevScope=void 0)}stop(e){if(this._active){let t,n;for(this._active=!1,t=0,n=this.effects.length;t0)return;if(we){let e=we;for(we=void 0;e;){const t=e.next;e.next=void 0,e.flags&=-9,e=t}}let e;for(;Ee;){let t=Ee;for(Ee=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,1&t.flags)try{t.trigger()}catch(t){e||(e=t)}t=n}}if(e)throw e}function Oe(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Me(e){let t,n=e.depsTail,r=n;for(;r;){const e=r.prevDep;-1===r.version?(r===n&&(n=e),Le(r),$e(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=e}e.deps=t,e.depsTail=n}function Pe(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(De(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function De(e){if(4&e.flags&&!(16&e.flags))return;if(e.flags&=-17,e.globalVersion===We)return;if(e.globalVersion=We,!e.isSSR&&128&e.flags&&(!e.deps&&!e._dirty||!Pe(e)))return;e.flags|=2;const t=e.dep,n=_e,r=Be;_e=e,Be=!0;try{Oe(e);const n=e.fn(e._value);(0===t.version||F(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{_e=n,Be=r,Me(e),e.flags&=-3}}function Le(e,t=!1){const{dep:n,prevSub:r,nextSub:o}=e;if(r&&(r.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)Le(e,!0)}t||--n.sc||!n.map||n.map.delete(n.key)}function $e(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}function Fe(e,t){e.effect instanceof ke&&(e=e.effect.fn);const n=new ke(e);t&&f(n,t);try{n.run()}catch(e){throw n.stop(),e}const r=n.run.bind(n);return r.effect=n,r}function Ve(e){e.effect.stop()}let Be=!0;const Ue=[];function He(){Ue.push(Be),Be=!1}function je(){const e=Ue.pop();Be=void 0===e||e}function qe(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const e=_e;_e=void 0;try{t()}finally{_e=e}}}let We=0;class ze{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Ke{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!_e||!Be||_e===this.computed)return;let t=this.activeLink;if(void 0===t||t.sub!==_e)t=this.activeLink=new ze(_e,this),_e.deps?(t.prevDep=_e.depsTail,_e.depsTail.nextDep=t,_e.depsTail=t):_e.deps=_e.depsTail=t,Je(t);else if(-1===t.version&&(t.version=this.version,t.nextDep)){const e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=_e.depsTail,t.nextDep=void 0,_e.depsTail.nextDep=t,_e.depsTail=t,_e.deps===t&&(_e.deps=e)}return t}trigger(e){this.version++,We++,this.notify(e)}notify(e){Ie();try{0;for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{Re()}}}function Je(e){if(e.dep.sc++,4&e.sub.flags){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let e=t.deps;e;e=e.nextDep)Je(e)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Ye=new WeakMap,Ge=Symbol(""),Xe=Symbol(""),Qe=Symbol("");function Ze(e,t,n){if(Be&&_e){let t=Ye.get(e);t||Ye.set(e,t=new Map);let r=t.get(n);r||(t.set(n,r=new Ke),r.map=t,r.key=n),r.track()}}function et(e,t,n,r,o,s){const i=Ye.get(e);if(!i)return void We++;const c=e=>{e&&e.trigger()};if(Ie(),"clear"===t)i.forEach(c);else{const o=m(e),s=o&&A(n);if(o&&"length"===n){const e=Number(r);i.forEach((t,n)=>{("length"===n||n===Qe||!S(n)&&n>=e)&&c(t)})}else switch((void 0!==n||i.has(void 0))&&c(i.get(n)),s&&c(i.get(Qe)),t){case"add":o?s&&c(i.get("length")):(c(i.get(Ge)),g(e)&&c(i.get(Xe)));break;case"delete":o||(c(i.get(Ge)),g(e)&&c(i.get(Xe)));break;case"set":g(e)&&c(i.get(Ge))}}Re()}function tt(e){const t=Ht(e);return t===e?t:(Ze(t,0,Qe),Bt(e)?t:t.map(qt))}function nt(e){return Ze(e=Ht(e),0,Qe),e}const rt={__proto__:null,[Symbol.iterator](){return ot(this,Symbol.iterator,qt)},concat(...e){return tt(this).concat(...e.map(e=>m(e)?tt(e):e))},entries(){return ot(this,"entries",e=>(e[1]=qt(e[1]),e))},every(e,t){return it(this,"every",e,t,void 0,arguments)},filter(e,t){return it(this,"filter",e,t,e=>e.map(qt),arguments)},find(e,t){return it(this,"find",e,t,qt,arguments)},findIndex(e,t){return it(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return it(this,"findLast",e,t,qt,arguments)},findLastIndex(e,t){return it(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return it(this,"forEach",e,t,void 0,arguments)},includes(...e){return lt(this,"includes",e)},indexOf(...e){return lt(this,"indexOf",e)},join(e){return tt(this).join(e)},lastIndexOf(...e){return lt(this,"lastIndexOf",e)},map(e,t){return it(this,"map",e,t,void 0,arguments)},pop(){return at(this,"pop")},push(...e){return at(this,"push",e)},reduce(e,...t){return ct(this,"reduce",e,t)},reduceRight(e,...t){return ct(this,"reduceRight",e,t)},shift(){return at(this,"shift")},some(e,t){return it(this,"some",e,t,void 0,arguments)},splice(...e){return at(this,"splice",e)},toReversed(){return tt(this).toReversed()},toSorted(e){return tt(this).toSorted(e)},toSpliced(...e){return tt(this).toSpliced(...e)},unshift(...e){return at(this,"unshift",e)},values(){return ot(this,"values",qt)}};function ot(e,t,n){const r=nt(e),o=r[t]();return r===e||Bt(e)||(o._next=o.next,o.next=()=>{const e=o._next();return e.value&&(e.value=n(e.value)),e}),o}const st=Array.prototype;function it(e,t,n,r,o,s){const i=nt(e),c=i!==e&&!Bt(e),l=i[t];if(l!==st[t]){const t=l.apply(e,s);return c?qt(t):t}let a=n;i!==e&&(c?a=function(t,r){return n.call(this,qt(t),r,e)}:n.length>2&&(a=function(t,r){return n.call(this,t,r,e)}));const u=l.call(i,a,r);return c&&o?o(u):u}function ct(e,t,n,r){const o=nt(e);let s=n;return o!==e&&(Bt(e)?n.length>3&&(s=function(t,r,o){return n.call(this,t,r,o,e)}):s=function(t,r,o){return n.call(this,t,qt(r),o,e)}),o[t](s,...r)}function lt(e,t,n){const r=Ht(e);Ze(r,0,Qe);const o=r[t](...n);return-1!==o&&!1!==o||!Ut(n[0])?o:(n[0]=Ht(n[0]),r[t](...n))}function at(e,t,n=[]){He(),Ie();const r=Ht(e)[t].apply(e,n);return Re(),je(),r}const ut=o("__proto__,__v_isRef,__isVue"),ft=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>"arguments"!==e&&"caller"!==e).map(e=>Symbol[e]).filter(S));function dt(e){S(e)||(e=String(e));const t=Ht(this);return Ze(t,0,e),t.hasOwnProperty(e)}class pt{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if("__v_skip"===t)return e.__v_skip;const r=this._isReadonly,o=this._isShallow;if("__v_isReactive"===t)return!r;if("__v_isReadonly"===t)return r;if("__v_isShallow"===t)return o;if("__v_raw"===t)return n===(r?o?Ot:Rt:o?It:Nt).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;const s=m(e);if(!r){let e;if(s&&(e=rt[t]))return e;if("hasOwnProperty"===t)return dt}const i=Reflect.get(e,t,zt(e)?e:n);return(S(t)?ft.has(t):ut(t))?i:(r||Ze(e,0,t),o?i:zt(i)?s&&A(t)?i:i.value:x(i)?r?Dt(i):Mt(i):i)}}class ht extends pt{constructor(e=!1){super(!1,e)}set(e,t,n,r){let o=e[t];if(!this._isShallow){const t=Vt(o);if(Bt(n)||Vt(n)||(o=Ht(o),n=Ht(n)),!m(e)&&zt(o)&&!zt(n))return!t&&(o.value=n,!0)}const s=m(e)&&A(t)?Number(t)e,St=e=>Reflect.getPrototypeOf(e);function xt(e){return function(...t){return"delete"!==e&&("clear"===e?void 0:this)}}function Ct(e,t){const n={get(n){const r=this.__v_raw,o=Ht(r),s=Ht(n);e||(F(n,s)&&Ze(o,0,n),Ze(o,0,s));const{has:i}=St(o),c=t?bt:e?Wt:qt;return i.call(o,n)?c(r.get(n)):i.call(o,s)?c(r.get(s)):void(r!==o&&r.get(n))},get size(){const t=this.__v_raw;return!e&&Ze(Ht(t),0,Ge),Reflect.get(t,"size",t)},has(t){const n=this.__v_raw,r=Ht(n),o=Ht(t);return e||(F(t,o)&&Ze(r,0,t),Ze(r,0,o)),t===o?n.has(t):n.has(t)||n.has(o)},forEach(n,r){const o=this,s=o.__v_raw,i=Ht(s),c=t?bt:e?Wt:qt;return!e&&Ze(i,0,Ge),s.forEach((e,t)=>n.call(r,c(e),c(t),o))}};f(n,e?{add:xt("add"),set:xt("set"),delete:xt("delete"),clear:xt("clear")}:{add(e){t||Bt(e)||Vt(e)||(e=Ht(e));const n=Ht(this);return St(n).has.call(n,e)||(n.add(e),et(n,"add",e,e)),this},set(e,n){t||Bt(n)||Vt(n)||(n=Ht(n));const r=Ht(this),{has:o,get:s}=St(r);let i=o.call(r,e);i||(e=Ht(e),i=o.call(r,e));const c=s.call(r,e);return r.set(e,n),i?F(n,c)&&et(r,"set",e,n):et(r,"add",e,n),this},delete(e){const t=Ht(this),{has:n,get:r}=St(t);let o=n.call(t,e);o||(e=Ht(e),o=n.call(t,e));r&&r.call(t,e);const s=t.delete(e);return o&&et(t,"delete",e,void 0),s},clear(){const e=Ht(this),t=0!==e.size,n=e.clear();return t&&et(e,"clear",void 0,void 0),n}});return["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=function(e,t,n){return function(...r){const o=this.__v_raw,s=Ht(o),i=g(s),c="entries"===e||e===Symbol.iterator&&i,l="keys"===e&&i,a=o[e](...r),u=n?bt:t?Wt:qt;return!t&&Ze(s,0,l?Xe:Ge),{next(){const{value:e,done:t}=a.next();return t?{value:e,done:t}:{value:c?[u(e[0]),u(e[1])]:u(e),done:t}},[Symbol.iterator](){return this}}}}(r,e,t)}),n}function Tt(e,t){const n=Ct(e,t);return(t,r,o)=>"__v_isReactive"===r?!e:"__v_isReadonly"===r?e:"__v_raw"===r?t:Reflect.get(h(n,r)&&r in t?n:t,r,o)}const kt={get:Tt(!1,!1)},Et={get:Tt(!1,!0)},wt={get:Tt(!0,!1)},At={get:Tt(!0,!0)};const Nt=new WeakMap,It=new WeakMap,Rt=new WeakMap,Ot=new WeakMap;function Mt(e){return Vt(e)?e:$t(e,!1,gt,kt,Nt)}function Pt(e){return $t(e,!1,yt,Et,It)}function Dt(e){return $t(e,!0,vt,wt,Rt)}function Lt(e){return $t(e,!0,_t,At,Ot)}function $t(e,t,n,r,o){if(!x(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const s=(i=e).__v_skip||!Object.isExtensible(i)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}(E(i));var i;if(0===s)return e;const c=o.get(e);if(c)return c;const l=new Proxy(e,2===s?r:n);return o.set(e,l),l}function Ft(e){return Vt(e)?Ft(e.__v_raw):!(!e||!e.__v_isReactive)}function Vt(e){return!(!e||!e.__v_isReadonly)}function Bt(e){return!(!e||!e.__v_isShallow)}function Ut(e){return!!e&&!!e.__v_raw}function Ht(e){const t=e&&e.__v_raw;return t?Ht(t):e}function jt(e){return!h(e,"__v_skip")&&Object.isExtensible(e)&&B(e,"__v_skip",!0),e}const qt=e=>x(e)?Mt(e):e,Wt=e=>x(e)?Dt(e):e;function zt(e){return!!e&&!0===e.__v_isRef}function Kt(e){return Yt(e,!1)}function Jt(e){return Yt(e,!0)}function Yt(e,t){return zt(e)?e:new Gt(e,t)}class Gt{constructor(e,t){this.dep=new Ke,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:Ht(e),this._value=t?e:qt(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){const t=this._rawValue,n=this.__v_isShallow||Bt(e)||Vt(e);e=n?e:Ht(e),F(e,t)&&(this._rawValue=e,this._value=n?e:qt(e),this.dep.trigger())}}function Xt(e){e.dep&&e.dep.trigger()}function Qt(e){return zt(e)?e.value:e}function Zt(e){return _(e)?e():Qt(e)}const en={get:(e,t,n)=>"__v_raw"===t?e:Qt(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return zt(o)&&!zt(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function tn(e){return Ft(e)?e:new Proxy(e,en)}class nn{constructor(e){this.__v_isRef=!0,this._value=void 0;const t=this.dep=new Ke,{get:n,set:r}=e(t.track.bind(t),t.trigger.bind(t));this._get=n,this._set=r}get value(){return this._value=this._get()}set value(e){this._set(e)}}function rn(e){return new nn(e)}function on(e){const t=m(e)?new Array(e.length):{};for(const n in e)t[n]=an(e,n);return t}class sn{constructor(e,t,n){this._object=e,this._key=t,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0}get value(){const e=this._object[this._key];return this._value=void 0===e?this._defaultValue:e}set value(e){this._object[this._key]=e}get dep(){return function(e,t){const n=Ye.get(e);return n&&n.get(t)}(Ht(this._object),this._key)}}class cn{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function ln(e,t,n){return zt(e)?e:_(e)?new cn(e):x(e)&&arguments.length>1?an(e,t,n):Kt(e)}function an(e,t,n){const r=e[t];return zt(r)?r:new sn(e,t,n)}class un{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new Ke(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=We-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(8&this.flags||_e===this))return Ne(this,!0),!0}get value(){const e=this.dep.track();return De(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}}const fn={GET:"get",HAS:"has",ITERATE:"iterate"},dn={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"},pn={},hn=new WeakMap;let mn;function gn(){return mn}function vn(e,t=!1,n=mn){if(n){let t=hn.get(n);t||hn.set(n,t=[]),t.push(e)}else 0}function yn(e,t=1/0,n){if(t<=0||!x(e)||e.__v_skip)return e;if((n=n||new Set).has(e))return e;if(n.add(e),t--,zt(e))yn(e.value,t,n);else if(m(e))for(let r=0;r{yn(e,t,n)});else if(w(e)){for(const r in e)yn(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&yn(e[r],t,n)}return e} +/** +* @vue/runtime-core v3.5.18 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +const _n=[];let bn=!1;function Sn(e,...t){if(bn)return;bn=!0,He();const n=_n.length?_n[_n.length-1].component:null,r=n&&n.appContext.config.warnHandler,o=function(){let e=_n[_n.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const r=e.component&&e.component.parent;e=r&&r.vnode}return t}();if(r)wn(r,n,11,[e+t.map(e=>{var t,n;return null!=(n=null==(t=e.toString)?void 0:t.call(e))?n:JSON.stringify(e)}).join(""),n&&n.proxy,o.map(({vnode:e})=>`at <${Cc(n,e.type)}>`).join("\n"),o]);else{const n=[`[Vue warn]: ${e}`,...t];o.length&&n.push("\n",...function(e){const t=[];return e.forEach((e,n)=>{t.push(...0===n?[]:["\n"],...function({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",r=!!e.component&&null==e.component.parent,o=` at <${Cc(e.component,e.type,r)}`,s=">"+n;return e.props?[o,...xn(e.props),s]:[o+s]}(e))}),t}(o)),console.warn(...n)}je(),bn=!1}function xn(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach(n=>{t.push(...Cn(n,e[n]))}),n.length>3&&t.push(" ..."),t}function Cn(e,t,n){return b(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):"number"==typeof t||"boolean"==typeof t||null==t?n?t:[`${e}=${t}`]:zt(t)?(t=Cn(e,Ht(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):_(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=Ht(t),n?t:[`${e}=`,t])}function Tn(e,t){}const kn={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE",APP_UNMOUNT_CLEANUP:16,16:"APP_UNMOUNT_CLEANUP"},En={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush",15:"component update",16:"app unmount cleanup function"};function wn(e,t,n,r){try{return r?e(...r):e()}catch(e){Nn(e,t,n)}}function An(e,t,n,r){if(_(e)){const o=wn(e,t,n,r);return o&&C(o)&&o.catch(e=>{Nn(e,t,n)}),o}if(m(e)){const o=[];for(let s=0;s=jn(n)?In.push(e):In.splice(function(e){let t=Rn+1,n=In.length;for(;t>>1,o=In[r],s=jn(o);sjn(e)-jn(t));if(On.length=0,Mn)return void Mn.push(...e);for(Mn=e,Pn=0;Pnnull==e.id?2&e.flags?-1:1/0:e.id;function qn(e){try{for(Rn=0;Rner;function er(e,t=Jn,n){if(!t)return e;if(e._n)return e;const r=(...n)=>{r._d&&Ri(-1);const o=Gn(t);let s;try{s=e(...n)}finally{Gn(o),r._d&&Ri(1)}return s};return r._n=!0,r._c=!0,r._d=!0,r}function tr(e,t){if(null===Jn)return e;const n=_c(Jn),r=e.dirs||(e.dirs=[]);for(let e=0;ee.__isTeleport,sr=e=>e&&(e.disabled||""===e.disabled),ir=e=>e&&(e.defer||""===e.defer),cr=e=>"undefined"!=typeof SVGElement&&e instanceof SVGElement,lr=e=>"function"==typeof MathMLElement&&e instanceof MathMLElement,ar=(e,t)=>{const n=e&&e.to;if(b(n)){if(t){return t(n)}return null}return n},ur={name:"Teleport",__isTeleport:!0,process(e,t,n,r,o,s,i,c,l,a){const{mc:u,pc:f,pbc:d,o:{insert:p,querySelector:h,createText:m,createComment:g}}=a,v=sr(t.props);let{shapeFlag:y,children:_,dynamicChildren:b}=t;if(null==e){const e=t.el=m(""),a=t.anchor=m("");p(e,n,r),p(a,n,r);const f=(e,t)=>{16&y&&(o&&o.isCE&&(o.ce._teleportTarget=e),u(_,e,t,o,s,i,c,l))},d=()=>{const e=t.target=ar(t.props,h),n=hr(e,t,m,p);e&&("svg"!==i&&cr(e)?i="svg":"mathml"!==i&&lr(e)&&(i="mathml"),v||(f(e,n),pr(t,!1)))};v&&(f(n,a),pr(t,!0)),ir(t.props)?(t.el.__isMounted=!1,$s(()=>{d(),delete t.el.__isMounted},s)):d()}else{if(ir(t.props)&&!1===e.el.__isMounted)return void $s(()=>{ur.process(e,t,n,r,o,s,i,c,l,a)},s);t.el=e.el,t.targetStart=e.targetStart;const u=t.anchor=e.anchor,p=t.target=e.target,m=t.targetAnchor=e.targetAnchor,g=sr(e.props),y=g?n:p,_=g?u:m;if("svg"===i||cr(p)?i="svg":("mathml"===i||lr(p))&&(i="mathml"),b?(d(e.dynamicChildren,b,y,o,s,i,c),qs(e,t,!0)):l||f(e,t,y,_,o,s,i,c,!1),v)g?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):fr(t,n,u,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const e=t.target=ar(t.props,h);e&&fr(t,e,null,a,0)}else g&&fr(t,p,m,a,1);pr(t,v)}},remove(e,t,n,{um:r,o:{remove:o}},s){const{shapeFlag:i,children:c,anchor:l,targetStart:a,targetAnchor:u,target:f,props:d}=e;if(f&&(o(a),o(u)),s&&o(l),16&i){const e=s||!sr(d);for(let o=0;o{e.isMounted=!0}),vo(()=>{e.isUnmounting=!0}),e}const yr=[Function,Array],_r={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:yr,onEnter:yr,onAfterEnter:yr,onEnterCancelled:yr,onBeforeLeave:yr,onLeave:yr,onAfterLeave:yr,onLeaveCancelled:yr,onBeforeAppear:yr,onAppear:yr,onAfterAppear:yr,onAppearCancelled:yr},br=e=>{const t=e.subTree;return t.component?br(t.component):t};function Sr(e){let t=e[0];if(e.length>1){let n=!1;for(const r of e)if(r.type!==Ci){0,t=r,n=!0;break}}return t}const xr={name:"BaseTransition",props:_r,setup(e,{slots:t}){const n=rc(),r=vr();return()=>{const o=t.default&&Ar(t.default(),!0);if(!o||!o.length)return;const s=Sr(o),i=Ht(e),{mode:c}=i;if(r.isLeaving)return kr(s);const l=Er(s);if(!l)return kr(s);let a=Tr(l,i,r,n,e=>a=e);l.type!==Ci&&wr(l,a);let u=n.subTree&&Er(n.subTree);if(u&&u.type!==Ci&&!Li(l,u)&&br(n).type!==Ci){let e=Tr(u,i,r,n);if(wr(u,e),"out-in"===c&&l.type!==Ci)return r.isLeaving=!0,e.afterLeave=()=>{r.isLeaving=!1,8&n.job.flags||n.update(),delete e.afterLeave,u=void 0},kr(s);"in-out"===c&&l.type!==Ci?e.delayLeave=(e,t,n)=>{Cr(r,u)[String(u.key)]=u,e[mr]=()=>{t(),e[mr]=void 0,delete a.delayedLeave,u=void 0},a.delayedLeave=()=>{n(),delete a.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return s}}};function Cr(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Tr(e,t,n,r,o){const{appear:s,mode:i,persisted:c=!1,onBeforeEnter:l,onEnter:a,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:d,onLeave:p,onAfterLeave:h,onLeaveCancelled:g,onBeforeAppear:v,onAppear:y,onAfterAppear:_,onAppearCancelled:b}=t,S=String(e.key),x=Cr(n,e),C=(e,t)=>{e&&An(e,r,9,t)},T=(e,t)=>{const n=t[1];C(e,t),m(e)?e.every(e=>e.length<=1)&&n():e.length<=1&&n()},k={mode:i,persisted:c,beforeEnter(t){let r=l;if(!n.isMounted){if(!s)return;r=v||l}t[mr]&&t[mr](!0);const o=x[S];o&&Li(e,o)&&o.el[mr]&&o.el[mr](),C(r,[t])},enter(e){let t=a,r=u,o=f;if(!n.isMounted){if(!s)return;t=y||a,r=_||u,o=b||f}let i=!1;const c=e[gr]=t=>{i||(i=!0,C(t?o:r,[e]),k.delayedLeave&&k.delayedLeave(),e[gr]=void 0)};t?T(t,[e,c]):c()},leave(t,r){const o=String(e.key);if(t[gr]&&t[gr](!0),n.isUnmounting)return r();C(d,[t]);let s=!1;const i=t[mr]=n=>{s||(s=!0,r(),C(n?g:h,[t]),t[mr]=void 0,x[o]===e&&delete x[o])};x[o]=e,p?T(p,[t,i]):i()},clone(e){const s=Tr(e,t,n,r,o);return o&&o(s),s}};return k}function kr(e){if(to(e))return(e=qi(e)).children=null,e}function Er(e){if(!to(e))return or(e.type)&&e.children?Sr(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(16&t)return n[0];if(32&t&&_(n.default))return n.default()}}function wr(e,t){6&e.shapeFlag&&e.component?(e.transition=t,wr(e.component.subTree,t)):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ar(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let e=0;ef({name:e.name},t,{setup:e}))():e}function Ir(){const e=rc();return e?(e.appContext.config.idPrefix||"v")+"-"+e.ids[0]+e.ids[1]++:""}function Rr(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Or(e){const t=rc(),n=Jt(null);if(t){const r=t.refs===s?t.refs={}:t.refs;Object.defineProperty(r,e,{enumerable:!0,get:()=>n.value,set:e=>n.value=e})}else 0;return n}function Mr(e,t,n,r,o=!1){if(m(e))return void e.forEach((e,s)=>Mr(e,t&&(m(t)?t[s]:t),n,r,o));if(Qr(r)&&!o)return void(512&r.shapeFlag&&r.type.__asyncResolved&&r.component.subTree.component&&Mr(e,t,n,r.component.subTree));const i=4&r.shapeFlag?_c(r.component):r.el,c=o?null:i,{i:l,r:a}=e;const u=t&&t.r,f=l.refs===s?l.refs={}:l.refs,p=l.setupState,g=Ht(p),v=p===s?()=>!1:e=>h(g,e);if(null!=u&&u!==a&&(b(u)?(f[u]=null,v(u)&&(p[u]=null)):zt(u)&&(u.value=null)),_(a))wn(a,l,12,[c,f]);else{const t=b(a),r=zt(a);if(t||r){const s=()=>{if(e.f){const n=t?v(a)?p[a]:f[a]:a.value;o?m(n)&&d(n,i):m(n)?n.includes(i)||n.push(i):t?(f[a]=[i],v(a)&&(p[a]=f[a])):(a.value=[i],e.k&&(f[e.k]=a.value))}else t?(f[a]=c,v(a)&&(p[a]=c)):r&&(a.value=c,e.k&&(f[e.k]=c))};c?(s.id=-1,$s(s,n)):s()}else 0}}let Pr=!1;const Dr=()=>{Pr||(console.error("Hydration completed but contains mismatches."),Pr=!0)},Lr=e=>{if(1===e.nodeType)return(e=>e.namespaceURI.includes("svg")&&"foreignObject"!==e.tagName)(e)?"svg":(e=>e.namespaceURI.includes("MathML"))(e)?"mathml":void 0},$r=e=>8===e.nodeType;function Fr(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:s,parentNode:i,remove:c,insert:l,createComment:u}}=e,f=(n,r,c,a,u,_=!1)=>{_=_||!!r.dynamicChildren;const b=$r(n)&&"["===n.data,S=()=>m(n,r,c,a,u,b),{type:x,ref:C,shapeFlag:T,patchFlag:k}=r;let E=n.nodeType;r.el=n,-2===k&&(_=!1,r.dynamicChildren=null);let w=null;switch(x){case xi:3!==E?""===r.children?(l(r.el=o(""),i(n),n),w=n):w=S():(n.data!==r.children&&(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&Sn("Hydration text mismatch in",n.parentNode,`\n - rendered on server: ${JSON.stringify(n.data)}\n - expected on client: ${JSON.stringify(r.children)}`),Dr(),n.data=r.children),w=s(n));break;case Ci:y(n)?(w=s(n),v(r.el=n.content.firstChild,n,c)):w=8!==E||b?S():s(n);break;case Ti:if(b&&(E=(n=s(n)).nodeType),1===E||3===E){w=n;const e=!r.children.length;for(let t=0;t{i=i||!!t.dynamicChildren;const{type:l,props:u,patchFlag:f,shapeFlag:d,dirs:h,transition:m}=t,g="input"===l||"option"===l;if(g||-1!==f){h&&nr(t,null,n,"created");let l,_=!1;if(y(e)){_=js(null,m)&&n&&n.vnode.props&&n.vnode.props.appear;const r=e.content.firstChild;if(_){const e=r.getAttribute("class");e&&(r.$cls=e),m.beforeEnter(r)}v(r,e,n),t.el=e=r}if(16&d&&(!u||!u.innerHTML&&!u.textContent)){let r=p(e.firstChild,t,e,n,o,s,i),l=!1;for(;r;){Wr(e,1)||(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&!l&&(Sn("Hydration children mismatch on",e,"\nServer rendered element contains more child nodes than client vdom."),l=!0),Dr());const t=r;r=r.nextSibling,c(t)}}else if(8&d){let n=t.children;"\n"!==n[0]||"PRE"!==e.tagName&&"TEXTAREA"!==e.tagName||(n=n.slice(1)),e.textContent!==n&&(Wr(e,0)||(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&Sn("Hydration text content mismatch on",e,`\n - rendered on server: ${e.textContent}\n - expected on client: ${t.children}`),Dr()),e.textContent=t.children)}if(u)if(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__||g||!i||48&f){const o=e.tagName.includes("-");for(const s in u)!__VUE_PROD_HYDRATION_MISMATCH_DETAILS__||h&&h.some(e=>e.dir.created)||!Vr(e,s,u[s],t,n)||Dr(),(g&&(s.endsWith("value")||"indeterminate"===s)||a(s)&&!N(s)||"."===s[0]||o)&&r(e,s,null,u[s],void 0,n)}else if(u.onClick)r(e,"onClick",null,u.onClick,void 0,n);else if(4&f&&Ft(u.style))for(const e in u.style)u.style[e];(l=u&&u.onVnodeBeforeMount)&&Qi(l,n,t),h&&nr(t,null,n,"beforeMount"),((l=u&&u.onVnodeMounted)||h||_)&&_i(()=>{l&&Qi(l,n,t),_&&m.enter(e),h&&nr(t,null,n,"mounted")},o)}return e.nextSibling},p=(e,t,r,i,c,a,u)=>{u=u||!!t.dynamicChildren;const d=t.children,p=d.length;let h=!1;for(let t=0;t{const{slotScopeIds:a}=t;a&&(o=o?o.concat(a):a);const f=i(e),d=p(s(e),t,f,n,r,o,c);return d&&$r(d)&&"]"===d.data?s(t.anchor=d):(Dr(),l(t.anchor=u("]"),f,d),d)},m=(e,t,r,o,l,a)=>{if(Wr(e.parentElement,1)||(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&Sn("Hydration node mismatch:\n- rendered on server:",e,3===e.nodeType?"(text)":$r(e)&&"["===e.data?"(start of fragment)":"","\n- expected on client:",t.type),Dr()),t.el=null,a){const t=g(e);for(;;){const n=s(e);if(!n||n===t)break;c(n)}}const u=s(e),f=i(e);return c(e),n(null,t,f,u,r,o,Lr(f),l),r&&(r.vnode.el=t.el,di(r,t.el)),u},g=(e,t="[",n="]")=>{let r=0;for(;e;)if((e=s(e))&&$r(e)&&(e.data===t&&r++,e.data===n)){if(0===r)return s(e);r--}return e},v=(e,t,n)=>{const r=t.parentNode;r&&r.replaceChild(e,t);let o=n;for(;o;)o.vnode.el===t&&(o.vnode.el=o.subTree.el=e),o=o.parent},y=e=>1===e.nodeType&&"TEMPLATE"===e.tagName;return[(e,t)=>{if(!t.hasChildNodes())return __VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&Sn("Attempting to hydrate existing markup but container is empty. Performing full mount instead."),n(null,e,t),Hn(),void(t._vnode=e);f(t.firstChild,e,null,null,null),Hn(),t._vnode=e},f]}function Vr(e,t,n,r,o){let s,i,c,l;if("class"===t)e.$cls?(c=e.$cls,delete e.$cls):c=e.getAttribute("class"),l=X(n),function(e,t){if(e.size!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;return!0}(Br(c||""),Br(l))||(s=2,i="class");else if("style"===t){c=e.getAttribute("style")||"",l=b(n)?n:function(e){if(!e)return"";if(b(e))return e;let t="";for(const n in e){const r=e[n];(b(r)||"number"==typeof r)&&(t+=`${n.startsWith("--")?n:D(n)}:${r};`)}return t}(z(n));const t=Ur(c),a=Ur(l);if(r.dirs)for(const{dir:e,value:t}of r.dirs)"show"!==e.name||t||a.set("display","none");o&&Hr(o,r,a),function(e,t){if(e.size!==t.size)return!1;for(const[n,r]of e)if(r!==t.get(n))return!1;return!0}(t,a)||(s=3,i="style")}else(e instanceof SVGElement&&le(t)||e instanceof HTMLElement&&(se(t)||ce(t)))&&(se(t)?(c=e.hasAttribute(t),l=ie(n)):null==n?(c=e.hasAttribute(t),l=!1):(c=e.hasAttribute(t)?e.getAttribute(t):"value"===t&&"TEXTAREA"===e.tagName&&e.value,l=!!function(e){if(null==e)return!1;const t=typeof e;return"string"===t||"number"===t||"boolean"===t}(n)&&String(n)),c!==l&&(s=4,i=t));if(null!=s&&!Wr(e,s)){const t=e=>!1===e?"(not rendered)":`${i}="${e}"`;return Sn(`Hydration ${qr[s]} mismatch on`,e,`\n - rendered on server: ${t(c)}\n - expected on client: ${t(l)}\n Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.\n You should fix the source of the mismatch.`),!0}return!1}function Br(e){return new Set(e.trim().split(/\s+/))}function Ur(e){const t=new Map;for(const n of e.split(";")){let[e,r]=n.split(":");e=e.trim(),r=r&&r.trim(),e&&r&&t.set(e,r)}return t}function Hr(e,t,n){const r=e.subTree;if(e.getCssVars&&(t===r||r&&r.type===Si&&r.children.includes(t))){const t=e.getCssVars();for(const e in t){const r=ve(t[e]);n.set(`--${ue(e,!1)}`,r)}}t===r&&e.parent&&Hr(e.parent,e.vnode,n)}const jr="data-allow-mismatch",qr={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function Wr(e,t){if(0===t||1===t)for(;e&&!e.hasAttribute(jr);)e=e.parentElement;const n=e&&e.getAttribute(jr);if(null==n)return!1;if(""===n)return!0;{const e=n.split(",");return!(0!==t||!e.includes("children"))||e.includes(qr[t])}}const zr=q().requestIdleCallback||(e=>setTimeout(e,1)),Kr=q().cancelIdleCallback||(e=>clearTimeout(e)),Jr=(e=1e4)=>t=>{const n=zr(t,{timeout:e});return()=>Kr(n)};const Yr=e=>(t,n)=>{const r=new IntersectionObserver(e=>{for(const n of e)if(n.isIntersecting){r.disconnect(),t();break}},e);return n(e=>{if(e instanceof Element)return function(e){const{top:t,left:n,bottom:r,right:o}=e.getBoundingClientRect(),{innerHeight:s,innerWidth:i}=window;return(t>0&&t0&&r0&&n0&&or.disconnect()},Gr=e=>t=>{if(e){const n=matchMedia(e);if(!n.matches)return n.addEventListener("change",t,{once:!0}),()=>n.removeEventListener("change",t);t()}},Xr=(e=[])=>(t,n)=>{b(e)&&(e=[e]);let r=!1;const o=e=>{r||(r=!0,s(),t(),e.target.dispatchEvent(new e.constructor(e.type,e)))},s=()=>{n(t=>{for(const n of e)t.removeEventListener(n,o)})};return n(t=>{for(const n of e)t.addEventListener(n,o,{once:!0})}),s};const Qr=e=>!!e.type.__asyncLoader; +/*! #__NO_SIDE_EFFECTS__ */function Zr(e){_(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,hydrate:s,timeout:i,suspensible:c=!0,onError:l}=e;let a,u=null,f=0;const d=()=>{let e;return u||(e=u=t().catch(e=>{if(e=e instanceof Error?e:new Error(String(e)),l)return new Promise((t,n)=>{l(e,()=>t((f++,u=null,d())),()=>n(e),f+1)});throw e}).then(t=>e!==u&&u?u:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),a=t,t)))};return Nr({name:"AsyncComponentWrapper",__asyncLoader:d,__asyncHydrate(e,t,n){let r=!1;(t.bu||(t.bu=[])).push(()=>r=!0);const o=()=>{r||n()},i=s?()=>{const n=s(o,t=>function(e,t){if($r(e)&&"["===e.data){let n=1,r=e.nextSibling;for(;r;){if(1===r.nodeType){if(!1===t(r))break}else if($r(r))if("]"===r.data){if(0===--n)break}else"["===r.data&&n++;r=r.nextSibling}}else t(e)}(e,t));n&&(t.bum||(t.bum=[])).push(n)}:o;a?i():d().then(()=>!t.isUnmounted&&i())},get __asyncResolved(){return a},setup(){const e=nc;if(Rr(e),a)return()=>eo(a,e);const t=t=>{u=null,Nn(t,e,13,!r)};if(c&&e.suspense||fc)return d().then(t=>()=>eo(t,e)).catch(e=>(t(e),()=>r?Ui(r,{error:e}):null));const s=Kt(!1),l=Kt(),f=Kt(!!o);return o&&setTimeout(()=>{f.value=!1},o),null!=i&&setTimeout(()=>{if(!s.value&&!l.value){const e=new Error(`Async component timed out after ${i}ms.`);t(e),l.value=e}},i),d().then(()=>{s.value=!0,e.parent&&to(e.parent.vnode)&&e.parent.update()}).catch(e=>{t(e),l.value=e}),()=>s.value&&a?eo(a,e):l.value&&r?Ui(r,{error:l.value}):n&&!f.value?Ui(n):void 0}})}function eo(e,t){const{ref:n,props:r,children:o,ce:s}=t.vnode,i=Ui(e,r,o);return i.ref=n,i.ce=s,delete t.vnode.ce,i}const to=e=>e.type.__isKeepAlive,no={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=rc(),r=n.ctx;if(!r.renderer)return()=>{const e=t.default&&t.default();return e&&1===e.length?e[0]:e};const o=new Map,s=new Set;let i=null;const c=n.suspense,{renderer:{p:l,m:a,um:u,o:{createElement:f}}}=r,d=f("div");function p(e){lo(e),u(e,n,c,!0)}function h(e){o.forEach((t,n)=>{const r=xc(t.type);r&&!e(r)&&m(n)})}function m(e){const t=o.get(e);!t||i&&Li(t,i)?i&&lo(i):p(t),o.delete(e),s.delete(e)}r.activate=(e,t,n,r,o)=>{const s=e.component;a(e,t,n,0,c),l(s.vnode,e,t,n,s,c,r,e.slotScopeIds,o),$s(()=>{s.isDeactivated=!1,s.a&&V(s.a);const t=e.props&&e.props.onVnodeMounted;t&&Qi(t,s.parent,e)},c)},r.deactivate=e=>{const t=e.component;zs(t.m),zs(t.a),a(e,d,null,1,c),$s(()=>{t.da&&V(t.da);const n=e.props&&e.props.onVnodeUnmounted;n&&Qi(n,t.parent,e),t.isDeactivated=!0},c)},Qs(()=>[e.include,e.exclude],([e,t])=>{e&&h(t=>ro(e,t)),t&&h(e=>!ro(t,e))},{flush:"post",deep:!0});let g=null;const v=()=>{null!=g&&(pi(n.subTree.type)?$s(()=>{o.set(g,ao(n.subTree))},n.subTree.suspense):o.set(g,ao(n.subTree)))};return ho(v),go(v),vo(()=>{o.forEach(e=>{const{subTree:t,suspense:r}=n,o=ao(t);if(e.type===o.type&&e.key===o.key){lo(o);const e=o.component.da;return void(e&&$s(e,r))}p(e)})}),()=>{if(g=null,!t.default)return i=null;const n=t.default(),r=n[0];if(n.length>1)return i=null,n;if(!(Di(r)&&(4&r.shapeFlag||128&r.shapeFlag)))return i=null,r;let c=ao(r);if(c.type===Ci)return i=null,c;const l=c.type,a=xc(Qr(c)?c.type.__asyncResolved||{}:l),{include:u,exclude:f,max:d}=e;if(u&&(!a||!ro(u,a))||f&&a&&ro(f,a))return c.shapeFlag&=-257,i=c,r;const p=null==c.key?l:c.key,h=o.get(p);return c.el&&(c=qi(c),128&r.shapeFlag&&(r.ssContent=c)),g=p,h?(c.el=h.el,c.component=h.component,c.transition&&wr(c,c.transition),c.shapeFlag|=512,s.delete(p),s.add(p)):(s.add(p),d&&s.size>parseInt(d,10)&&m(s.values().next().value)),c.shapeFlag|=256,i=c,pi(r.type)?r:c}}};function ro(e,t){return m(e)?e.some(e=>ro(e,t)):b(e)?e.split(",").includes(t):"[object RegExp]"===k(e)&&(e.lastIndex=0,e.test(t))}function oo(e,t){io(e,"a",t)}function so(e,t){io(e,"da",t)}function io(e,t,n=nc){const r=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(uo(t,r,n),n){let e=n.parent;for(;e&&e.parent;)to(e.parent.vnode)&&co(r,t,n,e),e=e.parent}}function co(e,t,n,r){const o=uo(t,e,r,!0);yo(()=>{d(r[t],o)},n)}function lo(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function ao(e){return 128&e.shapeFlag?e.ssContent:e}function uo(e,t,n=nc,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...r)=>{He();const o=ic(n),s=An(t,n,e,r);return o(),je(),s});return r?o.unshift(s):o.push(s),s}}const fo=e=>(t,n=nc)=>{fc&&"sp"!==e||uo(e,(...e)=>t(...e),n)},po=fo("bm"),ho=fo("m"),mo=fo("bu"),go=fo("u"),vo=fo("bum"),yo=fo("um"),_o=fo("sp"),bo=fo("rtg"),So=fo("rtc");function xo(e,t=nc){uo("ec",e,t)}const Co="components",To="directives";function ko(e,t){return No(Co,e,!0,t)||e}const Eo=Symbol.for("v-ndc");function wo(e){return b(e)?No(Co,e,!1)||e:e||Eo}function Ao(e){return No(To,e)}function No(e,t,n=!0,r=!1){const o=Jn||nc;if(o){const n=o.type;if(e===Co){const e=xc(n,!1);if(e&&(e===t||e===M(t)||e===L(M(t))))return n}const s=Io(o[e]||n[e],t)||Io(o.appContext[e],t);return!s&&r?n:s}}function Io(e,t){return e&&(e[t]||e[M(t)]||e[L(M(t))])}function Ro(e,t,n,r){let o;const s=n&&n[r],i=m(e);if(i||b(e)){let n=!1,r=!1;i&&Ft(e)&&(n=!Bt(e),r=Vt(e),e=nt(e)),o=new Array(e.length);for(let i=0,c=e.length;it(e,n,void 0,s&&s[n]));else{const n=Object.keys(e);o=new Array(n.length);for(let r=0,i=n.length;r{const t=r.fn(...e);return t&&(t.key=r.key),t}:r.fn)}return e}function Mo(e,t,n={},r,o){if(Jn.ce||Jn.parent&&Qr(Jn.parent)&&Jn.parent.ce)return"default"!==t&&(n.name=t),wi(),Pi(Si,null,[Ui("slot",n,r&&r())],64);let s=e[t];s&&s._c&&(s._d=!1),wi();const i=s&&Po(s(n)),c=n.key||i&&i.key,l=Pi(Si,{key:(c&&!S(c)?c:`_${t}`)+(!i&&r?"_fb":"")},i||(r?r():[]),i&&1===e._?64:-2);return!o&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),s&&s._c&&(s._d=!0),l}function Po(e){return e.some(e=>!Di(e)||e.type!==Ci&&!(e.type===Si&&!Po(e.children)))?e:null}function Do(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:$(r)]=e[r];return n}const Lo=e=>e?lc(e)?_c(e):Lo(e.parent):null,$o=f(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Lo(e.parent),$root:e=>Lo(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>is(e),$forceUpdate:e=>e.f||(e.f=()=>{Fn(e.update)}),$nextTick:e=>e.n||(e.n=$n.bind(e.proxy)),$watch:e=>ei.bind(e)}),Fo=(e,t)=>e!==s&&!e.__isScriptSetup&&h(e,t),Vo={get({_:e},t){if("__v_skip"===t)return!0;const{ctx:n,setupState:r,data:o,props:i,accessCache:c,type:l,appContext:a}=e;let u;if("$"!==t[0]){const l=c[t];if(void 0!==l)switch(l){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(Fo(r,t))return c[t]=1,r[t];if(o!==s&&h(o,t))return c[t]=2,o[t];if((u=e.propsOptions[0])&&h(u,t))return c[t]=3,i[t];if(n!==s&&h(n,t))return c[t]=4,n[t];ns&&(c[t]=0)}}const f=$o[t];let d,p;return f?("$attrs"===t&&Ze(e.attrs,0,""),f(e)):(d=l.__cssModules)&&(d=d[t])?d:n!==s&&h(n,t)?(c[t]=4,n[t]):(p=a.config.globalProperties,h(p,t)?p[t]:void 0)},set({_:e},t,n){const{data:r,setupState:o,ctx:i}=e;return Fo(o,t)?(o[t]=n,!0):r!==s&&h(r,t)?(r[t]=n,!0):!h(e.props,t)&&(("$"!==t[0]||!(t.slice(1)in e))&&(i[t]=n,!0))},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:i}},c){let l;return!!n[c]||e!==s&&h(e,c)||Fo(t,c)||(l=i[0])&&h(l,c)||h(r,c)||h($o,c)||h(o.config.globalProperties,c)},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:h(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};const Bo=f({},Vo,{get(e,t){if(t!==Symbol.unscopables)return Vo.get(e,t,e)},has(e,t){return"_"!==t[0]&&!W(t)}});function Uo(){return null}function Ho(){return null}function jo(e){0}function qo(e){0}function Wo(){return null}function zo(){0}function Ko(e,t){return null}function Jo(){return Go("useSlots").slots}function Yo(){return Go("useAttrs").attrs}function Go(e){const t=rc();return t.setupContext||(t.setupContext=yc(t))}function Xo(e){return m(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}function Qo(e,t){const n=Xo(e);for(const e in t){if(e.startsWith("__skip"))continue;let r=n[e];r?m(r)||_(r)?r=n[e]={type:r,default:t[e]}:r.default=t[e]:null===r&&(r=n[e]={default:t[e]}),r&&t[`__skip_${e}`]&&(r.skipFactory=!0)}return n}function Zo(e,t){return e&&t?m(e)&&m(t)?e.concat(t):f({},Xo(e),Xo(t)):e||t}function es(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function ts(e){const t=rc();let n=e();return cc(),C(n)&&(n=n.catch(e=>{throw ic(t),e})),[n,()=>ic(t)]}let ns=!0;function rs(e){const t=is(e),n=e.proxy,r=e.ctx;ns=!1,t.beforeCreate&&os(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:i,watch:l,provide:a,inject:u,created:f,beforeMount:d,mounted:p,beforeUpdate:h,updated:g,activated:v,deactivated:y,beforeDestroy:b,beforeUnmount:S,destroyed:C,unmounted:T,render:k,renderTracked:E,renderTriggered:w,errorCaptured:A,serverPrefetch:N,expose:I,inheritAttrs:R,components:O,directives:M,filters:P}=t;if(u&&function(e,t){m(e)&&(e=us(e));for(const n in e){const r=e[n];let o;o=x(r)?"default"in r?_s(r.from||n,r.default,!0):_s(r.from||n):_s(r),zt(o)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>o.value,set:e=>o.value=e}):t[n]=o}}(u,r,null),i)for(const e in i){const t=i[e];_(t)&&(r[e]=t.bind(n))}if(o){0;const t=o.call(n,n);0,x(t)&&(e.data=Mt(t))}if(ns=!0,s)for(const e in s){const t=s[e],o=_(t)?t.bind(n,n):_(t.get)?t.get.bind(n,n):c;0;const i=!_(t)&&_(t.set)?t.set.bind(n):c,l=kc({get:o,set:i});Object.defineProperty(r,e,{enumerable:!0,configurable:!0,get:()=>l.value,set:e=>l.value=e})}if(l)for(const e in l)ss(l[e],r,n,e);if(a){const e=_(a)?a.call(n):a;Reflect.ownKeys(e).forEach(t=>{ys(t,e[t])})}function D(e,t){m(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(f&&os(f,e,"c"),D(po,d),D(ho,p),D(mo,h),D(go,g),D(oo,v),D(so,y),D(xo,A),D(So,E),D(bo,w),D(vo,S),D(yo,T),D(_o,N),m(I))if(I.length){const t=e.exposed||(e.exposed={});I.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||(e.exposed={});k&&e.render===c&&(e.render=k),null!=R&&(e.inheritAttrs=R),O&&(e.components=O),M&&(e.directives=M),N&&Rr(e)}function os(e,t,n){An(m(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function ss(e,t,n,r){let o=r.includes(".")?ti(n,r):()=>n[r];if(b(e)){const n=t[e];_(n)&&Qs(o,n)}else if(_(e))Qs(o,e.bind(n));else if(x(e))if(m(e))e.forEach(e=>ss(e,t,n,r));else{const r=_(e.handler)?e.handler.bind(n):t[e.handler];_(r)&&Qs(o,r,e)}else 0}function is(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,c=s.get(t);let l;return c?l=c:o.length||n||r?(l={},o.length&&o.forEach(e=>cs(l,e,i,!0)),cs(l,t,i)):l=t,x(t)&&s.set(t,l),l}function cs(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&cs(e,s,n,!0),o&&o.forEach(t=>cs(e,t,n,!0));for(const o in t)if(r&&"expose"===o);else{const r=ls[o]||n&&n[o];e[o]=r?r(e[o],t[o]):t[o]}return e}const ls={data:as,props:ps,emits:ps,methods:ds,computed:ds,beforeCreate:fs,created:fs,beforeMount:fs,mounted:fs,beforeUpdate:fs,updated:fs,beforeDestroy:fs,beforeUnmount:fs,destroyed:fs,unmounted:fs,activated:fs,deactivated:fs,errorCaptured:fs,serverPrefetch:fs,components:ds,directives:ds,watch:function(e,t){if(!e)return t;if(!t)return e;const n=f(Object.create(null),e);for(const r in t)n[r]=fs(e[r],t[r]);return n},provide:as,inject:function(e,t){return ds(us(e),us(t))}};function as(e,t){return t?e?function(){return f(_(e)?e.call(this,this):e,_(t)?t.call(this,this):t)}:t:e}function us(e){if(m(e)){const t={};for(let n=0;n1)return n&&_(t)?t.call(r&&r.proxy):t}else 0}function bs(){return!(!rc()&&!vs)}const Ss={},xs=()=>Object.create(Ss),Cs=e=>Object.getPrototypeOf(e)===Ss;function Ts(e,t,n,r){const[o,i]=e.propsOptions;let c,l=!1;if(t)for(let s in t){if(N(s))continue;const a=t[s];let u;o&&h(o,u=M(s))?i&&i.includes(u)?(c||(c={}))[u]=a:n[u]=a:ii(e.emitsOptions,s)||s in r&&a===r[s]||(r[s]=a,l=!0)}if(i){const t=Ht(n),r=c||s;for(let s=0;s{u=!0;const[n,r]=ws(e,t,!0);f(l,n),r&&a.push(...r)};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}if(!c&&!u)return x(e)&&r.set(e,i),i;if(m(c))for(let e=0;e"_"===e||"__"===e||"_ctx"===e||"$stable"===e,Is=e=>m(e)?e.map(Ji):[Ji(e)],Rs=(e,t,n)=>{if(t._n)return t;const r=er((...e)=>Is(t(...e)),n);return r._c=!1,r},Os=(e,t,n)=>{const r=e._ctx;for(const n in e){if(Ns(n))continue;const o=e[n];if(_(o))t[n]=Rs(0,o,r);else if(null!=o){0;const e=Is(o);t[n]=()=>e}}},Ms=(e,t)=>{const n=Is(t);e.slots.default=()=>n},Ps=(e,t,n)=>{for(const r in t)!n&&Ns(r)||(e[r]=t[r])},Ds=(e,t,n)=>{const r=e.slots=xs();if(32&e.vnode.shapeFlag){const e=t.__;e&&B(r,"__",e,!0);const o=t._;o?(Ps(r,t,n),n&&B(r,"_",o,!0)):Os(t,r)}else t&&Ms(e,t)},Ls=(e,t,n)=>{const{vnode:r,slots:o}=e;let i=!0,c=s;if(32&r.shapeFlag){const e=t._;e?n&&1===e?i=!1:Ps(o,t,n):(i=!t.$stable,Os(t,o)),c=t}else t&&(Ms(e,t),c={default:1});if(i)for(const e in o)Ns(e)||null!=c[e]||delete o[e]};const $s=_i;function Fs(e){return Bs(e)}function Vs(e){return Bs(e,Fr)}function Bs(e,t){"boolean"!=typeof __VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&(q().__VUE_PROD_HYDRATION_MISMATCH_DETAILS__=!1);q().__VUE__=!0;const{insert:n,remove:r,patchProp:o,createElement:l,createText:a,createComment:u,setText:f,setElementText:d,parentNode:p,nextSibling:g,setScopeId:v=c,insertStaticContent:y}=e,_=(e,t,n,r=null,o=null,s=null,i=void 0,c=null,l=!!t.dynamicChildren)=>{if(e===t)return;e&&!Li(e,t)&&(r=X(e),z(e,o,s,!0),e=null),-2===t.patchFlag&&(l=!1,t.dynamicChildren=null);const{type:a,ref:u,shapeFlag:f}=t;switch(a){case xi:b(e,t,n,r);break;case Ci:S(e,t,n,r);break;case Ti:null==e&&x(t,n,r,i);break;case Si:O(e,t,n,r,o,s,i,c,l);break;default:1&f?T(e,t,n,r,o,s,i,c,l):6&f?P(e,t,n,r,o,s,i,c,l):(64&f||128&f)&&a.process(e,t,n,r,o,s,i,c,l,ee)}null!=u&&o?Mr(u,e&&e.ref,s,t||e,!t):null==u&&e&&null!=e.ref&&Mr(e.ref,null,s,e,!0)},b=(e,t,r,o)=>{if(null==e)n(t.el=a(t.children),r,o);else{const n=t.el=e.el;t.children!==e.children&&f(n,t.children)}},S=(e,t,r,o)=>{null==e?n(t.el=u(t.children||""),r,o):t.el=e.el},x=(e,t,n,r)=>{[e.el,e.anchor]=y(e.children,t,n,r,e.el,e.anchor)},C=({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=g(e),r(e),e=n;r(t)},T=(e,t,n,r,o,s,i,c,l)=>{"svg"===t.type?i="svg":"math"===t.type&&(i="mathml"),null==e?k(t,n,r,o,s,i,c,l):A(e,t,o,s,i,c,l)},k=(e,t,r,s,i,c,a,u)=>{let f,p;const{props:h,shapeFlag:m,transition:g,dirs:v}=e;if(f=e.el=l(e.type,c,h&&h.is,h),8&m?d(f,e.children):16&m&&w(e.children,f,null,s,i,Us(e,c),a,u),v&&nr(e,null,s,"created"),E(f,e,e.scopeId,a,s),h){for(const e in h)"value"===e||N(e)||o(f,e,null,h[e],c,s);"value"in h&&o(f,"value",null,h.value,c),(p=h.onVnodeBeforeMount)&&Qi(p,s,e)}v&&nr(e,null,s,"beforeMount");const y=js(i,g);y&&g.beforeEnter(f),n(f,t,r),((p=h&&h.onVnodeMounted)||y||v)&&$s(()=>{p&&Qi(p,s,e),y&&g.enter(f),v&&nr(e,null,s,"mounted")},i)},E=(e,t,n,r,o)=>{if(n&&v(e,n),r)for(let t=0;t{for(let a=l;a{const a=t.el=e.el;let{patchFlag:u,dynamicChildren:f,dirs:p}=t;u|=16&e.patchFlag;const h=e.props||s,m=t.props||s;let g;if(n&&Hs(n,!1),(g=m.onVnodeBeforeUpdate)&&Qi(g,n,t,e),p&&nr(t,e,n,"beforeUpdate"),n&&Hs(n,!0),(h.innerHTML&&null==m.innerHTML||h.textContent&&null==m.textContent)&&d(a,""),f?I(e.dynamicChildren,f,a,n,r,Us(t,i),c):l||U(e,t,a,null,n,r,Us(t,i),c,!1),u>0){if(16&u)R(a,h,m,n,i);else if(2&u&&h.class!==m.class&&o(a,"class",null,m.class,i),4&u&&o(a,"style",h.style,m.style,i),8&u){const e=t.dynamicProps;for(let t=0;t{g&&Qi(g,n,t,e),p&&nr(t,e,n,"updated")},r)},I=(e,t,n,r,o,s,i)=>{for(let c=0;c{if(t!==n){if(t!==s)for(const s in t)N(s)||s in n||o(e,s,t[s],null,i,r);for(const s in n){if(N(s))continue;const c=n[s],l=t[s];c!==l&&"value"!==s&&o(e,s,l,c,i,r)}"value"in n&&o(e,"value",t.value,n.value,i)}},O=(e,t,r,o,s,i,c,l,u)=>{const f=t.el=e?e.el:a(""),d=t.anchor=e?e.anchor:a("");let{patchFlag:p,dynamicChildren:h,slotScopeIds:m}=t;m&&(l=l?l.concat(m):m),null==e?(n(f,r,o),n(d,r,o),w(t.children||[],r,d,s,i,c,l,u)):p>0&&64&p&&h&&e.dynamicChildren?(I(e.dynamicChildren,h,r,s,i,c,l),(null!=t.key||s&&t===s.subTree)&&qs(e,t,!0)):U(e,t,r,d,s,i,c,l,u)},P=(e,t,n,r,o,s,i,c,l)=>{t.slotScopeIds=c,null==e?512&t.shapeFlag?o.ctx.activate(t,n,r,i,l):L(t,n,r,o,s,i,l):$(e,t,l)},L=(e,t,n,r,o,s,i)=>{const c=e.component=tc(e,r,o);if(to(e)&&(c.ctx.renderer=ee),dc(c,!1,i),c.asyncDep){if(o&&o.registerDep(c,F,i),!e.el){const r=c.subTree=Ui(Ci);S(null,r,t,n),e.placeholder=r.el}}else F(c,e,t,n,o,s,i)},$=(e,t,n)=>{const r=t.component=e.component;if(function(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:c,patchFlag:l}=t,a=s.emitsOptions;0;if(t.dirs||t.transition)return!0;if(!(n&&l>=0))return!(!o&&!c||c&&c.$stable)||r!==i&&(r?!i||fi(r,i,a):!!i);if(1024&l)return!0;if(16&l)return r?fi(r,i,a):!!i;if(8&l){const e=t.dynamicProps;for(let t=0;t{const c=()=>{if(e.isMounted){let{next:t,bu:n,u:r,parent:l,vnode:a}=e;{const n=Ws(e);if(n)return t&&(t.el=a.el,B(e,t,i)),void n.asyncDep.then(()=>{e.isUnmounted||c()})}let u,f=t;0,Hs(e,!1),t?(t.el=a.el,B(e,t,i)):t=a,n&&V(n),(u=t.props&&t.props.onVnodeBeforeUpdate)&&Qi(u,l,t,a),Hs(e,!0);const d=ci(e);0;const h=e.subTree;e.subTree=d,_(h,d,p(h.el),X(h),e,o,s),t.el=d.el,null===f&&di(e,d.el),r&&$s(r,o),(u=t.props&&t.props.onVnodeUpdated)&&$s(()=>Qi(u,l,t,a),o)}else{let i;const{el:c,props:l}=t,{bm:a,m:u,parent:f,root:d,type:p}=e,h=Qr(t);if(Hs(e,!1),a&&V(a),!h&&(i=l&&l.onVnodeBeforeMount)&&Qi(i,f,t),Hs(e,!0),c&&ne){const t=()=>{e.subTree=ci(e),ne(c,e.subTree,e,o,null)};h&&p.__asyncHydrate?p.__asyncHydrate(c,e,t):t()}else{d.ce&&!1!==d.ce._def.shadowRoot&&d.ce._injectChildStyle(p);const i=e.subTree=ci(e);0,_(null,i,n,r,e,o,s),t.el=i.el}if(u&&$s(u,o),!h&&(i=l&&l.onVnodeMounted)){const e=t;$s(()=>Qi(i,f,e),o)}(256&t.shapeFlag||f&&Qr(f.vnode)&&256&f.vnode.shapeFlag)&&e.a&&$s(e.a,o),e.isMounted=!0,t=n=r=null}};e.scope.on();const l=e.effect=new ke(c);e.scope.off();const a=e.update=l.run.bind(l),u=e.job=l.runIfDirty.bind(l);u.i=e,u.id=e.uid,l.scheduler=()=>Fn(u),Hs(e,!0),a()},B=(e,t,n)=>{t.component=e;const r=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,c=Ht(o),[l]=e.propsOptions;let a=!1;if(!(r||i>0)||16&i){let r;Ts(e,t,o,s)&&(a=!0);for(const s in c)t&&(h(t,s)||(r=D(s))!==s&&h(t,r))||(l?!n||void 0===n[s]&&void 0===n[r]||(o[s]=ks(l,c,s,void 0,e,!0)):delete o[s]);if(s!==c)for(const e in s)t&&h(t,e)||(delete s[e],a=!0)}else if(8&i){const n=e.vnode.dynamicProps;for(let r=0;r{const a=e&&e.children,u=e?e.shapeFlag:0,f=t.children,{patchFlag:p,shapeFlag:h}=t;if(p>0){if(128&p)return void j(a,f,n,r,o,s,i,c,l);if(256&p)return void H(a,f,n,r,o,s,i,c,l)}8&h?(16&u&&G(a,o,s),f!==a&&d(n,f)):16&u?16&h?j(a,f,n,r,o,s,i,c,l):G(a,o,s,!0):(8&u&&d(n,""),16&h&&w(f,n,r,o,s,i,c,l))},H=(e,t,n,r,o,s,c,l,a)=>{t=t||i;const u=(e=e||i).length,f=t.length,d=Math.min(u,f);let p;for(p=0;pf?G(e,o,s,!0,!1,d):w(t,n,r,o,s,c,l,a,d)},j=(e,t,n,r,o,s,c,l,a)=>{let u=0;const f=t.length;let d=e.length-1,p=f-1;for(;u<=d&&u<=p;){const r=e[u],i=t[u]=a?Yi(t[u]):Ji(t[u]);if(!Li(r,i))break;_(r,i,n,null,o,s,c,l,a),u++}for(;u<=d&&u<=p;){const r=e[d],i=t[p]=a?Yi(t[p]):Ji(t[p]);if(!Li(r,i))break;_(r,i,n,null,o,s,c,l,a),d--,p--}if(u>d){if(u<=p){const e=p+1,i=ep)for(;u<=d;)z(e[u],o,s,!0),u++;else{const h=u,m=u,g=new Map;for(u=m;u<=p;u++){const e=t[u]=a?Yi(t[u]):Ji(t[u]);null!=e.key&&g.set(e.key,u)}let v,y=0;const b=p-m+1;let S=!1,x=0;const C=new Array(b);for(u=0;u=b){z(r,o,s,!0);continue}let i;if(null!=r.key)i=g.get(r.key);else for(v=m;v<=p;v++)if(0===C[v-m]&&Li(r,t[v])){i=v;break}void 0===i?z(r,o,s,!0):(C[i-m]=u+1,i>=x?x=i:S=!0,_(r,t[i],n,null,o,s,c,l,a),y++)}const T=S?function(e){const t=e.slice(),n=[0];let r,o,s,i,c;const l=e.length;for(r=0;r>1,e[n[c]]0&&(t[r]=n[s-1]),n[s]=r)}}s=n.length,i=n[s-1];for(;s-- >0;)n[s]=i,i=t[i];return n}(C):i;for(v=T.length-1,u=b-1;u>=0;u--){const e=m+u,i=t[e],d=t[e+1],p=e+1{const{el:c,type:l,transition:a,children:u,shapeFlag:f}=e;if(6&f)return void W(e.component.subTree,t,o,s);if(128&f)return void e.suspense.move(t,o,s);if(64&f)return void l.move(e,t,o,ee);if(l===Si){n(c,t,o);for(let e=0;e{let s;for(;e&&e!==t;)s=g(e),n(e,r,o),e=s;n(t,r,o)})(e,t,o);if(2!==s&&1&f&&a)if(0===s)a.beforeEnter(c),n(c,t,o),$s(()=>a.enter(c),i);else{const{leave:s,delayLeave:i,afterLeave:l}=a,u=()=>{e.ctx.isUnmounted?r(c):n(c,t,o)},f=()=>{s(c,()=>{u(),l&&l()})};i?i(c,u,f):f()}else n(c,t,o)},z=(e,t,n,r=!1,o=!1)=>{const{type:s,props:i,ref:c,children:l,dynamicChildren:a,shapeFlag:u,patchFlag:f,dirs:d,cacheIndex:p}=e;if(-2===f&&(o=!1),null!=c&&(He(),Mr(c,null,n,e,!0),je()),null!=p&&(t.renderCache[p]=void 0),256&u)return void t.ctx.deactivate(e);const h=1&u&&d,m=!Qr(e);let g;if(m&&(g=i&&i.onVnodeBeforeUnmount)&&Qi(g,t,e),6&u)Y(e.component,n,r);else{if(128&u)return void e.suspense.unmount(n,r);h&&nr(e,null,t,"beforeUnmount"),64&u?e.type.remove(e,t,n,ee,r):a&&!a.hasOnce&&(s!==Si||f>0&&64&f)?G(a,t,n,!1,!0):(s===Si&&384&f||!o&&16&u)&&G(l,t,n),r&&K(e)}(m&&(g=i&&i.onVnodeUnmounted)||h)&&$s(()=>{g&&Qi(g,t,e),h&&nr(e,null,t,"unmounted")},n)},K=e=>{const{type:t,el:n,anchor:o,transition:s}=e;if(t===Si)return void J(n,o);if(t===Ti)return void C(e);const i=()=>{r(n),s&&!s.persisted&&s.afterLeave&&s.afterLeave()};if(1&e.shapeFlag&&s&&!s.persisted){const{leave:t,delayLeave:r}=s,o=()=>t(n,i);r?r(e.el,i,o):o()}else i()},J=(e,t)=>{let n;for(;e!==t;)n=g(e),r(e),e=n;r(t)},Y=(e,t,n)=>{const{bum:r,scope:o,job:s,subTree:i,um:c,m:l,a:a,parent:u,slots:{__:f}}=e;zs(l),zs(a),r&&V(r),u&&m(f)&&f.forEach(e=>{u.renderCache[e]=void 0}),o.stop(),s&&(s.flags|=8,z(i,e,t,n)),c&&$s(c,t),$s(()=>{e.isUnmounted=!0},t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},G=(e,t,n,r=!1,o=!1,s=0)=>{for(let i=s;i{if(6&e.shapeFlag)return X(e.component.subTree);if(128&e.shapeFlag)return e.suspense.next();const t=g(e.anchor||e.el),n=t&&t[rr];return n?g(n):t};let Q=!1;const Z=(e,t,n)=>{null==e?t._vnode&&z(t._vnode,null,null,!0):_(t._vnode||null,e,t,null,null,null,n),t._vnode=e,Q||(Q=!0,Un(),Hn(),Q=!1)},ee={p:_,um:z,m:W,r:K,mt:L,mc:w,pc:U,pbc:I,n:X,o:e};let te,ne;return t&&([te,ne]=t(ee)),{render:Z,hydrate:te,createApp:gs(Z,te)}}function Us({type:e,props:t},n){return"svg"===n&&"foreignObject"===e||"mathml"===n&&"annotation-xml"===e&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Hs({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function js(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function qs(e,t,n=!1){const r=e.children,o=t.children;if(m(r)&&m(o))for(let e=0;e{{const e=_s(Ks);return e}};function Ys(e,t){return Zs(e,null,t)}function Gs(e,t){return Zs(e,null,{flush:"post"})}function Xs(e,t){return Zs(e,null,{flush:"sync"})}function Qs(e,t,n){return Zs(e,t,n)}function Zs(e,t,n=s){const{immediate:r,deep:o,flush:i,once:l}=n;const a=f({},n);const u=t&&r||!t&&"post"!==i;let p;if(fc)if("sync"===i){const e=Js();p=e.__watcherHandles||(e.__watcherHandles=[])}else if(!u){const e=()=>{};return e.stop=c,e.resume=c,e.pause=c,e}const h=nc;a.call=(e,t,n)=>An(e,h,t,n);let g=!1;"post"===i?a.scheduler=e=>{$s(e,h&&h.suspense)}:"sync"!==i&&(g=!0,a.scheduler=(e,t)=>{t?e():Fn(e)}),a.augmentJob=e=>{t&&(e.flags|=4),g&&(e.flags|=2,h&&(e.id=h.uid,e.i=h))};const v=function(e,t,n=s){const{immediate:r,deep:o,once:i,scheduler:l,augmentJob:a,call:u}=n,f=e=>o?e:Bt(e)||!1===o||0===o?yn(e,1):yn(e);let p,h,g,v,y=!1,b=!1;if(zt(e)?(h=()=>e.value,y=Bt(e)):Ft(e)?(h=()=>f(e),y=!0):m(e)?(b=!0,y=e.some(e=>Ft(e)||Bt(e)),h=()=>e.map(e=>zt(e)?e.value:Ft(e)?f(e):_(e)?u?u(e,2):e():void 0)):h=_(e)?t?u?()=>u(e,2):e:()=>{if(g){He();try{g()}finally{je()}}const t=mn;mn=p;try{return u?u(e,3,[v]):e(v)}finally{mn=t}}:c,t&&o){const e=h,t=!0===o?1/0:o;h=()=>yn(e(),t)}const S=xe(),x=()=>{p.stop(),S&&S.active&&d(S.effects,p)};if(i&&t){const e=t;t=(...t)=>{e(...t),x()}}let C=b?new Array(e.length).fill(pn):pn;const T=e=>{if(1&p.flags&&(p.dirty||e))if(t){const e=p.run();if(o||y||(b?e.some((e,t)=>F(e,C[t])):F(e,C))){g&&g();const n=mn;mn=p;try{const n=[e,C===pn?void 0:b&&C[0]===pn?[]:C,v];C=e,u?u(t,3,n):t(...n)}finally{mn=n}}}else p.run()};return a&&a(T),p=new ke(h),p.scheduler=l?()=>l(T,!1):T,v=e=>vn(e,!1,p),g=p.onStop=()=>{const e=hn.get(p);if(e){if(u)u(e,4);else for(const t of e)t();hn.delete(p)}},t?r?T(!0):C=p.run():l?l(T.bind(null,!0),!0):p.run(),x.pause=p.pause.bind(p),x.resume=p.resume.bind(p),x.stop=x,x}(e,t,a);return fc&&(p?p.push(v):u&&v()),v}function ei(e,t,n){const r=this.proxy,o=b(e)?e.includes(".")?ti(r,e):()=>r[e]:e.bind(r,r);let s;_(t)?s=t:(s=t.handler,n=t);const i=ic(this),c=Zs(o,s.bind(r),n);return i(),c}function ti(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e{let a,u,f=s;return Xs(()=>{const t=e[o];F(a,t)&&(a=t,l())}),{get(){return c(),n.get?n.get(a):a},set(e){const c=n.set?n.set(e):e;if(!(F(c,a)||f!==s&&F(e,f)))return;const d=r.vnode.props;d&&(t in d||o in d||i in d)&&(`onUpdate:${t}`in d||`onUpdate:${o}`in d||`onUpdate:${i}`in d)||(a=e,l()),r.emit(`update:${t}`,c),F(e,c)&&F(e,f)&&!F(c,u)&&l(),f=e,u=c}}});return l[Symbol.iterator]=()=>{let e=0;return{next(){return e<2?{value:e++?c||s:l,done:!1}:{done:!0}}}},l}const ri=(e,t)=>"modelValue"===t||"model-value"===t?e.modelModifiers:e[`${t}Modifiers`]||e[`${M(t)}Modifiers`]||e[`${D(t)}Modifiers`];function oi(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||s;let o=n;const i=t.startsWith("update:"),c=i&&ri(r,t.slice(7));let l;c&&(c.trim&&(o=n.map(e=>b(e)?e.trim():e)),c.number&&(o=n.map(U)));let a=r[l=$(t)]||r[l=$(M(t))];!a&&i&&(a=r[l=$(D(t))]),a&&An(a,e,6,o);const u=r[l+"Once"];if(u){if(e.emitted){if(e.emitted[l])return}else e.emitted={};e.emitted[l]=!0,An(u,e,6,o)}}function si(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(void 0!==o)return o;const s=e.emits;let i={},c=!1;if(!_(e)){const r=e=>{const n=si(e,t,!0);n&&(c=!0,f(i,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return s||c?(m(s)?s.forEach(e=>i[e]=null):f(i,s),x(e)&&r.set(e,i),i):(x(e)&&r.set(e,null),null)}function ii(e,t){return!(!e||!a(t))&&(t=t.slice(2).replace(/Once$/,""),h(e,t[0].toLowerCase()+t.slice(1))||h(e,D(t))||h(e,t))}function ci(e){const{type:t,vnode:n,proxy:r,withProxy:o,propsOptions:[s],slots:i,attrs:c,emit:l,render:a,renderCache:f,props:d,data:p,setupState:h,ctx:m,inheritAttrs:g}=e,v=Gn(e);let y,_;try{if(4&n.shapeFlag){const e=o||r,t=e;y=Ji(a.call(t,e,f,d,h,p,m)),_=c}else{const e=t;0,y=Ji(e.length>1?e(d,{attrs:c,slots:i,emit:l}):e(d,null)),_=t.props?c:ai(c)}}catch(t){ki.length=0,Nn(t,e,1),y=Ui(Ci)}let b=y;if(_&&!1!==g){const e=Object.keys(_),{shapeFlag:t}=b;e.length&&7&t&&(s&&e.some(u)&&(_=ui(_,s)),b=qi(b,_,!1,!0))}return n.dirs&&(b=qi(b,null,!1,!0),b.dirs=b.dirs?b.dirs.concat(n.dirs):n.dirs),n.transition&&wr(b,n.transition),y=b,Gn(v),y}function li(e,t=!0){let n;for(let t=0;t{let t;for(const n in e)("class"===n||"style"===n||a(n))&&((t||(t={}))[n]=e[n]);return t},ui=(e,t)=>{const n={};for(const r in e)u(r)&&r.slice(9)in t||(n[r]=e[r]);return n};function fi(e,t,n){const r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let o=0;oe.__isSuspense;let hi=0;const mi={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,s,i,c,l,a){if(null==e)!function(e,t,n,r,o,s,i,c,l){const{p:a,o:{createElement:u}}=l,f=u("div"),d=e.suspense=vi(e,o,r,t,f,n,s,i,c,l);a(null,d.pendingBranch=e.ssContent,f,null,r,d,s,i),d.deps>0?(gi(e,"onPending"),gi(e,"onFallback"),a(null,e.ssFallback,t,n,r,null,s,i),bi(d,e.ssFallback)):d.resolve(!1,!0)}(t,n,r,o,s,i,c,l,a);else{if(s&&s.deps>0&&!e.suspense.isInFallback)return t.suspense=e.suspense,t.suspense.vnode=t,void(t.el=e.el);!function(e,t,n,r,o,s,i,c,{p:l,um:a,o:{createElement:u}}){const f=t.suspense=e.suspense;f.vnode=t,t.el=e.el;const d=t.ssContent,p=t.ssFallback,{activeBranch:h,pendingBranch:m,isInFallback:g,isHydrating:v}=f;if(m)f.pendingBranch=d,Li(d,m)?(l(m,d,f.hiddenContainer,null,o,f,s,i,c),f.deps<=0?f.resolve():g&&(v||(l(h,p,n,r,o,null,s,i,c),bi(f,p)))):(f.pendingId=hi++,v?(f.isHydrating=!1,f.activeBranch=m):a(m,o,f),f.deps=0,f.effects.length=0,f.hiddenContainer=u("div"),g?(l(null,d,f.hiddenContainer,null,o,f,s,i,c),f.deps<=0?f.resolve():(l(h,p,n,r,o,null,s,i,c),bi(f,p))):h&&Li(d,h)?(l(h,d,n,r,o,f,s,i,c),f.resolve(!0)):(l(null,d,f.hiddenContainer,null,o,f,s,i,c),f.deps<=0&&f.resolve()));else if(h&&Li(d,h))l(h,d,n,r,o,f,s,i,c),bi(f,d);else if(gi(t,"onPending"),f.pendingBranch=d,512&d.shapeFlag?f.pendingId=d.component.suspenseId:f.pendingId=hi++,l(null,d,f.hiddenContainer,null,o,f,s,i,c),f.deps<=0)f.resolve();else{const{timeout:e,pendingId:t}=f;e>0?setTimeout(()=>{f.pendingId===t&&f.fallback(p)},e):0===e&&f.fallback(p)}}(e,t,n,r,o,i,c,l,a)}},hydrate:function(e,t,n,r,o,s,i,c,l){const a=t.suspense=vi(t,r,n,e.parentNode,document.createElement("div"),null,o,s,i,c,!0),u=l(e,a.pendingBranch=t.ssContent,n,a,s,i);0===a.deps&&a.resolve(!1,!0);return u},normalize:function(e){const{shapeFlag:t,children:n}=e,r=32&t;e.ssContent=yi(r?n.default:n),e.ssFallback=r?yi(n.fallback):Ui(Ci)}};function gi(e,t){const n=e.props&&e.props[t];_(n)&&n()}function vi(e,t,n,r,o,s,i,c,l,a,u=!1){const{p:f,m:d,um:p,n:h,o:{parentNode:m,remove:g}}=a;let v;const y=function(e){const t=e.props&&e.props.suspensible;return null!=t&&!1!==t}(e);y&&t&&t.pendingBranch&&(v=t.pendingId,t.deps++);const _=e.props?H(e.props.timeout):void 0;const b=s,S={vnode:e,parent:t,parentComponent:n,namespace:i,container:r,hiddenContainer:o,deps:0,pendingId:hi++,timeout:"number"==typeof _?_:-1,activeBranch:null,pendingBranch:null,isInFallback:!u,isHydrating:u,isUnmounted:!1,effects:[],resolve(e=!1,n=!1){const{vnode:r,activeBranch:o,pendingBranch:i,pendingId:c,effects:l,parentComponent:a,container:u}=S;let f=!1;S.isHydrating?S.isHydrating=!1:e||(f=o&&i.transition&&"out-in"===i.transition.mode,f&&(o.transition.afterLeave=()=>{c===S.pendingId&&(d(i,u,s===b?h(o):s,0),Bn(l))}),o&&(m(o.el)===u&&(s=h(o)),p(o,a,S,!0)),f||d(i,u,s,0)),bi(S,i),S.pendingBranch=null,S.isInFallback=!1;let g=S.parent,_=!1;for(;g;){if(g.pendingBranch){g.effects.push(...l),_=!0;break}g=g.parent}_||f||Bn(l),S.effects=[],y&&t&&t.pendingBranch&&v===t.pendingId&&(t.deps--,0!==t.deps||n||t.resolve()),gi(r,"onResolve")},fallback(e){if(!S.pendingBranch)return;const{vnode:t,activeBranch:n,parentComponent:r,container:o,namespace:s}=S;gi(t,"onFallback");const i=h(n),a=()=>{S.isInFallback&&(f(null,e,o,i,r,null,s,c,l),bi(S,e))},u=e.transition&&"out-in"===e.transition.mode;u&&(n.transition.afterLeave=a),S.isInFallback=!0,p(n,r,null,!0),u||a()},move(e,t,n){S.activeBranch&&d(S.activeBranch,e,t,n),S.container=e},next(){return S.activeBranch&&h(S.activeBranch)},registerDep(e,t,n){const r=!!S.pendingBranch;r&&S.deps++;const o=e.vnode.el;e.asyncDep.catch(t=>{Nn(t,e,0)}).then(s=>{if(e.isUnmounted||S.isUnmounted||S.pendingId!==e.suspenseId)return;e.asyncResolved=!0;const{vnode:c}=e;pc(e,s,!1),o&&(c.el=o);const l=!o&&e.subTree.el;t(e,c,m(o||e.subTree.el),o?null:h(e.subTree),S,i,n),l&&g(l),di(e,c.el),r&&0===--S.deps&&S.resolve()})},unmount(e,t){S.isUnmounted=!0,S.activeBranch&&p(S.activeBranch,n,e,t),S.pendingBranch&&p(S.pendingBranch,n,e,t)}};return S}function yi(e){let t;if(_(e)){const n=Ii&&e._c;n&&(e._d=!1,wi()),e=e(),n&&(e._d=!0,t=Ei,Ai())}if(m(e)){const t=li(e);0,e=t}return e=Ji(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(t=>t!==e)),e}function _i(e,t){t&&t.pendingBranch?m(e)?t.effects.push(...e):t.effects.push(e):Bn(e)}function bi(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let o=t.el;for(;!o&&t.component;)o=(t=t.component.subTree).el;n.el=o,r&&r.subTree===n&&(r.vnode.el=o,di(r,o))}const Si=Symbol.for("v-fgt"),xi=Symbol.for("v-txt"),Ci=Symbol.for("v-cmt"),Ti=Symbol.for("v-stc"),ki=[];let Ei=null;function wi(e=!1){ki.push(Ei=e?null:[])}function Ai(){ki.pop(),Ei=ki[ki.length-1]||null}let Ni,Ii=1;function Ri(e,t=!1){Ii+=e,e<0&&Ei&&t&&(Ei.hasOnce=!0)}function Oi(e){return e.dynamicChildren=Ii>0?Ei||i:null,Ai(),Ii>0&&Ei&&Ei.push(e),e}function Mi(e,t,n,r,o,s){return Oi(Bi(e,t,n,r,o,s,!0))}function Pi(e,t,n,r,o){return Oi(Ui(e,t,n,r,o,!0))}function Di(e){return!!e&&!0===e.__v_isVNode}function Li(e,t){return e.type===t.type&&e.key===t.key}function $i(e){Ni=e}const Fi=({key:e})=>null!=e?e:null,Vi=({ref:e,ref_key:t,ref_for:n})=>("number"==typeof e&&(e=""+e),null!=e?b(e)||zt(e)||_(e)?{i:Jn,r:e,k:t,f:!!n}:e:null);function Bi(e,t=null,n=null,r=0,o=null,s=(e===Si?0:1),i=!1,c=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Fi(t),ref:t&&Vi(t),scopeId:Yn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Jn};return c?(Gi(l,n),128&s&&e.normalize(l)):n&&(l.shapeFlag|=b(n)?8:16),Ii>0&&!i&&Ei&&(l.patchFlag>0||6&s)&&32!==l.patchFlag&&Ei.push(l),l}const Ui=Hi;function Hi(e,t=null,n=null,r=0,o=null,s=!1){if(e&&e!==Eo||(e=Ci),Di(e)){const r=qi(e,t,!0);return n&&Gi(r,n),Ii>0&&!s&&Ei&&(6&r.shapeFlag?Ei[Ei.indexOf(e)]=r:Ei.push(r)),r.patchFlag=-2,r}if(Tc(e)&&(e=e.__vccOpts),t){t=ji(t);let{class:e,style:n}=t;e&&!b(e)&&(t.class=X(e)),x(n)&&(Ut(n)&&!m(n)&&(n=f({},n)),t.style=z(n))}return Bi(e,t,n,r,o,b(e)?1:pi(e)?128:or(e)?64:x(e)?4:_(e)?2:0,s,!0)}function ji(e){return e?Ut(e)||Cs(e)?f({},e):e:null}function qi(e,t,n=!1,r=!1){const{props:o,ref:s,patchFlag:i,children:c,transition:l}=e,a=t?Xi(o||{},t):o,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:a,key:a&&Fi(a),ref:t&&t.ref?n&&s?m(s)?s.concat(Vi(t)):[s,Vi(t)]:Vi(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:c,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Si?-1===i?16:16|i:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&qi(e.ssContent),ssFallback:e.ssFallback&&qi(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&wr(u,l.clone(u)),u}function Wi(e=" ",t=0){return Ui(xi,null,e,t)}function zi(e,t){const n=Ui(Ti,null,e);return n.staticCount=t,n}function Ki(e="",t=!1){return t?(wi(),Pi(Ci,null,e)):Ui(Ci,null,e)}function Ji(e){return null==e||"boolean"==typeof e?Ui(Ci):m(e)?Ui(Si,null,e.slice()):Di(e)?Yi(e):Ui(xi,null,String(e))}function Yi(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:qi(e)}function Gi(e,t){let n=0;const{shapeFlag:r}=e;if(null==t)t=null;else if(m(t))n=16;else if("object"==typeof t){if(65&r){const n=t.default;return void(n&&(n._c&&(n._d=!1),Gi(e,n()),n._c&&(n._d=!0)))}{n=32;const r=t._;r||Cs(t)?3===r&&Jn&&(1===Jn.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=Jn}}else _(t)?(t={default:t,_ctx:Jn},n=32):(t=String(t),64&r?(n=16,t=[Wi(t)]):n=8);e.children=t,e.shapeFlag|=n}function Xi(...e){const t={};for(let n=0;nnc||Jn;let oc,sc;{const e=q(),t=(t,n)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(n),e=>{r.length>1?r.forEach(t=>t(e)):r[0](e)}};oc=t("__VUE_INSTANCE_SETTERS__",e=>nc=e),sc=t("__VUE_SSR_SETTERS__",e=>fc=e)}const ic=e=>{const t=nc;return oc(e),e.scope.on(),()=>{e.scope.off(),oc(t)}},cc=()=>{nc&&nc.scope.off(),oc(null)};function lc(e){return 4&e.vnode.shapeFlag}let ac,uc,fc=!1;function dc(e,t=!1,n=!1){t&&sc(t);const{props:r,children:o}=e.vnode,s=lc(e);!function(e,t,n,r=!1){const o={},s=xs();e.propsDefaults=Object.create(null),Ts(e,t,o,s);for(const t in e.propsOptions[0])t in o||(o[t]=void 0);n?e.props=r?o:Pt(o):e.type.props?e.props=o:e.props=s,e.attrs=s}(e,r,s,t),Ds(e,o,n||t);const i=s?function(e,t){const n=e.type;0;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Vo),!1;const{setup:r}=n;if(r){He();const n=e.setupContext=r.length>1?yc(e):null,o=ic(e),s=wn(r,e,0,[e.props,n]),i=C(s);if(je(),o(),!i&&!e.sp||Qr(e)||Rr(e),i){if(s.then(cc,cc),t)return s.then(n=>{pc(e,n,t)}).catch(t=>{Nn(t,e,0)});e.asyncDep=s}else pc(e,s,t)}else gc(e,t)}(e,t):void 0;return t&&sc(!1),i}function pc(e,t,n){_(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:x(t)&&(e.setupState=tn(t)),gc(e,n)}function hc(e){ac=e,uc=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,Bo))}}const mc=()=>!ac;function gc(e,t,n){const r=e.type;if(!e.render){if(!t&&ac&&!r.render){const t=r.template||is(e).template;if(t){0;const{isCustomElement:n,compilerOptions:o}=e.appContext.config,{delimiters:s,compilerOptions:i}=r,c=f(f({isCustomElement:n,delimiters:s},o),i);r.render=ac(t,c)}}e.render=r.render||c,uc&&uc(e)}{const t=ic(e);He();try{rs(e)}finally{je(),t()}}}const vc={get(e,t){return Ze(e,0,""),e[t]}};function yc(e){const t=t=>{e.exposed=t||{}};return{attrs:new Proxy(e.attrs,vc),slots:e.slots,emit:e.emit,expose:t}}function _c(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(tn(jt(e.exposed)),{get(t,n){return n in t?t[n]:n in $o?$o[n](e):void 0},has(e,t){return t in e||t in $o}})):e.proxy}const bc=/(?:^|[-_])(\w)/g,Sc=e=>e.replace(bc,e=>e.toUpperCase()).replace(/[-_]/g,"");function xc(e,t=!0){return _(e)?e.displayName||e.name:e.name||t&&e.__name}function Cc(e,t,n=!1){let r=xc(t);if(!r&&t.__file){const e=t.__file.match(/([^/\\]+)\.\w+$/);e&&(r=e[1])}if(!r&&e&&e.parent){const n=e=>{for(const n in e)if(e[n]===t)return n};r=n(e.components||e.parent.type.components)||n(e.appContext.components)}return r?Sc(r):n?"App":"Anonymous"}function Tc(e){return _(e)&&"__vccOpts"in e}const kc=(e,t)=>{const n=function(e,t,n=!1){let r,o;return _(e)?r=e:(r=e.get,o=e.set),new un(r,o,n)}(e,0,fc);return n};function Ec(e,t,n){const r=arguments.length;return 2===r?x(t)&&!m(t)?Di(t)?Ui(e,null,[t]):Ui(e,t):Ui(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):3===r&&Di(n)&&(n=[n]),Ui(e,t,n))}function wc(){return void 0}function Ac(e,t,n,r){const o=n[r];if(o&&Nc(o,e))return o;const s=t();return s.memo=e.slice(),s.cacheIndex=r,n[r]=s}function Nc(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e0&&Ei&&Ei.push(e),!0}const Ic="3.5.18",Rc=c,Oc=En,Mc=Wn,Pc=function e(t,n){var r,o;if(Wn=t,Wn)Wn.enabled=!0,zn.forEach(({event:e,args:t})=>Wn.emit(e,...t)),zn=[];else if("undefined"!=typeof window&&window.HTMLElement&&!(null==(o=null==(r=window.navigator)?void 0:r.userAgent)?void 0:o.includes("jsdom"))){(n.__VUE_DEVTOOLS_HOOK_REPLAY__=n.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(t=>{e(t,n)}),setTimeout(()=>{Wn||(n.__VUE_DEVTOOLS_HOOK_REPLAY__=null,Kn=!0,zn=[])},3e3)}else Kn=!0,zn=[]},Dc={createComponentInstance:tc,setupComponent:dc,renderComponentRoot:ci,setCurrentRenderingInstance:Gn,isVNode:Di,normalizeVNode:Ji,getComponentPublicInstance:_c,ensureValidVNode:Po,pushWarningContext:function(e){_n.push(e)},popWarningContext:function(){_n.pop()}},Lc=null,$c=null,Fc=null; +/** +* @vue/runtime-dom v3.5.18 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +let Vc;const Bc="undefined"!=typeof window&&window.trustedTypes;if(Bc)try{Vc=Bc.createPolicy("vue",{createHTML:e=>e})}catch(e){}const Uc=Vc?e=>Vc.createHTML(e):e=>e,Hc="undefined"!=typeof document?document:null,jc=Hc&&Hc.createElement("template"),qc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o="svg"===t?Hc.createElementNS("http://www.w3.org/2000/svg",e):"mathml"===t?Hc.createElementNS("http://www.w3.org/1998/Math/MathML",e):n?Hc.createElement(e,{is:n}):Hc.createElement(e);return"select"===e&&r&&null!=r.multiple&&o.setAttribute("multiple",r.multiple),o},createText:e=>Hc.createTextNode(e),createComment:e=>Hc.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Hc.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),o!==s&&(o=o.nextSibling););else{jc.innerHTML=Uc("svg"===r?`${e}`:"mathml"===r?`${e}`:e);const o=jc.content;if("svg"===r||"mathml"===r){const e=o.firstChild;for(;e.firstChild;)o.appendChild(e.firstChild);o.removeChild(e)}t.insertBefore(o,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Wc="transition",zc="animation",Kc=Symbol("_vtc"),Jc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Yc=f({},_r,Jc),Gc=(e=>(e.displayName="Transition",e.props=Yc,e))((e,{slots:t})=>Ec(xr,Zc(e),t)),Xc=(e,t=[])=>{m(e)?e.forEach(e=>e(...t)):e&&e(...t)},Qc=e=>!!e&&(m(e)?e.some(e=>e.length>1):e.length>1);function Zc(e){const t={};for(const n in e)n in Jc||(t[n]=e[n]);if(!1===e.css)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:c=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:a=i,appearToClass:u=c,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,m=function(e){if(null==e)return null;if(x(e))return[el(e.enter),el(e.leave)];{const t=el(e);return[t,t]}}(o),g=m&&m[0],v=m&&m[1],{onBeforeEnter:y,onEnter:_,onEnterCancelled:b,onLeave:S,onLeaveCancelled:C,onBeforeAppear:T=y,onAppear:k=_,onAppearCancelled:E=b}=t,w=(e,t,n,r)=>{e._enterCancelled=r,nl(e,t?u:c),nl(e,t?a:i),n&&n()},A=(e,t)=>{e._isLeaving=!1,nl(e,d),nl(e,h),nl(e,p),t&&t()},N=e=>(t,n)=>{const o=e?k:_,i=()=>w(t,e,n);Xc(o,[t,i]),rl(()=>{nl(t,e?l:s),tl(t,e?u:c),Qc(o)||sl(t,r,g,i)})};return f(t,{onBeforeEnter(e){Xc(y,[e]),tl(e,s),tl(e,i)},onBeforeAppear(e){Xc(T,[e]),tl(e,l),tl(e,a)},onEnter:N(!1),onAppear:N(!0),onLeave(e,t){e._isLeaving=!0;const n=()=>A(e,t);tl(e,d),e._enterCancelled?(tl(e,p),al()):(al(),tl(e,p)),rl(()=>{e._isLeaving&&(nl(e,d),tl(e,h),Qc(S)||sl(e,r,v,n))}),Xc(S,[e,n])},onEnterCancelled(e){w(e,!1,void 0,!0),Xc(b,[e])},onAppearCancelled(e){w(e,!0,void 0,!0),Xc(E,[e])},onLeaveCancelled(e){A(e),Xc(C,[e])}})}function el(e){return H(e)}function tl(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.add(t)),(e[Kc]||(e[Kc]=new Set)).add(t)}function nl(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.remove(t));const n=e[Kc];n&&(n.delete(t),n.size||(e[Kc]=void 0))}function rl(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ol=0;function sl(e,t,n,r){const o=e._endId=++ol,s=()=>{o===e._endId&&r()};if(null!=n)return setTimeout(s,n);const{type:i,timeout:c,propCount:l}=il(e,t);if(!i)return r();const a=i+"end";let u=0;const f=()=>{e.removeEventListener(a,d),s()},d=t=>{t.target===e&&++u>=l&&f()};setTimeout(()=>{u(n[e]||"").split(", "),o=r(`${Wc}Delay`),s=r(`${Wc}Duration`),i=cl(o,s),c=r(`${zc}Delay`),l=r(`${zc}Duration`),a=cl(c,l);let u=null,f=0,d=0;t===Wc?i>0&&(u=Wc,f=i,d=s.length):t===zc?a>0&&(u=zc,f=a,d=l.length):(f=Math.max(i,a),u=f>0?i>a?Wc:zc:null,d=u?u===Wc?s.length:l.length:0);return{type:u,timeout:f,propCount:d,hasTransform:u===Wc&&/\b(transform|all)(,|$)/.test(r(`${Wc}Property`).toString())}}function cl(e,t){for(;e.lengthll(t)+ll(e[n])))}function ll(e){return"auto"===e?0:1e3*Number(e.slice(0,-1).replace(",","."))}function al(){return document.body.offsetHeight}const ul=Symbol("_vod"),fl=Symbol("_vsh"),dl={beforeMount(e,{value:t},{transition:n}){e[ul]="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):pl(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),pl(e,!0),r.enter(e)):r.leave(e,()=>{pl(e,!1)}):pl(e,t))},beforeUnmount(e,{value:t}){pl(e,t)}};function pl(e,t){e.style.display=t?e[ul]:"none",e[fl]=!t}const hl=Symbol("");function ml(e){const t=rc();if(!t)return;const n=t.ut=(n=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(e=>vl(e,n))};const r=()=>{const r=e(t.proxy);t.ce?vl(t.ce,r):gl(t.subTree,r),n(r)};mo(()=>{Bn(r)}),ho(()=>{Qs(r,c,{flush:"post"});const e=new MutationObserver(r);e.observe(t.subTree.el.parentNode,{childList:!0}),yo(()=>e.disconnect())})}function gl(e,t){if(128&e.shapeFlag){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{gl(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(1&e.shapeFlag&&e.el)vl(e.el,t);else if(e.type===Si)e.children.forEach(e=>gl(e,t));else if(e.type===Ti){let{el:n,anchor:r}=e;for(;n&&(vl(n,t),n!==r);)n=n.nextSibling}}function vl(e,t){if(1===e.nodeType){const n=e.style;let r="";for(const e in t){const o=ve(t[e]);n.setProperty(`--${e}`,o),r+=`--${e}: ${o};`}n[hl]=r}}const yl=/(^|;)\s*display\s*:/;const _l=/\s*!important$/;function bl(e,t,n){if(m(n))n.forEach(n=>bl(e,t,n));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=function(e,t){const n=xl[t];if(n)return n;let r=M(t);if("filter"!==r&&r in e)return xl[t]=r;r=L(r);for(let n=0;n{if(e._vts){if(e._vts<=n.attached)return}else e._vts=Date.now();An(function(e,t){if(m(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(e=>t=>!t._stopped&&e&&e(t))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=Ol(),n}(r,o);El(e,n,i,c)}else i&&(!function(e,t,n,r){e.removeEventListener(t,n,r)}(e,n,i,c),s[t]=void 0)}}const Nl=/(?:Once|Passive|Capture)$/;let Il=0;const Rl=Promise.resolve(),Ol=()=>Il||(Rl.then(()=>Il=0),Il=Date.now());const Ml=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123;const Pl={}; +/*! #__NO_SIDE_EFFECTS__ */function Dl(e,t,n){const r=Nr(e,t);w(r)&&f(r,t);class o extends Fl{constructor(e){super(r,e,n)}}return o.def=r,o} +/*! #__NO_SIDE_EFFECTS__ */const Ll=(e,t)=>Dl(e,t,Ta),$l="undefined"!=typeof HTMLElement?HTMLElement:class{};class Fl extends $l{constructor(e,t={},n=Ca){super(),this._def=e,this._props=t,this._createApp=n,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._ob=null,this.shadowRoot&&n!==Ca?this._root=this.shadowRoot:!1!==e.shadowRoot?(this.attachShadow({mode:"open"}),this._root=this.shadowRoot):this._root=this}connectedCallback(){if(!this.isConnected)return;this.shadowRoot||this._resolved||this._parseSlots(),this._connected=!0;let e=this;for(;e=e&&(e.parentNode||e.host);)if(e instanceof Fl){this._parent=e;break}this._instance||(this._resolved?this._mount(this._def):e&&e._pendingResolve?this._pendingResolve=e._pendingResolve.then(()=>{this._pendingResolve=void 0,this._resolveDef()}):this._resolveDef())}_setParent(e=this._parent){e&&(this._instance.parent=e._instance,this._inheritParentContext(e))}_inheritParentContext(e=this._parent){e&&this._app&&Object.setPrototypeOf(this._app._context.provides,e._instance.provides)}disconnectedCallback(){this._connected=!1,$n(()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null)})}_resolveDef(){if(this._pendingResolve)return;for(let e=0;e{for(const t of e)this._setAttr(t.attributeName)}),this._ob.observe(this,{attributes:!0});const e=(e,t=!1)=>{this._resolved=!0,this._pendingResolve=void 0;const{props:n,styles:r}=e;let o;if(n&&!m(n))for(const e in n){const t=n[e];(t===Number||t&&t.type===Number)&&(e in this._props&&(this._props[e]=H(this._props[e])),(o||(o=Object.create(null)))[M(e)]=!0)}this._numberProps=o,this._resolveProps(e),this.shadowRoot&&this._applyStyles(r),this._mount(e)},t=this._def.__asyncLoader;t?this._pendingResolve=t().then(t=>{t.configureApp=this._def.configureApp,e(this._def=t,!0)}):e(this._def)}_mount(e){this._app=this._createApp(e),this._inheritParentContext(),e.configureApp&&e.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);const t=this._instance&&this._instance.exposed;if(t)for(const e in t)h(this,e)||Object.defineProperty(this,e,{get:()=>Qt(t[e])})}_resolveProps(e){const{props:t}=e,n=m(t)?t:Object.keys(t||{});for(const e of Object.keys(this))"_"!==e[0]&&n.includes(e)&&this._setProp(e,this[e]);for(const e of n.map(M))Object.defineProperty(this,e,{get(){return this._getProp(e)},set(t){this._setProp(e,t,!0,!0)}})}_setAttr(e){if(e.startsWith("data-v-"))return;const t=this.hasAttribute(e);let n=t?this.getAttribute(e):Pl;const r=M(e);t&&this._numberProps&&this._numberProps[r]&&(n=H(n)),this._setProp(r,n,!1,!0)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,r=!1){if(t!==this._props[e]&&(t===Pl?delete this._props[e]:(this._props[e]=t,"key"===e&&this._app&&(this._app._ceVNode.key=t)),r&&this._instance&&this._update(),n)){const n=this._ob;n&&n.disconnect(),!0===t?this.setAttribute(D(e),""):"string"==typeof t||"number"==typeof t?this.setAttribute(D(e),t+""):t||this.removeAttribute(D(e)),n&&n.observe(this,{attributes:!0})}}_update(){const e=this._createVNode();this._app&&(e.appContext=this._app._context),Sa(e,this._root)}_createVNode(){const e={};this.shadowRoot||(e.onVnodeMounted=e.onVnodeUpdated=this._renderSlots.bind(this));const t=Ui(this._def,f(e,this._props));return this._instance||(t.ce=e=>{this._instance=e,e.ce=this,e.isCE=!0;const t=(e,t)=>{this.dispatchEvent(new CustomEvent(e,w(t[0])?f({detail:t},t[0]):{detail:t}))};e.emit=(e,...n)=>{t(e,n),D(e)!==e&&t(D(e),n)},this._setParent()}),t}_applyStyles(e,t){if(!e)return;if(t){if(t===this._def||this._styleChildren.has(t))return;this._styleChildren.add(t)}const n=this._nonce;for(let t=e.length-1;t>=0;t--){const r=document.createElement("style");n&&r.setAttribute("nonce",n),r.textContent=e[t],this.shadowRoot.prepend(r)}}_parseSlots(){const e=this._slots={};let t;for(;t=this.firstChild;){const n=1===t.nodeType&&t.getAttribute("slot")||"default";(e[n]||(e[n]=[])).push(t),this.removeChild(t)}}_renderSlots(){const e=(this._teleportTarget||this).querySelectorAll("slot"),t=this._instance.type.__scopeId;for(let n=0;n(delete e.props.mode,e))({name:"TransitionGroup",props:f({},Yc,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=rc(),r=vr();let o,s;return go(()=>{if(!o.length)return;const t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){const r=e.cloneNode(),o=e[Kc];o&&o.forEach(e=>{e.split(/\s+/).forEach(e=>e&&r.classList.remove(e))});n.split(/\s+/).forEach(e=>e&&r.classList.add(e)),r.style.display="none";const s=1===t.nodeType?t:t.parentNode;s.appendChild(r);const{hasTransform:i}=il(r);return s.removeChild(r),i}(o[0].el,n.vnode.el,t))return void(o=[]);o.forEach(Kl),o.forEach(Jl);const r=o.filter(Yl);al(),r.forEach(e=>{const n=e.el,r=n.style;tl(n,t),r.transform=r.webkitTransform=r.transitionDuration="";const o=n[ql]=e=>{e&&e.target!==n||e&&!/transform$/.test(e.propertyName)||(n.removeEventListener("transitionend",o),n[ql]=null,nl(n,t))};n.addEventListener("transitionend",o)}),o=[]}),()=>{const i=Ht(e),c=Zc(i);let l=i.tag||Si;if(o=[],s)for(let e=0;e{const t=e.props["onUpdate:modelValue"]||!1;return m(t)?e=>V(t,e):t};function Xl(e){e.target.composing=!0}function Ql(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Zl=Symbol("_assign"),ea={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e[Zl]=Gl(o);const s=r||o.props&&"number"===o.props.type;El(e,t?"change":"input",t=>{if(t.target.composing)return;let r=e.value;n&&(r=r.trim()),s&&(r=U(r)),e[Zl](r)}),n&&El(e,"change",()=>{e.value=e.value.trim()}),t||(El(e,"compositionstart",Xl),El(e,"compositionend",Ql),El(e,"change",Ql))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:o,number:s}},i){if(e[Zl]=Gl(i),e.composing)return;const c=null==t?"":t;if((!s&&"number"!==e.type||/^0\d/.test(e.value)?e.value:U(e.value))!==c){if(document.activeElement===e&&"range"!==e.type){if(r&&t===n)return;if(o&&e.value.trim()===c)return}e.value=c}}},ta={deep:!0,created(e,t,n){e[Zl]=Gl(n),El(e,"change",()=>{const t=e._modelValue,n=ia(e),r=e.checked,o=e[Zl];if(m(t)){const e=de(t,n),s=-1!==e;if(r&&!s)o(t.concat(n));else if(!r&&s){const n=[...t];n.splice(e,1),o(n)}}else if(v(t)){const e=new Set(t);r?e.add(n):e.delete(n),o(e)}else o(ca(e,r))})},mounted:na,beforeUpdate(e,t,n){e[Zl]=Gl(n),na(e,t,n)}};function na(e,{value:t,oldValue:n},r){let o;if(e._modelValue=t,m(t))o=de(t,r.props.value)>-1;else if(v(t))o=t.has(r.props.value);else{if(t===n)return;o=fe(t,ca(e,!0))}e.checked!==o&&(e.checked=o)}const ra={created(e,{value:t},n){e.checked=fe(t,n.props.value),e[Zl]=Gl(n),El(e,"change",()=>{e[Zl](ia(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[Zl]=Gl(r),t!==n&&(e.checked=fe(t,r.props.value))}},oa={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=v(t);El(e,"change",()=>{const t=Array.prototype.filter.call(e.options,e=>e.selected).map(e=>n?U(ia(e)):ia(e));e[Zl](e.multiple?o?new Set(t):t:t[0]),e._assigning=!0,$n(()=>{e._assigning=!1})}),e[Zl]=Gl(r)},mounted(e,{value:t}){sa(e,t)},beforeUpdate(e,t,n){e[Zl]=Gl(n)},updated(e,{value:t}){e._assigning||sa(e,t)}};function sa(e,t){const n=e.multiple,r=m(t);if(!n||r||v(t)){for(let o=0,s=e.options.length;oString(e)===String(i)):de(t,i)>-1}else s.selected=t.has(i);else if(fe(ia(s),t))return void(e.selectedIndex!==o&&(e.selectedIndex=o))}n||-1===e.selectedIndex||(e.selectedIndex=-1)}}function ia(e){return"_value"in e?e._value:e.value}function ca(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const la={created(e,t,n){ua(e,t,n,null,"created")},mounted(e,t,n){ua(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){ua(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){ua(e,t,n,r,"updated")}};function aa(e,t){switch(e){case"SELECT":return oa;case"TEXTAREA":return ea;default:switch(t){case"checkbox":return ta;case"radio":return ra;default:return ea}}}function ua(e,t,n,r,o){const s=aa(e.tagName,n.props&&n.props.type)[o];s&&s(e,t,n,r)}const fa=["ctrl","shift","alt","meta"],da={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>fa.some(n=>e[`${n}Key`]&&!t.includes(n))},pa=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(n,...r)=>{for(let e=0;e{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=n=>{if(!("key"in n))return;const r=D(n.key);return t.some(e=>e===r||ha[e]===r)?e(n):void 0})},ga=f({patchProp:(e,t,n,r,o,s)=>{const i="svg"===o;"class"===t?function(e,t,n){const r=e[Kc];r&&(t=(t?[t,...r]:[...r]).join(" ")),null==t?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}(e,r,i):"style"===t?function(e,t,n){const r=e.style,o=b(n);let s=!1;if(n&&!o){if(t)if(b(t))for(const e of t.split(";")){const t=e.slice(0,e.indexOf(":")).trim();null==n[t]&&bl(r,t,"")}else for(const e in t)null==n[e]&&bl(r,e,"");for(const e in n)"display"===e&&(s=!0),bl(r,e,n[e])}else if(o){if(t!==n){const e=r[hl];e&&(n+=";"+e),r.cssText=n,s=yl.test(n)}}else t&&e.removeAttribute("style");ul in e&&(e[ul]=s?r.display:"",e[fl]&&(r.display="none"))}(e,n,r):a(t)?u(t)||Al(e,t,0,r,s):("."===t[0]?(t=t.slice(1),1):"^"===t[0]?(t=t.slice(1),0):function(e,t,n,r){if(r)return"innerHTML"===t||"textContent"===t||!!(t in e&&Ml(t)&&_(n));if("spellcheck"===t||"draggable"===t||"translate"===t||"autocorrect"===t)return!1;if("form"===t)return!1;if("list"===t&&"INPUT"===e.tagName)return!1;if("type"===t&&"TEXTAREA"===e.tagName)return!1;if("width"===t||"height"===t){const t=e.tagName;if("IMG"===t||"VIDEO"===t||"CANVAS"===t||"SOURCE"===t)return!1}if(Ml(t)&&b(n))return!1;return t in e}(e,t,r,i))?(kl(e,t,r),e.tagName.includes("-")||"value"!==t&&"checked"!==t&&"selected"!==t||Tl(e,t,r,i,0,"value"!==t)):!e._isVueCE||!/[A-Z]/.test(t)&&b(r)?("true-value"===t?e._trueValue=r:"false-value"===t&&(e._falseValue=r),Tl(e,t,r,i)):kl(e,M(t),r,0,t)}},qc);let va,ya=!1;function _a(){return va||(va=Fs(ga))}function ba(){return va=ya?va:Vs(ga),ya=!0,va}const Sa=(...e)=>{_a().render(...e)},xa=(...e)=>{ba().hydrate(...e)},Ca=(...e)=>{const t=_a().createApp(...e);const{mount:n}=t;return t.mount=e=>{const r=Ea(e);if(!r)return;const o=t._component;_(o)||o.render||o.template||(o.template=r.innerHTML),1===r.nodeType&&(r.textContent="");const s=n(r,!1,ka(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),s},t},Ta=(...e)=>{const t=ba().createApp(...e);const{mount:n}=t;return t.mount=e=>{const t=Ea(e);if(t)return n(t,!0,ka(t))},t};function ka(e){return e instanceof SVGElement?"svg":"function"==typeof MathMLElement&&e instanceof MathMLElement?"mathml":void 0}function Ea(e){if(b(e)){return document.querySelector(e)}return e}let wa=!1;const Aa=()=>{wa||(wa=!0,ea.getSSRProps=({value:e})=>({value:e}),ra.getSSRProps=({value:e},t)=>{if(t.props&&fe(t.props.value,e))return{checked:!0}},ta.getSSRProps=({value:e},t)=>{if(m(e)){if(t.props&&de(e,t.props.value)>-1)return{checked:!0}}else if(v(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},la.getSSRProps=(e,t)=>{if("string"!=typeof t.type)return;const n=aa(t.type.toUpperCase(),t.props&&t.props.type);return n.getSSRProps?n.getSSRProps(e,t):void 0},dl.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}})},Na=Symbol(""),Ia=Symbol(""),Ra=Symbol(""),Oa=Symbol(""),Ma=Symbol(""),Pa=Symbol(""),Da=Symbol(""),La=Symbol(""),$a=Symbol(""),Fa=Symbol(""),Va=Symbol(""),Ba=Symbol(""),Ua=Symbol(""),Ha=Symbol(""),ja=Symbol(""),qa=Symbol(""),Wa=Symbol(""),za=Symbol(""),Ka=Symbol(""),Ja=Symbol(""),Ya=Symbol(""),Ga=Symbol(""),Xa=Symbol(""),Qa=Symbol(""),Za=Symbol(""),eu=Symbol(""),tu=Symbol(""),nu=Symbol(""),ru=Symbol(""),ou=Symbol(""),su=Symbol(""),iu=Symbol(""),cu=Symbol(""),lu=Symbol(""),au=Symbol(""),uu=Symbol(""),fu=Symbol(""),du=Symbol(""),pu=Symbol(""),hu={[Na]:"Fragment",[Ia]:"Teleport",[Ra]:"Suspense",[Oa]:"KeepAlive",[Ma]:"BaseTransition",[Pa]:"openBlock",[Da]:"createBlock",[La]:"createElementBlock",[$a]:"createVNode",[Fa]:"createElementVNode",[Va]:"createCommentVNode",[Ba]:"createTextVNode",[Ua]:"createStaticVNode",[Ha]:"resolveComponent",[ja]:"resolveDynamicComponent",[qa]:"resolveDirective",[Wa]:"resolveFilter",[za]:"withDirectives",[Ka]:"renderList",[Ja]:"renderSlot",[Ya]:"createSlots",[Ga]:"toDisplayString",[Xa]:"mergeProps",[Qa]:"normalizeClass",[Za]:"normalizeStyle",[eu]:"normalizeProps",[tu]:"guardReactiveProps",[nu]:"toHandlers",[ru]:"camelize",[ou]:"capitalize",[su]:"toHandlerKey",[iu]:"setBlockTracking",[cu]:"pushScopeId",[lu]:"popScopeId",[au]:"withCtx",[uu]:"unref",[fu]:"isRef",[du]:"withMemo",[pu]:"isMemoSame"};const mu={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0},source:""};function gu(e,t,n,r,o,s,i,c=!1,l=!1,a=!1,u=mu){return e&&(c?(e.helper(Pa),e.helper(Eu(e.inSSR,a))):e.helper(ku(e.inSSR,a)),i&&e.helper(za)),{type:13,tag:t,props:n,children:r,patchFlag:o,dynamicProps:s,directives:i,isBlock:c,disableTracking:l,isComponent:a,loc:u}}function vu(e,t=mu){return{type:17,loc:t,elements:e}}function yu(e,t=mu){return{type:15,loc:t,properties:e}}function _u(e,t){return{type:16,loc:mu,key:b(e)?bu(e,!0):e,value:t}}function bu(e,t=!1,n=mu,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function Su(e,t=mu){return{type:8,loc:t,children:e}}function xu(e,t=[],n=mu){return{type:14,loc:n,callee:e,arguments:t}}function Cu(e,t=void 0,n=!1,r=!1,o=mu){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:o}}function Tu(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:mu}}function ku(e,t){return e||t?$a:Fa}function Eu(e,t){return e||t?Da:La}function wu(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(ku(r,e.isComponent)),t(Pa),t(Eu(r,e.isComponent)))}const Au=new Uint8Array([123,123]),Nu=new Uint8Array([125,125]);function Iu(e){return e>=97&&e<=122||e>=65&&e<=90}function Ru(e){return 32===e||10===e||9===e||12===e||13===e}function Ou(e){return 47===e||62===e||Ru(e)}function Mu(e){const t=new Uint8Array(e.length);for(let n=0;n4===e.type&&e.isStatic;function Hu(e){switch(e){case"Teleport":case"teleport":return Ia;case"Suspense":case"suspense":return Ra;case"KeepAlive":case"keep-alive":return Oa;case"BaseTransition":case"base-transition":return Ma}}const ju=/^$|^\d|[^\$\w\xA0-\uFFFF]/,qu=e=>!ju.test(e),Wu=/[A-Za-z_$\xA0-\uFFFF]/,zu=/[\.\?\w$\xA0-\uFFFF]/,Ku=/\s+[.[]\s*|\s*[.[]\s+/g,Ju=e=>4===e.type?e.content:e.loc.source,Yu=e=>{const t=Ju(e).trim().replace(Ku,e=>e.trim());let n=0,r=[],o=0,s=0,i=null;for(let e=0;e|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/,Xu=e=>Gu.test(Ju(e));function Qu(e,t,n=!1){for(let r=0;r4===e.key.type&&e.key.content===r)}return n}function ff(e,t){return`_${t}_${e.replace(/[^\w]/g,(t,n)=>"-"===t?"_":e.charCodeAt(n).toString())}`}const df=/([\s\S]*?)\s+(?:in|of)\s+(\S[\s\S]*)/,pf={parseMode:"base",ns:0,delimiters:["{{","}}"],getNamespace:()=>0,isVoidTag:l,isPreTag:l,isIgnoreNewlineTag:l,isCustomElement:l,onError:Fu,onWarn:Vu,comments:!1,prefixIdentifiers:!1};let hf=pf,mf=null,gf="",vf=null,yf=null,_f="",bf=-1,Sf=-1,xf=0,Cf=!1,Tf=null;const kf=[],Ef=new class{constructor(e,t){this.stack=e,this.cbs=t,this.state=1,this.buffer="",this.sectionStart=0,this.index=0,this.entityStart=0,this.baseState=1,this.inRCDATA=!1,this.inXML=!1,this.inVPre=!1,this.newlines=[],this.mode=0,this.delimiterOpen=Au,this.delimiterClose=Nu,this.delimiterIndex=-1,this.currentSequence=void 0,this.sequenceIndex=0}get inSFCRoot(){return 2===this.mode&&0===this.stack.length}reset(){this.state=1,this.mode=0,this.buffer="",this.sectionStart=0,this.index=0,this.baseState=1,this.inRCDATA=!1,this.currentSequence=void 0,this.newlines.length=0,this.delimiterOpen=Au,this.delimiterClose=Nu}getPos(e){let t=1,n=e+1;for(let r=this.newlines.length-1;r>=0;r--){const o=this.newlines[r];if(e>o){t=r+2,n=e-o;break}}return{column:n,line:t,offset:e}}peek(){return this.buffer.charCodeAt(this.index+1)}stateText(e){60===e?(this.index>this.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=5,this.sectionStart=this.index):this.inVPre||e!==this.delimiterOpen[0]||(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(e))}stateInterpolationOpen(e){if(e===this.delimiterOpen[this.delimiterIndex])if(this.delimiterIndex===this.delimiterOpen.length-1){const e=this.index+1-this.delimiterOpen.length;e>this.sectionStart&&this.cbs.ontext(this.sectionStart,e),this.state=3,this.sectionStart=e}else this.delimiterIndex++;else this.inRCDATA?(this.state=32,this.stateInRCDATA(e)):(this.state=1,this.stateText(e))}stateInterpolation(e){e===this.delimiterClose[0]&&(this.state=4,this.delimiterIndex=0,this.stateInterpolationClose(e))}stateInterpolationClose(e){e===this.delimiterClose[this.delimiterIndex]?this.delimiterIndex===this.delimiterClose.length-1?(this.cbs.oninterpolation(this.sectionStart,this.index+1),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):this.delimiterIndex++:(this.state=3,this.stateInterpolation(e))}stateSpecialStartSequence(e){const t=this.sequenceIndex===this.currentSequence.length;if(t?Ou(e):(32|e)===this.currentSequence[this.sequenceIndex]){if(!t)return void this.sequenceIndex++}else this.inRCDATA=!1;this.sequenceIndex=0,this.state=6,this.stateInTagName(e)}stateInRCDATA(e){if(this.sequenceIndex===this.currentSequence.length){if(62===e||Ru(e)){const t=this.index-this.currentSequence.length;if(this.sectionStart=e||(28===this.state?this.currentSequence===Pu.CdataEnd?this.cbs.oncdata(this.sectionStart,e):this.cbs.oncomment(this.sectionStart,e):6===this.state||11===this.state||18===this.state||17===this.state||12===this.state||13===this.state||14===this.state||15===this.state||16===this.state||20===this.state||19===this.state||21===this.state||9===this.state||this.cbs.ontext(this.sectionStart,e))}emitCodePoint(e,t){}}(kf,{onerr:Kf,ontext(e,t){Rf(Nf(e,t),e,t)},ontextentity(e,t,n){Rf(e,t,n)},oninterpolation(e,t){if(Cf)return Rf(Nf(e,t),e,t);let n=e+Ef.delimiterOpen.length,r=t-Ef.delimiterClose.length;for(;Ru(gf.charCodeAt(n));)n++;for(;Ru(gf.charCodeAt(r-1));)r--;let o=Nf(n,r);o.includes("&")&&(o=hf.decodeEntities(o,!1)),Uf({type:5,content:zf(o,!1,Hf(n,r)),loc:Hf(e,t)})},onopentagname(e,t){const n=Nf(e,t);vf={type:1,tag:n,ns:hf.getNamespace(n,kf[0],hf.ns),tagType:0,props:[],children:[],loc:Hf(e-1,t),codegenNode:void 0}},onopentagend(e){If(e)},onclosetag(e,t){const n=Nf(e,t);if(!hf.isVoidTag(n)){let r=!1;for(let e=0;e0&&Kf(24,kf[0].loc.start.offset);for(let n=0;n<=e;n++){Of(kf.shift(),t,n(7===e.type?e.rawName:e.name)===n)&&Kf(2,t)},onattribend(e,t){if(vf&&yf){if(qf(yf.loc,t),0!==e)if(_f.includes("&")&&(_f=hf.decodeEntities(_f,!0)),6===yf.type)"class"===yf.name&&(_f=Bf(_f).trim()),1!==e||_f||Kf(13,t),yf.value={type:2,content:_f,loc:1===e?Hf(bf,Sf):Hf(bf-1,Sf+1)},Ef.inSFCRoot&&"template"===vf.tag&&"lang"===yf.name&&_f&&"html"!==_f&&Ef.enterRCDATA(Mu("{const o=t.start.offset+n;return zf(e,!1,Hf(o,o+e.length),0,r?1:0)},c={source:i(s.trim(),n.indexOf(s,o.length)),value:void 0,key:void 0,index:void 0,finalized:!1};let l=o.trim().replace(Af,"").trim();const a=o.indexOf(l),u=l.match(wf);if(u){l=l.replace(wf,"").trim();const e=u[1].trim();let t;if(e&&(t=n.indexOf(e,a+l.length),c.key=i(e,t,!0)),u[2]){const r=u[2].trim();r&&(c.index=i(r,n.indexOf(r,c.key?t+e.length:a+l.length),!0))}}l&&(c.value=i(l,a,!0));return c}(yf.exp));let t=-1;"bind"===yf.name&&(t=yf.modifiers.findIndex(e=>"sync"===e.content))>-1&&$u("COMPILER_V_BIND_SYNC",hf,yf.loc,yf.arg.loc.source)&&(yf.name="model",yf.modifiers.splice(t,1))}7===yf.type&&"pre"===yf.name||vf.props.push(yf)}_f="",bf=Sf=-1},oncomment(e,t){hf.comments&&Uf({type:3,content:Nf(e,t),loc:Hf(e-4,t+3)})},onend(){const e=gf.length;for(let t=0;t64&&n<91)||Hu(e)||hf.isBuiltInComponent&&hf.isBuiltInComponent(e)||hf.isNativeTag&&!hf.isNativeTag(e))return!0;var n;for(let e=0;e6===e.type&&"inline-template"===e.name);n&&$u("COMPILER_INLINE_TEMPLATE",hf,n.loc)&&e.children.length&&(n.value={type:2,content:Nf(e.children[0].loc.start.offset,e.children[e.children.length-1].loc.end.offset),loc:n.loc})}}function Mf(e,t){let n=e;for(;gf.charCodeAt(n)!==t&&n>=0;)n--;return n}const Pf=new Set(["if","else","else-if","for","slot"]);function Df({tag:e,props:t}){if("template"===e)for(let e=0;e3!==e.type);return 1!==t.length||1!==t[0].type||sf(t[0])?null:t[0]}function Xf(e,t,n,r=!1,o=!1){const{children:s}=e,i=[];for(let t=0;t0){if(e>=2){c.codegenNode.patchFlag=-1,i.push(c);continue}}else{const e=c.codegenNode;if(13===e.type){const t=e.patchFlag;if((void 0===t||512===t||1===t)&&td(c,n)>=2){const t=nd(c);t&&(e.props=n.hoist(t))}e.dynamicProps&&(e.dynamicProps=n.hoist(e.dynamicProps))}}}else if(12===c.type){if((r?0:Qf(c,n))>=2){14===c.codegenNode.type&&c.codegenNode.arguments.length>0&&c.codegenNode.arguments.push("-1"),i.push(c);continue}}if(1===c.type){const t=1===c.tagType;t&&n.scopes.vSlot++,Xf(c,e,n,!1,o),t&&n.scopes.vSlot--}else if(11===c.type)Xf(c,e,n,1===c.children.length,!0);else if(9===c.type)for(let t=0;te.key===t||e.key.content===t);return n&&n.value}}l.length&&1===e.type&&1===e.tagType&&e.codegenNode&&13===e.codegenNode.type&&e.codegenNode.children&&!m(e.codegenNode.children)&&15===e.codegenNode.children.type&&e.codegenNode.children.properties.push(_u("__",bu(JSON.stringify(l),!1))),i.length&&n.transformHoist&&n.transformHoist(s,n,e)}function Qf(e,t){const{constantCache:n}=t;switch(e.type){case 1:if(0!==e.tagType)return 0;const r=n.get(e);if(void 0!==r)return r;const o=e.codegenNode;if(13!==o.type)return 0;if(o.isBlock&&"svg"!==e.tag&&"foreignObject"!==e.tag&&"math"!==e.tag)return 0;if(void 0===o.patchFlag){let r=3;const s=td(e,t);if(0===s)return n.set(e,0),0;s1)for(let o=0;on&&(w.childIndex--,w.onNodeRemoved()):(w.currentNode=null,w.onNodeRemoved()),w.parent.children.splice(n,1)},onNodeRemoved:c,addIdentifiers(e){},removeIdentifiers(e){},hoist(e){b(e)&&(e=bu(e)),w.hoists.push(e);const t=bu(`_hoisted_${w.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache(e,t=!1,n=!1){const r=function(e,t,n=!1,r=!1){return{type:20,index:e,value:t,needPauseTracking:n,inVOnce:r,needArraySpread:!1,loc:mu}}(w.cached.length,e,t,n);return w.cached.push(r),r}};return w.filters=new Set,w}function od(e,t){const n=rd(e,t);sd(e,n),t.hoistStatic&&Yf(e,n),t.ssr||function(e,t){const{helper:n}=t,{children:r}=e;if(1===r.length){const n=Gf(e);if(n&&n.codegenNode){const r=n.codegenNode;13===r.type&&wu(r,t),e.codegenNode=r}else e.codegenNode=r[0]}else if(r.length>1){let r=64;0,e.codegenNode=gu(t,n(Na),void 0,e.children,r,void 0,void 0,!0,void 0,!1)}}(e,n),e.helpers=new Set([...n.helpers.keys()]),e.components=[...n.components],e.directives=[...n.directives],e.imports=n.imports,e.hoists=n.hoists,e.temps=n.temps,e.cached=n.cached,e.transformed=!0,e.filters=[...n.filters]}function sd(e,t){t.currentNode=e;const{nodeTransforms:n}=t,r=[];for(let o=0;o{n--};for(;nt===e:t=>e.test(t);return(e,r)=>{if(1===e.type){const{props:o}=e;if(3===e.tagType&&o.some(rf))return;const s=[];for(let i=0;i`${hu[e]}: _${hu[e]}`;function ad(e,t={}){const n=function(e,{mode:t="function",prefixIdentifiers:n="module"===t,sourceMap:r=!1,filename:o="template.vue.html",scopeId:s=null,optimizeImports:i=!1,runtimeGlobalName:c="Vue",runtimeModuleName:l="vue",ssrRuntimeModuleName:a="vue/server-renderer",ssr:u=!1,isTS:f=!1,inSSR:d=!1}){const p={mode:t,prefixIdentifiers:n,sourceMap:r,filename:o,scopeId:s,optimizeImports:i,runtimeGlobalName:c,runtimeModuleName:l,ssrRuntimeModuleName:a,ssr:u,isTS:f,inSSR:d,source:e.source,code:"",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper(e){return`_${hu[e]}`},push(e,t=-2,n){p.code+=e},indent(){h(++p.indentLevel)},deindent(e=!1){e?--p.indentLevel:h(--p.indentLevel)},newline(){h(p.indentLevel)}};function h(e){p.push("\n"+" ".repeat(e),0)}return p}(e,t);t.onContextCreated&&t.onContextCreated(n);const{mode:r,push:o,prefixIdentifiers:s,indent:i,deindent:c,newline:l,scopeId:a,ssr:u}=n,f=Array.from(e.helpers),d=f.length>0,p=!s&&"module"!==r;!function(e,t){const{ssr:n,prefixIdentifiers:r,push:o,newline:s,runtimeModuleName:i,runtimeGlobalName:c,ssrRuntimeModuleName:l}=t,a=c,u=Array.from(e.helpers);if(u.length>0&&(o(`const _Vue = ${a}\n`,-1),e.hoists.length)){o(`const { ${[$a,Fa,Va,Ba,Ua].filter(e=>u.includes(e)).map(ld).join(", ")} } = _Vue\n`,-1)}(function(e,t){if(!e.length)return;t.pure=!0;const{push:n,newline:r}=t;r();for(let o=0;o0)&&l()),e.directives.length&&(ud(e.directives,"directive",n),e.temps>0&&l()),e.filters&&e.filters.length&&(l(),ud(e.filters,"filter",n),l()),e.temps>0){o("let ");for(let t=0;t0?", ":""}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(o("\n",0),l()),u||o("return "),e.codegenNode?pd(e.codegenNode,n):o("null"),p&&(c(),o("}")),c(),o("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}function ud(e,t,{helper:n,push:r,newline:o,isTS:s}){const i=n("filter"===t?Wa:"component"===t?Ha:qa);for(let n=0;n3||!1;t.push("["),n&&t.indent(),dd(e,t,n),n&&t.deindent(),t.push("]")}function dd(e,t,n=!1,r=!0){const{push:o,newline:s}=t;for(let i=0;ie||"null")}([s,i,c,h,a]),t),n(")"),f&&n(")");u&&(n(", "),pd(u,t),n(")"))}(e,t);break;case 14:!function(e,t){const{push:n,helper:r,pure:o}=t,s=b(e.callee)?e.callee:r(e.callee);o&&n(cd);n(s+"(",-2,e),dd(e.arguments,t),n(")")}(e,t);break;case 15:!function(e,t){const{push:n,indent:r,deindent:o,newline:s}=t,{properties:i}=e;if(!i.length)return void n("{}",-2,e);const c=i.length>1||!1;n(c?"{":"{ "),c&&r();for(let e=0;e "),(l||c)&&(n("{"),r());i?(l&&n("return "),m(i)?fd(i,t):pd(i,t)):c&&pd(c,t);(l||c)&&(o(),n("}"));a&&(e.isNonScopedSlot&&n(", undefined, true"),n(")"))}(e,t);break;case 19:!function(e,t){const{test:n,consequent:r,alternate:o,newline:s}=e,{push:i,indent:c,deindent:l,newline:a}=t;if(4===n.type){const e=!qu(n.content);e&&i("("),hd(n,t),e&&i(")")}else i("("),pd(n,t),i(")");s&&c(),t.indentLevel++,s||i(" "),i("? "),pd(r,t),t.indentLevel--,s&&a(),s||i(" "),i(": ");const u=19===o.type;u||t.indentLevel++;pd(o,t),u||t.indentLevel--;s&&l(!0)}(e,t);break;case 20:!function(e,t){const{push:n,helper:r,indent:o,deindent:s,newline:i}=t,{needPauseTracking:c,needArraySpread:l}=e;l&&n("[...(");n(`_cache[${e.index}] || (`),c&&(o(),n(`${r(iu)}(-1`),e.inVOnce&&n(", true"),n("),"),i(),n("("));n(`_cache[${e.index}] = `),pd(e.value,t),c&&(n(`).cacheIndex = ${e.index},`),i(),n(`${r(iu)}(1),`),i(),n(`_cache[${e.index}]`),s());n(")"),l&&n(")]")}(e,t);break;case 21:dd(e.body,t,!0,!1)}}function hd(e,t){const{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,-3,e)}function md(e,t){for(let n=0;nfunction(e,t,n,r){if(!("else"===t.name||t.exp&&t.exp.content.trim())){const r=t.exp?t.exp.loc:e.loc;n.onError(Bu(28,t.loc)),t.exp=bu("true",!1,r)}0;if("if"===t.name){const o=yd(e,t),s={type:9,loc:jf(e.loc),branches:[o]};if(n.replaceNode(s),r)return r(s,o,!0)}else{const o=n.parent.children;let s=o.indexOf(e);for(;s-- >=-1;){const i=o[s];if(i&&3===i.type)n.removeNode(i);else{if(!i||2!==i.type||i.content.trim().length){if(i&&9===i.type){"else-if"===t.name&&void 0===i.branches[i.branches.length-1].condition&&n.onError(Bu(30,e.loc)),n.removeNode();const o=yd(e,t);0,i.branches.push(o);const s=r&&r(i,o,!1);sd(o,n),s&&s(),n.currentNode=null}else n.onError(Bu(30,e.loc));break}n.removeNode(i)}}}}(e,t,n,(e,t,r)=>{const o=n.parent.children;let s=o.indexOf(e),i=0;for(;s-- >=0;){const e=o[s];e&&9===e.type&&(i+=e.branches.length)}return()=>{if(r)e.codegenNode=_d(t,i,n);else{const r=function(e){for(;;)if(19===e.type){if(19!==e.alternate.type)return e;e=e.alternate}else 20===e.type&&(e=e.value)}(e.codegenNode);r.alternate=_d(t,i+e.branches.length-1,n)}}}));function yd(e,t){const n=3===e.tagType;return{type:10,loc:e.loc,condition:"else"===t.name?void 0:t.exp,children:n&&!Qu(e,"for")?e.children:[e],userKey:Zu(e,"key"),isTemplateIf:n}}function _d(e,t,n){return e.condition?Tu(e.condition,bd(e,t,n),xu(n.helper(Va),['""',"true"])):bd(e,t,n)}function bd(e,t,n){const{helper:r}=n,o=_u("key",bu(`${t}`,!1,mu,2)),{children:s}=e,i=s[0];if(1!==s.length||1!==i.type){if(1===s.length&&11===i.type){const e=i.codegenNode;return af(e,o,n),e}{let t=64;return gu(n,r(Na),yu([o]),s,t,void 0,void 0,!0,!1,!1,e.loc)}}{const e=i.codegenNode,t=14===(c=e).type&&c.callee===du?c.arguments[1].returns:c;return 13===t.type&&wu(t,n),af(t,o,n),e}var c}const Sd=(e,t,n)=>{const{modifiers:r,loc:o}=e,s=e.arg;let{exp:i}=e;if(i&&4===i.type&&!i.content.trim()&&(i=void 0),!i){if(4!==s.type||!s.isStatic)return n.onError(Bu(52,s.loc)),{props:[_u(s,bu("",!0,o))]};xd(e),i=e.exp}return 4!==s.type?(s.children.unshift("("),s.children.push(') || ""')):s.isStatic||(s.content=s.content?`${s.content} || ""`:'""'),r.some(e=>"camel"===e.content)&&(4===s.type?s.isStatic?s.content=M(s.content):s.content=`${n.helperString(ru)}(${s.content})`:(s.children.unshift(`${n.helperString(ru)}(`),s.children.push(")"))),n.inSSR||(r.some(e=>"prop"===e.content)&&Cd(s,"."),r.some(e=>"attr"===e.content)&&Cd(s,"^")),{props:[_u(s,i)]}},xd=(e,t)=>{const n=e.arg,r=M(n.content);e.exp=bu(r,!1,n.loc)},Cd=(e,t)=>{4===e.type?e.isStatic?e.content=t+e.content:e.content=`\`${t}\${${e.content}}\``:(e.children.unshift(`'${t}' + (`),e.children.push(")"))},Td=id("for",(e,t,n)=>{const{helper:r,removeHelper:o}=n;return function(e,t,n,r){if(!t.exp)return void n.onError(Bu(31,t.loc));const o=t.forParseResult;if(!o)return void n.onError(Bu(32,t.loc));kd(o,n);const{addIdentifiers:s,removeIdentifiers:i,scopes:c}=n,{source:l,value:a,key:u,index:f}=o,d={type:11,loc:t.loc,source:l,valueAlias:a,keyAlias:u,objectIndexAlias:f,parseResult:o,children:of(e)?e.children:[e]};n.replaceNode(d),c.vFor++;const p=r&&r(d);return()=>{c.vFor--,p&&p()}}(e,t,n,t=>{const s=xu(r(Ka),[t.source]),i=of(e),c=Qu(e,"memo"),l=Zu(e,"key",!1,!0);l&&7===l.type&&!l.exp&&xd(l);let a=l&&(6===l.type?l.value?bu(l.value.content,!0):void 0:l.exp);const u=l&&a?_u("key",a):null,f=4===t.source.type&&t.source.constType>0,d=f?64:l?128:256;return t.codegenNode=gu(n,r(Na),void 0,s,d,void 0,void 0,!0,!f,!1,e.loc),()=>{let l;const{children:d}=t;const p=1!==d.length||1!==d[0].type,h=sf(e)?e:i&&1===e.children.length&&sf(e.children[0])?e.children[0]:null;if(h?(l=h.codegenNode,i&&u&&af(l,u,n)):p?l=gu(n,r(Na),u?yu([u]):void 0,e.children,64,void 0,void 0,!0,void 0,!1):(l=d[0].codegenNode,i&&u&&af(l,u,n),l.isBlock!==!f&&(l.isBlock?(o(Pa),o(Eu(n.inSSR,l.isComponent))):o(ku(n.inSSR,l.isComponent))),l.isBlock=!f,l.isBlock?(r(Pa),r(Eu(n.inSSR,l.isComponent))):r(ku(n.inSSR,l.isComponent))),c){const e=Cu(Ed(t.parseResult,[bu("_cached")]));e.body={type:21,body:[Su(["const _memo = (",c.exp,")"]),Su(["if (_cached",...a?[" && _cached.key === ",a]:[],` && ${n.helperString(pu)}(_cached, _memo)) return _cached`]),Su(["const _item = ",l]),bu("_item.memo = _memo"),bu("return _item")],loc:mu},s.arguments.push(e,bu("_cache"),bu(String(n.cached.length))),n.cached.push(null)}else s.arguments.push(Cu(Ed(t.parseResult),l,!0))}})});function kd(e,t){e.finalized||(e.finalized=!0)}function Ed({value:e,key:t,index:n},r=[]){return function(e){let t=e.length;for(;t--&&!e[t];);return e.slice(0,t+1).map((e,t)=>e||bu("_".repeat(t+1),!1))}([e,t,n,...r])}const wd=bu("undefined",!1),Ad=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){const n=Qu(e,"slot");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},Nd=(e,t,n,r)=>Cu(e,n,!1,!0,n.length?n[0].loc:r);function Id(e,t,n=Nd){t.helper(au);const{children:r,loc:o}=e,s=[],i=[];let c=t.scopes.vSlot>0||t.scopes.vFor>0;const l=Qu(e,"slot",!0);if(l){const{arg:e,exp:t}=l;e&&!Uu(e)&&(c=!0),s.push(_u(e||bu("default",!0),n(t,void 0,r,o)))}let a=!1,u=!1;const f=[],d=new Set;let p=0;for(let e=0;e{const s=n(e,void 0,r,o);return t.compatConfig&&(s.isNonScopedSlot=!0),_u("default",s)};a?f.length&&f.some(e=>Md(e))&&(u?t.onError(Bu(39,f[0].loc)):s.push(e(void 0,f))):s.push(e(void 0,r))}const h=c?2:Od(e.children)?3:1;let m=yu(s.concat(_u("_",bu(h+"",!1))),o);return i.length&&(m=xu(t.helper(Ya),[m,vu(i)])),{slots:m,hasDynamicSlots:c}}function Rd(e,t,n){const r=[_u("name",e),_u("fn",t)];return null!=n&&r.push(_u("key",bu(String(n),!0))),yu(r)}function Od(e){for(let t=0;tfunction(){if(1!==(e=t.currentNode).type||0!==e.tagType&&1!==e.tagType)return;const{tag:n,props:r}=e,o=1===e.tagType;let s=o?function(e,t,n=!1){let{tag:r}=e;const o=Vd(r),s=Zu(e,"is",!1,!0);if(s)if(o||Lu("COMPILER_IS_ON_ELEMENT",t)){let e;if(6===s.type?e=s.value&&bu(s.value.content,!0):(e=s.exp,e||(e=bu("is",!1,s.arg.loc))),e)return xu(t.helper(ja),[e])}else 6===s.type&&s.value.content.startsWith("vue:")&&(r=s.value.content.slice(4));const i=Hu(r)||t.isBuiltInComponent(r);if(i)return n||t.helper(i),i;return t.helper(Ha),t.components.add(r),ff(r,"component")}(e,t):`"${n}"`;const i=x(s)&&s.callee===ja;let c,l,a,u,f,d=0,p=i||s===Ia||s===Ra||!o&&("svg"===n||"foreignObject"===n||"math"===n);if(r.length>0){const n=Ld(e,t,void 0,o,i);c=n.props,d=n.patchFlag,u=n.dynamicPropNames;const r=n.directives;f=r&&r.length?vu(r.map(e=>function(e,t){const n=[],r=Pd.get(e);r?n.push(t.helperString(r)):(t.helper(qa),t.directives.add(e.name),n.push(ff(e.name,"directive")));const{loc:o}=e;e.exp&&n.push(e.exp);e.arg&&(e.exp||n.push("void 0"),n.push(e.arg));if(Object.keys(e.modifiers).length){e.arg||(e.exp||n.push("void 0"),n.push("void 0"));const t=bu("true",!1,o);n.push(yu(e.modifiers.map(e=>_u(e,t)),o))}return vu(n,e.loc)}(e,t))):void 0,n.shouldUseBlock&&(p=!0)}if(e.children.length>0){s===Oa&&(p=!0,d|=1024);if(o&&s!==Ia&&s!==Oa){const{slots:n,hasDynamicSlots:r}=Id(e,t);l=n,r&&(d|=1024)}else if(1===e.children.length&&s!==Ia){const n=e.children[0],r=n.type,o=5===r||8===r;o&&0===Qf(n,t)&&(d|=1),l=o||2===r?n:e.children}else l=e.children}u&&u.length&&(a=function(e){let t="[";for(let n=0,r=e.length;n0;let h=!1,m=0,g=!1,v=!1,y=!1,_=!1,b=!1,x=!1;const C=[],T=e=>{u.length&&(f.push(yu($d(u),c)),u=[]),e&&f.push(e)},k=()=>{t.scopes.vFor>0&&u.push(_u(bu("ref_for",!0),bu("true")))},E=({key:e,value:n})=>{if(Uu(e)){const s=e.content,i=a(s);if(!i||r&&!o||"onclick"===s.toLowerCase()||"onUpdate:modelValue"===s||N(s)||(_=!0),i&&N(s)&&(x=!0),i&&14===n.type&&(n=n.arguments[0]),20===n.type||(4===n.type||8===n.type)&&Qf(n,t)>0)return;"ref"===s?g=!0:"class"===s?v=!0:"style"===s?y=!0:"key"===s||C.includes(s)||C.push(s),!r||"class"!==s&&"style"!==s||C.includes(s)||C.push(s)}else b=!0};for(let o=0;o"prop"===e.content)&&(m|=32);const x=t.directiveTransforms[n];if(x){const{props:n,needRuntime:r}=x(l,e,t);!s&&n.forEach(E),_&&o&&!Uu(o)?T(yu(n,c)):u.push(...n),r&&(d.push(l),S(r)&&Pd.set(l,r))}else I(n)||(d.push(l),p&&(h=!0))}}let w;if(f.length?(T(),w=f.length>1?xu(t.helper(Xa),f,c):f[0]):u.length&&(w=yu($d(u),c)),b?m|=16:(v&&!r&&(m|=2),y&&!r&&(m|=4),C.length&&(m|=8),_&&(m|=32)),h||0!==m&&32!==m||!(g||x||d.length>0)||(m|=512),!t.inSSR&&w)switch(w.type){case 15:let e=-1,n=-1,r=!1;for(let t=0;t{if(sf(e)){const{children:n,loc:r}=e,{slotName:o,slotProps:s}=function(e,t){let n,r='"default"';const o=[];for(let t=0;t0){const{props:r,directives:s}=Ld(e,t,o,!1,!1);n=r,s.length&&t.onError(Bu(36,s[0].loc))}return{slotName:r,slotProps:n}}(e,t),i=[t.prefixIdentifiers?"_ctx.$slots":"$slots",o,"{}","undefined","true"];let c=2;s&&(i[2]=s,c=3),n.length&&(i[3]=Cu([],n,!1,!1,r),c=4),t.scopeId&&!t.slotted&&(c=5),i.splice(c),e.codegenNode=xu(t.helper(Ja),i,r)}};const Ud=(e,t,n,r)=>{const{loc:o,modifiers:s,arg:i}=e;let c;if(e.exp||s.length||n.onError(Bu(35,o)),4===i.type)if(i.isStatic){let e=i.content;0,e.startsWith("vue:")&&(e=`vnode-${e.slice(4)}`);c=bu(0!==t.tagType||e.startsWith("vnode")||!/[A-Z]/.test(e)?$(M(e)):`on:${e}`,!0,i.loc)}else c=Su([`${n.helperString(su)}(`,i,")"]);else c=i,c.children.unshift(`${n.helperString(su)}(`),c.children.push(")");let l=e.exp;l&&!l.content.trim()&&(l=void 0);let a=n.cacheHandlers&&!l&&!n.inVOnce;if(l){const e=Yu(l),t=!(e||Xu(l)),n=l.content.includes(";");0,(t||a&&e)&&(l=Su([`${t?"$event":"(...args)"} => ${n?"{":"("}`,l,n?"}":")"]))}let u={props:[_u(c,l||bu("() => {}",!1,o))]};return r&&(u=r(u)),a&&(u.props[0].value=n.cache(u.props[0].value)),u.props.forEach(e=>e.key.isHandlerKey=!0),u},Hd=(e,t)=>{if(0===e.type||1===e.type||11===e.type||10===e.type)return()=>{const n=e.children;let r,o=!1;for(let e=0;e7===e.type&&!t.directiveTransforms[e.name])||"template"===e.tag)))for(let e=0;e{if(1===e.type&&Qu(e,"once",!0)){if(jd.has(e)||t.inVOnce||t.inSSR)return;return jd.add(e),t.inVOnce=!0,t.helper(iu),()=>{t.inVOnce=!1;const e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0,!0))}}},Wd=(e,t,n)=>{const{exp:r,arg:o}=e;if(!r)return n.onError(Bu(41,e.loc)),zd();const s=r.loc.source.trim(),i=4===r.type?r.content:s,c=n.bindingMetadata[s];if("props"===c||"props-aliased"===c)return n.onError(Bu(44,r.loc)),zd();if(!i.trim()||!Yu(r))return n.onError(Bu(42,r.loc)),zd();const l=o||bu("modelValue",!0),a=o?Uu(o)?`onUpdate:${M(o.content)}`:Su(['"onUpdate:" + ',o]):"onUpdate:modelValue";let u;u=Su([`${n.isTS?"($event: any)":"$event"} => ((`,r,") = $event)"]);const f=[_u(l,e.exp),_u(a,u)];if(e.modifiers.length&&1===t.tagType){const t=e.modifiers.map(e=>e.content).map(e=>(qu(e)?e:JSON.stringify(e))+": true").join(", "),n=o?Uu(o)?`${o.content}Modifiers`:Su([o,' + "Modifiers"']):"modelModifiers";f.push(_u(n,bu(`{ ${t} }`,!1,e.loc,2)))}return zd(f)};function zd(e=[]){return{props:e}}const Kd=/[\w).+\-_$\]]/,Jd=(e,t)=>{Lu("COMPILER_FILTERS",t)&&(5===e.type?Yd(e.content,t):1===e.type&&e.props.forEach(e=>{7===e.type&&"for"!==e.name&&e.exp&&Yd(e.exp,t)}))};function Yd(e,t){if(4===e.type)Gd(e,t);else for(let n=0;n=0&&(e=n.charAt(t)," "===e);t--);e&&Kd.test(e)||(u=!0)}}else void 0===i?(h=s+1,i=n.slice(0,s).trim()):g();function g(){m.push(n.slice(h,s).trim()),h=s+1}if(void 0===i?i=n.slice(0,s).trim():0!==h&&g(),m.length){for(s=0;s{if(1===e.type){const n=Qu(e,"memo");if(!n||Qd.has(e))return;return Qd.add(e),()=>{const r=e.codegenNode||t.currentNode.codegenNode;r&&13===r.type&&(1!==e.tagType&&wu(r,t),e.codegenNode=xu(t.helper(du),[n.exp,Cu(void 0,r),"_cache",String(t.cached.length)]),t.cached.push(null))}}};function ep(e,t={}){const n=t.onError||Fu,r="module"===t.mode;!0===t.prefixIdentifiers?n(Bu(47)):r&&n(Bu(48));t.cacheHandlers&&n(Bu(49)),t.scopeId&&!r&&n(Bu(50));const o=f({},t,{prefixIdentifiers:!1}),s=b(e)?Jf(e,o):e,[i,c]=[[qd,vd,Zd,Td,Jd,Bd,Dd,Ad,Hd],{on:Ud,bind:Sd,model:Wd}];return od(s,f({},o,{nodeTransforms:[...i,...t.nodeTransforms||[]],directiveTransforms:f({},c,t.directiveTransforms||{})})),ad(s,o)}const tp=Symbol(""),np=Symbol(""),rp=Symbol(""),op=Symbol(""),sp=Symbol(""),ip=Symbol(""),cp=Symbol(""),lp=Symbol(""),ap=Symbol(""),up=Symbol("");var fp;let dp;fp={[tp]:"vModelRadio",[np]:"vModelCheckbox",[rp]:"vModelText",[op]:"vModelSelect",[sp]:"vModelDynamic",[ip]:"withModifiers",[cp]:"withKeys",[lp]:"vShow",[ap]:"Transition",[up]:"TransitionGroup"},Object.getOwnPropertySymbols(fp).forEach(e=>{hu[e]=fp[e]});const pp={parseMode:"html",isVoidTag:ne,isNativeTag:e=>Z(e)||ee(e)||te(e),isPreTag:e=>"pre"===e,isIgnoreNewlineTag:e=>"pre"===e||"textarea"===e,decodeEntities:function(e,t=!1){return dp||(dp=document.createElement("div")),t?(dp.innerHTML=`
`,dp.children[0].getAttribute("foo")):(dp.innerHTML=e,dp.textContent)},isBuiltInComponent:e=>"Transition"===e||"transition"===e?ap:"TransitionGroup"===e||"transition-group"===e?up:void 0,getNamespace(e,t,n){let r=t?t.ns:n;if(t&&2===r)if("annotation-xml"===t.tag){if("svg"===e)return 1;t.props.some(e=>6===e.type&&"encoding"===e.name&&null!=e.value&&("text/html"===e.value.content||"application/xhtml+xml"===e.value.content))&&(r=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&"mglyph"!==e&&"malignmark"!==e&&(r=0);else t&&1===r&&("foreignObject"!==t.tag&&"desc"!==t.tag&&"title"!==t.tag||(r=0));if(0===r){if("svg"===e)return 1;if("math"===e)return 2}return r}},hp=(e,t)=>{const n=G(e);return bu(JSON.stringify(n),!1,t,3)};function mp(e,t){return Bu(e,t)}const gp=o("passive,once,capture"),vp=o("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),yp=o("left,right"),_p=o("onkeyup,onkeydown,onkeypress"),bp=(e,t)=>Uu(e)&&"onclick"===e.content.toLowerCase()?bu(t,!0):4!==e.type?Su(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e;const Sp=(e,t)=>{1!==e.type||0!==e.tagType||"script"!==e.tag&&"style"!==e.tag||t.removeNode()};const xp=[e=>{1===e.type&&e.props.forEach((t,n)=>{6===t.type&&"style"===t.name&&t.value&&(e.props[n]={type:7,name:"bind",arg:bu("style",!0,t.loc),exp:hp(t.value.content,t.loc),modifiers:[],loc:t.loc})})}],Cp={cloak:()=>({props:[]}),html:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(mp(53,o)),t.children.length&&(n.onError(mp(54,o)),t.children.length=0),{props:[_u(bu("innerHTML",!0,o),r||bu("",!0))]}},text:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(mp(55,o)),t.children.length&&(n.onError(mp(56,o)),t.children.length=0),{props:[_u(bu("textContent",!0),r?Qf(r,n)>0?r:xu(n.helperString(Ga),[r],o):bu("",!0))]}},model:(e,t,n)=>{const r=Wd(e,t,n);if(!r.props.length||1===t.tagType)return r;e.arg&&n.onError(mp(58,e.arg.loc));const{tag:o}=t,s=n.isCustomElement(o);if("input"===o||"textarea"===o||"select"===o||s){let i=rp,c=!1;if("input"===o||s){const r=Zu(t,"type");if(r){if(7===r.type)i=sp;else if(r.value)switch(r.value.content){case"radio":i=tp;break;case"checkbox":i=np;break;case"file":c=!0,n.onError(mp(59,e.loc))}}else(function(e){return e.props.some(e=>!(7!==e.type||"bind"!==e.name||e.arg&&4===e.arg.type&&e.arg.isStatic))})(t)&&(i=sp)}else"select"===o&&(i=op);c||(r.needRuntime=n.helper(i))}else n.onError(mp(57,e.loc));return r.props=r.props.filter(e=>!(4===e.key.type&&"modelValue"===e.key.content)),r},on:(e,t,n)=>Ud(e,t,n,t=>{const{modifiers:r}=e;if(!r.length)return t;let{key:o,value:s}=t.props[0];const{keyModifiers:i,nonKeyModifiers:c,eventOptionModifiers:l}=((e,t,n)=>{const r=[],o=[],s=[];for(let i=0;i{const{exp:r,loc:o}=e;return r||n.onError(mp(61,o)),{props:[],needRuntime:n.helper(lp)}}};const Tp=Object.create(null);function kp(e,t){if(!b(e)){if(!e.nodeType)return c;e=e.innerHTML}const n=function(e,t){return e+JSON.stringify(t,(e,t)=>"function"==typeof t?t.toString():t)}(e,t),o=Tp[n];if(o)return o;if("#"===e[0]){const t=document.querySelector(e);0,e=t?t.innerHTML:""}const s=f({hoistStatic:!0,onError:void 0,onWarn:c},t);s.isCustomElement||"undefined"==typeof customElements||(s.isCustomElement=e=>!!customElements.get(e));const{code:i}=function(e,t={}){return ep(e,f({},pp,t,{nodeTransforms:[Sp,...xp,...t.nodeTransforms||[]],directiveTransforms:f({},Cp,t.directiveTransforms||{}),transformHoist:null}))}(e,s);const l=new Function("Vue",i)(r);return l._rc=!0,Tp[n]=l}hc(kp)},171:function(e,t,n){n.d(t,{M:function(){return r}});var r=function(e,t){void 0===t&&(t=["event"]);var n=e.startsWith("$")?function(){return window.$(document).trigger(e.slice(1),[].slice.call(arguments)[0].detail)}:function(){var n=arguments,r=t.reduce(function(e,t,r){return e[t]=[].slice.call(n)[r],e},{});r.event.target.dispatchEvent(new CustomEvent("$"+e,{detail:r,bubbles:!0,cancelable:!0}))};return e.startsWith("$")?document.addEventListener(e,n):window.$(document).on(e,n),n}},433:function(e,t){t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}},591:function(e,t,n){var r,o=function(){return void 0===r&&(r=Boolean(window&&document&&document.all&&!window.atob)),r},s=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),i=[];function c(e){for(var t=-1,n=0;n { + Snowboard.addPlugin('backend.ajax.handler', BackendAjaxHandler); + Snowboard.addPlugin('backend.ui.eventHandler', BackendUiEventHandler); + Snowboard.addPlugin('backend.ui.widgetHandler', BackendUiWidgetHandler); + + // Add the pre-filter immediately + Snowboard['backend.ajax.handler']().addPrefilter(); + + // Add polyfill for AssetManager + window.AssetManager = { + load: (assets, callback) => { + Snowboard.assetLoader().load(assets).then( + () => { + if (callback && typeof callback === 'function') { + callback(); + } + }, + ); + }, + }; + window.assetManager = window.AssetManager; +})(window.Snowboard); + +// Add Vue to global scope +window.Vue = Vue; diff --git a/modules/backend/assets/ui/js/pages/Preferences.js b/modules/backend/assets/ui/js/pages/Preferences.js new file mode 100644 index 0000000..85378a2 --- /dev/null +++ b/modules/backend/assets/ui/js/pages/Preferences.js @@ -0,0 +1,100 @@ +import { delegate } from 'jquery-events-to-dom-events'; + +((Snowboard) => { + class Preferences extends Snowboard.Singleton { + construct() { + this.widget = null; + } + + listens() { + return { + 'backend.widget.initialized': 'onWidgetInitialized', + }; + } + + onWidgetInitialized(element, widget) { + if (element === document.getElementById('CodeEditor-formEditorPreview-_editor_preview')) { + this.widget = widget; + this.enablePreferences(); + } + } + + enablePreferences() { + delegate('change'); + + const checkboxes = { + show_gutter: 'showGutter', + highlight_active_line: 'highlightActiveLine', + use_hard_tabs: '!useSoftTabs', + display_indent_guides: 'displayIndentGuides', + show_invisibles: 'showInvisibles', + show_print_margin: 'showPrintMargin', + show_minimap: 'showMinimap', + enable_folding: 'codeFolding', + bracket_colors: 'bracketColors', + show_colors: 'showColors', + }; + + Object.entries(checkboxes).forEach(([key, value]) => { + this.element(key).addEventListener('change', (event) => { + this.widget.setConfig( + value.replace(/^!/, ''), + /^!/.test(value) ? !event.target.checked : event.target.checked, + ); + }); + }); + + this.element('theme').addEventListener('$change', (event) => { + this.widget.loadTheme(event.target.value); + }); + + this.element('font_size').addEventListener('$change', (event) => { + this.widget.setConfig('fontSize', event.target.value); + }); + + this.element('tab_size').addEventListener('$change', (event) => { + this.widget.setConfig('tabSize', event.target.value); + }); + + this.element('word_wrap').addEventListener('$change', (event) => { + const { value } = event.target; + switch (value) { + case 'off': + this.widget.setConfig('wordWrap', false); + break; + case 'fluid': + this.widget.setConfig('wordWrap', 'fluid'); + break; + default: + this.widget.setConfig('wordWrap', parseInt(value, 10)); + } + }); + + document.querySelectorAll('[data-switch-lang]').forEach((element) => { + element.addEventListener('click', (event) => { + event.preventDefault(); + const language = element.dataset.switchLang; + const template = document.querySelector(`[data-lang-snippet="${language}"]`); + + if (!template) { + return; + } + + this.widget.setValue(template.textContent.trim()); + this.widget.setLanguage(language); + }); + }); + + this.widget.events.once('create', () => { + const event = new MouseEvent('click'); + document.querySelector('[data-switch-lang="css"]').dispatchEvent(event); + }); + } + + element(key) { + return document.getElementById(`Form-field-Preference-editor_${key}`); + } + } + + Snowboard.addPlugin('backend.preferences', Preferences); +})(window.Snowboard); diff --git a/modules/backend/assets/ui/js/ui/EventHandler.js b/modules/backend/assets/ui/js/ui/EventHandler.js new file mode 100644 index 0000000..1bc70cd --- /dev/null +++ b/modules/backend/assets/ui/js/ui/EventHandler.js @@ -0,0 +1,116 @@ +/** + * Widget event handler. + * + * Extends a widget with event handling functionality, allowing for the quick definition of events + * and listening for events on a specific instance of a widget. + * + * This is a complement to Snowboard's global events - these events will still fire in order to + * allow external code to listen and handle events. Local events can cancel the global event (and + * further local events) by returning `false` from the callback. + * + * @copyright 2022 Winter. + * @author Ben Thomson + */ +export default class EventHandler extends Snowboard.PluginBase { + /** + * Constructor. + * + * @param {PluginBase} instance + * @param {String} eventPrefix + */ + construct(instance, eventPrefix) { + if (instance instanceof Snowboard.PluginBase === false) { + throw new Error('Event handling can only be applied to Snowboard classes.'); + } + if (!eventPrefix) { + throw new Error('Event prefix is required.'); + } + this.instance = instance; + this.eventPrefix = eventPrefix; + this.events = []; + } + + /** + * Registers a listener for a widget's event. + * + * @param {String} event + * @param {Function} callback + */ + on(event, callback) { + this.events.push({ + event, + callback, + }); + } + + /** + * Deregisters a listener for a widget's event. + * + * @param {String} event + * @param {Function} callback + */ + off(event, callback) { + this.events = this.events.filter((registeredEvent) => registeredEvent.event !== event || registeredEvent.callback !== callback); + } + + /** + * Registers a listener for a widget's event that will only fire once. + * + * @param {String} event + * @param {Function} callback + */ + once(event, callback) { + const length = this.events.push({ + event, + callback: (...parameters) => { + callback(...parameters); + this.events.splice(length - 1, 1); + }, + }); + } + + /** + * Fires an event on the widget. + * + * Local events are fired first, then a global event is fired afterwards. + * + * @param {String} eventName + * @param {...any} parameters + */ + fire(eventName, ...parameters) { + // Fire local events first + const events = this.events.filter((registeredEvent) => registeredEvent.event === eventName); + let cancelled = false; + events.forEach((event) => { + if (cancelled) { + return; + } + if (event.callback(...parameters) === false) { + cancelled = true; + } + }); + + if (!cancelled) { + this.snowboard.globalEvent(`${this.eventPrefix}.${eventName}`, ...parameters); + } + } + + /** + * Fires a promise event on the widget. + * + * Local events are fired first, then a global event is fired afterwards. + * + * @param {String} eventName + * @param {...any} parameters + */ + firePromise(eventName, ...parameters) { + const events = this.events.filter((registeredEvent) => registeredEvent.event === eventName); + const promises = events.filter((event) => event !== null, events.map((event) => event.callback(...parameters))); + + Promise.all(promises).then( + () => { + this.snowboard.globalPromiseEvent(`${this.eventPrefix}.${eventName}`, ...parameters); + }, + ); + } +} diff --git a/modules/backend/assets/ui/js/ui/WidgetHandler.js b/modules/backend/assets/ui/js/ui/WidgetHandler.js new file mode 100644 index 0000000..f332b55 --- /dev/null +++ b/modules/backend/assets/ui/js/ui/WidgetHandler.js @@ -0,0 +1,181 @@ +/** + * Backend widget handler. + * + * Handles the creation and disposal of widgets in the Backend. Widgets should include this as + * a dependency in order to be loaded and initialised after the handler, in order to correctly + * register. + * + * @copyright 2022 Winter. + * @author Ben Thomson + */ +export default class WidgetHandler extends Snowboard.Singleton { + /** + * Constructor. + */ + construct() { + this.registeredWidgets = []; + this.elements = []; + this.events = { + mutate: (mutations) => this.onMutation(mutations), + }; + this.observer = null; + } + + /** + * Listeners. + * + * @returns {Object} + */ + listens() { + return { + ready: 'onReady', + render: 'onRender', + ajaxUpdate: 'onAjaxUpdate', + }; + } + + /** + * Registers a widget as a given data control. + * + * Registering a widget will allow any element that contains a "data-control" attribute matching + * the control name to be initialized with the given widget. + * + * You may optionally provide a callback that will be fired when an instance of the widget is + * initialized - the callback will be provided the element and the widget instance as parameters. + * + * @param {String} control + * @param {Snowboard.PluginBase} widget + * @param {Function} callback + */ + register(control, widget, callback) { + this.registeredWidgets.push({ + control, + widget, + callback, + }); + } + + /** + * Unregisters a data control. + * + * @param {String} control + */ + unregister(control) { + this.registeredWidgets = this.registeredWidgets.filter((widget) => widget.control !== control); + } + + /** + * Ready handler. + * + * Initializes widgets within the entire document. + */ + onReady() { + this.initializeWidgets(document.body); + + // Register a DOM observer and watch for any removed nodes + if (!this.observer) { + this.observer = new MutationObserver(this.events.mutate); + this.observer.observe(document.body, { + childList: true, + subtree: true, + }); + } + } + + /** + * Render handler. + * + * Initializes widgets within the entire document. + */ + onRender() { + this.initializeWidgets(document.body); + } + + /** + * AJAX update handler. + * + * Initializes widgets inside an update element from an AJAX response. + * + * @param {HTMLElement} element + */ + onAjaxUpdate(element) { + this.initializeWidgets(element); + } + + /** + * Initializes all widgets within an element. + * + * If an element contains a "data-control" attribute matching a registered widget, the widget + * is initialized and attached to the element as a "widget" property. + * + * Only one widget may be initialized to a particular element. + * + * @param {HTMLElement} element + */ + initializeWidgets(element) { + this.registeredWidgets.forEach((widget) => { + const instances = element.querySelectorAll(`[data-control="${widget.control}"]:not([data-widget-initialized])`); + + if (instances.length) { + instances.forEach((instance) => { + // Prevent double-widget initialization + if (instance.dataset.widgetInitialized) { + return; + } + + const widgetInstance = this.snowboard[widget.widget](instance); + this.elements.push({ + element: instance, + instance: widgetInstance, + }); + instance.dataset.widgetInitialized = true; + this.snowboard.globalEvent('backend.widget.initialized', instance, widgetInstance); + + if (typeof widget.callback === 'function') { + widget.callback(widgetInstance, instance); + } + }); + } + }); + } + + /** + * Returns a widget that is attached to the given element, if any. + * + * @param {HTMLElement} element + * @returns {Snowboard.PluginBase|null} + */ + getWidget(element) { + const found = this.elements.find((widget) => widget.element === element); + + if (found) { + return found.instance; + } + + return null; + } + + /** + * Callback for mutation events. + * + * We're only tracking removed nodes, to ensure that those widgets are disposed of. + * + * @param {MutationRecord[]} mutations + */ + onMutation(mutations) { + const removedNodes = mutations.filter((mutation) => mutation.removedNodes.length).map((mutation) => Array.from(mutation.removedNodes)).flat(); + if (!removedNodes.length) { + return; + } + + removedNodes.forEach((node) => { + const widgets = this.elements.filter((widget) => node.contains(widget.element)); + if (widgets.length) { + widgets.forEach((widget) => { + widget.instance.destruct(); + this.elements = this.elements.filter((element) => element !== widget); + }); + } + }); + } +} diff --git a/modules/backend/assets/vendor/ace-codeeditor/build-min.js b/modules/backend/assets/vendor/ace-codeeditor/build-min.js new file mode 100644 index 0000000..c22c2f7 --- /dev/null +++ b/modules/backend/assets/vendor/ace-codeeditor/build-min.js @@ -0,0 +1,2314 @@ +var _=(function(){var root=this;var previousUnderscore=root._;var breaker={};var ArrayProto=Array.prototype,ObjProto=Object.prototype,FuncProto=Function.prototype;var slice=ArrayProto.slice,unshift=ArrayProto.unshift,toString=ObjProto.toString,hasOwnProperty=ObjProto.hasOwnProperty;var nativeForEach=ArrayProto.forEach,nativeMap=ArrayProto.map,nativeReduce=ArrayProto.reduce,nativeReduceRight=ArrayProto.reduceRight,nativeFilter=ArrayProto.filter,nativeEvery=ArrayProto.every,nativeSome=ArrayProto.some,nativeIndexOf=ArrayProto.indexOf,nativeLastIndexOf=ArrayProto.lastIndexOf,nativeIsArray=Array.isArray,nativeKeys=Object.keys,nativeBind=FuncProto.bind;var _=function(obj){return new wrapper(obj);};if(typeof exports!=='undefined'){if(typeof module!=='undefined'&&module.exports){exports=module.exports=_;}exports._=_;}else{root['_']=_;}_.VERSION='1.3.3';var each=_.each=_.forEach=function(obj,iterator,context){if(obj==null)return;if(nativeForEach&&obj.forEach===nativeForEach){obj.forEach(iterator,context); +}else if(obj.length===+obj.length){for(var i=0,l=obj.length;i2;if(obj==null)obj=[];if(nativeReduce&&obj.reduce===nativeReduce){if(context)iterator=_.bind(iterator,context);return initial?obj.reduce(iterator,memo):obj.reduce(iterator);}each(obj,function(value,index,list){if(!initial){memo=value;initial=true;}else{memo=iterator.call(context,memo,value,index,list);}});if(!initial)throw new TypeError('Reduce of empty array with no initial value'); +return memo;};_.reduceRight=_.foldr=function(obj,iterator,memo,context){var initial=arguments.length>2;if(obj==null)obj=[];if(nativeReduceRight&&obj.reduceRight===nativeReduceRight){if(context)iterator=_.bind(iterator,context);return initial?obj.reduceRight(iterator,memo):obj.reduceRight(iterator);}var reversed=_.toArray(obj).reverse();if(context&&!initial)iterator=_.bind(iterator,context);return initial?_.reduce(reversed,iterator,memo,context):_.reduce(reversed,iterator);};_.find=_.detect=function(obj,iterator,context){var result;any(obj,function(value,index,list){if(iterator.call(context,value,index,list)){result=value;return true;}});return result;};_.filter=_.select=function(obj,iterator,context){var results=[];if(obj==null)return results;if(nativeFilter&&obj.filter===nativeFilter)return obj.filter(iterator,context);each(obj,function(value,index,list){if(iterator.call(context,value,index,list))results[results.length]=value;});return results;};_.reject=function(obj,iterator,context){ +var results=[];if(obj==null)return results;each(obj,function(value,index,list){if(!iterator.call(context,value,index,list))results[results.length]=value;});return results;};_.every=_.all=function(obj,iterator,context){var result=true;if(obj==null)return result;if(nativeEvery&&obj.every===nativeEvery)return obj.every(iterator,context);each(obj,function(value,index,list){if(!(result=result&&iterator.call(context,value,index,list)))return breaker;});return!!result;};var any=_.some=_.any=function(obj,iterator,context){iterator||(iterator=_.identity);var result=false;if(obj==null)return result;if(nativeSome&&obj.some===nativeSome)return obj.some(iterator,context);each(obj,function(value,index,list){if(result||(result=iterator.call(context,value,index,list)))return breaker;});return!!result;};_.include=_.contains=function(obj,target){var found=false;if(obj==null)return found;if(nativeIndexOf&&obj.indexOf===nativeIndexOf)return obj.indexOf(target)!=-1;found=any(obj,function(value){return value===target; +});return found;};_.invoke=function(obj,method){var args=slice.call(arguments,2);return _.map(obj,function(value){return(_.isFunction(method)?method||value:value[method]).apply(value,args);});};_.pluck=function(obj,key){return _.map(obj,function(value){return value[key];});};_.max=function(obj,iterator,context){if(!iterator&&_.isArray(obj)&&obj[0]===+obj[0])return Math.max.apply(Math,obj);if(!iterator&&_.isEmpty(obj))return-Infinity;var result={computed:-Infinity};each(obj,function(value,index,list){var computed=iterator?iterator.call(context,value,index,list):value;computed>=result.computed&&(result={value:value,computed:computed});});return result.value;};_.min=function(obj,iterator,context){if(!iterator&&_.isArray(obj)&&obj[0]===+obj[0])return Math.min.apply(Math,obj);if(!iterator&&_.isEmpty(obj))return Infinity;var result={computed:Infinity};each(obj,function(value,index,list){var computed=iterator?iterator.call(context,value,index,list):value;computedb?1:0;}),'value');};_.groupBy=function(obj,val){var result={};var iterator=_.isFunction(val)?val:function(obj){return obj[val];};each(obj,function(value,index){var key=iterator(value,index);(result[key]||(result[key]=[])).push(value);});return result;};_.sortedIndex=function(array,obj,iterator){iterator||(iterator=_.identity);var low=0,high=array.length;while(low>1;iterator(array[mid])=0;});});};_.difference=function(array){var rest=_.flatten(slice.call(arguments,1),true);return _.filter(array,function(value){return!_.include(rest,value);});};_.zip=function(){var args=slice.call(arguments);var length=_.max(_.pluck(args,'length'));var results=new Array(length);for(var i=0;i=0;i--){args=[funcs[i].apply(this,args)];}return args[0];};};_.after=function(times,func){ +if(times<=0)return func();return function(){if(--times<1){return func.apply(this,arguments);}};};_.keys=nativeKeys||function(obj){if(obj!==Object(obj))throw new TypeError('Invalid object');var keys=[];for(var key in obj)if(_.has(obj,key))keys[keys.length]=key;return keys;};_.values=function(obj){return _.map(obj,_.identity);};_.functions=_.methods=function(obj){var names=[];for(var key in obj){if(_.isFunction(obj[key]))names.push(key);}return names.sort();};_.extend=function(obj){each(slice.call(arguments,1),function(source){for(var prop in source){obj[prop]=source[prop];}});return obj;};_.pick=function(obj){var result={};each(_.flatten(slice.call(arguments,1)),function(key){if(key in obj)result[key]=obj[key];});return result;};_.defaults=function(obj){each(slice.call(arguments,1),function(source){for(var prop in source){if(obj[prop]==null)obj[prop]=source[prop];}});return obj;};_.clone=function(obj){if(!_.isObject(obj))return obj;return _.isArray(obj)?obj.slice():_.extend({},obj);};_.tap=function(obj,interceptor){ +interceptor(obj);return obj;};function eq(a,b,stack){if(a===b)return a!==0||1/a==1/b;if(a==null||b==null)return a===b;if(a._chain)a=a._wrapped;if(b._chain)b=b._wrapped;if(a.isEqual&&_.isFunction(a.isEqual))return a.isEqual(b);if(b.isEqual&&_.isFunction(b.isEqual))return b.isEqual(a);var className=toString.call(a);if(className!=toString.call(b))return false;switch(className){case'[object String]':return a==String(b);case'[object Number]':return a!=+a?b!=+b:(a==0?1/a==1/b:a==+b);case'[object Date]':case'[object Boolean]':return+a==+b;case'[object RegExp]':return a.source==b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase;}if(typeof a!='object'||typeof b!='object')return false;var length=stack.length;while(length--){if(stack[length]==a)return true;}stack.push(a);var size=0,result=true;if(className=='[object Array]'){size=a.length;result=size==b.length;if(result){while(size--){if(!(result=size in a==size in b&&eq(a[size],b[size],stack)))break;}}}else{if('constructor'in a!='constructor'in b||a.constructor!=b.constructor)return false; +for(var key in a){if(_.has(a,key)){size++;if(!(result=_.has(b,key)&&eq(a[key],b[key],stack)))break;}}if(result){for(key in b){if(_.has(b,key)&&!(size--))break;}result=!size;}}stack.pop();return result;}_.isEqual=function(a,b){return eq(a,b,[]);};_.isEmpty=function(obj){if(obj==null)return true;if(_.isArray(obj)||_.isString(obj))return obj.length===0;for(var key in obj)if(_.has(obj,key))return false;return true;};_.isElement=function(obj){return!!(obj&&obj.nodeType==1);};_.isArray=nativeIsArray||function(obj){return toString.call(obj)=='[object Array]';};_.isObject=function(obj){return obj===Object(obj);};_.isArguments=function(obj){return toString.call(obj)=='[object Arguments]';};if(!_.isArguments(arguments)){_.isArguments=function(obj){return!!(obj&&_.has(obj,'callee'));};}_.isFunction=function(obj){return toString.call(obj)=='[object Function]';};_.isString=function(obj){return toString.call(obj)=='[object String]';};_.isNumber=function(obj){return toString.call(obj)=='[object Number]'; +};_.isFinite=function(obj){return _.isNumber(obj)&&isFinite(obj);};_.isNaN=function(obj){return obj!==obj;};_.isBoolean=function(obj){return obj===true||obj===false||toString.call(obj)=='[object Boolean]';};_.isDate=function(obj){return toString.call(obj)=='[object Date]';};_.isRegExp=function(obj){return toString.call(obj)=='[object RegExp]';};_.isNull=function(obj){return obj===null;};_.isUndefined=function(obj){return obj===void 0;};_.has=function(obj,key){return hasOwnProperty.call(obj,key);};_.noConflict=function(){root._=previousUnderscore;return this;};_.identity=function(value){return value;};_.times=function(n,iterator,context){for(var i=0;i/g,'>').replace(/"/g,'"').replace(/'/g,''').replace(/\//g,'/');};_.result=function(object,property){if(object==null)return null;var value=object[property];return _.isFunction(value)?value.call(object):value; +};_.mixin=function(obj){each(_.functions(obj),function(name){addToWrapper(name,_[name]=obj[name]);});};var idCounter=0;_.uniqueId=function(prefix){var id=idCounter++;return prefix?prefix+id:id;};_.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var noMatch=/.^/;var escapes={'\\':'\\',"'":"'",'r':'\r','n':'\n','t':'\t','u2028':'\u2028','u2029':'\u2029'};for(var p in escapes)escapes[escapes[p]]=p;var escaper=/\\|'|\r|\n|\t|\u2028|\u2029/g;var unescaper=/\\(\\|'|r|n|t|u2028|u2029)/g;var unescape=function(code){return code.replace(unescaper,function(match,escape){return escapes[escape];});};_.template=function(text,data,settings){settings=_.defaults(settings||{},_.templateSettings);var source="__p+='"+text.replace(escaper,function(match){return'\\'+escapes[match];}).replace(settings.escape||noMatch,function(match,code){return"'+\n_.escape("+unescape(code)+")+\n'";}).replace(settings.interpolate||noMatch,function(match,code){return"'+\n("+unescape(code)+")+\n'"; +}).replace(settings.evaluate||noMatch,function(match,code){return"';\n"+unescape(code)+"\n;__p+='";})+"';\n";if(!settings.variable)source='with(obj||{}){\n'+source+'}\n';source="var __p='';"+"var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n"+source+"return __p;\n";var render=new Function(settings.variable||'obj','_',source);if(data)return render(data,_);var template=function(data){return render.call(this,data,_);};template.source='function('+(settings.variable||'obj')+'){\n'+source+'}';return template;};_.chain=function(obj){return _(obj).chain();};var wrapper=function(obj){this._wrapped=obj;};_.prototype=wrapper.prototype;var result=function(obj,chain){return chain?_(obj).chain():obj;};var addToWrapper=function(name,func){wrapper.prototype[name]=function(){var args=slice.call(arguments);unshift.call(args,this._wrapped);return result(func.apply(_,args),this._chain);};};_.mixin(_);each(['pop','push','reverse','shift','sort','splice','unshift'],function(name){var method=ArrayProto[name]; +wrapper.prototype[name]=function(){var wrapped=this._wrapped;method.apply(wrapped,arguments);var length=wrapped.length;if((name=='shift'||name=='splice')&&length===0)delete wrapped[0];return result(wrapped,this._chain);};});each(['concat','join','slice'],function(name){var method=ArrayProto[name];wrapper.prototype[name]=function(){return result(method.apply(this._wrapped,arguments),this._chain);};});wrapper.prototype.chain=function(){this._chain=true;return this;};wrapper.prototype.value=function(){return this._wrapped;};return _;}).call({});var emmet=(function(global){var defaultSyntax='html';var defaultProfile='plain';if(typeof _=='undefined'){try{_=global[['require'][0]]('underscore');}catch(e){}}if(typeof _=='undefined'){throw'Cannot access to Underscore.js lib';}var modules={_:_};var ctor=function(){};function inherits(parent,protoProps,staticProps){var child;if(protoProps&&protoProps.hasOwnProperty('constructor')){child=protoProps.constructor;}else{child=function(){parent.apply(this,arguments); +};}_.extend(child,parent);ctor.prototype=parent.prototype;child.prototype=new ctor();if(protoProps)_.extend(child.prototype,protoProps);if(staticProps)_.extend(child,staticProps);child.prototype.constructor=child;child.__super__=parent.prototype;return child;};var moduleLoader=null;function r(name){if(!(name in modules)&&moduleLoader)moduleLoader(name);return modules[name];}return{define:function(name,factory){if(!(name in modules)){modules[name]=_.isFunction(factory)?this.exec(factory):factory;}},require:r,exec:function(fn,context){return fn.call(context||global,_.bind(r,this),_,this);},extend:function(protoProps,classProps){var child=inherits(this,protoProps,classProps);child.extend=this.extend;if(protoProps.hasOwnProperty('toString'))child.prototype.toString=protoProps.toString;return child;},expandAbbreviation:function(abbr,syntax,profile,contextNode){if(!abbr)return'';syntax=syntax||defaultSyntax;var filters=r('filters');var parser=r('abbreviationParser');profile=r('profile').get(profile,syntax); +r('tabStops').resetTabstopIndex();var data=filters.extractFromAbbreviation(abbr);var outputTree=parser.parse(data[0],{syntax:syntax,contextNode:contextNode});var filtersList=filters.composeList(syntax,profile,data[1]);filters.apply(outputTree,filtersList,profile);return outputTree.toString();},defaultSyntax:function(){return defaultSyntax;},defaultProfile:function(){return defaultProfile;},log:function(){if(global.console&&global.console.log)global.console.log.apply(global.console,arguments);},setModuleLoader:function(fn){moduleLoader=fn;}};})(this);if(typeof exports!=='undefined'){if(typeof module!=='undefined'&&module.exports){exports=module.exports=emmet;}exports.emmet=emmet;}if(typeof define!=='undefined'){define('emmet',[],emmet);}emmet.define('abbreviationParser',function(require,_){var reValidName=/^[\w\-\$\:@\!%]+\+?$/i;var reWord=/[\w\-:\$@]/;var pairs={'[':']','(':')','{':'}'};var spliceFn=Array.prototype.splice;var preprocessors=[];var postprocessors=[];var outputProcessors=[]; +function AbbreviationNode(parent){this.parent=null;this.children=[];this._attributes=[];this.abbreviation='';this.counter=1;this._name=null;this._text='';this.repeatCount=1;this.hasImplicitRepeat=false;this._data={};this.start='';this.end='';this.content='';this.padding='';}AbbreviationNode.prototype={addChild:function(child,position){child=child||new AbbreviationNode;child.parent=this;if(_.isUndefined(position)){this.children.push(child);}else{this.children.splice(position,0,child);}return child;},clone:function(){var node=new AbbreviationNode();var attrs=['abbreviation','counter','_name','_text','repeatCount','hasImplicitRepeat','start','end','content','padding'];_.each(attrs,function(a){node[a]=this[a];},this);node._attributes=_.map(this._attributes,function(attr){return _.clone(attr);});node._data=_.clone(this._data);node.children=_.map(this.children,function(child){child=child.clone();child.parent=node;return child;});return node;},remove:function(){if(this.parent){this.parent.children=_.without(this.parent.children,this); +}return this;},replace:function(){var parent=this.parent;var ix=_.indexOf(parent.children,this);var items=_.flatten(arguments);spliceFn.apply(parent.children,[ix,1].concat(items));_.each(items,function(item){item.parent=parent;});},updateProperty:function(name,value){this[name]=value;_.each(this.children,function(child){child.updateProperty(name,value);});return this;},find:function(fn){return this.findAll(fn)[0];},findAll:function(fn){if(!_.isFunction(fn)){var elemName=fn.toLowerCase();fn=function(item){return item.name().toLowerCase()==elemName;};}var result=[];_.each(this.children,function(child){if(fn(child))result.push(child);result=result.concat(child.findAll(fn));});return _.compact(result);},data:function(name,value){if(arguments.length==2){this._data[name]=value;if(name=='resource'&&require('elements').is(value,'snippet')){this.content=value.data;if(this._text){this.content=require('abbreviationUtils').insertChildContent(value.data,this._text);}}}return this._data[name];},name:function(){ +var res=this.matchedResource();if(require('elements').is(res,'element')){return res.name;}return this._name;},attributeList:function(){var attrs=[];var res=this.matchedResource();if(require('elements').is(res,'element')&&_.isArray(res.attributes)){attrs=attrs.concat(res.attributes);}return optimizeAttributes(attrs.concat(this._attributes));},attribute:function(name,value){if(arguments.length==2){var ix=_.indexOf(_.pluck(this._attributes,'name'),name.toLowerCase());if(~ix){this._attributes[ix].value=value;}else{this._attributes.push({name:name,value:value});}}return(_.find(this.attributeList(),function(attr){return attr.name==name;})||{}).value;},matchedResource:function(){return this.data('resource');},index:function(){return this.parent?_.indexOf(this.parent.children,this):-1;},_setRepeat:function(count){if(count){this.repeatCount=parseInt(count,10)||1;}else{this.hasImplicitRepeat=true;}},setAbbreviation:function(abbr){abbr=abbr||'';var that=this;abbr=abbr.replace(/\*(\d+)?$/,function(str,repeatCount){ +that._setRepeat(repeatCount);return'';});this.abbreviation=abbr;var abbrText=extractText(abbr);if(abbrText){abbr=abbrText.element;this.content=this._text=abbrText.text;}var abbrAttrs=parseAttributes(abbr);if(abbrAttrs){abbr=abbrAttrs.element;this._attributes=abbrAttrs.attributes;}this._name=abbr;if(this._name&&!reValidName.test(this._name)){throw'Invalid abbreviation';}},toString:function(){var utils=require('utils');var start=this.start;var end=this.end;var content=this.content;var node=this;_.each(outputProcessors,function(fn){start=fn(start,node,'start');content=fn(content,node,'content');end=fn(end,node,'end');});var innerContent=_.map(this.children,function(child){return child.toString();}).join('');content=require('abbreviationUtils').insertChildContent(content,innerContent,{keepVariable:false});return start+utils.padString(content,this.padding)+end;},hasEmptyChildren:function(){return!!_.find(this.children,function(child){return child.isEmpty();});},hasImplicitName:function(){ +return!this._name&&!this.isTextNode();},isGroup:function(){return!this.abbreviation;},isEmpty:function(){return!this.abbreviation&&!this.children.length;},isRepeating:function(){return this.repeatCount>1||this.hasImplicitRepeat;},isTextNode:function(){return!this.name()&&!this.attributeList().length;},isElement:function(){return!this.isEmpty()&&!this.isTextNode();},deepestChild:function(){if(!this.children.length)return null;var deepestChild=this;while(deepestChild.children.length){deepestChild=_.last(deepestChild.children);}return deepestChild;}};function stripped(str){return str.substring(1,str.length-1);}function consumeQuotedValue(stream,quote){var ch;while(ch=stream.next()){if(ch===quote)return true;if(ch=='\\')continue;}return false;}function parseAbbreviation(abbr){abbr=require('utils').trim(abbr);var root=new AbbreviationNode;var context=root.addChild(),ch;var stream=require('stringStream').create(abbr);var loopProtector=1000,multiplier;while(!stream.eol()&&--loopProtector>0){ +ch=stream.peek();switch(ch){case'(':stream.start=stream.pos;if(stream.skipToPair('(',')')){var inner=parseAbbreviation(stripped(stream.current()));if(multiplier=stream.match(/^\*(\d+)?/,true)){context._setRepeat(multiplier[1]);}_.each(inner.children,function(child){context.addChild(child);});}else{throw'Invalid abbreviation: mo matching ")" found for character at '+stream.pos;}break;case'>':context=context.addChild();stream.next();break;case'+':context=context.parent.addChild();stream.next();break;case'^':var parent=context.parent||context;context=(parent.parent||parent).addChild();stream.next();break;default:stream.start=stream.pos;stream.eatWhile(function(c){if(c=='['||c=='{'){if(stream.skipToPair(c,pairs[c])){stream.backUp(1);return true;}throw'Invalid abbreviation: mo matching "'+pairs[c]+'" found for character at '+stream.pos;}if(c=='+'){stream.next();var isMarker=stream.eol()||~'+>^*'.indexOf(stream.peek());stream.backUp(1);return isMarker;}return c!='('&&isAllowedChar(c);}); +context.setAbbreviation(stream.current());stream.start=stream.pos;}}if(loopProtector<1)throw'Endless loop detected';return root;}function extractAttributes(attrSet,attrs){attrSet=require('utils').trim(attrSet);var result=[];var stream=require('stringStream').create(attrSet);stream.eatSpace();while(!stream.eol()){stream.start=stream.pos;if(stream.eatWhile(reWord)){var attrName=stream.current();var attrValue='';if(stream.peek()=='='){stream.next();stream.start=stream.pos;var quote=stream.peek();if(quote=='"'||quote=="'"){stream.next();if(consumeQuotedValue(stream,quote)){attrValue=stream.current();attrValue=attrValue.substring(1,attrValue.length-1);}else{throw'Invalid attribute value';}}else if(stream.eatWhile(/[^\s\]]/)){attrValue=stream.current();}else{throw'Invalid attribute value';}}result.push({name:attrName,value:attrValue});stream.eatSpace();}else{break;}}return result;}function parseAttributes(abbr){var result=[];var attrMap={'#':'id','.':'class'};var nameEnd=null;var stream=require('stringStream').create(abbr); +while(!stream.eol()){switch(stream.peek()){case'#':case'.':if(nameEnd===null)nameEnd=stream.pos;var attrName=attrMap[stream.peek()];stream.next();stream.start=stream.pos;stream.eatWhile(reWord);result.push({name:attrName,value:stream.current()});break;case'[':if(nameEnd===null)nameEnd=stream.pos;stream.start=stream.pos;if(!stream.skipToPair('[',']'))throw'Invalid attribute set definition';result=result.concat(extractAttributes(stripped(stream.current())));break;default:stream.next();}}if(!result.length)return null;return{element:abbr.substring(0,nameEnd),attributes:optimizeAttributes(result)};}function optimizeAttributes(attrs){attrs=_.map(attrs,function(attr){return _.clone(attr);});var lookup={};return _.filter(attrs,function(attr){if(!(attr.name in lookup)){return lookup[attr.name]=attr;}var la=lookup[attr.name];if(attr.name.toLowerCase()=='class'){la.value+=(la.value.length?' ':'')+attr.value;}else{la.value=attr.value;}return false;});}function extractText(abbr){if(!~abbr.indexOf('{')) +return null;var stream=require('stringStream').create(abbr);while(!stream.eol()){switch(stream.peek()){case'[':case'(':stream.skipToPair(stream.peek(),pairs[stream.peek()]);break;case'{':stream.start=stream.pos;stream.skipToPair('{','}');return{element:abbr.substring(0,stream.start),text:stripped(stream.current())};default:stream.next();}}}function unroll(node){for(var i=node.children.length-1,j,child,maxCount;i>=0;i--){child=node.children[i];if(child.isRepeating()){maxCount=j=child.repeatCount;child.repeatCount=1;child.updateProperty('counter',1);child.updateProperty('maxCount',maxCount);while(--j>0){child.parent.addChild(child.clone(),i+1).updateProperty('counter',j+1).updateProperty('maxCount',maxCount);}}}_.each(node.children,unroll);return node;}function squash(node){for(var i=node.children.length-1;i>=0;i--){var n=node.children[i];if(n.isGroup()){n.replace(squash(n).children);}else if(n.isEmpty()){n.remove();}}_.each(node.children,squash);return node;}function isAllowedChar(ch){ +var charCode=ch.charCodeAt(0);var specialChars='#.*:$-_!@|%';return(charCode>64&&charCode<91)||(charCode>96&&charCode<123)||(charCode>47&&charCode<58)||specialChars.indexOf(ch)!=-1;}outputProcessors.push(function(text,node){return require('utils').replaceCounter(text,node.counter,node.maxCount);});return{parse:function(abbr,options){options=options||{};var tree=parseAbbreviation(abbr);if(options.contextNode){tree._name=options.contextNode.name;var attrLookup={};_.each(tree._attributes,function(attr){attrLookup[attr.name]=attr;});_.each(options.contextNode.attributes,function(attr){if(attr.name in attrLookup){attrLookup[attr.name].value=attr.value;}else{attr=_.clone(attr);tree._attributes.push(attr);attrLookup[attr.name]=attr;}});}_.each(preprocessors,function(fn){fn(tree,options);});tree=squash(unroll(tree));_.each(postprocessors,function(fn){fn(tree,options);});return tree;},AbbreviationNode:AbbreviationNode,addPreprocessor:function(fn){if(!_.include(preprocessors,fn))preprocessors.push(fn); +},removeFilter:function(fn){preprocessor=_.without(preprocessors,fn);},addPostprocessor:function(fn){if(!_.include(postprocessors,fn))postprocessors.push(fn);},removePostprocessor:function(fn){postprocessors=_.without(postprocessors,fn);},addOutputProcessor:function(fn){if(!_.include(outputProcessors,fn))outputProcessors.push(fn);},removeOutputProcessor:function(fn){outputProcessors=_.without(outputProcessors,fn);},isAllowedChar:function(ch){ch=String(ch);return isAllowedChar(ch)||~'>+^[](){}'.indexOf(ch);}};});emmet.exec(function(require,_){function matchResources(node,syntax){var resources=require('resources');var elements=require('elements');var parser=require('abbreviationParser');_.each(_.clone(node.children),function(child){var r=resources.getMatchedResource(child,syntax);if(_.isString(r)){child.data('resource',elements.create('snippet',r));}else if(elements.is(r,'reference')){var subtree=parser.parse(r.data,{syntax:syntax});if(child.repeatCount>1){var repeatedChildren=subtree.findAll(function(node){ +return node.hasImplicitRepeat;});_.each(repeatedChildren,function(node){node.repeatCount=child.repeatCount;node.hasImplicitRepeat=false;});}var deepestChild=subtree.deepestChild();if(deepestChild){_.each(child.children,function(c){deepestChild.addChild(c);});}_.each(subtree.children,function(node){_.each(child.attributeList(),function(attr){node.attribute(attr.name,attr.value);});});child.replace(subtree.children);}else{child.data('resource',r);}matchResources(child,syntax);});}require('abbreviationParser').addPreprocessor(function(tree,options){var syntax=options.syntax||emmet.defaultSyntax();matchResources(tree,syntax);});});emmet.exec(function(require,_){var parser=require('abbreviationParser');var outputPlaceholder='$#';function locateOutputPlaceholder(text){var range=require('range');var result=[];var stream=require('stringStream').create(text);while(!stream.eol()){if(stream.peek()=='\\'){stream.next();}else{stream.start=stream.pos;if(stream.match(outputPlaceholder,true)){result.push(range.create(stream.start,outputPlaceholder)); +continue;}}stream.next();}return result;}function replaceOutputPlaceholders(source,value){var utils=require('utils');var ranges=locateOutputPlaceholder(source);ranges.reverse();_.each(ranges,function(r){source=utils.replaceSubstring(source,value,r);});return source;}function hasOutputPlaceholder(node){if(locateOutputPlaceholder(node.content).length)return true;return!!_.find(node.attributeList(),function(attr){return!!locateOutputPlaceholder(attr.value).length;});}function insertPastedContent(node,content,overwrite){var nodesWithPlaceholders=node.findAll(function(item){return hasOutputPlaceholder(item);});if(hasOutputPlaceholder(node))nodesWithPlaceholders.unshift(node);if(nodesWithPlaceholders.length){_.each(nodesWithPlaceholders,function(item){item.content=replaceOutputPlaceholders(item.content,content);_.each(item._attributes,function(attr){attr.value=replaceOutputPlaceholders(attr.value,content);});});}else{var deepest=node.deepestChild()||node;if(overwrite){deepest.content=content; +}else{deepest.content=require('abbreviationUtils').insertChildContent(deepest.content,content);}}}parser.addPreprocessor(function(tree,options){if(options.pastedContent){var utils=require('utils');var lines=_.map(utils.splitByLines(options.pastedContent,true),utils.trim);tree.findAll(function(item){if(item.hasImplicitRepeat){item.data('paste',lines);return item.repeatCount=lines.length;}});}});parser.addPostprocessor(function(tree,options){var targets=tree.findAll(function(item){var pastedContentObj=item.data('paste');var pastedContent='';if(_.isArray(pastedContentObj)){pastedContent=pastedContentObj[item.counter-1];}else if(_.isFunction(pastedContentObj)){pastedContent=pastedContentObj(item.counter-1,item.content);}else if(pastedContentObj){pastedContent=pastedContentObj;}if(pastedContent){insertPastedContent(item,pastedContent,!!item.data('pasteOverwrites'));}item.data('paste',null);return!!pastedContentObj;});if(!targets.length&&options.pastedContent){insertPastedContent(tree,options.pastedContent); +}});});emmet.exec(function(require,_){function resolveNodeNames(tree){var tagName=require('tagName');_.each(tree.children,function(node){if(node.hasImplicitName()||node.data('forceNameResolving')){node._name=tagName.resolve(node.parent.name());}resolveNodeNames(node);});return tree;}require('abbreviationParser').addPostprocessor(resolveNodeNames);});emmet.define('cssParser',function(require,_){var walker,tokens=[],isOp,isNameChar,isDigit;walker={lines:null,total_lines:0,linenum:-1,line:'',ch:'',chnum:-1,init:function(source){var me=walker;me.lines=source.replace(/\r\n/g,'\n').replace(/\r/g,'\n').split('\n');me.total_lines=me.lines.length;me.chnum=-1;me.linenum=-1;me.ch='';me.line='';me.nextLine();me.nextChar();},nextLine:function(){var me=this;me.linenum+=1;if(me.total_lines<=me.linenum){me.line=false;}else{me.line=me.lines[me.linenum];}if(me.chnum!==-1){me.chnum=0;}return me.line;},nextChar:function(){var me=this;me.chnum+=1;while(me.line.charAt(me.chnum)===''){if(this.nextLine()===false){ +me.ch=false;return false;}me.chnum=-1;me.ch='\n';return'\n';}me.ch=me.line.charAt(me.chnum);return me.ch;},peek:function(){return this.line.charAt(this.chnum+1);}};isNameChar=function(c){return(c=='&'||c==='_'||c==='-'||(c>='a'&&c<='z')||(c>='A'&&c<='Z'));};isDigit=function(ch){return(ch!==false&&ch>='0'&&ch<='9');};isOp=(function(){var opsa="{}[]()+*=.,;:>~|\\%$#@^!".split(''),opsmatcha="*^|$~".split(''),ops={},opsmatch={},i=0;for(;i"));else return null;}else if(stream.match("--"))return chain(inBlock("comment","-->"));else if(stream.match("DOCTYPE",true,true)){stream.eatWhile(/[\w\._\-]/);return chain(doctype(1));}else return null;}else if(stream.eat("?")){stream.eatWhile(/[\w\._\-]/);state.tokenize=inBlock("meta","?>");return"meta";}else{ +type=stream.eat("/")?"closeTag":"openTag";stream.eatSpace();tagName="";var c;while((c=stream.eat(/[^\s\u00a0=<>\"\'\/?]/)))tagName+=c;state.tokenize=inTag;return"tag";}}else if(ch=="&"){var ok;if(stream.eat("#")){if(stream.eat("x")){ok=stream.eatWhile(/[a-fA-F\d]/)&&stream.eat(";");}else{ok=stream.eatWhile(/[\d]/)&&stream.eat(";");}}else{ok=stream.eatWhile(/[\w\.\-:]/)&&stream.eat(";");}return ok?"atom":"error";}else{stream.eatWhile(/[^&<]/);return"text";}}function inTag(stream,state){var ch=stream.next();if(ch==">"||(ch=="/"&&stream.eat(">"))){state.tokenize=inText;type=ch==">"?"endTag":"selfcloseTag";return"tag";}else if(ch=="="){type="equals";return null;}else if(/[\'\"]/.test(ch)){state.tokenize=inAttribute(ch);return state.tokenize(stream,state);}else{stream.eatWhile(/[^\s\u00a0=<>\"\'\/?]/);return"word";}}function inAttribute(quote){return function(stream,state){while(!stream.eol()){if(stream.next()==quote){state.tokenize=inTag;break;}}return"string";};}function inBlock(style,terminator){ +return function(stream,state){while(!stream.eol()){if(stream.match(terminator)){state.tokenize=inText;break;}stream.next();}return style;};}function doctype(depth){return function(stream,state){var ch;while((ch=stream.next())!=null){if(ch=="<"){state.tokenize=doctype(depth+1);return state.tokenize(stream,state);}else if(ch==">"){if(depth==1){state.tokenize=inText;break;}else{state.tokenize=doctype(depth-1);return state.tokenize(stream,state);}}}return"meta";};}var curState=null,setStyle;function pass(){for(var i=arguments.length-1;i>=0;i--)curState.cc.push(arguments[i]);}function cont(){pass.apply(null,arguments);return true;}function pushContext(tagName,startOfLine){var noIndent=Kludges.doNotIndent.hasOwnProperty(tagName)||(curState.context&&curState.context.noIndent);curState.context={prev:curState.context,tagName:tagName,indent:curState.indented,startOfLine:startOfLine,noIndent:noIndent};}function popContext(){if(curState.context)curState.context=curState.context.prev;}function element(type){ +if(type=="openTag"){curState.tagName=tagName;return cont(attributes,endtag(curState.startOfLine));}else if(type=="closeTag"){var err=false;if(curState.context){if(curState.context.tagName!=tagName){if(Kludges.implicitlyClosed.hasOwnProperty(curState.context.tagName.toLowerCase())){popContext();}err=!curState.context||curState.context.tagName!=tagName;}}else{err=true;}if(err)setStyle="error";return cont(endclosetag(err));}return cont();}function endtag(startOfLine){return function(type){if(type=="selfcloseTag"||(type=="endTag"&&Kludges.autoSelfClosers.hasOwnProperty(curState.tagName.toLowerCase()))){maybePopContext(curState.tagName.toLowerCase());return cont();}if(type=="endTag"){maybePopContext(curState.tagName.toLowerCase());pushContext(curState.tagName,startOfLine);return cont();}return cont();};}function endclosetag(err){return function(type){if(err)setStyle="error";if(type=="endTag"){popContext();return cont();}setStyle="error";return cont(arguments.callee);};}function maybePopContext(nextTagName){ +var parentTagName;while(true){if(!curState.context){return;}parentTagName=curState.context.tagName.toLowerCase();if(!Kludges.contextGrabbers.hasOwnProperty(parentTagName)||!Kludges.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)){return;}popContext();}}function attributes(type){if(type=="word"){setStyle="attribute";return cont(attribute,attributes);}if(type=="endTag"||type=="selfcloseTag")return pass();setStyle="error";return cont(attributes);}function attribute(type){if(type=="equals")return cont(attvalue,attributes);if(!Kludges.allowMissing)setStyle="error";return(type=="endTag"||type=="selfcloseTag")?pass():cont();}function attvalue(type){if(type=="string")return cont(attvaluemaybe);if(type=="word"&&Kludges.allowUnquoted){setStyle="string";return cont();}setStyle="error";return(type=="endTag"||type=="selfCloseTag")?pass():cont();}function attvaluemaybe(type){if(type=="string")return cont(attvaluemaybe);else return pass();}function startState(){return{tokenize:inText,cc:[], +indented:0,startOfLine:true,tagName:null,context:null};}function token(stream,state){if(stream.sol()){state.startOfLine=true;state.indented=0;}if(stream.eatSpace())return null;setStyle=type=tagName=null;var style=state.tokenize(stream,state);state.type=type;if((style||type)&&style!="comment"){curState=state;while(true){var comb=state.cc.pop()||element;if(comb(type||style))break;}}state.startOfLine=false;return setStyle||style;}return{parse:function(data,offset){offset=offset||0;var state=startState();var stream=require('stringStream').create(data);var tokens=[];while(!stream.eol()){tokens.push({type:token(stream,state),start:stream.start+offset,end:stream.pos+offset});stream.start=stream.pos;}return tokens;}};});emmet.define('string-score',function(require,_){return{score:function(string,abbreviation,fuzziness){if(string==abbreviation){return 1;}if(abbreviation==""){return 0;}var total_character_score=0,abbreviation_length=abbreviation.length,string_length=string.length, +start_of_string_bonus,abbreviation_score,fuzzies=1,final_score;for(var i=0,character_score,index_in_string,c,index_c_lowercase,index_c_uppercase,min_index;i-1)?min_index:Math.max(index_c_lowercase,index_c_uppercase);if(index_in_string===-1){if(fuzziness){fuzzies+=1-fuzziness;continue;}else{return 0;}}else{character_score=0.1;}if(string[index_in_string]===c){character_score+=0.1;}if(index_in_string===0){character_score+=0.6;if(i===0){start_of_string_bonus=1;}}else{if(string.charAt(index_in_string-1)===' '){character_score+=0.8;}}string=string.substring(index_in_string+1,string_length);total_character_score+=character_score;}abbreviation_score=total_character_score/abbreviation_length;final_score=((abbreviation_score*(abbreviation_length/string_length))+abbreviation_score)/2; +final_score=final_score/fuzzies;if(start_of_string_bonus&&(final_score+0.15<1)){final_score+=0.15;}return final_score;}};});emmet.define('utils',function(require,_){var caretPlaceholder='${0}';function StringBuilder(value){this._data=[];this.length=0;if(value)this.append(value);}StringBuilder.prototype={append:function(text){this._data.push(text);this.length+=text.length;},toString:function(){return this._data.join('');},valueOf:function(){return this.toString();}};return{reTag:/<\/?[\w:\-]+(?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*\s*(\/?)>$/,endsWithTag:function(str){return this.reTag.test(str);},isNumeric:function(ch){if(typeof(ch)=='string')ch=ch.charCodeAt(0);return(ch&&ch>47&&ch<58);},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},getNewline:function(){var res=require('resources');if(!res){return'\n';}var nl=res.getVariable('newline');return _.isString(nl)?nl:'\n';},setNewline:function(str){var res=require('resources');res.setVariable('newline',str); +res.setVariable('nl',str);},splitByLines:function(text,removeEmpty){var nl=this.getNewline();var lines=(text||'').replace(/\r\n/g,'\n').replace(/\n\r/g,'\n').replace(/\r/g,'\n').replace(/\n/g,nl).split(nl);if(removeEmpty){lines=_.filter(lines,function(line){return line.length&&!!this.trim(line);},this);}return lines;},normalizeNewline:function(text){return this.splitByLines(text).join(this.getNewline());},repeatString:function(str,howMany){var result=[];for(var i=0;iil++)padding+='0';return padding+str;},unindentString:function(text,pad){var lines=this.splitByLines(text);for(var i=0;istr.length)return str;return str.substring(0,start)+value+str.substring(end);},narrowToNonSpace:function(text,start,end){var range=require('range').create(start,end);var reSpace=/[\s\n\r\u00a0]/;while(range.startrange.start){range.end--;if(!reSpace.test(text.charAt(range.end))){range.end++;break;}}return range;},findNewlineBounds:function(text,from){var len=text.length,start=0,end=len-1;for(var i=from-1;i>0;i--){var ch=text.charAt(i);if(ch=='\n'||ch=='\r'){start=i+1;break;}}for(var j=from;j':return a>b;case'gte':case'>=':return a>=b;}}function Range(start,len){if(_.isObject(start)&&'start'in start){this.start=Math.min(start.start,start.end);this.end=Math.max(start.start,start.end);}else if(_.isArray(start)){this.start=start[0];this.end=start[1];}else{len=_.isString(len)?len.length:+len;this.start=start;this.end=start+len;}}Range.prototype={length:function(){return Math.abs(this.end-this.start);},equal:function(range){return this.cmp(range,'eq','eq'); +},shift:function(delta){this.start+=delta;this.end+=delta;return this;},overlap:function(range){return range.start<=this.end&&range.end>=this.start;},intersection:function(range){if(this.overlap(range)){var start=Math.max(range.start,this.start);var end=Math.min(range.end,this.end);return new Range(start,end-start);}return null;},union:function(range){if(this.overlap(range)){var start=Math.min(range.start,this.start);var end=Math.max(range.end,this.end);return new Range(start,end-start);}return null;},inside:function(loc){return this.cmp(loc,'lte','gt');},contains:function(loc){return this.cmp(loc,'lt','gt');},include:function(r){return this.cmp(loc,'lte','gte');},cmp:function(loc,left,right){var a,b;if(loc instanceof Range){a=loc.start;b=loc.end;}else{a=b=loc;}return cmp(this.start,a,left||'<=')&&cmp(this.end,b,right||'>');},substring:function(str){return this.length()>0?str.substring(this.start,this.end):'';},clone:function(){return new Range(this.start,this.length());},toArray:function(){ +return[this.start,this.end];},toString:function(){return'{'+this.start+', '+this.length()+'}';}};return{create:function(start,len){if(_.isUndefined(start)||start===null)return null;if(start instanceof Range)return start;if(_.isObject(start)&&'start'in start&&'end'in start){len=start.end-start.start;start=start.start;}return new Range(start,len);},create2:function(start,end){if(_.isNumber(start)&&_.isNumber(end)){end-=start;}return this.create(start,end);}};});emmet.define('handlerList',function(require,_){function HandlerList(){this._list=[];}HandlerList.prototype={add:function(fn,options){this._list.push(_.extend({order:0},options||{},{fn:fn}));},remove:function(fn){this._list=_.without(this._list,_.find(this._list,function(item){return item.fn===fn;}));},list:function(){return _.sortBy(this._list,'order').reverse();},listFn:function(){return _.pluck(this.list(),'fn');},exec:function(skipValue,args){args=args||[];var result=null;_.find(this.list(),function(h){result=h.fn.apply(h,args); +if(result!==skipValue)return true;});return result;}};return{create:function(){return new HandlerList();}};});emmet.define('tokenIterator',function(require,_){function TokenIterator(tokens){this.tokens=tokens;this._position=0;this.reset();}TokenIterator.prototype={next:function(){if(this.hasNext()){var token=this.tokens[++this._i];this._position=token.start;return token;}return null;},current:function(){return this.tokens[this._i];},position:function(){return this._position;},hasNext:function(){return this._i=this.string.length;},sol:function(){return this.pos==0;},peek:function(){return this.string.charAt(this.pos);},next:function(){if(this.posstart;},eatSpace:function(){var start=this.pos;while(/[\s\u00a0]/.test(this.string.charAt(this.pos)))++this.pos;return this.pos>start;},skipToEnd:function(){this.pos=this.string.length;},skipTo:function(ch){var found=this.string.indexOf(ch,this.pos);if(found>-1){this.pos=found;return true;}},skipToPair:function(open,close){var braceCount=0,ch;var pos=this.pos,len=this.string.length; +while(pos/;var systemSettings={};var userSettings={};var resolvers=require('handlerList').create(); +function normalizeCaretPlaceholder(text){var utils=require('utils');return utils.replaceUnescapedSymbol(text,'|',utils.getCaretPlaceholder());}function parseItem(name,value,type){value=normalizeCaretPlaceholder(value);if(type=='snippets'){return require('elements').create('snippet',value);}if(type=='abbreviations'){return parseAbbreviation(name,value);}}function parseAbbreviation(key,value){key=require('utils').trim(key);var elements=require('elements');var m;if(m=reTag.exec(value)){return elements.create('element',m[1],m[2],m[4]=='/');}else{return elements.create('reference',value);}}function normalizeName(str){return str.replace(/:$/,'').replace(/:/g,'-');}return{setVocabulary:function(data,type){cache={};if(type==VOC_SYSTEM)systemSettings=data;else userSettings=data;},getVocabulary:function(name){return name==VOC_SYSTEM?systemSettings:userSettings;},getMatchedResource:function(node,syntax){return resolvers.exec(null,_.toArray(arguments))||this.findSnippet(syntax,node.name());}, +getVariable:function(name){return(this.getSection('variables')||{})[name];},setVariable:function(name,value){var voc=this.getVocabulary('user')||{};if(!('variables'in voc))voc.variables={};voc.variables[name]=value;this.setVocabulary(voc,'user');},hasSyntax:function(syntax){return syntax in this.getVocabulary(VOC_USER)||syntax in this.getVocabulary(VOC_SYSTEM);},addResolver:function(fn,options){resolvers.add(fn,options);},removeResolver:function(fn){resolvers.remove(fn);},getSection:function(name){if(!name)return null;if(!(name in cache)){cache[name]=require('utils').deepMerge({},systemSettings[name],userSettings[name]);}var data=cache[name],subsections=_.rest(arguments),key;while(data&&(key=subsections.shift())){if(key in data){data=data[key];}else{return null;}}return data;},findItem:function(topSection,subsection){var data=this.getSection(topSection);while(data){if(subsection in data)return data[subsection];data=this.getSection(data['extends']);}},findSnippet:function(syntax,name,memo){ +if(!syntax||!name)return null;memo=memo||[];var names=[name];if(~name.indexOf('-'))names.push(name.replace(/\-/g,':'));var data=this.getSection(syntax),matchedItem=null;_.find(['snippets','abbreviations'],function(sectionName){var data=this.getSection(syntax,sectionName);if(data){return _.find(names,function(n){if(data[n])return matchedItem=parseItem(n,data[n],sectionName);});}},this);memo.push(syntax);if(!matchedItem&&data['extends']&&!_.include(memo,data['extends'])){return this.findSnippet(data['extends'],name,memo);}return matchedItem;},fuzzyFindSnippet:function(syntax,name,minScore){minScore=minScore||0.3;var payload=this.getAllSnippets(syntax);var sc=require('string-score');name=normalizeName(name);var scores=_.map(payload,function(value,key){return{key:key,score:sc.score(value.nk,name,0.1)};});var result=_.last(_.sortBy(scores,'score'));if(result&&result.score>=minScore){var k=result.key;return payload[k].parsedValue;}},getAllSnippets:function(syntax){var cacheKey='all-'+syntax; +if(!cache[cacheKey]){var stack=[],sectionKey=syntax;var memo=[];do{var section=this.getSection(sectionKey);if(!section)break;_.each(['snippets','abbreviations'],function(sectionName){var stackItem={};_.each(section[sectionName]||null,function(v,k){stackItem[k]={nk:normalizeName(k),value:v,parsedValue:parseItem(k,v,sectionName),type:sectionName};});stack.push(stackItem);});memo.push(sectionKey);sectionKey=section['extends'];}while(sectionKey&&!_.include(memo,sectionKey));cache[cacheKey]=_.extend.apply(_,stack.reverse());}return cache[cacheKey];}};});emmet.define('actions',function(require,_,zc){var actions={};function humanizeActionName(name){return require('utils').trim(name.charAt(0).toUpperCase()+name.substring(1).replace(/_[a-z]/g,function(str){return' '+str.charAt(1).toUpperCase();}));}return{add:function(name,fn,options){name=name.toLowerCase();options=options||{};if(!options.label){options.label=humanizeActionName(name);}actions[name]={name:name,fn:fn,options:options};},get:function(name){ +return actions[name.toLowerCase()];},run:function(name,args){if(!_.isArray(args)){args=_.rest(arguments);}var action=this.get(name);if(action){return action.fn.apply(emmet,args);}else{emmet.log('Action "%s" is not defined',name);return false;}},getAll:function(){return actions;},getList:function(){return _.values(this.getAll());},getMenu:function(skipActions){var result=[];skipActions=skipActions||[];_.each(this.getList(),function(action){if(action.options.hidden||_.include(skipActions,action.name))return;var actionName=humanizeActionName(action.name);var ctx=result;if(action.options.label){var parts=action.options.label.split('/');actionName=parts.pop();var menuName,submenu;while(menuName=parts.shift()){submenu=_.find(ctx,function(item){return item.type=='submenu'&&item.name==menuName;});if(!submenu){submenu={name:menuName,type:'submenu',items:[]};ctx.push(submenu);}ctx=submenu.items;}}ctx.push({type:'action',name:action.name,label:actionName});});return result;}, +getActionNameForMenuTitle:function(title,menu){var item=null;_.find(menu||this.getMenu(),function(val){if(val.type=='action'){if(val.label==title||val.name==title){return item=val.name;}}else{return item=this.getActionNameForMenuTitle(title,val.items);}},this);return item||null;}};});emmet.define('profile',function(require,_){var profiles={};var defaultProfile={tag_case:'asis',attr_case:'asis',attr_quotes:'double',tag_nl:'decide',tag_nl_leaf:false,place_cursor:true,indent:true,inline_break:3,self_closing_tag:'xhtml',filters:'',extraFilters:''};function OutputProfile(options){_.extend(this,defaultProfile,options);}OutputProfile.prototype={tagName:function(name){return stringCase(name,this.tag_case);},attributeName:function(name){return stringCase(name,this.attr_case);},attributeQuote:function(){return this.attr_quotes=='single'?"'":'"';},selfClosing:function(param){if(this.self_closing_tag=='xhtml')return' /';if(this.self_closing_tag===true)return'/';return'';},cursor:function(){return this.place_cursor?require('utils').getCaretPlaceholder():''; +}};function stringCase(str,caseValue){switch(String(caseValue||'').toLowerCase()){case'lower':return str.toLowerCase();case'upper':return str.toUpperCase();}return str;}function createProfile(name,options){return profiles[name.toLowerCase()]=new OutputProfile(options);}function createDefaultProfiles(){createProfile('xhtml');createProfile('html',{self_closing_tag:false});createProfile('xml',{self_closing_tag:true,tag_nl:true});createProfile('plain',{tag_nl:false,indent:false,place_cursor:false});createProfile('line',{tag_nl:false,indent:false,extraFilters:'s'});}createDefaultProfiles();return{create:function(name,options){if(arguments.length==2)return createProfile(name,options);else return new OutputProfile(_.defaults(name||{},defaultProfile));},get:function(name,syntax){if(!name&&syntax){var profile=require('resources').findItem(syntax,'profile');if(profile){name=profile;}}if(!name){return profiles.plain;}if(name instanceof OutputProfile){return name;}if(_.isString(name)&&name.toLowerCase()in profiles){ +return profiles[name.toLowerCase()];}return this.create(name);},remove:function(name){name=(name||'').toLowerCase();if(name in profiles)delete profiles[name];},reset:function(){profiles={};createDefaultProfiles();},stringCase:stringCase};});emmet.define('editorUtils',function(require,_){return{isInsideTag:function(html,caretPos){var reTag=/^<\/?\w[\w\:\-]*.*?>/;var pos=caretPos;while(pos>-1){if(html.charAt(pos)=='<')break;pos--;}if(pos!=-1){var m=reTag.exec(html.substring(pos));if(m&&caretPos>pos&&caretPos'&&utils.endsWithTag(str.substring(0,curOffset+1)))){startIndex=curOffset+1;break;}}}if(startIndex!=-1&&!textCount&&!braceCount&&!groupCount)return str.substring(startIndex).replace(/^[\*\+\>\^]+/,''); +else return'';},getImageSize:function(stream){var pngMagicNum="\211PNG\r\n\032\n",jpgMagicNum="\377\330",gifMagicNum="GIF8",nextByte=function(){return stream.charCodeAt(pos++);};if(stream.substr(0,8)===pngMagicNum){var pos=stream.indexOf('IHDR')+4;return{width:(nextByte()<<24)|(nextByte()<<16)|(nextByte()<<8)|nextByte(),height:(nextByte()<<24)|(nextByte()<<16)|(nextByte()<<8)|nextByte()};}else if(stream.substr(0,4)===gifMagicNum){pos=6;return{width:nextByte()|(nextByte()<<8),height:nextByte()|(nextByte()<<8)};}else if(stream.substr(0,2)===jpgMagicNum){pos=2;var l=stream.length;while(pos=0xC0&&marker<=0xCF&&!(marker&0x4)&&!(marker&0x8)){pos+=1;return{height:(nextByte()<<8)|nextByte(),width:(nextByte()<<8)|nextByte()};}else{pos+=size-2;}}}},captureContext:function(editor){var allowedSyntaxes={'html':1,'xml':1,'xsl':1};var syntax=String(editor.getSyntax());if(syntax in allowedSyntaxes){ +var content=String(editor.getContent());var tag=require('htmlMatcher').find(content,editor.getCaretPos());if(tag&&tag.type=='tag'){var startTag=tag.open;var contextNode={name:startTag.name,attributes:[]};var tagTree=require('xmlEditTree').parse(startTag.range.substring(content));if(tagTree){contextNode.attributes=_.map(tagTree.getAll(),function(item){return{name:item.name(),value:item.value()};});}return contextNode;}}return null;},findExpressionBounds:function(editor,fn){var content=String(editor.getContent());var il=content.length;var exprStart=editor.getCaretPos()-1;var exprEnd=exprStart+1;while(exprStart>=0&&fn(content.charAt(exprStart),exprStart,content))exprStart--;while(exprEndexprStart){return require('range').create([++exprStart,exprEnd]);}},compoundUpdate:function(editor,data){if(data){var sel=editor.getSelectionRange();editor.replaceContent(data.data,data.start,data.end,true);editor.createSelection(data.caret,data.caret+sel.end-sel.start); +return true;}return false;},detectSyntax:function(editor,hint){var syntax=hint||'html';if(!require('resources').hasSyntax(syntax)){syntax='html';}if(syntax=='html'&&(this.isStyle(editor)||this.isInlineCSS(editor))){syntax='css';}return syntax;},detectProfile:function(editor){var syntax=editor.getSyntax();var profile=require('resources').findItem(syntax,'profile');if(profile){return profile;}switch(syntax){case'xml':case'xsl':return'xml';case'css':if(this.isInlineCSS(editor)){return'line';}break;case'html':var profile=require('resources').getVariable('profile');if(!profile){profile=this.isXHTML(editor)?'xhtml':'html';}return profile;}return'xhtml';},isXHTML:function(editor){return editor.getContent().search(/]+XHTML/i)!=-1;},isStyle:function(editor){var content=String(editor.getContent());var caretPos=editor.getCaretPos();var tag=require('htmlMatcher').tag(content,caretPos);return tag&&tag.open.name.toLowerCase()=='style'&&tag.innerRange.cmp(caretPos,'lte','gte');}, +isInlineCSS:function(editor){var content=String(editor.getContent());var caretPos=editor.getCaretPos();var tree=require('xmlEditTree').parseFromPosition(content,caretPos,true);if(tree){var attr=tree.itemFromPosition(caretPos,true);return attr&&attr.name().toLowerCase()=='style'&&attr.valueRange(true).cmp(caretPos,'lte','gte');}return false;}};});emmet.define('abbreviationUtils',function(require,_){return{isSnippet:function(node){return require('elements').is(node.matchedResource(),'snippet');},isUnary:function(node){if(node.children.length||node._text||this.isSnippet(node)){return false;}var r=node.matchedResource();return r&&r.is_empty;},isInline:function(node){return node.isTextNode()||!node.name()||require('tagName').isInlineLevel(node.name());},isBlock:function(node){return this.isSnippet(node)||!this.isInline(node);},isSnippet:function(node){return require('elements').is(node.matchedResource(),'snippet');},hasTagsInContent:function(node){return require('utils').matchesTag(node.content); +},hasBlockChildren:function(node){return(this.hasTagsInContent(node)&&this.isBlock(node))||_.any(node.children,function(child){return this.isBlock(child);},this);},insertChildContent:function(text,childContent,options){options=_.extend({keepVariable:true,appendIfNoChild:true},options||{});var childVariableReplaced=false;var utils=require('utils');text=utils.replaceVariables(text,function(variable,name,data){var output=variable;if(name=='child'){output=utils.padString(childContent,utils.getLinePaddingFromPosition(text,data.start));childVariableReplaced=true;if(options.keepVariable)output+=variable;}return output;});if(!childVariableReplaced&&options.appendIfNoChild){text+=childContent;}return text;}};});emmet.define('base64',function(require,_){var chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';return{encode:function(input){var output=[];var chr1,chr2,chr3,enc1,enc2,enc3,enc4,cdp1,cdp2,cdp3;var i=0,il=input.length,b64=chars;while(i>2;enc2=((chr1&3)<<4)|(chr2>>4);enc3=((chr2&15)<<2)|(chr3>>6);enc4=chr3&63;if(isNaN(cdp2)){enc3=enc4=64;}else if(isNaN(cdp3)){enc4=64;}output.push(b64.charAt(enc1)+b64.charAt(enc2)+b64.charAt(enc3)+b64.charAt(enc4));}return output.join('');},decode:function(data){var o1,o2,o3,h1,h2,h3,h4,bits,i=0,ac=0,tmpArr=[];var b64=chars,il=data.length;if(!data){return data;}data+='';do{h1=b64.indexOf(data.charAt(i++));h2=b64.indexOf(data.charAt(i++));h3=b64.indexOf(data.charAt(i++));h4=b64.indexOf(data.charAt(i++));bits=h1<<18|h2<<12|h3<<6|h4;o1=bits>>16&0xff;o2=bits>>8&0xff;o3=bits&0xff;if(h3==64){tmpArr[ac++]=String.fromCharCode(o1);}else if(h4==64){tmpArr[ac++]=String.fromCharCode(o1,o2);}else{tmpArr[ac++]=String.fromCharCode(o1,o2,o3);}}while(i\s]+))?)*)\s*(\/?)>/; +var reCloseTag=/^<\/([\w\:\-]+)[^>]*>/;function openTag(i,match){return{name:match[1],selfClose:!!match[3],range:require('range').create(i,match[0]),type:'open'};}function closeTag(i,match){return{name:match[1],range:require('range').create(i,match[0]),type:'close'};}function comment(i,match){return{range:require('range').create(i,_.isNumber(match)?match-i:match[0]),type:'comment'};}function createMatcher(text){var memo={},m;return{open:function(i){var m=this.matches(i);return m&&m.type=='open'?m:null;},close:function(i){var m=this.matches(i);return m&&m.type=='close'?m:null;},matches:function(i){var key='p'+i;if(!(key in memo)){if(text.charAt(i)=='<'){var substr=text.slice(i);if(m=substr.match(reOpenTag)){memo[key]=openTag(i,m);}else if(m=substr.match(reCloseTag)){memo[key]=closeTag(i,m);}else{memo[key]=false;}}}return memo[key];},text:function(){return text;}};}function matches(text,pos,pattern){return text.substring(pos,pos+pattern.length)==pattern;}function findClosingPair(open,matcher){ +var stack=[],tag=null;var text=matcher.text();for(var pos=open.range.end,len=text.length;pos')){pos=j+3;break;}}}if(tag=matcher.matches(pos)){if(tag.type=='open'&&!tag.selfClose){stack.push(tag.name);}else if(tag.type=='close'){if(!stack.length){return tag.name==open.name?tag:null;}if(_.last(stack)==tag.name){stack.pop();}else{var found=false;while(stack.length&&!found){var last=stack.pop();if(last==tag.name){found=true;}}if(!stack.length&&!found){return tag.name==open.name?tag:null;}}}}}}return{find:function(text,pos){var range=require('range');var matcher=createMatcher(text);var open=null,close=null;for(var i=pos;i>=0;i--){if(open=matcher.open(i)){if(open.selfClose){if(open.range.cmp(pos,'lt','gt')){break;}continue;}close=findClosingPair(open,matcher);if(close){var r=range.create2(open.range.start,close.range.end);if(r.contains(pos)){break;}}else if(open.range.contains(pos)){break;}open=null;}else if(matches(text,i,'-->')){ +for(var j=i-1;j>=0;j--){if(matches(text,j,'-->')){break;}else if(matches(text,j,'')){j+=3;break;}}open=comment(i,j);break;}}if(open){var outerRange=null;var innerRange=null;if(close){outerRange=range.create2(open.range.start,close.range.end);innerRange=range.create2(open.range.end,close.range.start);}else{outerRange=innerRange=range.create2(open.range.start,open.range.end);}if(open.type=='comment'){var _c=outerRange.substring(text);innerRange.start+=_c.length-_c.replace(/^<\!--\s*/,'').length;innerRange.end-=_c.length-_c.replace(/\s*-->$/,'').length;}return{open:open,close:close,type:open.type=='comment'?'comment':'tag',innerRange:innerRange,innerContent:function(){return this.innerRange.substring(text);},outerRange:outerRange,outerContent:function(){return this.outerRange.substring(text);},range:!innerRange.length()||!innerRange.cmp(pos,'lte','gte')?outerRange:innerRange, +content:function(){return this.range.substring(text);},source:text};}},tag:function(text,pos){var result=this.find(text,pos);if(result&&result.type=='tag'){return result;}}};});emmet.define('tabStops',function(require,_){var startPlaceholderNum=100;var tabstopIndex=0;var defaultOptions={replaceCarets:false,escape:function(ch){return'\\'+ch;},tabstop:function(data){return data.token;},variable:function(data){return data.token;}};require('abbreviationParser').addOutputProcessor(function(text,node,type){var maxNum=0;var tabstops=require('tabStops');var utils=require('utils');var tsOptions={tabstop:function(data){var group=parseInt(data.group);if(group==0)return'${0}';if(group>maxNum)maxNum=group;if(data.placeholder){var ix=group+tabstopIndex;var placeholder=tabstops.processText(data.placeholder,tsOptions);return'${'+ix+':'+placeholder+'}';}else{return'${'+(group+tabstopIndex)+'}';}}};text=tabstops.processText(text,tsOptions);text=utils.replaceVariables(text,tabstops.variablesResolver(node)); +tabstopIndex+=maxNum+1;return text;});return{extract:function(text,options){var utils=require('utils');var placeholders={carets:''};var marks=[];options=_.extend({},defaultOptions,options,{tabstop:function(data){var token=data.token;var ret='';if(data.placeholder=='cursor'){marks.push({start:data.start,end:data.start+token.length,group:'carets',value:''});}else{if('placeholder'in data)placeholders[data.group]=data.placeholder;if(data.group in placeholders)ret=placeholders[data.group];marks.push({start:data.start,end:data.start+token.length,group:data.group,value:ret});}return token;}});if(options.replaceCarets){text=text.replace(new RegExp(utils.escapeForRegexp(utils.getCaretPlaceholder()),'g'),'${0:cursor}');}text=this.processText(text,options);var buf=utils.stringBuilder(),lastIx=0;var tabStops=_.map(marks,function(mark){buf.append(text.substring(lastIx,mark.start));var pos=buf.length;var ph=placeholders[mark.group]||'';buf.append(ph);lastIx=mark.end;return{group:mark.group,start:pos, +end:pos+ph.length};});buf.append(text.substring(lastIx));return{text:buf.toString(),tabstops:_.sortBy(tabStops,'start')};},processText:function(text,options){options=_.extend({},defaultOptions,options);var buf=require('utils').stringBuilder();var stream=require('stringStream').create(text);var ch,m,a;while(ch=stream.next()){if(ch=='\\'&&!stream.eol()){buf.append(options.escape(stream.next()));continue;}a=ch;if(ch=='$'){stream.start=stream.pos-1;if(m=stream.match(/^[0-9]+/)){a=options.tabstop({start:buf.length,group:stream.current().substr(1),token:stream.current()});}else if(m=stream.match(/^\{([a-z_\-][\w\-]*)\}/)){a=options.variable({start:buf.length,name:m[1],token:stream.current()});}else if(m=stream.match(/^\{([0-9]+)(:.+?)?\}/,false)){stream.skipToPair('{','}');var obj={start:buf.length,group:m[1],token:stream.current()};var placeholder=obj.token.substring(obj.group.length+2,obj.token.length-1);if(placeholder){obj.placeholder=placeholder.substr(1);}a=options.tabstop(obj);}}buf.append(a); +}return buf.toString();},upgrade:function(node,offset){var maxNum=0;var options={tabstop:function(data){var group=parseInt(data.group);if(group>maxNum)maxNum=group;if(data.placeholder)return'${'+(group+offset)+':'+data.placeholder+'}';else return'${'+(group+offset)+'}';}};_.each(['start','end','content'],function(p){node[p]=this.processText(node[p],options);},this);return maxNum;},variablesResolver:function(node){var placeholderMemo={};var res=require('resources');return function(str,varName){if(varName=='child')return str;if(varName=='cursor')return require('utils').getCaretPlaceholder();var attr=node.attribute(varName);if(!_.isUndefined(attr)&&attr!==str){return attr;}var varValue=res.getVariable(varName);if(varValue)return varValue;if(!placeholderMemo[varName])placeholderMemo[varName]=startPlaceholderNum++;return'${'+placeholderMemo[varName]+':'+varName+'}';};},resetTabstopIndex:function(){tabstopIndex=0;startPlaceholderNum=100;}};});emmet.define('preferences',function(require,_){ +var preferences={};var defaults={};var _dbgDefaults=null;var _dbgPreferences=null;function toBoolean(val){if(_.isString(val)){val=val.toLowerCase();return val=='yes'||val=='true'||val=='1';}return!!val;}function isValueObj(obj){return _.isObject(obj)&&'value'in obj&&_.keys(obj).length<3;}return{define:function(name,value,description){var prefs=name;if(_.isString(name)){prefs={};prefs[name]={value:value,description:description};}_.each(prefs,function(v,k){defaults[k]=isValueObj(v)?v:{value:v};});},set:function(name,value){var prefs=name;if(_.isString(name)){prefs={};prefs[name]=value;}_.each(prefs,function(v,k){if(!(k in defaults)){throw'Property "'+k+'" is not defined. You should define it first with `define` method of current module';}if(v!==defaults[k].value){switch(typeof defaults[k].value){case'boolean':v=toBoolean(v);break;case'number':v=parseInt(v+'',10)||0;break;default:if(v!==null){v+='';}}preferences[k]=v;}else if(k in preferences){delete preferences[k];}});},get:function(name){ +if(name in preferences)return preferences[name];if(name in defaults)return defaults[name].value;return void 0;},getArray:function(name){var val=this.get(name);if(_.isUndefined(val)||val===null||val===''){return null;}val=_.map(val.split(','),require('utils').trim);if(!val.length){return null;}return val;},getDict:function(name){var result={};_.each(this.getArray(name),function(val){var parts=val.split(':');result[parts[0]]=parts[1];});return result;},description:function(name){return name in defaults?defaults[name].description:void 0;},remove:function(name){if(!_.isArray(name))name=[name];_.each(name,function(key){if(key in preferences)delete preferences[key];if(key in defaults)delete defaults[key];});},list:function(){return _.map(_.keys(defaults).sort(),function(key){return{name:key,value:this.get(key),type:typeof defaults[key].value,description:defaults[key].description};},this);},load:function(json){_.each(json,function(value,key){this.set(key,value);},this);},exportModified:function(){ +return _.clone(preferences);},reset:function(){preferences={};},_startTest:function(){_dbgDefaults=defaults;_dbgPreferences=preferences;defaults={};preferences={};},_stopTest:function(){defaults=_dbgDefaults;preferences=_dbgPreferences;}};});emmet.define('filters',function(require,_){var registeredFilters={};var basicFilters='html';function list(filters){if(!filters)return[];if(_.isString(filters))return filters.split(/[\|,]/g);return filters;}return{add:function(name,fn){registeredFilters[name]=fn;},apply:function(tree,filters,profile){var utils=require('utils');profile=require('profile').get(profile);_.each(list(filters),function(filter){var name=utils.trim(filter.toLowerCase());if(name&&name in registeredFilters){tree=registeredFilters[name](tree,profile);}});return tree;},composeList:function(syntax,profile,additionalFilters){profile=require('profile').get(profile);var filters=list(profile.filters||require('resources').findItem(syntax,'filters')||basicFilters);if(profile.extraFilters){ +filters=filters.concat(list(profile.extraFilters));}if(additionalFilters){filters=filters.concat(list(additionalFilters));}if(!filters||!filters.length){filters=list(basicFilters);}return filters;},extractFromAbbreviation:function(abbr){var filters='';abbr=abbr.replace(/\|([\w\|\-]+)$/,function(str,p1){filters=p1;return'';});return[abbr,list(filters)];}};});emmet.define('elements',function(require,_){var factories={};var reAttrs=/([\w\-:]+)\s*=\s*(['"])(.*?)\2/g;var result={add:function(name,factory){var that=this;factories[name]=function(){var elem=factory.apply(that,arguments);if(elem)elem.type=name;return elem;};},get:function(name){return factories[name];},create:function(name){var args=[].slice.call(arguments,1);var factory=this.get(name);return factory?factory.apply(this,args):null;},is:function(elem,type){return elem&&elem.type===type;}};function commonFactory(value){return{data:value};}result.add('element',function(elementName,attrs,isEmpty){var ret={name:elementName,is_empty:!!isEmpty +};if(attrs){ret.attributes=[];if(_.isArray(attrs)){ret.attributes=attrs;}else if(_.isString(attrs)){var m;while(m=reAttrs.exec(attrs)){ret.attributes.push({name:m[1],value:m[3]});}}else{_.each(attrs,function(value,name){ret.attributes.push({name:name,value:value});});}}return ret;});result.add('snippet',commonFactory);result.add('reference',commonFactory);result.add('empty',function(){return{};});return result;});emmet.define('editTree',function(require,_,core){var range=require('range').create;function EditContainer(source,options){this.options=_.extend({offset:0},options);this.source=source;this._children=[];this._positions={name:0};this.initialize.apply(this,arguments);}EditContainer.extend=core.extend;EditContainer.prototype={initialize:function(){},_updateSource:function(value,start,end){var r=range(start,_.isUndefined(end)?0:end-start);var delta=value.length-r.length();var update=function(obj){_.each(obj,function(v,k){if(v>=r.end)obj[k]+=delta;});};update(this._positions);_.each(this.list(),function(item){ +update(item._positions);});this.source=require('utils').replaceSubstring(this.source,value,r);},add:function(name,value,pos){var item=new EditElement(name,value);this._children.push(item);return item;},get:function(name){if(_.isNumber(name))return this.list()[name];if(_.isString(name))return _.find(this.list(),function(prop){return prop.name()===name;});return name;},getAll:function(name){if(!_.isArray(name))name=[name];var names=[],indexes=[];_.each(name,function(item){if(_.isString(item))names.push(item);else if(_.isNumber(item))indexes.push(item);});return _.filter(this.list(),function(attribute,i){return _.include(indexes,i)||_.include(names,attribute.name());});},value:function(name,value,pos){var element=this.get(name);if(element)return element.value(value);if(!_.isUndefined(value)){return this.add(name,value,pos);}},values:function(name){return _.map(this.getAll(name),function(element){return element.value();});},remove:function(name){var element=this.get(name);if(element){this._updateSource('',element.fullRange()); +this._children=_.without(this._children,element);}},list:function(){return this._children;},indexOf:function(item){return _.indexOf(this.list(),this.get(item));},name:function(val){if(!_.isUndefined(val)&&this._name!==(val=String(val))){this._updateSource(val,this._positions.name,this._positions.name+this._name.length);this._name=val;}return this._name;},nameRange:function(isAbsolute){return range(this._positions.name+(isAbsolute?this.options.offset:0),this.name());},range:function(isAbsolute){return range(isAbsolute?this.options.offset:0,this.toString());},itemFromPosition:function(pos,isAbsolute){return _.find(this.list(),function(elem){return elem.range(isAbsolute).inside(pos);});},toString:function(){return this.source;}};function EditElement(parent,nameToken,valueToken){this.parent=parent;this._name=nameToken.value;this._value=valueToken?valueToken.value:'';this._positions={name:nameToken.start,value:valueToken?valueToken.start:-1};this.initialize.apply(this,arguments);} +EditElement.extend=core.extend;EditElement.prototype={initialize:function(){},_pos:function(num,isAbsolute){return num+(isAbsolute?this.parent.options.offset:0);},value:function(val){if(!_.isUndefined(val)&&this._value!==(val=String(val))){this.parent._updateSource(val,this.valueRange());this._value=val;}return this._value;},name:function(val){if(!_.isUndefined(val)&&this._name!==(val=String(val))){this.parent._updateSource(val,this.nameRange());this._name=val;}return this._name;},namePosition:function(isAbsolute){return this._pos(this._positions.name,isAbsolute);},valuePosition:function(isAbsolute){return this._pos(this._positions.value,isAbsolute);},range:function(isAbsolute){return range(this.namePosition(isAbsolute),this.toString());},fullRange:function(isAbsolute){return this.range(isAbsolute);},nameRange:function(isAbsolute){return range(this.namePosition(isAbsolute),this.name());},valueRange:function(isAbsolute){return range(this.valuePosition(isAbsolute),this.value());}, +toString:function(){return this.name()+this.value();},valueOf:function(){return this.toString();}};return{EditContainer:EditContainer,EditElement:EditElement,createToken:function(start,value,type){var obj={start:start||0,value:value||'',type:type};obj.end=obj.start+obj.value.length;return obj;}};});emmet.define('cssEditTree',function(require,_){var defaultOptions={styleBefore:'\n\t',styleSeparator:': ',offset:0};var WHITESPACE_REMOVE_FROM_START=1;var WHITESPACE_REMOVE_FROM_END=2;function range(start,len){return require('range').create(start,len);}function trimWhitespaceTokens(tokens,mask){mask=mask||(WHITESPACE_REMOVE_FROM_START|WHITESPACE_REMOVE_FROM_END);var whitespace=['white','line'];if((mask&WHITESPACE_REMOVE_FROM_END)==WHITESPACE_REMOVE_FROM_END)while(tokens.length&&_.include(whitespace,_.last(tokens).type)){tokens.pop();}if((mask&WHITESPACE_REMOVE_FROM_START)==WHITESPACE_REMOVE_FROM_START)while(tokens.length&&_.include(whitespace,tokens[0].type)){tokens.shift();}return tokens;} +function findSelectorRange(it){var tokens=[],token;var start=it.position(),end;while(token=it.next()){if(token.type=='{')break;tokens.push(token);}trimWhitespaceTokens(tokens);if(tokens.length){start=tokens[0].start;end=_.last(tokens).end;}else{end=start;}return range(start,end-start);}function findValueRange(it){var skipTokens=['white','line',':'];var tokens=[],token,start,end;it.nextUntil(function(tok){return!_.include(skipTokens,this.itemNext().type);});start=it.current().end;while(token=it.next()){if(token.type=='}'||token.type==';'){trimWhitespaceTokens(tokens,WHITESPACE_REMOVE_FROM_START|(token.type=='}'?WHITESPACE_REMOVE_FROM_END:0));if(tokens.length){start=tokens[0].start;end=_.last(tokens).end;}else{end=start;}return range(start,end-start);}tokens.push(token);}if(tokens.length){return range(tokens[0].start,_.last(tokens).end-tokens[0].start);}}function findParts(str){var stream=require('stringStream').create(str);var ch;var result=[];var sep=/[\s\u00a0,]/;var add=function(){ +stream.next();result.push(range(stream.start,stream.current()));stream.start=stream.pos;};stream.eatSpace();stream.start=stream.pos;while(ch=stream.next()){if(ch=='"'||ch=="'"){stream.next();if(!stream.skipTo(ch))break;add();}else if(ch=='('){stream.backUp(1);if(!stream.skipToPair('(',')'))break;stream.backUp(1);add();}else{if(sep.test(ch)){result.push(range(stream.start,stream.current().length-1));stream.eatWhile(sep);stream.start=stream.pos;}}}add();return _.chain(result).filter(function(item){return!!item.length();}).uniq(false,function(item){return item.toString();}).value();}function isValidIdentifier(it){var tokens=it.tokens;for(var i=it._i+1,il=tokens.length;i1){p.styleBefore='\n'+_.last(lines);}p.styleSeparator=source.substring(p.nameRange().end,p.valuePosition());p.styleBefore=_.last(p.styleBefore.split('*/'));p.styleSeparator=p.styleSeparator.replace(/\/\*.*?\*\//g,'');start=p.range().end;});},add:function(name,value,pos){var list=this.list();var start=this._positions.contentStart;var styles=_.pick(this.options,'styleBefore','styleSeparator');var editTree=require('editTree');if(_.isUndefined(pos))pos=list.length;var donor=list[pos];if(donor){start=donor.fullRange().start;}else if(donor=list[pos-1]){donor.end(';');start=donor.range().end;}if(donor){styles=_.pick(donor,'styleBefore','styleSeparator');}var nameToken=editTree.createToken(start+styles.styleBefore.length,name);var valueToken=editTree.createToken(nameToken.end+styles.styleSeparator.length,value);var property=new CSSEditElement(this,nameToken,valueToken,editTree.createToken(valueToken.end,';'));_.extend(property,styles);this._updateSource(property.styleBefore+property.toString(),start); +this._children.splice(pos,0,property);return property;}});var CSSEditElement=require('editTree').EditElement.extend({initialize:function(rule,name,value,end){this.styleBefore=rule.options.styleBefore;this.styleSeparator=rule.options.styleSeparator;this._end=end.value;this._positions.end=end.start;},valueParts:function(isAbsolute){var parts=findParts(this.value());if(isAbsolute){var offset=this.valuePosition(true);_.each(parts,function(p){p.shift(offset);});}return parts;},end:function(val){if(!_.isUndefined(val)&&this._end!==val){this.parent._updateSource(val,this._positions.end,this._positions.end+this._end.length);this._end=val;}return this._end;},fullRange:function(isAbsolute){var r=this.range(isAbsolute);r.start-=this.styleBefore.length;return r;},toString:function(){return this.name()+this.styleSeparator+this.value()+this.end();}});return{parse:function(source,options){return new CSSEditContainer(source,options);},parseFromPosition:function(content,pos,isBackward){var bounds=this.extractRule(content,pos,isBackward); +if(!bounds||!bounds.inside(pos))return null;return this.parse(bounds.substring(content),{offset:bounds.start});},extractRule:function(content,pos,isBackward){var result='';var len=content.length;var offset=pos;var stopChars='{}/\\<>\n\r';var bracePos=-1,ch;while(offset>=0){ch=content.charAt(offset);if(ch=='{'){bracePos=offset;break;}else if(ch=='}'&&!isBackward){offset++;break;}offset--;}while(offset=0){ch=content.charAt(offset);if(stopChars.indexOf(ch)!=-1)break;offset--;}selector=content.substring(offset+1,bracePos).replace(/^[\s\n\r]+/m,'');return require('range').create(bracePos-selector.length,result.length+selector.length);}return null;},baseName:function(name){return name.replace(/^\s*\-\w+\-/,'');},findParts:findParts};});emmet.define('xmlEditTree',function(require,_){ +var defaultOptions={styleBefore:' ',styleSeparator:'=',styleQuote:'"',offset:0};var startTag=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/m;var XMLEditContainer=require('editTree').EditContainer.extend({initialize:function(source,options){_.defaults(this.options,defaultOptions);this._positions.name=1;var attrToken=null;var tokens=require('xmlParser').parse(source);var range=require('range');_.each(tokens,function(token){token.value=range.create(token).substring(source);switch(token.type){case'tag':if(/^<[^\/]+/.test(token.value)){this._name=token.value.substring(1);}break;case'attribute':if(attrToken){this._children.push(new XMLEditElement(this,attrToken));}attrToken=token;break;case'string':this._children.push(new XMLEditElement(this,attrToken,token));attrToken=null;break;}},this);if(attrToken){this._children.push(new XMLEditElement(this,attrToken));}this._saveStyle();},_saveStyle:function(){var start=this.nameRange().end;var source=this.source; +_.each(this.list(),function(p){p.styleBefore=source.substring(start,p.namePosition());if(p.valuePosition()!==-1){p.styleSeparator=source.substring(p.namePosition()+p.name().length,p.valuePosition()-p.styleQuote.length);}start=p.range().end;});},add:function(name,value,pos){var list=this.list();var start=this.nameRange().end;var editTree=require('editTree');var styles=_.pick(this.options,'styleBefore','styleSeparator','styleQuote');if(_.isUndefined(pos))pos=list.length;var donor=list[pos];if(donor){start=donor.fullRange().start;}else if(donor=list[pos-1]){start=donor.range().end;}if(donor){styles=_.pick(donor,'styleBefore','styleSeparator','styleQuote');}value=styles.styleQuote+value+styles.styleQuote;var attribute=new XMLEditElement(this,editTree.createToken(start+styles.styleBefore.length,name),editTree.createToken(start+styles.styleBefore.length+name.length+styles.styleSeparator.length,value));_.extend(attribute,styles);this._updateSource(attribute.styleBefore+attribute.toString(),start); +this._children.splice(pos,0,attribute);return attribute;}});var XMLEditElement=require('editTree').EditElement.extend({initialize:function(parent,nameToken,valueToken){this.styleBefore=parent.options.styleBefore;this.styleSeparator=parent.options.styleSeparator;var value='',quote=parent.options.styleQuote;if(valueToken){value=valueToken.value;quote=value.charAt(0);if(quote=='"'||quote=="'"){value=value.substring(1);}else{quote='';}if(quote&&value.charAt(value.length-1)==quote){value=value.substring(0,value.length-1);}}this.styleQuote=quote;this._value=value;this._positions.value=valueToken?valueToken.start+quote.length:-1;},fullRange:function(isAbsolute){var r=this.range(isAbsolute);r.start-=this.styleBefore.length;return r;},toString:function(){return this.name()+this.styleSeparator+this.styleQuote+this.value()+this.styleQuote;}});return{parse:function(source,options){return new XMLEditContainer(source,options);},parseFromPosition:function(content,pos,isBackward){var bounds=this.extractTag(content,pos,isBackward); +if(!bounds||!bounds.inside(pos))return null;return this.parse(bounds.substring(content),{offset:bounds.start});},extractTag:function(content,pos,isBackward){var len=content.length,i;var range=require('range');var maxLen=Math.min(2000,len);var r=null;var match=function(pos){var m;if(content.charAt(pos)=='<'&&(m=content.substr(pos,maxLen).match(startTag)))return range.create(pos,m[0]);};for(i=pos;i>=0;i--){if(r=match(i))break;}if(r&&(r.inside(pos)||isBackward))return r;if(!r&&isBackward)return null;for(i=pos;i',range);}function toggleCSSComment(editor){var range=require('range').create(editor.getSelectionRange());var info=require('editorUtils').outputInfo(editor);if(!range.length()){var rule=require('cssEditTree').parseFromPosition(info.content,editor.getCaretPos());if(rule){var property=cssItemFromPosition(rule,editor.getCaretPos());range=property?property.range(true):require('range').create(rule.nameRange(true).start,rule.source);}}if(!range.length()){range=require('range').create(editor.getCurrentLineRange());require('utils').narrowToNonSpace(info.content,range);}return genericCommentToggle(editor,'/*','*/',range);}function cssItemFromPosition(rule,absPos){var relPos=absPos-(rule.options.offset||0); +var reSafeChar=/^[\s\n\r]/;return _.find(rule.list(),function(item){if(item.range().end===relPos){return reSafeChar.test(rule.source.charAt(relPos));}return item.range().inside(relPos);});}function searchComment(text,from,startToken,endToken){var commentStart=-1;var commentEnd=-1;var hasMatch=function(str,start){return text.substr(start,str.length)==str;};while(from--){if(hasMatch(startToken,from)){commentStart=from;break;}}if(commentStart!=-1){from=commentStart;var contentLen=text.length;while(contentLen>=from++){if(hasMatch(endToken,from)){commentEnd=from+endToken.length;break;}}}return(commentStart!=-1&&commentEnd!=-1)?require('range').create(commentStart,commentEnd-commentStart):null;}function genericCommentToggle(editor,commentStart,commentEnd,range){var editorUtils=require('editorUtils');var content=editorUtils.outputInfo(editor).content;var caretPos=editor.getCaretPos();var newContent=null;var utils=require('utils');function removeComment(str){return str.replace(new RegExp('^'+utils.escapeForRegexp(commentStart)+'\\s*'),function(str){ +caretPos-=str.length;return'';}).replace(new RegExp('\\s*'+utils.escapeForRegexp(commentEnd)+'$'),'');}var commentRange=searchComment(content,caretPos,commentStart,commentEnd);if(commentRange&&commentRange.overlap(range)){range=commentRange;newContent=removeComment(range.substring(content));}else{newContent=commentStart+' '+range.substring(content).replace(new RegExp(utils.escapeForRegexp(commentStart)+'\\s*|\\s*'+utils.escapeForRegexp(commentEnd),'g'),'')+' '+commentEnd;caretPos+=commentStart.length+1;}if(newContent!==null){newContent=utils.escapeText(newContent);editor.setCaretPos(range.start);editor.replaceContent(editorUtils.unindent(editor,newContent),range.start,range.end);editor.setCaretPos(caretPos);return true;}return false;}require('actions').add('toggle_comment',function(editor){var info=require('editorUtils').outputInfo(editor);if(info.syntax=='css'){var caretPos=editor.getCaretPos();var tag=require('htmlMatcher').tag(info.content,caretPos);if(tag&&tag.open.range.inside(caretPos)){ +info.syntax='html';}}if(info.syntax=='css')return toggleCSSComment(editor);return toggleHTMLComment(editor);});});emmet.exec(function(require,_){function findNewEditPoint(editor,inc,offset){inc=inc||1;offset=offset||0;var curPoint=editor.getCaretPos()+offset;var content=String(editor.getContent());var maxLen=content.length;var nextPoint=-1;var reEmptyLine=/^\s+$/;function getLine(ix){var start=ix;while(start>=0){var c=content.charAt(start);if(c=='\n'||c=='\r')break;start--;}return content.substring(start,ix);}while(curPoint<=maxLen&&curPoint>=0){curPoint+=inc;var curChar=content.charAt(curPoint);var nextChar=content.charAt(curPoint+1);var prevChar=content.charAt(curPoint-1);switch(curChar){case'"':case'\'':if(nextChar==curChar&&prevChar=='='){nextPoint=curPoint+1;}break;case'>':if(nextChar=='<'){nextPoint=curPoint+1;}break;case'\n':case'\r':if(reEmptyLine.test(getLine(curPoint-1))){nextPoint=curPoint;}break;}if(nextPoint!=-1)break;}return nextPoint;}var actions=require('actions'); +actions.add('prev_edit_point',function(editor){var curPos=editor.getCaretPos();var newPoint=findNewEditPoint(editor,-1);if(newPoint==curPos)newPoint=findNewEditPoint(editor,-1,-2);if(newPoint!=-1){editor.setCaretPos(newPoint);return true;}return false;},{label:'Previous Edit Point'});actions.add('next_edit_point',function(editor){var newPoint=findNewEditPoint(editor,1);if(newPoint!=-1){editor.setCaretPos(newPoint);return true;}return false;});});emmet.exec(function(require,_){var startTag=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;function findItem(editor,isBackward,extractFn,rangeFn){var range=require('range');var content=require('editorUtils').outputInfo(editor).content;var contentLength=content.length;var itemRange,rng;var prevRange=range.create(-1,0);var sel=range.create(editor.getSelectionRange());var searchPos=sel.start,loop=100000;while(searchPos>=0&&searchPos0){if((itemRange=extractFn(content,searchPos,isBackward))){ +if(prevRange.equal(itemRange)){break;}prevRange=itemRange.clone();rng=rangeFn(itemRange.substring(content),itemRange.start,sel.clone());if(rng){editor.createSelection(rng.start,rng.end);return true;}else{searchPos=isBackward?itemRange.start:itemRange.end-1;}}searchPos+=isBackward?-1:1;}return false;}function findNextHTMLItem(editor){var isFirst=true;return findItem(editor,false,function(content,searchPos){if(isFirst){isFirst=false;return findOpeningTagFromPosition(content,searchPos);}else{return getOpeningTagFromPosition(content,searchPos);}},function(tag,offset,selRange){return getRangeForHTMLItem(tag,offset,selRange,false);});}function findPrevHTMLItem(editor){return findItem(editor,true,getOpeningTagFromPosition,function(tag,offset,selRange){return getRangeForHTMLItem(tag,offset,selRange,true);});}function makePossibleRangesHTML(source,tokens,offset){offset=offset||0;var range=require('range');var result=[];var attrStart=-1,attrName='',attrValue='',attrValueRange,tagName;_.each(tokens,function(tok){ +switch(tok.type){case'tag':tagName=source.substring(tok.start,tok.end);if(/^<[\w\:\-]/.test(tagName)){result.push(range.create({start:tok.start+1,end:tok.end}));}break;case'attribute':attrStart=tok.start;attrName=source.substring(tok.start,tok.end);break;case'string':result.push(range.create(attrStart,tok.end-attrStart));attrValueRange=range.create(tok);attrValue=attrValueRange.substring(source);if(isQuote(attrValue.charAt(0)))attrValueRange.start++;if(isQuote(attrValue.charAt(attrValue.length-1)))attrValueRange.end--;result.push(attrValueRange);if(attrName=='class'){result=result.concat(classNameRanges(attrValueRange.substring(source),attrValueRange.start));}break;}});_.each(result,function(r){r.shift(offset);});return _.chain(result).filter(function(item){return!!item.length();}).uniq(false,function(item){return item.toString();}).value();}function classNameRanges(className,offset){offset=offset||0;var result=[];var stream=require('stringStream').create(className);var range=require('range'); +stream.eatSpace();stream.start=stream.pos;var ch;while(ch=stream.next()){if(/[\s\u00a0]/.test(ch)){result.push(range.create(stream.start+offset,stream.pos-stream.start-1));stream.eatSpace();stream.start=stream.pos;}}result.push(range.create(stream.start+offset,stream.pos-stream.start));return result;}function getRangeForHTMLItem(tag,offset,selRange,isBackward){var ranges=makePossibleRangesHTML(tag,require('xmlParser').parse(tag),offset);if(isBackward)ranges.reverse();var curRange=_.find(ranges,function(r){return r.equal(selRange);});if(curRange){var ix=_.indexOf(ranges,curRange);if(ix1)return matchedRanges[1];}return _.find(ranges,function(r){return r.end>selRange.end;});}function findOpeningTagFromPosition(html,pos){var tag;while(pos>=0){if(tag=getOpeningTagFromPosition(html,pos)) +return tag;pos--;}return null;}function getOpeningTagFromPosition(html,pos){var m;if(html.charAt(pos)=='<'&&(m=html.substring(pos,html.length).match(startTag))){return require('range').create(pos,m[0]);}}function isQuote(ch){return ch=='"'||ch=="'";}function makePossibleRangesCSS(property){var valueRange=property.valueRange(true);var result=[property.range(true),valueRange];var stringStream=require('stringStream');var cssEditTree=require('cssEditTree');var range=require('range');var value=property.value();_.each(property.valueParts(),function(r){var clone=r.clone();result.push(clone.shift(valueRange.start));var stream=stringStream.create(r.substring(value));if(stream.match(/^[\w\-]+\(/,true)){stream.start=stream.pos;stream.skipToPair('(',')');var fnBody=stream.current();result.push(range.create(clone.start+stream.start,fnBody));_.each(cssEditTree.findParts(fnBody),function(part){result.push(range.create(clone.start+stream.start+part.start,part.substring(fnBody)));});}});return _.chain(result) +.filter(function(item){return!!item.length();}).uniq(false,function(item){return item.toString();}).value();}function matchedRangeForCSSProperty(rule,selRange,isBackward){var property=null;var possibleRanges,curRange=null,ix;var list=rule.list();var searchFn,nearestItemFn;if(isBackward){list.reverse();searchFn=function(p){return p.range(true).start<=selRange.start;};nearestItemFn=function(r){return r.start=selRange.end;};nearestItemFn=function(r){return r.end>selRange.start;};}while(property=_.find(list,searchFn)){possibleRanges=makePossibleRangesCSS(property);if(isBackward)possibleRanges.reverse();curRange=_.find(possibleRanges,function(r){return r.equal(selRange);});if(!curRange){var matchedRanges=_.filter(possibleRanges,function(r){return r.inside(selRange.end);});if(matchedRanges.length>1){curRange=matchedRanges[1];break;}if(curRange=_.find(possibleRanges,nearestItemFn))break;}else{ix=_.indexOf(possibleRanges,curRange); +if(ix!=possibleRanges.length-1){curRange=possibleRanges[ix+1];break;}}curRange=null;selRange.start=selRange.end=isBackward?property.range(true).start-1:property.range(true).end+1;}return curRange;}function findNextCSSItem(editor){return findItem(editor,false,require('cssEditTree').extractRule,getRangeForNextItemInCSS);}function findPrevCSSItem(editor){return findItem(editor,true,require('cssEditTree').extractRule,getRangeForPrevItemInCSS);}function getRangeForNextItemInCSS(rule,offset,selRange){var tree=require('cssEditTree').parse(rule,{offset:offset});var range=tree.nameRange(true);if(selRange.endrange.start){return range;}}return curRange;}var actions=require('actions'); +actions.add('select_next_item',function(editor){if(editor.getSyntax()=='css')return findNextCSSItem(editor);else return findNextHTMLItem(editor);});actions.add('select_previous_item',function(editor){if(editor.getSyntax()=='css')return findPrevCSSItem(editor);else return findPrevHTMLItem(editor);});});emmet.exec(function(require,_){var actions=require('actions');var matcher=require('htmlMatcher');var lastMatch=null;function matchPair(editor,direction){direction=String((direction||'out').toLowerCase());var info=require('editorUtils').outputInfo(editor);var range=require('range');var sel=range.create(editor.getSelectionRange());var content=info.content;if(lastMatch&&!lastMatch.range.equal(sel)){lastMatch=null;}if(lastMatch&&sel.length()){if(direction=='in'){if(lastMatch.type=='tag'&&!lastMatch.close){return false;}else{if(lastMatch.range.equal(lastMatch.outerRange)){lastMatch.range=lastMatch.innerRange;}else{var narrowed=require('utils').narrowToNonSpace(content,lastMatch.innerRange); +lastMatch=matcher.find(content,narrowed.start+1);if(lastMatch&&lastMatch.range.equal(sel)&&lastMatch.outerRange.equal(sel)){lastMatch.range=lastMatch.innerRange;}}}}else{if(!lastMatch.innerRange.equal(lastMatch.outerRange)&&lastMatch.range.equal(lastMatch.innerRange)&&sel.equal(lastMatch.range)){lastMatch.range=lastMatch.outerRange;}else{lastMatch=matcher.find(content,sel.start);if(lastMatch&&lastMatch.range.equal(sel)&&lastMatch.innerRange.equal(sel)){lastMatch.range=lastMatch.outerRange;}}}}else{lastMatch=matcher.find(content,sel.start);}if(lastMatch&&!lastMatch.range.equal(sel)){editor.createSelection(lastMatch.range.start,lastMatch.range.end);return true;}lastMatch=null;return false;}actions.add('match_pair',matchPair,{hidden:true});actions.add('match_pair_inward',function(editor){return matchPair(editor,'in');},{label:'HTML/Match Pair Tag (inward)'});actions.add('match_pair_outward',function(editor){return matchPair(editor,'out');},{label:'HTML/Match Pair Tag (outward)'});actions.add('matching_pair',function(editor){ +var content=String(editor.getContent());var caretPos=editor.getCaretPos();if(content.charAt(caretPos)=='<')caretPos++;var tag=matcher.tag(content,caretPos);if(tag&&tag.close){if(tag.open.range.inside(caretPos)){editor.setCaretPos(tag.close.range.start);}else{editor.setCaretPos(tag.open.range.start);}return true;}return false;},{label:'HTML/Go To Matching Tag Pair'});});emmet.exec(function(require,_){require('actions').add('remove_tag',function(editor){var utils=require('utils');var info=require('editorUtils').outputInfo(editor);var tag=require('htmlMatcher').tag(info.content,editor.getCaretPos());if(tag){if(!tag.close){editor.replaceContent(utils.getCaretPlaceholder(),tag.range.start,tag.range.end);}else{var tagContentRange=utils.narrowToNonSpace(info.content,tag.innerRange);var startLineBounds=utils.findNewlineBounds(info.content,tagContentRange.start);var startLinePad=utils.getLinePadding(startLineBounds.substring(info.content));var tagContent=tagContentRange.substring(info.content); +tagContent=utils.unindentString(tagContent,startLinePad);editor.replaceContent(utils.getCaretPlaceholder()+utils.escapeText(tagContent),tag.outerRange.start,tag.outerRange.end);}return true;}return false;},{label:'HTML/Remove Tag'});});emmet.exec(function(require,_){function joinTag(editor,profile,tag){var utils=require('utils');var slash=profile.selfClosing()||' /';var content=tag.open.range.substring(tag.source).replace(/\s*>$/,slash+'>');var caretPos=editor.getCaretPos();if(content.length+tag.outerRange.start$/,'>'); +caretPos=tag.outerRange.start+content.length;content+=tagContent+'';content=utils.escapeText(content);editor.replaceContent(content,tag.outerRange.start,tag.outerRange.end);editor.setCaretPos(caretPos);return true;}require('actions').add('split_join_tag',function(editor,profileName){var matcher=require('htmlMatcher');var info=require('editorUtils').outputInfo(editor,null,profileName);var profile=require('profile').get(info.profile);var tag=matcher.tag(info.content,editor.getCaretPos());if(tag){return tag.close?joinTag(editor,profile,tag):splitTag(editor,profile,tag);}return false;},{label:'HTML/Split\\Join Tag Declaration'});});emmet.define('reflectCSSValue',function(require,_){var handlers=require('handlerList').create();require('actions').add('reflect_css_value',function(editor){if(editor.getSyntax()!='css')return false;return require('actionUtils').compoundUpdate(editor,doCSSReflection(editor));},{label:'CSS/Reflect Value'});function doCSSReflection(editor){var cssEditTree=require('cssEditTree'); +var outputInfo=require('editorUtils').outputInfo(editor);var caretPos=editor.getCaretPos();var cssRule=cssEditTree.parseFromPosition(outputInfo.content,caretPos);if(!cssRule)return;var property=cssRule.itemFromPosition(caretPos,true);if(!property)return;var oldRule=cssRule.source;var offset=cssRule.options.offset;var caretDelta=caretPos-offset-property.range().start;handlers.exec(false,[property]);if(oldRule!==cssRule.source){return{data:cssRule.source,start:offset,end:offset+oldRule.length,caret:offset+property.range().start+caretDelta};}}function getReflectedCSSName(name){name=require('cssEditTree').baseName(name);var vendorPrefix='^(?:\\-\\w+\\-)?',m;if(name=='opacity'||name=='filter'){return new RegExp(vendorPrefix+'(?:opacity|filter)$');}else if(m=name.match(/^border-radius-(top|bottom)(left|right)/)){return new RegExp(vendorPrefix+'(?:'+name+'|border-'+m[1]+'-'+m[2]+'-radius)$');}else if(m=name.match(/^border-(top|bottom)-(left|right)-radius/)){return new RegExp(vendorPrefix+'(?:'+name+'|border-radius-'+m[1]+m[2]+')$'); +}return new RegExp(vendorPrefix+name+'$');}function reflectValue(donor,receiver){var value=getReflectedValue(donor.name(),donor.value(),receiver.name(),receiver.value());receiver.value(value);}function getReflectedValue(curName,curValue,refName,refValue){var cssEditTree=require('cssEditTree');var utils=require('utils');curName=cssEditTree.baseName(curName);refName=cssEditTree.baseName(refName);if(curName=='opacity'&&refName=='filter'){return refValue.replace(/opacity=[^)]*/i,'opacity='+Math.floor(parseFloat(curValue)*100));}else if(curName=='filter'&&refName=='opacity'){var m=curValue.match(/opacity=([^)]*)/i);return m?utils.prettifyNumber(parseInt(m[1])/100):refValue;}return curValue;}handlers.add(function(property){var reName=getReflectedCSSName(property.name());_.each(property.parent.list(),function(p){if(reName.test(p.name())){reflectValue(property,p);}});},{order:-1});return{addHandler:function(fn,options){handlers.add(fn,options);},removeHandler:function(fn){handlers.remove(fn,options); +}};});emmet.exec(function(require,_){require('actions').add('evaluate_math_expression',function(editor){var actionUtils=require('actionUtils');var utils=require('utils');var content=String(editor.getContent());var chars='.+-*/\\';var sel=require('range').create(editor.getSelectionRange());if(!sel.length()){sel=actionUtils.findExpressionBounds(editor,function(ch){return utils.isNumeric(ch)||chars.indexOf(ch)!=-1;});}if(sel&&sel.length()){var expr=sel.substring(content);expr=expr.replace(/([\d\.\-]+)\\([\d\.\-]+)/g,'Math.round($1/$2)');try{var result=utils.prettifyNumber(new Function('return '+expr)());editor.replaceContent(result,sel.start,sel.end);editor.setCaretPos(sel.start+result.length);return true;}catch(e){}}return false;},{label:'Numbers/Evaluate Math Expression'});});emmet.exec(function(require,_){function incrementNumber(editor,step){var utils=require('utils');var actionUtils=require('actionUtils');var hasSign=false;var hasDecimal=false;var r=actionUtils.findExpressionBounds(editor,function(ch,pos,content){ +if(utils.isNumeric(ch))return true;if(ch=='.'){if(!utils.isNumeric(content.charAt(pos+1)))return false;return hasDecimal?false:hasDecimal=true;}if(ch=='-')return hasSign?false:hasSign=true;return false;});if(r&&r.length()){var strNum=r.substring(String(editor.getContent()));var num=parseFloat(strNum);if(!_.isNaN(num)){num=utils.prettifyNumber(num+step);if(/^(\-?)0+[1-9]/.test(strNum)){var minus='';if(RegExp.$1){minus='-';num=num.substring(1);}var parts=num.split('.');parts[0]=utils.zeroPadString(parts[0],intLength(strNum));num=minus+parts.join('.');}editor.replaceContent(num,r.start,r.end);editor.createSelection(r.start,r.start+num.length);return true;}}return false;}function intLength(num){num=num.replace(/^\-/,'');if(~num.indexOf('.')){return num.split('.')[0].length;}return num.length;}var actions=require('actions');_.each([1,-1,10,-10,0.1,-0.1],function(num){var prefix=num>0?'increment':'decrement';actions.add(prefix+'_number_by_'+String(Math.abs(num)).replace('.','').substring(0,2),function(editor){ +return incrementNumber(editor,num);},{label:'Numbers/'+prefix.charAt(0).toUpperCase()+prefix.substring(1)+' number by '+Math.abs(num)});});});emmet.exec(function(require,_){var actions=require('actions');var prefs=require('preferences');prefs.define('css.closeBraceIndentation','\n','Indentation before closing brace of CSS rule. Some users prefere '+'indented closing brace of CSS rule for better readability. '+'This preference’s value will be automatically inserted before '+'closing brace when user adds newline in newly created CSS rule '+'(e.g. when “Insert formatted linebreak” action will be performed '+'in CSS file). If you’re such user, you may want to write put a value '+'like \\n\\t in this preference.');actions.add('insert_formatted_line_break_only',function(editor){var utils=require('utils');var res=require('resources');var info=require('editorUtils').outputInfo(editor);var caretPos=editor.getCaretPos();var nl=utils.getNewline();if(_.include(['html','xml','xsl'],info.syntax)){ +var pad=res.getVariable('indentation');var tag=require('htmlMatcher').tag(info.content,caretPos);if(tag&&!tag.innerRange.length()){editor.replaceContent(nl+pad+utils.getCaretPlaceholder()+nl,caretPos);return true;}}else if(info.syntax=='css'){var content=info.content;if(caretPos&&content.charAt(caretPos-1)=='{'){var append=prefs.get('css.closeBraceIndentation');var pad=res.getVariable('indentation');var hasCloseBrace=content.charAt(caretPos)=='}';if(!hasCloseBrace){for(var i=caretPos,il=content.length,ch;icurPadding.length)editor.replaceContent(nl+nextPadding,caretPos,caretPos,true);else editor.replaceContent(nl,caretPos);}return true;},{hidden:true});});emmet.exec(function(require,_){require('actions').add('merge_lines',function(editor){var matcher=require('htmlMatcher');var utils=require('utils');var editorUtils=require('editorUtils');var info=editorUtils.outputInfo(editor);var selection=require('range').create(editor.getSelectionRange());if(!selection.length()){var pair=matcher.find(info.content,editor.getCaretPos());if(pair){selection=pair.outerRange;}}if(selection.length()){var text=selection.substring(info.content);var lines=utils.splitByLines(text);for(var i=1;i=0){if(startsWith('src=',text,caretPos)){if(m=text.substr(caretPos).match(/^(src=(["'])?)([^'"<>\s]+)\1?/)){data=m[3];caretPos+=m[1].length;}break;}else if(startsWith('url(',text,caretPos)){if(m=text.substr(caretPos).match(/^(url\((['"])?)([^'"\)\s]+)\1?/)){data=m[3];caretPos+=m[1].length;}break;}}}if(data){if(startsWith('data:',data))return decodeFromBase64(editor,data,caretPos);else return encodeToBase64(editor,data,caretPos);}return false;},{label:'Encode\\Decode data:URL image'});function startsWith(token,text,pos){ +pos=pos||0;return text.charAt(pos)==token.charAt(0)&&text.substr(pos,token.length)==token;}function encodeToBase64(editor,imgPath,pos){var file=require('file');var actionUtils=require('actionUtils');var editorFile=editor.getFilePath();var defaultMimeType='application/octet-stream';if(editorFile===null){throw"You should save your file before using this action";}var realImgPath=file.locateFile(editorFile,imgPath);if(realImgPath===null){throw"Can't find "+imgPath+' file';}file.read(realImgPath,function(err,content){if(err){throw'Unable to read '+realImgPath+': '+err;}var b64=require('base64').encode(String(content));if(!b64){throw"Can't encode file content to base64";}b64='data:'+(actionUtils.mimeTypes[String(file.getExt(realImgPath))]||defaultMimeType)+';base64,'+b64;editor.replaceContent('$0'+b64,pos,pos+imgPath.length);});return true;}function decodeFromBase64(editor,data,pos){var filePath=String(editor.prompt('Enter path to file (absolute or relative)'));if(!filePath)return false;var file=require('file'); +var absPath=file.createPath(editor.getFilePath(),filePath);if(!absPath){throw"Can't save file";}file.save(absPath,require('base64').decode(data.replace(/^data\:.+?;.+?,/,'')));editor.replaceContent('$0'+filePath,pos,pos+data.length);return true;}});emmet.exec(function(require,_){function updateImageSizeHTML(editor){var offset=editor.getCaretPos();var info=require('editorUtils').outputInfo(editor);var xmlElem=require('xmlEditTree').parseFromPosition(info.content,offset,true);if(xmlElem&&(xmlElem.name()||'').toLowerCase()=='img'){getImageSizeForSource(editor,xmlElem.value('src'),function(size){if(size){var compoundData=xmlElem.range(true);xmlElem.value('width',size.width);xmlElem.value('height',size.height,xmlElem.indexOf('width')+1);require('actionUtils').compoundUpdate(editor,_.extend(compoundData,{data:xmlElem.toString(),caret:offset}));}});}}function updateImageSizeCSS(editor){var offset=editor.getCaretPos();var info=require('editorUtils').outputInfo(editor);var cssRule=require('cssEditTree').parseFromPosition(info.content,offset,true); +if(cssRule){var prop=cssRule.itemFromPosition(offset,true),m;if(prop&&(m=/url\((["']?)(.+?)\1\)/i.exec(prop.value()||''))){getImageSizeForSource(editor,m[2],function(size){if(size){var compoundData=cssRule.range(true);cssRule.value('width',size.width+'px');cssRule.value('height',size.height+'px',cssRule.indexOf('width')+1);require('actionUtils').compoundUpdate(editor,_.extend(compoundData,{data:cssRule.toString(),caret:offset}));}});}}}function getImageSizeForSource(editor,src,callback){var fileContent;var au=require('actionUtils');if(src){if(/^data:/.test(src)){fileContent=require('base64').decode(src.replace(/^data\:.+?;.+?,/,''));return callback(au.getImageSize(fileContent));}var file=require('file');var absPath=file.locateFile(editor.getFilePath(),src);if(absPath===null){throw"Can't find "+src+' file';}file.read(absPath,function(err,content){if(err){throw'Unable to read '+absPath+': '+err;}content=String(content);callback(au.getImageSize(content));});}}require('actions').add('update_image_size',function(editor){ +if(_.include(['css','less','scss'],String(editor.getSyntax()))){updateImageSizeCSS(editor);}else{updateImageSizeHTML(editor);}return true;});});emmet.define('cssResolver',function(require,_){var module=null;var prefixObj={prefix:'emmet',obsolete:false,transformName:function(name){return'-'+this.prefix+'-'+name;},properties:function(){return getProperties('css.'+this.prefix+'Properties')||[];},supports:function(name){return _.include(this.properties(),name);}};var vendorPrefixes={};var defaultValue='${1};';var prefs=require('preferences');prefs.define('css.valueSeparator',': ','Defines a symbol that should be placed between CSS property and '+'value when expanding CSS abbreviations.');prefs.define('css.propertyEnd',';','Defines a symbol that should be placed at the end of CSS property '+'when expanding CSS abbreviations.');prefs.define('stylus.valueSeparator',' ','Defines a symbol that should be placed between CSS property and '+'value when expanding CSS abbreviations in Stylus dialect.'); +prefs.define('stylus.propertyEnd','','Defines a symbol that should be placed at the end of CSS property '+'when expanding CSS abbreviations in Stylus dialect.');prefs.define('sass.propertyEnd','','Defines a symbol that should be placed at the end of CSS property '+'when expanding CSS abbreviations in SASS dialect.');prefs.define('css.autoInsertVendorPrefixes',true,'Automatically generate vendor-prefixed copies of expanded CSS '+'property. By default, Emmet will generate vendor-prefixed '+'properties only when you put dash before abbreviation '+'(e.g. -bxsh). With this option enabled, you don’t '+'need dashes before abbreviations: Emmet will produce '+'vendor-prefixed properties for you.');var descTemplate=_.template('A comma-separated list of CSS properties that may have '+'<%= vendor %> vendor prefix. This list is used to generate '+'a list of prefixed properties when expanding -property '+'abbreviations. Empty list means that all possible CSS values may ' ++'have <%= vendor %> prefix.');var descAddonTemplate=_.template('A comma-separated list of additional CSS properties '+'for css.<%= vendor %>Preperties preference. '+'You should use this list if you want to add or remove a few CSS '+'properties to original set. To add a new property, simply write its name, '+'to remove it, precede property with hyphen.
'+'For example, to add foo property and remove border-radius one, '+'the preference value will look like this: foo, -border-radius.');var props={'webkit':'animation, animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, appearance, backface-visibility, background-clip, background-composite, background-origin, background-size, border-fit, border-horizontal-spacing, border-image, border-vertical-spacing, box-align, box-direction, box-flex, box-flex-group, box-lines, box-ordinal-group, box-orient, box-pack, box-reflect, box-shadow, color-correction, column-break-after, column-break-before, column-break-inside, column-count, column-gap, column-rule-color, column-rule-style, column-rule-width, column-span, column-width, dashboard-region, font-smoothing, highlight, hyphenate-character, hyphenate-limit-after, hyphenate-limit-before, hyphens, line-box-contain, line-break, line-clamp, locale, margin-before-collapse, margin-after-collapse, marquee-direction, marquee-increment, marquee-repetition, marquee-style, mask-attachment, mask-box-image, mask-box-image-outset, mask-box-image-repeat, mask-box-image-slice, mask-box-image-source, mask-box-image-width, mask-clip, mask-composite, mask-image, mask-origin, mask-position, mask-repeat, mask-size, nbsp-mode, perspective, perspective-origin, rtl-ordering, text-combine, text-decorations-in-effect, text-emphasis-color, text-emphasis-position, text-emphasis-style, text-fill-color, text-orientation, text-security, text-stroke-color, text-stroke-width, transform, transition, transform-origin, transform-style, transition-delay, transition-duration, transition-property, transition-timing-function, user-drag, user-modify, user-select, writing-mode, svg-shadow, box-sizing, border-radius', +'moz':'animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, appearance, backface-visibility, background-inline-policy, binding, border-bottom-colors, border-image, border-left-colors, border-right-colors, border-top-colors, box-align, box-direction, box-flex, box-ordinal-group, box-orient, box-pack, box-shadow, box-sizing, column-count, column-gap, column-rule-color, column-rule-style, column-rule-width, column-width, float-edge, font-feature-settings, font-language-override, force-broken-image-icon, hyphens, image-region, orient, outline-radius-bottomleft, outline-radius-bottomright, outline-radius-topleft, outline-radius-topright, perspective, perspective-origin, stack-sizing, tab-size, text-blink, text-decoration-color, text-decoration-line, text-decoration-style, text-size-adjust, transform, transform-origin, transform-style, transition, transition-delay, transition-duration, transition-property, transition-timing-function, user-focus, user-input, user-modify, user-select, window-shadow, background-clip, border-radius', +'ms':'accelerator, backface-visibility, background-position-x, background-position-y, behavior, block-progression, box-align, box-direction, box-flex, box-line-progression, box-lines, box-ordinal-group, box-orient, box-pack, content-zoom-boundary, content-zoom-boundary-max, content-zoom-boundary-min, content-zoom-chaining, content-zoom-snap, content-zoom-snap-points, content-zoom-snap-type, content-zooming, filter, flow-from, flow-into, font-feature-settings, grid-column, grid-column-align, grid-column-span, grid-columns, grid-layer, grid-row, grid-row-align, grid-row-span, grid-rows, high-contrast-adjust, hyphenate-limit-chars, hyphenate-limit-lines, hyphenate-limit-zone, hyphens, ime-mode, interpolation-mode, layout-flow, layout-grid, layout-grid-char, layout-grid-line, layout-grid-mode, layout-grid-type, line-break, overflow-style, perspective, perspective-origin, perspective-origin-x, perspective-origin-y, scroll-boundary, scroll-boundary-bottom, scroll-boundary-left, scroll-boundary-right, scroll-boundary-top, scroll-chaining, scroll-rails, scroll-snap-points-x, scroll-snap-points-y, scroll-snap-type, scroll-snap-x, scroll-snap-y, scrollbar-arrow-color, scrollbar-base-color, scrollbar-darkshadow-color, scrollbar-face-color, scrollbar-highlight-color, scrollbar-shadow-color, scrollbar-track-color, text-align-last, text-autospace, text-justify, text-kashida-space, text-overflow, text-size-adjust, text-underline-position, touch-action, transform, transform-origin, transform-origin-x, transform-origin-y, transform-origin-z, transform-style, transition, transition-delay, transition-duration, transition-property, transition-timing-function, user-select, word-break, word-wrap, wrap-flow, wrap-margin, wrap-through, writing-mode', +'o':'dashboard-region, animation, animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, border-image, link, link-source, object-fit, object-position, tab-size, table-baseline, transform, transform-origin, transition, transition-delay, transition-duration, transition-property, transition-timing-function, accesskey, input-format, input-required, marquee-dir, marquee-loop, marquee-speed, marquee-style'};_.each(props,function(v,k){prefs.define('css.'+k+'Properties',v,descTemplate({vendor:k}));prefs.define('css.'+k+'PropertiesAddon','',descAddonTemplate({vendor:k}));});prefs.define('css.unitlessProperties','z-index, line-height, opacity, font-weight, zoom','The list of properties whose values ​​must not contain units.');prefs.define('css.intUnit','px','Default unit for integer values');prefs.define('css.floatUnit','em','Default unit for float values');prefs.define('css.keywords','auto, inherit', +'A comma-separated list of valid keywords that can be used in CSS abbreviations.');prefs.define('css.keywordAliases','a:auto, i:inherit, s:solid, da:dashed, do:dotted, t:transparent','A comma-separated list of keyword aliases, used in CSS abbreviation. '+'Each alias should be defined as alias:keyword_name.');prefs.define('css.unitAliases','e:em, p:%, x:ex, r:rem','A comma-separated list of unit aliases, used in CSS abbreviation. '+'Each alias should be defined as alias:unit_value.');prefs.define('css.color.short',true,'Should color values like #ffffff be shortened to '+'#fff after abbreviation with color was expanded.');prefs.define('css.color.case','keep','Letter case of color values generated by abbreviations with color '+'(like c#0). Possible values are upper, '+'lower and keep.');prefs.define('css.fuzzySearch',true, +'Enable fuzzy search among CSS snippet names. When enabled, every '+'unknown snippet will be scored against available snippet '+'names (not values or CSS properties!). The match with best score '+'will be used to resolve snippet value. For example, with this '+'preference enabled, the following abbreviations are equal: '+'ov:h == ov-h == o-h == '+'oh');prefs.define('css.fuzzySearchMinScore',0.3,'The minium score (from 0 to 1) that fuzzy-matched abbreviation should '+'achive. Lower values may produce many false-positive matches, '+'higher values may reduce possible matches.');prefs.define('css.alignVendor',false,'If set to true, all generated vendor-prefixed properties '+'will be aligned by real property name.');function isNumeric(ch){var code=ch&&ch.charCodeAt(0);return(ch&&ch=='.'||(code>47&&code<58));}function isSingleProperty(snippet){var utils=require('utils');snippet=utils.trim(snippet);if(~snippet.indexOf('/*')||/[\n\r]/.test(snippet)){ +return false;}if(!/^[a-z0-9\-]+\s*\:/i.test(snippet)){return false;}snippet=require('tabStops').processText(snippet,{replaceCarets:true,tabstop:function(){return'value';}});return snippet.split(':').length==2;}function normalizeValue(value){if(value.charAt(0)=='-'&&!/^\-[\.\d]/.test(value)){value=value.replace(/^\-+/,'');}if(value.charAt(0)=='#'){return normalizeHexColor(value);}return getKeyword(value);}function normalizeHexColor(value){var hex=value.replace(/^#+/,'')||'0';if(hex.toLowerCase()=='t'){return'transparent';}var repeat=require('utils').repeatString;var color=null;switch(hex.length){case 1:color=repeat(hex,6);break;case 2:color=repeat(hex,3);break;case 3:color=hex.charAt(0)+hex.charAt(0)+hex.charAt(1)+hex.charAt(1)+hex.charAt(2)+hex.charAt(2);break;case 4:color=hex+hex.substr(0,2);break;case 5:color=hex+hex.charAt(0);break;default:color=hex.substr(0,6);}if(prefs.get('css.color.short')){var p=color.split('');if(p[0]==p[1]&&p[2]==p[3]&&p[4]==p[5]){color=p[0]+p[2]+p[4];}} +switch(prefs.get('css.color.case')){case'upper':color=color.toUpperCase();break;case'lower':color=color.toLowerCase();break;}return'#'+color;}function getKeyword(name){var aliases=prefs.getDict('css.keywordAliases');return name in aliases?aliases[name]:name;}function getUnit(name){var aliases=prefs.getDict('css.unitAliases');return name in aliases?aliases[name]:name;}function isValidKeyword(keyword){return _.include(prefs.getArray('css.keywords'),getKeyword(keyword));}function hasPrefix(property,prefix){var info=vendorPrefixes[prefix];if(!info)info=_.find(vendorPrefixes,function(data){return data.prefix==prefix;});return info&&info.supports(property);}function findPrefixes(property,noAutofill){var result=[];_.each(vendorPrefixes,function(obj,prefix){if(hasPrefix(property,prefix)){result.push(prefix);}});if(!result.length&&!noAutofill){_.each(vendorPrefixes,function(obj,prefix){if(!obj.obsolete)result.push(prefix);});}return result;}function addPrefix(name,obj){if(_.isString(obj))obj={prefix:obj}; +vendorPrefixes[name]=_.extend({},prefixObj,obj);}function getSyntaxPreference(name,syntax){if(syntax){var val=prefs.get(syntax+'.'+name);if(!_.isUndefined(val))return val;}return prefs.get('css.'+name);}function formatProperty(property,syntax){var ix=property.indexOf(':');property=property.substring(0,ix).replace(/\s+$/,'')+getSyntaxPreference('valueSeparator',syntax)+require('utils').trim(property.substring(ix+1));return property.replace(/\s*;\s*$/,getSyntaxPreference('propertyEnd',syntax));}function transformSnippet(snippet,isImportant,syntax){if(!_.isString(snippet))snippet=snippet.data;if(!isSingleProperty(snippet))return snippet;if(isImportant){if(~snippet.indexOf(';')){snippet=snippet.split(';').join(' !important;');}else{snippet+=' !important';}}return formatProperty(snippet,syntax);}function parseList(list){var result=_.map((list||'').split(','),require('utils').trim);return result.length?result:null;}function getProperties(key){var list=prefs.getArray(key);_.each(prefs.getArray(key+'Addon'),function(prop){ +if(prop.charAt(0)=='-'){list=_.without(list,prop.substr(1));}else{if(prop.charAt(0)=='+')prop=prop.substr(1);list.push(prop);}});return list;}addPrefix('w',{prefix:'webkit'});addPrefix('m',{prefix:'moz'});addPrefix('s',{prefix:'ms'});addPrefix('o',{prefix:'o'});var cssSyntaxes=['css','less','sass','scss','stylus'];require('resources').addResolver(function(node,syntax){if(_.include(cssSyntaxes,syntax)&&node.isElement()){return module.expandToSnippet(node.abbreviation,syntax);}return null;});var ea=require('expandAbbreviation');ea.addHandler(function(editor,syntax,profile){if(!_.include(cssSyntaxes,syntax)){return false;}var caretPos=editor.getSelectionRange().end;var abbr=ea.findAbbreviation(editor);if(abbr){var content=emmet.expandAbbreviation(abbr,syntax,profile);if(content){var replaceFrom=caretPos-abbr.length;var replaceTo=caretPos;if(editor.getContent().charAt(caretPos)==';'&&content.charAt(content.length-1)==';'){replaceTo++;}editor.replaceContent(content,replaceFrom,replaceTo); +return true;}}return false;});return module={addPrefix:addPrefix,supportsPrefix:hasPrefix,prefixed:function(property,prefix){return hasPrefix(property,prefix)?'-'+prefix+'-'+property:property;},listPrefixes:function(){return _.map(vendorPrefixes,function(obj){return obj.prefix;});},getPrefix:function(name){return vendorPrefixes[name];},removePrefix:function(name){if(name in vendorPrefixes)delete vendorPrefixes[name];},extractPrefixes:function(abbr){if(abbr.charAt(0)!='-'){return{property:abbr,prefixes:null};}var i=1,il=abbr.length,ch;var prefixes=[];while(ibackground-color property with gradient first color '+'as fallback for old browsers.');function normalizeSpace(str){return require('utils').trim(str).replace(/\s+/g,' ');} +function parseLinearGradient(gradient){var direction=defaultLinearDirections[0];var stream=require('stringStream').create(require('utils').trim(gradient));var colorStops=[],ch;while(ch=stream.next()){if(stream.peek()==','){colorStops.push(stream.current());stream.next();stream.eatSpace();stream.start=stream.pos;}else if(ch=='('){stream.skipTo(')');}}colorStops.push(stream.current());colorStops=_.compact(_.map(colorStops,normalizeSpace));if(!colorStops.length)return null;if(reDeg.test(colorStops[0])||reKeyword.test(colorStops[0])){direction=colorStops.shift();}return{type:'linear',direction:direction,colorStops:_.map(colorStops,parseColorStop)};}function parseColorStop(colorStop){colorStop=normalizeSpace(colorStop);var color=null;colorStop=colorStop.replace(/^(\w+\(.+?\))\s*/,function(str,c){color=c;return'';});if(!color){var parts=colorStop.split(' ');color=parts[0];colorStop=parts[1]||'';}var result={color:color};if(colorStop){colorStop.replace(/^(\-?[\d\.]+)([a-z%]+)?$/,function(str,pos,unit){ +result.position=pos;if(~pos.indexOf('.')){unit='';}else if(!unit){unit='%';}if(unit)result.unit=unit;});}return result;}function resolvePropertyName(name,syntax){var res=require('resources');var prefs=require('preferences');var snippet=res.findSnippet(syntax,name);if(!snippet&&prefs.get('css.fuzzySearch')){snippet=res.fuzzyFindSnippet(syntax,name,parseFloat(prefs.get('css.fuzzySearchMinScore')));}if(snippet){if(!_.isString(snippet)){snippet=snippet.data;}return require('cssResolver').splitSnippet(snippet).name;}}function fillImpliedPositions(colorStops){var from=0;_.each(colorStops,function(cs,i){if(!i)return cs.position=cs.position||0;if(i==colorStops.length-1&&!('position'in cs))cs.position=1;if('position'in cs){var start=colorStops[from].position||0;var step=(cs.position-start)/(i-from);_.each(colorStops.slice(from,i),function(cs2,j){cs2.position=start+step*j;});from=i;}});}function textualDirection(direction){var angle=parseFloat(direction);if(!_.isNaN(angle)){switch(angle%360){ +case 0:return'left';case 90:return'bottom';case 180:return'right';case 240:return'top';}}return direction;}function oldWebkitDirection(direction){direction=textualDirection(direction);if(reDeg.test(direction))throw"The direction is an angle that can’t be converted.";var v=function(pos){return~direction.indexOf(pos)?'100%':'0';};return v('right')+' '+v('bottom')+', '+v('left')+' '+v('top');}function getPrefixedNames(name){var prefixes=prefs.getArray('css.gradient.prefixes');var names=prefixes?_.map(prefixes,function(p){return'-'+p+'-'+name;}):[];names.push(name);return names;}function getPropertiesForGradient(gradient,propertyName){var props=[];var css=require('cssResolver');if(prefs.get('css.gradient.fallback')&&~propertyName.toLowerCase().indexOf('background')){props.push({name:'background-color',value:'${1:'+gradient.colorStops[0].color+'}'});}_.each(prefs.getArray('css.gradient.prefixes'),function(prefix){var name=css.prefixed(propertyName,prefix);if(prefix=='webkit'&&prefs.get('css.gradient.oldWebkit')){ +try{props.push({name:name,value:module.oldWebkitLinearGradient(gradient)});}catch(e){}}props.push({name:name,value:module.toString(gradient,prefix)});});return props.sort(function(a,b){return b.name.length-a.name.length;});}function pasteGradient(property,gradient,valueRange){var rule=property.parent;var utils=require('utils');var alignVendor=require('preferences').get('css.alignVendor');var sep=property.styleSeparator;var before=property.styleBefore;_.each(rule.getAll(getPrefixedNames(property.name())),function(item){if(item!=property&&/gradient/i.test(item.value())){if(item.styleSeparator.length<%= attr("class", ".") %> -->','A definition of comment that should be placed after matched '+'element when comment filter is applied. This definition ' ++'is an ERB-style template passed to _.template() '+'function (see Underscore.js docs for details). In template context, '+'the following properties and functions are availabe:\n'+'
    '+'
  • attr(name, before, after) – a function that outputs'+'specified attribute value concatenated with before '+'and after strings. If attribute doesn\'t exists, the '+'empty string will be returned.
  • '+'
  • node – current node (instance of AbbreviationNode)
  • '+'
  • name – name of current tag
  • '+'
  • padding – current string padding, can be used '+'for formatting
  • '+'
');prefs.define('filter.commentBefore','','A definition of comment that should be placed before matched '+'element when comment filter is applied. '+'For more info, read description of filter.commentAfter '+'property');prefs.define('filter.commentTrigger','id, class', +'A comma-separated list of attribute names that should exist in abbreviatoin '+'where comment should be added. If you wish to add comment for '+'every element, set this option to *');function addComments(node,templateBefore,templateAfter){var utils=require('utils');var trigger=prefs.get('filter.commentTrigger');if(trigger!='*'){var shouldAdd=_.find(trigger.split(','),function(name){return!!node.attribute(utils.trim(name));});if(!shouldAdd)return;}var ctx={node:node,name:node.name(),padding:node.parent?node.parent.padding:'',attr:function(name,before,after){var attr=node.attribute(name);if(attr){return(before||'')+attr+(after||'');}return'';}};var nodeBefore=utils.normalizeNewline(templateBefore?templateBefore(ctx):'');var nodeAfter=utils.normalizeNewline(templateAfter?templateAfter(ctx):'');node.start=node.start.replace(//,'>'+nodeAfter);}function process(tree,before,after){var abbrUtils=require('abbreviationUtils');_.each(tree.children,function(item){ +if(abbrUtils.isBlock(item))addComments(item,before,after);process(item,before,after);});return tree;}require('filters').add('c',function(tree){var templateBefore=_.template(prefs.get('filter.commentBefore'));var templateAfter=_.template(prefs.get('filter.commentAfter'));return process(tree,templateBefore,templateAfter);});});emmet.exec(function(require,_){var charMap={'<':'<','>':'>','&':'&'};function escapeChars(str){return str.replace(/([<>&])/g,function(str,p1){return charMap[p1];});}require('filters').add('e',function process(tree){_.each(tree.children,function(item){item.start=escapeChars(item.start);item.end=escapeChars(item.end);item.content=escapeChars(item.content);process(item);});return tree;});});emmet.exec(function(require,_){var placeholder='%s';var prefs=require('preferences');prefs.define('format.noIndentTags','html','A comma-separated list of tag names that should not get inner indentation.');prefs.define('format.forceIndentationForTags','body', +'A comma-separated list of tag names that should always get inner indentation.');function getIndentation(node){if(_.include(prefs.getArray('format.noIndentTags')||[],node.name())){return'';}return require('resources').getVariable('indentation');}function hasBlockSibling(item){return item.parent&&require('abbreviationUtils').hasBlockChildren(item.parent);}function isVeryFirstChild(item){return item.parent&&!item.parent.parent&&!item.index();}function shouldAddLineBreak(node,profile){var abbrUtils=require('abbreviationUtils');if(profile.tag_nl===true||abbrUtils.isBlock(node))return true;if(!node.parent||!profile.inline_break)return false;return shouldFormatInline(node.parent,profile);}function shouldBreakChild(node,profile){return node.children.length&&shouldAddLineBreak(node.children[0],profile);}function shouldFormatInline(node,profile){var nodeCount=0;var abbrUtils=require('abbreviationUtils');return!!_.find(node.children,function(child){if(child.isTextNode()||!abbrUtils.isInline(child)) +nodeCount=0;else if(abbrUtils.isInline(child))nodeCount++;if(nodeCount>=profile.inline_break)return true;});}function isRoot(item){return!item.parent;}function processSnippet(item,profile,level){item.start=item.end='';if(!isVeryFirstChild(item)&&profile.tag_nl!==false&&shouldAddLineBreak(item,profile)){if(isRoot(item.parent)||!require('abbreviationUtils').isInline(item.parent)){item.start=require('utils').getNewline()+item.start;}}return item;}function shouldBreakInsideInline(node,profile){var abbrUtils=require('abbreviationUtils');var hasBlockElems=_.any(node.children,function(child){if(abbrUtils.isSnippet(child))return false;return!abbrUtils.isInline(child);});if(!hasBlockElems){return shouldFormatInline(node,profile);}return true;}function processTag(item,profile,level){item.start=item.end=placeholder;var utils=require('utils');var abbrUtils=require('abbreviationUtils');var isUnary=abbrUtils.isUnary(item);var nl=utils.getNewline();var indent=getIndentation(item);if(profile.tag_nl!==false){ +var forceNl=profile.tag_nl===true&&(profile.tag_nl_leaf||item.children.length);if(!forceNl){forceNl=_.include(prefs.getArray('format.forceIndentationForTags')||[],item.name());}if(!item.isTextNode()){if(shouldAddLineBreak(item,profile)){if(!isVeryFirstChild(item)&&(!abbrUtils.isSnippet(item.parent)||item.index()))item.start=nl+item.start;if(abbrUtils.hasBlockChildren(item)||shouldBreakChild(item,profile)||(forceNl&&!isUnary))item.end=nl+item.end;if(abbrUtils.hasTagsInContent(item)||(forceNl&&!item.children.length&&!isUnary))item.start+=nl+indent;}else if(abbrUtils.isInline(item)&&hasBlockSibling(item)&&!isVeryFirstChild(item)){item.start=nl+item.start;}else if(abbrUtils.isInline(item)&&shouldBreakInsideInline(item,profile)){item.end=nl+item.end;}item.padding=indent;}}return item;}require('filters').add('_format',function process(tree,profile,level){level=level||0;var abbrUtils=require('abbreviationUtils');_.each(tree.children,function(item){if(abbrUtils.isSnippet(item))processSnippet(item,profile,level); +else processTag(item,profile,level);process(item,profile,level+1);});return tree;});});emmet.exec(function(require,_){var childToken='${child}';function transformClassName(className){return require('utils').trim(className).replace(/\s+/g,'.');}function makeAttributesString(tag,profile){var attrs='';var otherAttrs=[];var attrQuote=profile.attributeQuote();var cursor=profile.cursor();_.each(tag.attributeList(),function(a){var attrName=profile.attributeName(a.name);switch(attrName.toLowerCase()){case'id':attrs+='#'+(a.value||cursor);break;case'class':attrs+='.'+transformClassName(a.value||cursor);break;default:otherAttrs.push(':'+attrName+' => '+attrQuote+(a.value||cursor)+attrQuote);}});if(otherAttrs.length)attrs+='{'+otherAttrs.join(', ')+'}';return attrs;}function hasBlockSibling(item){return item.parent&&item.parent.hasBlockChildren();}function processTag(item,profile,level){if(!item.parent)return item;var abbrUtils=require('abbreviationUtils');var utils=require('utils');var attrs=makeAttributesString(item,profile); +var cursor=profile.cursor();var isUnary=abbrUtils.isUnary(item);var selfClosing=profile.self_closing_tag&&isUnary?'/':'';var start='';var tagName='%'+profile.tagName(item.name());if(tagName.toLowerCase()=='%div'&&attrs&&attrs.indexOf('{')==-1)tagName='';item.end='';start=tagName+attrs+selfClosing+' ';var placeholder='%s';item.start=utils.replaceSubstring(item.start,start,item.start.indexOf(placeholder),placeholder);if(!item.children.length&&!isUnary)item.start+=cursor;return item;}require('filters').add('haml',function process(tree,profile,level){level=level||0;var abbrUtils=require('abbreviationUtils');if(!level){tree=require('filters').apply(tree,'_format',profile);}_.each(tree.children,function(item){if(!abbrUtils.isSnippet(item))processTag(item,profile,level);process(item,profile,level+1);});return tree;});});emmet.exec(function(require,_){function makeAttributesString(node,profile){var attrQuote=profile.attributeQuote();var cursor=profile.cursor();return _.map(node.attributeList(),function(a){ +var attrName=profile.attributeName(a.name);return' '+attrName+'='+attrQuote+(a.value||cursor)+attrQuote;}).join('');}function processTag(item,profile,level){if(!item.parent)return item;var abbrUtils=require('abbreviationUtils');var utils=require('utils');var attrs=makeAttributesString(item,profile);var cursor=profile.cursor();var isUnary=abbrUtils.isUnary(item);var start='';var end='';if(!item.isTextNode()){var tagName=profile.tagName(item.name());if(isUnary){start='<'+tagName+attrs+profile.selfClosing()+'>';item.end='';}else{start='<'+tagName+attrs+'>';end='';}}var placeholder='%s';item.start=utils.replaceSubstring(item.start,start,item.start.indexOf(placeholder),placeholder);item.end=utils.replaceSubstring(item.end,end,item.end.indexOf(placeholder),placeholder);if(!item.children.length&&!isUnary&&!~item.content.indexOf(cursor)&&!require('tabStops').extract(item.content).tabstops.length){item.start+=cursor;}return item;}require('filters').add('html',function process(tree,profile,level){ +level=level||0;var abbrUtils=require('abbreviationUtils');if(!level){tree=require('filters').apply(tree,'_format',profile);}_.each(tree.children,function(item){if(!abbrUtils.isSnippet(item))processTag(item,profile,level);process(item,profile,level+1);});return tree;});});emmet.exec(function(require,_){var rePad=/^\s+/;var reNl=/[\n\r]/g;require('filters').add('s',function process(tree,profile,level){var abbrUtils=require('abbreviationUtils');_.each(tree.children,function(item){if(!abbrUtils.isSnippet(item)){item.start=item.start.replace(rePad,'');item.end=item.end.replace(rePad,'');}item.start=item.start.replace(reNl,'');item.end=item.end.replace(reNl,'');item.content=item.content.replace(reNl,'');process(item);});return tree;});});emmet.exec(function(require,_){require('preferences').define('filter.trimRegexp','[\\s|\\u00a0]*[\\d|#|\\-|\*|\\u2022]+\\.?\\s*','Regular expression used to remove list markers (numbers, dashes, '+'bullets, etc.) in t (trim) filter. The trim filter ' ++'is useful for wrapping with abbreviation lists, pased from other '+'documents (for example, Word documents).');function process(tree,re){_.each(tree.children,function(item){if(item.content)item.content=item.content.replace(re,'');process(item,re);});return tree;}require('filters').add('t',function(tree){var re=new RegExp(require('preferences').get('filter.trimRegexp'));return process(tree,re);});});emmet.exec(function(require,_){var tags={'xsl:variable':1,'xsl:with-param':1};function trimAttribute(node){node.start=node.start.replace(/\s+select\s*=\s*(['"]).*?\1/,'');}require('filters').add('xsl',function process(tree){var abbrUtils=require('abbreviationUtils');_.each(tree.children,function(item){if(!abbrUtils.isSnippet(item)&&(item.name()||'').toLowerCase()in tags&&item.children.length)trimAttribute(item);process(item);});return tree;});});emmet.define('lorem',function(require,_){var langs={en:{common:['lorem','ipsum','dolor','sit','amet','consectetur','adipisicing','elit'],words:['exercitationem','perferendis','perspiciatis','laborum','eveniet', +'sunt','iure','nam','nobis','eum','cum','officiis','excepturi','odio','consectetur','quasi','aut','quisquam','vel','eligendi','itaque','non','odit','tempore','quaerat','dignissimos','facilis','neque','nihil','expedita','vitae','vero','ipsum','nisi','animi','cumque','pariatur','velit','modi','natus','iusto','eaque','sequi','illo','sed','ex','et','voluptatibus','tempora','veritatis','ratione','assumenda','incidunt','nostrum','placeat','aliquid','fuga','provident','praesentium','rem','necessitatibus','suscipit','adipisci','quidem','possimus','voluptas','debitis','sint','accusantium','unde','sapiente','voluptate','qui','aspernatur','laudantium','soluta','amet','quo','aliquam','saepe','culpa','libero','ipsa','dicta','reiciendis','nesciunt','doloribus','autem','impedit','minima','maiores','repudiandae','ipsam','obcaecati','ullam','enim','totam','delectus','ducimus','quis','voluptates','dolores','molestiae','harum','dolorem','quia','voluptatem','molestias','magni','distinctio','omnis','illum','dolorum','voluptatum','ea', +'quas','quam','corporis','quae','blanditiis','atque','deserunt','laboriosam','earum','consequuntur','hic','cupiditate','quibusdam','accusamus','ut','rerum','error','minus','eius','ab','ad','nemo','fugit','officia','at','in','id','quos','reprehenderit','numquam','iste','fugiat','sit','inventore','beatae','repellendus','magnam','recusandae','quod','explicabo','doloremque','aperiam','consequatur','asperiores','commodi','optio','dolor','labore','temporibus','repellat','veniam','architecto','est','esse','mollitia','nulla','a','similique','eos','alias','dolore','tenetur','deleniti','porro','facere','maxime','corrupti']},ru:{common:['далеко-далеко','за','словесными','горами','в стране','гласных','и согласных','живут','рыбные','тексты'],words:['вдали','от всех','они','буквенных','домах','на берегу','семантика','большого','языкового','океана','маленький','ручеек','даль', +'журчит','по всей','обеспечивает','ее','всеми','необходимыми','правилами','эта','парадигматическая','страна','которой','жаренные','предложения','залетают','прямо','рот','даже','всемогущая','пунктуация','не','имеет','власти','над','рыбными','текстами','ведущими','безорфографичный','образ','жизни','однажды','одна','маленькая','строчка','рыбного','текста','имени','lorem','ipsum','решила','выйти','большой','мир','грамматики','великий','оксмокс','предупреждал','о','злых','запятых','диких','знаках','вопроса','коварных','точках','запятой','но','текст','дал','сбить','себя','толку','он','собрал','семь','своих','заглавных','букв', +'подпоясал','инициал','за','пояс','пустился','дорогу','взобравшись','первую','вершину','курсивных','гор','бросил','последний','взгляд','назад','силуэт','своего','родного','города','буквоград','заголовок','деревни','алфавит','подзаголовок','своего','переулка','грустный','реторический','вопрос','скатился','его','щеке','продолжил','свой','путь','дороге','встретил','рукопись','она','предупредила','моей','все','переписывается','несколько','раз','единственное','что','меня','осталось','это','приставка','возвращайся','ты','лучше','свою','безопасную','страну','послушавшись','рукописи','наш','продолжил','свой','путь','вскоре','ему', +'повстречался','коварный','составитель','рекламных','текстов','напоивший','языком','речью','заманивший','свое','агенство','которое','использовало','снова','снова','своих','проектах','если','переписали','то','живет','там','до','сих','пор']}};var prefs=require('preferences');prefs.define('lorem.defaultLang','en');require('abbreviationParser').addPreprocessor(function(tree,options){var re=/^(?:lorem|lipsum)([a-z]{2})?(\d*)$/i,match;tree.findAll(function(node){if(node._name&&(match=node._name.match(re))){var wordCound=match[2]||30;var lang=match[1]||prefs.get('lorem.defaultLang')||'en';node._name='';node.data('forceNameResolving',node.isRepeating()||node.attributeList().length);node.data('pasteOverwrites',true);node.data('paste',function(i,content){return paragraph(lang,wordCound,!i);});}});});function randint(from,to){return Math.round(Math.random()*(to-from)+from); +}function sample(arr,count){var len=arr.length;var iterations=Math.min(len,count);var result=[];while(result.length3&&len<=6){totalCommas=randint(0,1);}else if(len>6&&len<=12){totalCommas=randint(0,2);}else{totalCommas=randint(1,4);}_.each(_.range(totalCommas),function(ix){if(ix5)words[4]+=',';totalWords+=words.length;result.push(sentence(words,'.'));}while(totalWords","!!!4t":"","!!!4s":"","!!!xt":"","!!!xs":"", +"!!!xxs":"","c":"","cc:ie6":"","cc:ie":"","cc:noie":"\n\t${child}|\n"},"abbreviations":{"!":"html:5","a":"","a:link":"","a:mail":"","abbr":"","acronym":"","base":"","basefont":"","br":"
","frame":"","hr":"
","bdo":"","bdo:r":"","bdo:l":"","col":"","link":"","link:css":"","link:print":"","link:favicon":"","link:touch":"", +"link:rss":"","link:atom":"","meta":"","meta:utf":"","meta:win":"","meta:vp":"","meta:compat":"","style":"\n\ +snippet sub\n\ + ${1}\n\ +snippet summary\n\ + \n\ + ${1}\n\ + \n\ +snippet sup\n\ + ${1}\n\ +snippet table\n\ + \n\ + ${2}\n\ +
\n\ +snippet table.\n\ + \n\ + ${3}\n\ +
\n\ +snippet table#\n\ + \n\ + ${3}\n\ +
\n\ +snippet tbody\n\ + \n\ + ${1}\n\ + \n\ +snippet td\n\ + ${1}\n\ +snippet td.\n\ + ${2}\n\ +snippet td#\n\ + ${2}\n\ +snippet td+\n\ + ${1}\n\ + td+${2}\n\ +snippet textarea\n\ + ${6}\n\ +snippet tfoot\n\ + \n\ + ${1}\n\ + \n\ +snippet th\n\ + ${1}\n\ +snippet th.\n\ + ${2}\n\ +snippet th#\n\ + ${2}\n\ +snippet th+\n\ + ${1}\n\ + th+${2}\n\ +snippet thead\n\ + \n\ + ${1}\n\ + \n\ +snippet time\n\ + \n\ +snippet title\n\ + ${1:`substitute(Filename('', 'Page Title'), '^.', '\\u&', '')`}\n\ +snippet tr\n\ + \n\ + ${1}\n\ + \n\ +snippet tr+\n\ + \n\ + ${1}\n\ + td+${2}\n\ + \n\ +snippet track\n\ + ${5}${6}\n\ +snippet ul\n\ +
    \n\ + ${1}\n\ +
\n\ +snippet ul.\n\ +
    \n\ + ${2}\n\ +
\n\ +snippet ul#\n\ +
    \n\ + ${2}\n\ +
\n\ +snippet ul+\n\ +
    \n\ +
  • ${1}
  • \n\ + li+${2}\n\ +
\n\ +snippet var\n\ + ${1}\n\ +snippet video\n\ + ${8}\n\ +snippet wbr\n\ + ${1}\n\ +"; +exports.scope = "html"; + +}); diff --git a/modules/backend/assets/vendor/ace/snippets/javascript.js b/modules/backend/assets/vendor/ace/snippets/javascript.js new file mode 100644 index 0000000..f3f998a --- /dev/null +++ b/modules/backend/assets/vendor/ace/snippets/javascript.js @@ -0,0 +1,202 @@ +ace.define("ace/snippets/javascript",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# Prototype\n\ +snippet proto\n\ + ${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) {\n\ + ${4:// body...}\n\ + };\n\ +# Function\n\ +snippet fun\n\ + function ${1?:function_name}(${2:argument}) {\n\ + ${3:// body...}\n\ + }\n\ +# Anonymous Function\n\ +regex /((=)\\s*|(:)\\s*|(\\()|\\b)/f/(\\))?/\n\ +snippet f\n\ + function${M1?: ${1:functionName}}($2) {\n\ + ${0:$TM_SELECTED_TEXT}\n\ + }${M2?;}${M3?,}${M4?)}\n\ +# Immediate function\n\ +trigger \\(?f\\(\n\ +endTrigger \\)?\n\ +snippet f(\n\ + (function(${1}) {\n\ + ${0:${TM_SELECTED_TEXT:/* code */}}\n\ + }(${1}));\n\ +# if\n\ +snippet if\n\ + if (${1:true}) {\n\ + ${0}\n\ + }\n\ +# if ... else\n\ +snippet ife\n\ + if (${1:true}) {\n\ + ${2}\n\ + } else {\n\ + ${0}\n\ + }\n\ +# tertiary conditional\n\ +snippet ter\n\ + ${1:/* condition */} ? ${2:a} : ${3:b}\n\ +# switch\n\ +snippet switch\n\ + switch (${1:expression}) {\n\ + case '${3:case}':\n\ + ${4:// code}\n\ + break;\n\ + ${5}\n\ + default:\n\ + ${2:// code}\n\ + }\n\ +# case\n\ +snippet case\n\ + case '${1:case}':\n\ + ${2:// code}\n\ + break;\n\ + ${3}\n\ +\n\ +# while (...) {...}\n\ +snippet wh\n\ + while (${1:/* condition */}) {\n\ + ${0:/* code */}\n\ + }\n\ +# try\n\ +snippet try\n\ + try {\n\ + ${0:/* code */}\n\ + } catch (e) {}\n\ +# do...while\n\ +snippet do\n\ + do {\n\ + ${2:/* code */}\n\ + } while (${1:/* condition */});\n\ +# Object Method\n\ +snippet :f\n\ +regex /([,{[])|^\\s*/:f/\n\ + ${1:method_name}: function(${2:attribute}) {\n\ + ${0}\n\ + }${3:,}\n\ +# setTimeout function\n\ +snippet setTimeout\n\ +regex /\\b/st|timeout|setTimeo?u?t?/\n\ + setTimeout(function() {${3:$TM_SELECTED_TEXT}}, ${1:10});\n\ +# Get Elements\n\ +snippet gett\n\ + getElementsBy${1:TagName}('${2}')${3}\n\ +# Get Element\n\ +snippet get\n\ + getElementBy${1:Id}('${2}')${3}\n\ +# console.log (Firebug)\n\ +snippet cl\n\ + console.log(${1});\n\ +# return\n\ +snippet ret\n\ + return ${1:result}\n\ +# for (property in object ) { ... }\n\ +snippet fori\n\ + for (var ${1:prop} in ${2:Things}) {\n\ + ${0:$2[$1]}\n\ + }\n\ +# hasOwnProperty\n\ +snippet has\n\ + hasOwnProperty(${1})\n\ +# docstring\n\ +snippet /**\n\ + /**\n\ + * ${1:description}\n\ + *\n\ + */\n\ +snippet @par\n\ +regex /^\\s*\\*\\s*/@(para?m?)?/\n\ + @param {${1:type}} ${2:name} ${3:description}\n\ +snippet @ret\n\ + @return {${1:type}} ${2:description}\n\ +# JSON.parse\n\ +snippet jsonp\n\ + JSON.parse(${1:jstr});\n\ +# JSON.stringify\n\ +snippet jsons\n\ + JSON.stringify(${1:object});\n\ +# self-defining function\n\ +snippet sdf\n\ + var ${1:function_name} = function(${2:argument}) {\n\ + ${3:// initial code ...}\n\ +\n\ + $1 = function($2) {\n\ + ${4:// main code}\n\ + };\n\ + }\n\ +# singleton\n\ +snippet sing\n\ + function ${1:Singleton} (${2:argument}) {\n\ + // the cached instance\n\ + var instance;\n\ +\n\ + // rewrite the constructor\n\ + $1 = function $1($2) {\n\ + return instance;\n\ + };\n\ + \n\ + // carry over the prototype properties\n\ + $1.prototype = this;\n\ +\n\ + // the instance\n\ + instance = new $1();\n\ +\n\ + // reset the constructor pointer\n\ + instance.constructor = $1;\n\ +\n\ + ${3:// code ...}\n\ +\n\ + return instance;\n\ + }\n\ +# class\n\ +snippet class\n\ +regex /^\\s*/clas{0,2}/\n\ + var ${1:class} = function(${20}) {\n\ + $40$0\n\ + };\n\ + \n\ + (function() {\n\ + ${60:this.prop = \"\"}\n\ + }).call(${1:class}.prototype);\n\ + \n\ + exports.${1:class} = ${1:class};\n\ +# \n\ +snippet for-\n\ + for (var ${1:i} = ${2:Things}.length; ${1:i}--; ) {\n\ + ${0:${2:Things}[${1:i}];}\n\ + }\n\ +# for (...) {...}\n\ +snippet for\n\ + for (var ${1:i} = 0; $1 < ${2:Things}.length; $1++) {\n\ + ${3:$2[$1]}$0\n\ + }\n\ +# for (...) {...} (Improved Native For-Loop)\n\ +snippet forr\n\ + for (var ${1:i} = ${2:Things}.length - 1; $1 >= 0; $1--) {\n\ + ${3:$2[$1]}$0\n\ + }\n\ +\n\ +\n\ +#modules\n\ +snippet def\n\ + define(function(require, exports, module) {\n\ + \"use strict\";\n\ + var ${1/.*\\///} = require(\"${1}\");\n\ + \n\ + $TM_SELECTED_TEXT\n\ + });\n\ +snippet req\n\ +guard ^\\s*\n\ + var ${1/.*\\///} = require(\"${1}\");\n\ + $0\n\ +snippet requ\n\ +guard ^\\s*\n\ + var ${1/.*\\/(.)/\\u$1/} = require(\"${1}\").${1/.*\\/(.)/\\u$1/};\n\ + $0\n\ +"; +exports.scope = "javascript"; + +}); diff --git a/modules/backend/assets/vendor/ace/snippets/markdown.js b/modules/backend/assets/vendor/ace/snippets/markdown.js new file mode 100644 index 0000000..d05f16b --- /dev/null +++ b/modules/backend/assets/vendor/ace/snippets/markdown.js @@ -0,0 +1,95 @@ +ace.define("ace/snippets/markdown",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# Markdown\n\ +\n\ +# Includes octopress (http://octopress.org/) snippets\n\ +\n\ +snippet [\n\ + [${1:text}](http://${2:address} \"${3:title}\")\n\ +snippet [*\n\ + [${1:link}](${2:`@*`} \"${3:title}\")${4}\n\ +\n\ +snippet [:\n\ + [${1:id}]: http://${2:url} \"${3:title}\"\n\ +snippet [:*\n\ + [${1:id}]: ${2:`@*`} \"${3:title}\"\n\ +\n\ +snippet ![\n\ + ![${1:alttext}](${2:/images/image.jpg} \"${3:title}\")\n\ +snippet ![*\n\ + ![${1:alt}](${2:`@*`} \"${3:title}\")${4}\n\ +\n\ +snippet ![:\n\ + ![${1:id}]: ${2:url} \"${3:title}\"\n\ +snippet ![:*\n\ + ![${1:id}]: ${2:`@*`} \"${3:title}\"\n\ +\n\ +snippet ===\n\ +regex /^/=+/=*//\n\ + ${PREV_LINE/./=/g}\n\ + \n\ + ${0}\n\ +snippet ---\n\ +regex /^/-+/-*//\n\ + ${PREV_LINE/./-/g}\n\ + \n\ + ${0}\n\ +snippet blockquote\n\ + {% blockquote %}\n\ + ${1:quote}\n\ + {% endblockquote %}\n\ +\n\ +snippet blockquote-author\n\ + {% blockquote ${1:author}, ${2:title} %}\n\ + ${3:quote}\n\ + {% endblockquote %}\n\ +\n\ +snippet blockquote-link\n\ + {% blockquote ${1:author} ${2:URL} ${3:link_text} %}\n\ + ${4:quote}\n\ + {% endblockquote %}\n\ +\n\ +snippet bt-codeblock-short\n\ + ```\n\ + ${1:code_snippet}\n\ + ```\n\ +\n\ +snippet bt-codeblock-full\n\ + ``` ${1:language} ${2:title} ${3:URL} ${4:link_text}\n\ + ${5:code_snippet}\n\ + ```\n\ +\n\ +snippet codeblock-short\n\ + {% codeblock %}\n\ + ${1:code_snippet}\n\ + {% endcodeblock %}\n\ +\n\ +snippet codeblock-full\n\ + {% codeblock ${1:title} lang:${2:language} ${3:URL} ${4:link_text} %}\n\ + ${5:code_snippet}\n\ + {% endcodeblock %}\n\ +\n\ +snippet gist-full\n\ + {% gist ${1:gist_id} ${2:filename} %}\n\ +\n\ +snippet gist-short\n\ + {% gist ${1:gist_id} %}\n\ +\n\ +snippet img\n\ + {% img ${1:class} ${2:URL} ${3:width} ${4:height} ${5:title_text} ${6:alt_text} %}\n\ +\n\ +snippet youtube\n\ + {% youtube ${1:video_id} %}\n\ +\n\ +# The quote should appear only once in the text. It is inherently part of it.\n\ +# See http://octopress.org/docs/plugins/pullquote/ for more info.\n\ +\n\ +snippet pullquote\n\ + {% pullquote %}\n\ + ${1:text} {\" ${2:quote} \"} ${3:text}\n\ + {% endpullquote %}\n\ +"; +exports.scope = "markdown"; + +}); diff --git a/modules/backend/assets/vendor/ace/snippets/php-inline.js b/modules/backend/assets/vendor/ace/snippets/php-inline.js new file mode 100644 index 0000000..a99ab6e --- /dev/null +++ b/modules/backend/assets/vendor/ace/snippets/php-inline.js @@ -0,0 +1,384 @@ +ace.define("ace/snippets/php",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet \n\ +# this one is for php5.4\n\ +snippet \n\ +snippet ns\n\ + namespace ${1:Foo\\Bar\\Baz};\n\ + ${2}\n\ +snippet use\n\ + use ${1:Foo\\Bar\\Baz};\n\ + ${2}\n\ +snippet c\n\ + ${1:abstract }class ${2:$FILENAME}\n\ + {\n\ + ${3}\n\ + }\n\ +snippet i\n\ + interface ${1:$FILENAME}\n\ + {\n\ + ${2}\n\ + }\n\ +snippet t.\n\ + $this->${1}\n\ +snippet f\n\ + function ${1:foo}(${2:array }${3:$bar})\n\ + {\n\ + ${4}\n\ + }\n\ +# method\n\ +snippet m\n\ + ${1:abstract }${2:protected}${3: static} function ${4:foo}(${5:array }${6:$bar})\n\ + {\n\ + ${7}\n\ + }\n\ +# setter method\n\ +snippet sm \n\ + /**\n\ + * Sets the value of ${1:foo}\n\ + *\n\ + * @param ${2:$1} $$1 ${3:description}\n\ + *\n\ + * @return ${4:$FILENAME}\n\ + */\n\ + ${5:public} function set${6:$2}(${7:$2 }$$1)\n\ + {\n\ + $this->${8:$1} = $$1;\n\ + return $this;\n\ + }${9}\n\ +# getter method\n\ +snippet gm\n\ + /**\n\ + * Gets the value of ${1:foo}\n\ + *\n\ + * @return ${2:$1}\n\ + */\n\ + ${3:public} function get${4:$2}()\n\ + {\n\ + return $this->${5:$1};\n\ + }${6}\n\ +#setter\n\ +snippet $s\n\ + ${1:$foo}->set${2:Bar}(${3});\n\ +#getter\n\ +snippet $g\n\ + ${1:$foo}->get${2:Bar}();\n\ +\n\ +# Tertiary conditional\n\ +snippet =?:\n\ + $${1:foo} = ${2:true} ? ${3:a} : ${4};\n\ +snippet ?:\n\ + ${1:true} ? ${2:a} : ${3}\n\ +\n\ +snippet C\n\ + $_COOKIE['${1:variable}']${2}\n\ +snippet E\n\ + $_ENV['${1:variable}']${2}\n\ +snippet F\n\ + $_FILES['${1:variable}']${2}\n\ +snippet G\n\ + $_GET['${1:variable}']${2}\n\ +snippet P\n\ + $_POST['${1:variable}']${2}\n\ +snippet R\n\ + $_REQUEST['${1:variable}']${2}\n\ +snippet S\n\ + $_SERVER['${1:variable}']${2}\n\ +snippet SS\n\ + $_SESSION['${1:variable}']${2}\n\ + \n\ +# the following are old ones\n\ +snippet inc\n\ + include '${1:file}';${2}\n\ +snippet inc1\n\ + include_once '${1:file}';${2}\n\ +snippet req\n\ + require '${1:file}';${2}\n\ +snippet req1\n\ + require_once '${1:file}';${2}\n\ +# Start Docblock\n\ +snippet /*\n\ + /**\n\ + * ${1}\n\ + */\n\ +# Class - post doc\n\ +snippet doc_cp\n\ + /**\n\ + * ${1:undocumented class}\n\ + *\n\ + * @package ${2:default}\n\ + * @subpackage ${3:default}\n\ + * @author ${4:`g:snips_author`}\n\ + */${5}\n\ +# Class Variable - post doc\n\ +snippet doc_vp\n\ + /**\n\ + * ${1:undocumented class variable}\n\ + *\n\ + * @var ${2:string}\n\ + */${3}\n\ +# Class Variable\n\ +snippet doc_v\n\ + /**\n\ + * ${3:undocumented class variable}\n\ + *\n\ + * @var ${4:string}\n\ + */\n\ + ${1:var} $${2};${5}\n\ +# Class\n\ +snippet doc_c\n\ + /**\n\ + * ${3:undocumented class}\n\ + *\n\ + * @package ${4:default}\n\ + * @subpackage ${5:default}\n\ + * @author ${6:`g:snips_author`}\n\ + */\n\ + ${1:}class ${2:}\n\ + {\n\ + ${7}\n\ + } // END $1class $2\n\ +# Constant Definition - post doc\n\ +snippet doc_dp\n\ + /**\n\ + * ${1:undocumented constant}\n\ + */${2}\n\ +# Constant Definition\n\ +snippet doc_d\n\ + /**\n\ + * ${3:undocumented constant}\n\ + */\n\ + define(${1}, ${2});${4}\n\ +# Function - post doc\n\ +snippet doc_fp\n\ + /**\n\ + * ${1:undocumented function}\n\ + *\n\ + * @return ${2:void}\n\ + * @author ${3:`g:snips_author`}\n\ + */${4}\n\ +# Function signature\n\ +snippet doc_s\n\ + /**\n\ + * ${4:undocumented function}\n\ + *\n\ + * @return ${5:void}\n\ + * @author ${6:`g:snips_author`}\n\ + */\n\ + ${1}function ${2}(${3});${7}\n\ +# Function\n\ +snippet doc_f\n\ + /**\n\ + * ${4:undocumented function}\n\ + *\n\ + * @return ${5:void}\n\ + * @author ${6:`g:snips_author`}\n\ + */\n\ + ${1}function ${2}(${3})\n\ + {${7}\n\ + }\n\ +# Header\n\ +snippet doc_h\n\ + /**\n\ + * ${1}\n\ + *\n\ + * @author ${2:`g:snips_author`}\n\ + * @version ${3:$Id$}\n\ + * @copyright ${4:$2}, `strftime('%d %B, %Y')`\n\ + * @package ${5:default}\n\ + */\n\ + \n\ +# Interface\n\ +snippet interface\n\ + /**\n\ + * ${2:undocumented class}\n\ + *\n\ + * @package ${3:default}\n\ + * @author ${4:`g:snips_author`}\n\ + */\n\ + interface ${1:$FILENAME}\n\ + {\n\ + ${5}\n\ + }\n\ +# class ...\n\ +snippet class\n\ + /**\n\ + * ${1}\n\ + */\n\ + class ${2:$FILENAME}\n\ + {\n\ + ${3}\n\ + /**\n\ + * ${4}\n\ + */\n\ + ${5:public} function ${6:__construct}(${7:argument})\n\ + {\n\ + ${8:// code...}\n\ + }\n\ + }\n\ +# define(...)\n\ +snippet def\n\ + define('${1}'${2});${3}\n\ +# defined(...)\n\ +snippet def?\n\ + ${1}defined('${2}')${3}\n\ +snippet wh\n\ + while (${1:/* condition */}) {\n\ + ${2:// code...}\n\ + }\n\ +# do ... while\n\ +snippet do\n\ + do {\n\ + ${2:// code... }\n\ + } while (${1:/* condition */});\n\ +snippet if\n\ + if (${1:/* condition */}) {\n\ + ${2:// code...}\n\ + }\n\ +snippet ifil\n\ + \n\ + ${2:}\n\ + \n\ +snippet ife\n\ + if (${1:/* condition */}) {\n\ + ${2:// code...}\n\ + } else {\n\ + ${3:// code...}\n\ + }\n\ + ${4}\n\ +snippet ifeil\n\ + \n\ + ${2:}\n\ + \n\ + ${3:}\n\ + \n\ + ${4}\n\ +snippet else\n\ + else {\n\ + ${1:// code...}\n\ + }\n\ +snippet elseif\n\ + elseif (${1:/* condition */}) {\n\ + ${2:// code...}\n\ + }\n\ +snippet switch\n\ + switch ($${1:variable}) {\n\ + case '${2:value}':\n\ + ${3:// code...}\n\ + break;\n\ + ${5}\n\ + default:\n\ + ${4:// code...}\n\ + break;\n\ + }\n\ +snippet case\n\ + case '${1:value}':\n\ + ${2:// code...}\n\ + break;${3}\n\ +snippet for\n\ + for ($${2:i} = 0; $$2 < ${1:count}; $$2${3:++}) {\n\ + ${4: // code...}\n\ + }\n\ +snippet foreach\n\ + foreach ($${1:variable} as $${2:value}) {\n\ + ${3:// code...}\n\ + }\n\ +snippet foreachil\n\ + \n\ + ${3:}\n\ + \n\ +snippet foreachk\n\ + foreach ($${1:variable} as $${2:key} => $${3:value}) {\n\ + ${4:// code...}\n\ + }\n\ +snippet foreachkil\n\ + $${3:value}): ?>\n\ + ${4:}\n\ + \n\ +# $... = array (...)\n\ +snippet array\n\ + $${1:arrayName} = array('${2}' => ${3});${4}\n\ +snippet try\n\ + try {\n\ + ${2}\n\ + } catch (${1:Exception} $e) {\n\ + }\n\ +# lambda with closure\n\ +snippet lambda\n\ + ${1:static }function (${2:args}) use (${3:&$x, $y /*put vars in scope (closure) */}) {\n\ + ${4}\n\ + };\n\ +# pre_dump();\n\ +snippet pd\n\ + echo '
'; var_dump(${1}); echo '
';\n\ +# pre_dump(); die();\n\ +snippet pdd\n\ + echo '
'; var_dump(${1}); echo '
'; die(${2:});\n\ +snippet vd\n\ + var_dump(${1});\n\ +snippet vdd\n\ + var_dump(${1}); die(${2:});\n\ +snippet http_redirect\n\ + header (\"HTTP/1.1 301 Moved Permanently\"); \n\ + header (\"Location: \".URL); \n\ + exit();\n\ +# Getters & Setters\n\ +snippet gs\n\ + /**\n\ + * Gets the value of ${1:foo}\n\ + *\n\ + * @return ${2:$1}\n\ + */\n\ + public function get${3:$2}()\n\ + {\n\ + return $this->${4:$1};\n\ + }\n\ +\n\ + /**\n\ + * Sets the value of $1\n\ + *\n\ + * @param $2 $$1 ${5:description}\n\ + *\n\ + * @return ${6:$FILENAME}\n\ + */\n\ + public function set$3(${7:$2 }$$1)\n\ + {\n\ + $this->$4 = $$1;\n\ + return $this;\n\ + }${8}\n\ +# anotation, get, and set, useful for doctrine\n\ +snippet ags\n\ + /**\n\ + * ${1:description}\n\ + * \n\ + * @${7}\n\ + */\n\ + ${2:protected} $${3:foo};\n\ +\n\ + public function get${4:$3}()\n\ + {\n\ + return $this->$3;\n\ + }\n\ +\n\ + public function set$4(${5:$4 }$${6:$3})\n\ + {\n\ + $this->$3 = $$6;\n\ + return $this;\n\ + }\n\ +snippet rett\n\ + return true;\n\ +snippet retf\n\ + return false;\n\ +"; +exports.scope = "php"; + +}); diff --git a/modules/backend/assets/vendor/ace/snippets/php.js b/modules/backend/assets/vendor/ace/snippets/php.js new file mode 100644 index 0000000..a99ab6e --- /dev/null +++ b/modules/backend/assets/vendor/ace/snippets/php.js @@ -0,0 +1,384 @@ +ace.define("ace/snippets/php",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet \n\ +# this one is for php5.4\n\ +snippet \n\ +snippet ns\n\ + namespace ${1:Foo\\Bar\\Baz};\n\ + ${2}\n\ +snippet use\n\ + use ${1:Foo\\Bar\\Baz};\n\ + ${2}\n\ +snippet c\n\ + ${1:abstract }class ${2:$FILENAME}\n\ + {\n\ + ${3}\n\ + }\n\ +snippet i\n\ + interface ${1:$FILENAME}\n\ + {\n\ + ${2}\n\ + }\n\ +snippet t.\n\ + $this->${1}\n\ +snippet f\n\ + function ${1:foo}(${2:array }${3:$bar})\n\ + {\n\ + ${4}\n\ + }\n\ +# method\n\ +snippet m\n\ + ${1:abstract }${2:protected}${3: static} function ${4:foo}(${5:array }${6:$bar})\n\ + {\n\ + ${7}\n\ + }\n\ +# setter method\n\ +snippet sm \n\ + /**\n\ + * Sets the value of ${1:foo}\n\ + *\n\ + * @param ${2:$1} $$1 ${3:description}\n\ + *\n\ + * @return ${4:$FILENAME}\n\ + */\n\ + ${5:public} function set${6:$2}(${7:$2 }$$1)\n\ + {\n\ + $this->${8:$1} = $$1;\n\ + return $this;\n\ + }${9}\n\ +# getter method\n\ +snippet gm\n\ + /**\n\ + * Gets the value of ${1:foo}\n\ + *\n\ + * @return ${2:$1}\n\ + */\n\ + ${3:public} function get${4:$2}()\n\ + {\n\ + return $this->${5:$1};\n\ + }${6}\n\ +#setter\n\ +snippet $s\n\ + ${1:$foo}->set${2:Bar}(${3});\n\ +#getter\n\ +snippet $g\n\ + ${1:$foo}->get${2:Bar}();\n\ +\n\ +# Tertiary conditional\n\ +snippet =?:\n\ + $${1:foo} = ${2:true} ? ${3:a} : ${4};\n\ +snippet ?:\n\ + ${1:true} ? ${2:a} : ${3}\n\ +\n\ +snippet C\n\ + $_COOKIE['${1:variable}']${2}\n\ +snippet E\n\ + $_ENV['${1:variable}']${2}\n\ +snippet F\n\ + $_FILES['${1:variable}']${2}\n\ +snippet G\n\ + $_GET['${1:variable}']${2}\n\ +snippet P\n\ + $_POST['${1:variable}']${2}\n\ +snippet R\n\ + $_REQUEST['${1:variable}']${2}\n\ +snippet S\n\ + $_SERVER['${1:variable}']${2}\n\ +snippet SS\n\ + $_SESSION['${1:variable}']${2}\n\ + \n\ +# the following are old ones\n\ +snippet inc\n\ + include '${1:file}';${2}\n\ +snippet inc1\n\ + include_once '${1:file}';${2}\n\ +snippet req\n\ + require '${1:file}';${2}\n\ +snippet req1\n\ + require_once '${1:file}';${2}\n\ +# Start Docblock\n\ +snippet /*\n\ + /**\n\ + * ${1}\n\ + */\n\ +# Class - post doc\n\ +snippet doc_cp\n\ + /**\n\ + * ${1:undocumented class}\n\ + *\n\ + * @package ${2:default}\n\ + * @subpackage ${3:default}\n\ + * @author ${4:`g:snips_author`}\n\ + */${5}\n\ +# Class Variable - post doc\n\ +snippet doc_vp\n\ + /**\n\ + * ${1:undocumented class variable}\n\ + *\n\ + * @var ${2:string}\n\ + */${3}\n\ +# Class Variable\n\ +snippet doc_v\n\ + /**\n\ + * ${3:undocumented class variable}\n\ + *\n\ + * @var ${4:string}\n\ + */\n\ + ${1:var} $${2};${5}\n\ +# Class\n\ +snippet doc_c\n\ + /**\n\ + * ${3:undocumented class}\n\ + *\n\ + * @package ${4:default}\n\ + * @subpackage ${5:default}\n\ + * @author ${6:`g:snips_author`}\n\ + */\n\ + ${1:}class ${2:}\n\ + {\n\ + ${7}\n\ + } // END $1class $2\n\ +# Constant Definition - post doc\n\ +snippet doc_dp\n\ + /**\n\ + * ${1:undocumented constant}\n\ + */${2}\n\ +# Constant Definition\n\ +snippet doc_d\n\ + /**\n\ + * ${3:undocumented constant}\n\ + */\n\ + define(${1}, ${2});${4}\n\ +# Function - post doc\n\ +snippet doc_fp\n\ + /**\n\ + * ${1:undocumented function}\n\ + *\n\ + * @return ${2:void}\n\ + * @author ${3:`g:snips_author`}\n\ + */${4}\n\ +# Function signature\n\ +snippet doc_s\n\ + /**\n\ + * ${4:undocumented function}\n\ + *\n\ + * @return ${5:void}\n\ + * @author ${6:`g:snips_author`}\n\ + */\n\ + ${1}function ${2}(${3});${7}\n\ +# Function\n\ +snippet doc_f\n\ + /**\n\ + * ${4:undocumented function}\n\ + *\n\ + * @return ${5:void}\n\ + * @author ${6:`g:snips_author`}\n\ + */\n\ + ${1}function ${2}(${3})\n\ + {${7}\n\ + }\n\ +# Header\n\ +snippet doc_h\n\ + /**\n\ + * ${1}\n\ + *\n\ + * @author ${2:`g:snips_author`}\n\ + * @version ${3:$Id$}\n\ + * @copyright ${4:$2}, `strftime('%d %B, %Y')`\n\ + * @package ${5:default}\n\ + */\n\ + \n\ +# Interface\n\ +snippet interface\n\ + /**\n\ + * ${2:undocumented class}\n\ + *\n\ + * @package ${3:default}\n\ + * @author ${4:`g:snips_author`}\n\ + */\n\ + interface ${1:$FILENAME}\n\ + {\n\ + ${5}\n\ + }\n\ +# class ...\n\ +snippet class\n\ + /**\n\ + * ${1}\n\ + */\n\ + class ${2:$FILENAME}\n\ + {\n\ + ${3}\n\ + /**\n\ + * ${4}\n\ + */\n\ + ${5:public} function ${6:__construct}(${7:argument})\n\ + {\n\ + ${8:// code...}\n\ + }\n\ + }\n\ +# define(...)\n\ +snippet def\n\ + define('${1}'${2});${3}\n\ +# defined(...)\n\ +snippet def?\n\ + ${1}defined('${2}')${3}\n\ +snippet wh\n\ + while (${1:/* condition */}) {\n\ + ${2:// code...}\n\ + }\n\ +# do ... while\n\ +snippet do\n\ + do {\n\ + ${2:// code... }\n\ + } while (${1:/* condition */});\n\ +snippet if\n\ + if (${1:/* condition */}) {\n\ + ${2:// code...}\n\ + }\n\ +snippet ifil\n\ + \n\ + ${2:}\n\ + \n\ +snippet ife\n\ + if (${1:/* condition */}) {\n\ + ${2:// code...}\n\ + } else {\n\ + ${3:// code...}\n\ + }\n\ + ${4}\n\ +snippet ifeil\n\ + \n\ + ${2:}\n\ + \n\ + ${3:}\n\ + \n\ + ${4}\n\ +snippet else\n\ + else {\n\ + ${1:// code...}\n\ + }\n\ +snippet elseif\n\ + elseif (${1:/* condition */}) {\n\ + ${2:// code...}\n\ + }\n\ +snippet switch\n\ + switch ($${1:variable}) {\n\ + case '${2:value}':\n\ + ${3:// code...}\n\ + break;\n\ + ${5}\n\ + default:\n\ + ${4:// code...}\n\ + break;\n\ + }\n\ +snippet case\n\ + case '${1:value}':\n\ + ${2:// code...}\n\ + break;${3}\n\ +snippet for\n\ + for ($${2:i} = 0; $$2 < ${1:count}; $$2${3:++}) {\n\ + ${4: // code...}\n\ + }\n\ +snippet foreach\n\ + foreach ($${1:variable} as $${2:value}) {\n\ + ${3:// code...}\n\ + }\n\ +snippet foreachil\n\ + \n\ + ${3:}\n\ + \n\ +snippet foreachk\n\ + foreach ($${1:variable} as $${2:key} => $${3:value}) {\n\ + ${4:// code...}\n\ + }\n\ +snippet foreachkil\n\ + $${3:value}): ?>\n\ + ${4:}\n\ + \n\ +# $... = array (...)\n\ +snippet array\n\ + $${1:arrayName} = array('${2}' => ${3});${4}\n\ +snippet try\n\ + try {\n\ + ${2}\n\ + } catch (${1:Exception} $e) {\n\ + }\n\ +# lambda with closure\n\ +snippet lambda\n\ + ${1:static }function (${2:args}) use (${3:&$x, $y /*put vars in scope (closure) */}) {\n\ + ${4}\n\ + };\n\ +# pre_dump();\n\ +snippet pd\n\ + echo '
'; var_dump(${1}); echo '
';\n\ +# pre_dump(); die();\n\ +snippet pdd\n\ + echo '
'; var_dump(${1}); echo '
'; die(${2:});\n\ +snippet vd\n\ + var_dump(${1});\n\ +snippet vdd\n\ + var_dump(${1}); die(${2:});\n\ +snippet http_redirect\n\ + header (\"HTTP/1.1 301 Moved Permanently\"); \n\ + header (\"Location: \".URL); \n\ + exit();\n\ +# Getters & Setters\n\ +snippet gs\n\ + /**\n\ + * Gets the value of ${1:foo}\n\ + *\n\ + * @return ${2:$1}\n\ + */\n\ + public function get${3:$2}()\n\ + {\n\ + return $this->${4:$1};\n\ + }\n\ +\n\ + /**\n\ + * Sets the value of $1\n\ + *\n\ + * @param $2 $$1 ${5:description}\n\ + *\n\ + * @return ${6:$FILENAME}\n\ + */\n\ + public function set$3(${7:$2 }$$1)\n\ + {\n\ + $this->$4 = $$1;\n\ + return $this;\n\ + }${8}\n\ +# anotation, get, and set, useful for doctrine\n\ +snippet ags\n\ + /**\n\ + * ${1:description}\n\ + * \n\ + * @${7}\n\ + */\n\ + ${2:protected} $${3:foo};\n\ +\n\ + public function get${4:$3}()\n\ + {\n\ + return $this->$3;\n\ + }\n\ +\n\ + public function set$4(${5:$4 }$${6:$3})\n\ + {\n\ + $this->$3 = $$6;\n\ + return $this;\n\ + }\n\ +snippet rett\n\ + return true;\n\ +snippet retf\n\ + return false;\n\ +"; +exports.scope = "php"; + +}); diff --git a/modules/backend/assets/vendor/ace/snippets/plain_text.js b/modules/backend/assets/vendor/ace/snippets/plain_text.js new file mode 100644 index 0000000..24223a6 --- /dev/null +++ b/modules/backend/assets/vendor/ace/snippets/plain_text.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/plain_text",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "plain_text"; + +}); diff --git a/modules/backend/assets/vendor/ace/snippets/sass.js b/modules/backend/assets/vendor/ace/snippets/sass.js new file mode 100644 index 0000000..b9adc9d --- /dev/null +++ b/modules/backend/assets/vendor/ace/snippets/sass.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/sass",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "sass"; + +}); diff --git a/modules/backend/assets/vendor/ace/snippets/scss.js b/modules/backend/assets/vendor/ace/snippets/scss.js new file mode 100644 index 0000000..fbd98f7 --- /dev/null +++ b/modules/backend/assets/vendor/ace/snippets/scss.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/scss",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "scss"; + +}); diff --git a/modules/backend/assets/vendor/ace/snippets/text.js b/modules/backend/assets/vendor/ace/snippets/text.js new file mode 100644 index 0000000..57b897b --- /dev/null +++ b/modules/backend/assets/vendor/ace/snippets/text.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/text",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "text"; + +}); diff --git a/modules/backend/assets/vendor/ace/snippets/twig.js b/modules/backend/assets/vendor/ace/snippets/twig.js new file mode 100644 index 0000000..ccc6073 --- /dev/null +++ b/modules/backend/assets/vendor/ace/snippets/twig.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/twig",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "twig"; + +}); diff --git a/modules/backend/assets/vendor/ace/snippets/yaml.js b/modules/backend/assets/vendor/ace/snippets/yaml.js new file mode 100644 index 0000000..1adceab --- /dev/null +++ b/modules/backend/assets/vendor/ace/snippets/yaml.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/yaml",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "yaml"; + +}); diff --git a/modules/backend/assets/vendor/ace/theme-ambiance.js b/modules/backend/assets/vendor/ace/theme-ambiance.js new file mode 100755 index 0000000..1e53ecd --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-ambiance.js @@ -0,0 +1,182 @@ +ace.define("ace/theme/ambiance",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-ambiance"; +exports.cssText = ".ace-ambiance .ace_gutter {\ +background-color: #3d3d3d;\ +background-image: -moz-linear-gradient(left, #3D3D3D, #333);\ +background-image: -ms-linear-gradient(left, #3D3D3D, #333);\ +background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#3D3D3D), to(#333));\ +background-image: -webkit-linear-gradient(left, #3D3D3D, #333);\ +background-image: -o-linear-gradient(left, #3D3D3D, #333);\ +background-image: linear-gradient(left, #3D3D3D, #333);\ +background-repeat: repeat-x;\ +border-right: 1px solid #4d4d4d;\ +text-shadow: 0px 1px 1px #4d4d4d;\ +color: #222;\ +}\ +.ace-ambiance .ace_gutter-layer {\ +background: repeat left top;\ +}\ +.ace-ambiance .ace_gutter-active-line {\ +background-color: #3F3F3F;\ +}\ +.ace-ambiance .ace_fold-widget {\ +text-align: center;\ +}\ +.ace-ambiance .ace_fold-widget:hover {\ +color: #777;\ +}\ +.ace-ambiance .ace_fold-widget.ace_start,\ +.ace-ambiance .ace_fold-widget.ace_end,\ +.ace-ambiance .ace_fold-widget.ace_closed{\ +background: none;\ +border: none;\ +box-shadow: none;\ +}\ +.ace-ambiance .ace_fold-widget.ace_start:after {\ +content: '▾'\ +}\ +.ace-ambiance .ace_fold-widget.ace_end:after {\ +content: '▴'\ +}\ +.ace-ambiance .ace_fold-widget.ace_closed:after {\ +content: '‣'\ +}\ +.ace-ambiance .ace_print-margin {\ +border-left: 1px dotted #2D2D2D;\ +right: 0;\ +background: #262626;\ +}\ +.ace-ambiance .ace_scroller {\ +-webkit-box-shadow: inset 0 0 10px black;\ +-moz-box-shadow: inset 0 0 10px black;\ +-o-box-shadow: inset 0 0 10px black;\ +box-shadow: inset 0 0 10px black;\ +}\ +.ace-ambiance {\ +color: #E6E1DC;\ +background-color: #202020;\ +}\ +.ace-ambiance .ace_cursor {\ +border-left: 1px solid #7991E8;\ +}\ +.ace-ambiance .ace_overwrite-cursors .ace_cursor {\ +border: 1px solid #FFE300;\ +background: #766B13;\ +}\ +.ace-ambiance.normal-mode .ace_cursor-layer {\ +z-index: 0;\ +}\ +.ace-ambiance .ace_marker-layer .ace_selection {\ +background: rgba(221, 240, 255, 0.20);\ +}\ +.ace-ambiance .ace_marker-layer .ace_selected-word {\ +border-radius: 4px;\ +border: 8px solid #3f475d;\ +box-shadow: 0 0 4px black;\ +}\ +.ace-ambiance .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174);\ +}\ +.ace-ambiance .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 255, 255, 0.25);\ +}\ +.ace-ambiance .ace_marker-layer .ace_active-line {\ +background: rgba(255, 255, 255, 0.031);\ +}\ +.ace-ambiance .ace_invisible {\ +color: #333;\ +}\ +.ace-ambiance .ace_paren {\ +color: #24C2C7;\ +}\ +.ace-ambiance .ace_keyword {\ +color: #cda869;\ +}\ +.ace-ambiance .ace_keyword.ace_operator {\ +color: #fa8d6a;\ +}\ +.ace-ambiance .ace_punctuation.ace_operator {\ +color: #fa8d6a;\ +}\ +.ace-ambiance .ace_identifier {\ +}\ +.ace-ambiance .ace-statement {\ +color: #cda869;\ +}\ +.ace-ambiance .ace_constant {\ +color: #CF7EA9;\ +}\ +.ace-ambiance .ace_constant.ace_language {\ +color: #CF7EA9;\ +}\ +.ace-ambiance .ace_constant.ace_library {\ +}\ +.ace-ambiance .ace_constant.ace_numeric {\ +color: #78CF8A;\ +}\ +.ace-ambiance .ace_invalid {\ +text-decoration: underline;\ +}\ +.ace-ambiance .ace_invalid.ace_illegal {\ +color:#F8F8F8;\ +background-color: rgba(86, 45, 86, 0.75);\ +}\ +.ace-ambiance .ace_invalid,\ +.ace-ambiance .ace_deprecated {\ +text-decoration: underline;\ +font-style: italic;\ +color: #D2A8A1;\ +}\ +.ace-ambiance .ace_support {\ +color: #9B859D;\ +}\ +.ace-ambiance .ace_support.ace_function {\ +color: #DAD085;\ +}\ +.ace-ambiance .ace_function.ace_buildin {\ +color: #9b859d;\ +}\ +.ace-ambiance .ace_string {\ +color: #8f9d6a;\ +}\ +.ace-ambiance .ace_string.ace_regexp {\ +color: #DAD085;\ +}\ +.ace-ambiance .ace_comment {\ +font-style: italic;\ +color: #555;\ +}\ +.ace-ambiance .ace_comment.ace_doc {\ +}\ +.ace-ambiance .ace_comment.ace_doc.ace_tag {\ +color: #666;\ +font-style: normal;\ +}\ +.ace-ambiance .ace_definition,\ +.ace-ambiance .ace_type {\ +color: #aac6e3;\ +}\ +.ace-ambiance .ace_variable {\ +color: #9999cc;\ +}\ +.ace-ambiance .ace_variable.ace_language {\ +color: #9b859d;\ +}\ +.ace-ambiance .ace_xml-pe {\ +color: #494949;\ +}\ +.ace-ambiance .ace_gutter-layer,\ +.ace-ambiance .ace_text-layer {\ +background-image: url(\"data:image/png;base64,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\");\ +}\ +.ace-ambiance .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); + +}); diff --git a/modules/backend/assets/vendor/ace/theme-chaos.js b/modules/backend/assets/vendor/ace/theme-chaos.js new file mode 100755 index 0000000..97ec7fb --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-chaos.js @@ -0,0 +1,156 @@ +ace.define("ace/theme/chaos",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-chaos"; +exports.cssText = ".ace-chaos .ace_gutter {\ +background: #141414;\ +color: #595959;\ +border-right: 1px solid #282828;\ +}\ +.ace-chaos .ace_gutter-cell.ace_warning {\ +background-image: none;\ +background: #FC0;\ +border-left: none;\ +padding-left: 0;\ +color: #000;\ +}\ +.ace-chaos .ace_gutter-cell.ace_error {\ +background-position: -6px center;\ +background-image: none;\ +background: #F10;\ +border-left: none;\ +padding-left: 0;\ +color: #000;\ +}\ +.ace-chaos .ace_print-margin {\ +border-left: 1px solid #555;\ +right: 0;\ +background: #1D1D1D;\ +}\ +.ace-chaos {\ +background-color: #161616;\ +color: #E6E1DC;\ +}\ +.ace-chaos .ace_cursor {\ +border-left: 2px solid #FFFFFF;\ +}\ +.ace-chaos .ace_cursor.ace_overwrite {\ +border-left: 0px;\ +border-bottom: 1px solid #FFFFFF;\ +}\ +.ace-chaos .ace_marker-layer .ace_selection {\ +background: #494836;\ +}\ +.ace-chaos .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174);\ +}\ +.ace-chaos .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #FCE94F;\ +}\ +.ace-chaos .ace_marker-layer .ace_active-line {\ +background: #333;\ +}\ +.ace-chaos .ace_gutter-active-line {\ +background-color: #222;\ +}\ +.ace-chaos .ace_invisible {\ +color: #404040;\ +}\ +.ace-chaos .ace_keyword {\ +color:#00698F;\ +}\ +.ace-chaos .ace_keyword.ace_operator {\ +color:#FF308F;\ +}\ +.ace-chaos .ace_constant {\ +color:#1EDAFB;\ +}\ +.ace-chaos .ace_constant.ace_language {\ +color:#FDC251;\ +}\ +.ace-chaos .ace_constant.ace_library {\ +color:#8DFF0A;\ +}\ +.ace-chaos .ace_constant.ace_numeric {\ +color:#58C554;\ +}\ +.ace-chaos .ace_invalid {\ +color:#FFFFFF;\ +background-color:#990000;\ +}\ +.ace-chaos .ace_invalid.ace_deprecated {\ +color:#FFFFFF;\ +background-color:#990000;\ +}\ +.ace-chaos .ace_support {\ +color: #999;\ +}\ +.ace-chaos .ace_support.ace_function {\ +color:#00AEEF;\ +}\ +.ace-chaos .ace_function {\ +color:#00AEEF;\ +}\ +.ace-chaos .ace_string {\ +color:#58C554;\ +}\ +.ace-chaos .ace_comment {\ +color:#555;\ +font-style:italic;\ +padding-bottom: 0px;\ +}\ +.ace-chaos .ace_variable {\ +color:#997744;\ +}\ +.ace-chaos .ace_meta.ace_tag {\ +color:#BE53E6;\ +}\ +.ace-chaos .ace_entity.ace_other.ace_attribute-name {\ +color:#FFFF89;\ +}\ +.ace-chaos .ace_markup.ace_underline {\ +text-decoration: underline;\ +}\ +.ace-chaos .ace_fold-widget {\ +text-align: center;\ +}\ +.ace-chaos .ace_fold-widget:hover {\ +color: #777;\ +}\ +.ace-chaos .ace_fold-widget.ace_start,\ +.ace-chaos .ace_fold-widget.ace_end,\ +.ace-chaos .ace_fold-widget.ace_closed{\ +background: none;\ +border: none;\ +box-shadow: none;\ +}\ +.ace-chaos .ace_fold-widget.ace_start:after {\ +content: '▾'\ +}\ +.ace-chaos .ace_fold-widget.ace_end:after {\ +content: '▴'\ +}\ +.ace-chaos .ace_fold-widget.ace_closed:after {\ +content: '‣'\ +}\ +.ace-chaos .ace_indent-guide {\ +border-right:1px dotted #333;\ +margin-right:-1px;\ +}\ +.ace-chaos .ace_fold { \ +background: #222; \ +border-radius: 3px; \ +color: #7AF; \ +border: none; \ +}\ +.ace-chaos .ace_fold:hover {\ +background: #CCC; \ +color: #000;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); + +}); diff --git a/modules/backend/assets/vendor/ace/theme-chrome.js b/modules/backend/assets/vendor/ace/theme-chrome.js new file mode 100755 index 0000000..83742aa --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-chrome.js @@ -0,0 +1,128 @@ +ace.define("ace/theme/chrome",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-chrome"; +exports.cssText = ".ace-chrome .ace_gutter {\ +background: #ebebeb;\ +color: #333;\ +overflow : hidden;\ +}\ +.ace-chrome .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-chrome {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-chrome .ace_cursor {\ +color: black;\ +}\ +.ace-chrome .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-chrome .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-chrome .ace_constant.ace_language {\ +color: rgb(88, 92, 246);\ +}\ +.ace-chrome .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-chrome .ace_invalid {\ +background-color: rgb(153, 0, 0);\ +color: white;\ +}\ +.ace-chrome .ace_fold {\ +}\ +.ace-chrome .ace_support.ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-chrome .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-chrome .ace_support.ace_type,\ +.ace-chrome .ace_support.ace_class\ +.ace-chrome .ace_support.ace_other {\ +color: rgb(109, 121, 222);\ +}\ +.ace-chrome .ace_variable.ace_parameter {\ +font-style:italic;\ +color:#FD971F;\ +}\ +.ace-chrome .ace_keyword.ace_operator {\ +color: rgb(104, 118, 135);\ +}\ +.ace-chrome .ace_comment {\ +color: #236e24;\ +}\ +.ace-chrome .ace_comment.ace_doc {\ +color: #236e24;\ +}\ +.ace-chrome .ace_comment.ace_doc.ace_tag {\ +color: #236e24;\ +}\ +.ace-chrome .ace_constant.ace_numeric {\ +color: rgb(0, 0, 205);\ +}\ +.ace-chrome .ace_variable {\ +color: rgb(49, 132, 149);\ +}\ +.ace-chrome .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-chrome .ace_entity.ace_name.ace_function {\ +color: #0000A2;\ +}\ +.ace-chrome .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-chrome .ace_list {\ +color:rgb(185, 6, 144);\ +}\ +.ace-chrome .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-chrome .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-chrome .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-chrome .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-chrome .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-chrome .ace_gutter-active-line {\ +background-color : #dcdcdc;\ +}\ +.ace-chrome .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-chrome .ace_storage,\ +.ace-chrome .ace_keyword,\ +.ace-chrome .ace_meta.ace_tag {\ +color: rgb(147, 15, 128);\ +}\ +.ace-chrome .ace_string.ace_regex {\ +color: rgb(255, 0, 0)\ +}\ +.ace-chrome .ace_string {\ +color: #1A1AA6;\ +}\ +.ace-chrome .ace_entity.ace_other.ace_attribute-name {\ +color: #994409;\ +}\ +.ace-chrome .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-clouds.js b/modules/backend/assets/vendor/ace/theme-clouds.js new file mode 100755 index 0000000..83d0d14 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-clouds.js @@ -0,0 +1,95 @@ +ace.define("ace/theme/clouds",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-clouds"; +exports.cssText = ".ace-clouds .ace_gutter {\ +background: #ebebeb;\ +color: #333\ +}\ +.ace-clouds .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-clouds {\ +background-color: #FFFFFF;\ +color: #000000\ +}\ +.ace-clouds .ace_cursor {\ +color: #000000\ +}\ +.ace-clouds .ace_marker-layer .ace_selection {\ +background: #BDD5FC\ +}\ +.ace-clouds.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #FFFFFF;\ +}\ +.ace-clouds .ace_marker-layer .ace_step {\ +background: rgb(255, 255, 0)\ +}\ +.ace-clouds .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #BFBFBF\ +}\ +.ace-clouds .ace_marker-layer .ace_active-line {\ +background: #FFFBD1\ +}\ +.ace-clouds .ace_gutter-active-line {\ +background-color : #dcdcdc\ +}\ +.ace-clouds .ace_marker-layer .ace_selected-word {\ +border: 1px solid #BDD5FC\ +}\ +.ace-clouds .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-clouds .ace_keyword,\ +.ace-clouds .ace_meta,\ +.ace-clouds .ace_support.ace_constant.ace_property-value {\ +color: #AF956F\ +}\ +.ace-clouds .ace_keyword.ace_operator {\ +color: #484848\ +}\ +.ace-clouds .ace_keyword.ace_other.ace_unit {\ +color: #96DC5F\ +}\ +.ace-clouds .ace_constant.ace_language {\ +color: #39946A\ +}\ +.ace-clouds .ace_constant.ace_numeric {\ +color: #46A609\ +}\ +.ace-clouds .ace_constant.ace_character.ace_entity {\ +color: #BF78CC\ +}\ +.ace-clouds .ace_invalid {\ +background-color: #FF002A\ +}\ +.ace-clouds .ace_fold {\ +background-color: #AF956F;\ +border-color: #000000\ +}\ +.ace-clouds .ace_storage,\ +.ace-clouds .ace_support.ace_class,\ +.ace-clouds .ace_support.ace_function,\ +.ace-clouds .ace_support.ace_other,\ +.ace-clouds .ace_support.ace_type {\ +color: #C52727\ +}\ +.ace-clouds .ace_string {\ +color: #5D90CD\ +}\ +.ace-clouds .ace_comment {\ +color: #BCC8BA\ +}\ +.ace-clouds .ace_entity.ace_name.ace_tag,\ +.ace-clouds .ace_entity.ace_other.ace_attribute-name {\ +color: #606060\ +}\ +.ace-clouds .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-clouds_midnight.js b/modules/backend/assets/vendor/ace/theme-clouds_midnight.js new file mode 100755 index 0000000..275e9f2 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-clouds_midnight.js @@ -0,0 +1,96 @@ +ace.define("ace/theme/clouds_midnight",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-clouds-midnight"; +exports.cssText = ".ace-clouds-midnight .ace_gutter {\ +background: #232323;\ +color: #929292\ +}\ +.ace-clouds-midnight .ace_print-margin {\ +width: 1px;\ +background: #232323\ +}\ +.ace-clouds-midnight {\ +background-color: #191919;\ +color: #929292\ +}\ +.ace-clouds-midnight .ace_cursor {\ +color: #7DA5DC\ +}\ +.ace-clouds-midnight .ace_marker-layer .ace_selection {\ +background: #000000\ +}\ +.ace-clouds-midnight.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #191919;\ +}\ +.ace-clouds-midnight .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-clouds-midnight .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #BFBFBF\ +}\ +.ace-clouds-midnight .ace_marker-layer .ace_active-line {\ +background: rgba(215, 215, 215, 0.031)\ +}\ +.ace-clouds-midnight .ace_gutter-active-line {\ +background-color: rgba(215, 215, 215, 0.031)\ +}\ +.ace-clouds-midnight .ace_marker-layer .ace_selected-word {\ +border: 1px solid #000000\ +}\ +.ace-clouds-midnight .ace_invisible {\ +color: #666\ +}\ +.ace-clouds-midnight .ace_keyword,\ +.ace-clouds-midnight .ace_meta,\ +.ace-clouds-midnight .ace_support.ace_constant.ace_property-value {\ +color: #927C5D\ +}\ +.ace-clouds-midnight .ace_keyword.ace_operator {\ +color: #4B4B4B\ +}\ +.ace-clouds-midnight .ace_keyword.ace_other.ace_unit {\ +color: #366F1A\ +}\ +.ace-clouds-midnight .ace_constant.ace_language {\ +color: #39946A\ +}\ +.ace-clouds-midnight .ace_constant.ace_numeric {\ +color: #46A609\ +}\ +.ace-clouds-midnight .ace_constant.ace_character.ace_entity {\ +color: #A165AC\ +}\ +.ace-clouds-midnight .ace_invalid {\ +color: #FFFFFF;\ +background-color: #E92E2E\ +}\ +.ace-clouds-midnight .ace_fold {\ +background-color: #927C5D;\ +border-color: #929292\ +}\ +.ace-clouds-midnight .ace_storage,\ +.ace-clouds-midnight .ace_support.ace_class,\ +.ace-clouds-midnight .ace_support.ace_function,\ +.ace-clouds-midnight .ace_support.ace_other,\ +.ace-clouds-midnight .ace_support.ace_type {\ +color: #E92E2E\ +}\ +.ace-clouds-midnight .ace_string {\ +color: #5D90CD\ +}\ +.ace-clouds-midnight .ace_comment {\ +color: #3C403B\ +}\ +.ace-clouds-midnight .ace_entity.ace_name.ace_tag,\ +.ace-clouds-midnight .ace_entity.ace_other.ace_attribute-name {\ +color: #606060\ +}\ +.ace-clouds-midnight .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-cobalt.js b/modules/backend/assets/vendor/ace/theme-cobalt.js new file mode 100755 index 0000000..c5b6f26 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-cobalt.js @@ -0,0 +1,113 @@ +ace.define("ace/theme/cobalt",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-cobalt"; +exports.cssText = ".ace-cobalt .ace_gutter {\ +background: #011e3a;\ +color: rgb(128,145,160)\ +}\ +.ace-cobalt .ace_print-margin {\ +width: 1px;\ +background: #555555\ +}\ +.ace-cobalt {\ +background-color: #002240;\ +color: #FFFFFF\ +}\ +.ace-cobalt .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-cobalt .ace_marker-layer .ace_selection {\ +background: rgba(179, 101, 57, 0.75)\ +}\ +.ace-cobalt.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #002240;\ +}\ +.ace-cobalt .ace_marker-layer .ace_step {\ +background: rgb(127, 111, 19)\ +}\ +.ace-cobalt .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 255, 255, 0.15)\ +}\ +.ace-cobalt .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.35)\ +}\ +.ace-cobalt .ace_gutter-active-line {\ +background-color: rgba(0, 0, 0, 0.35)\ +}\ +.ace-cobalt .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(179, 101, 57, 0.75)\ +}\ +.ace-cobalt .ace_invisible {\ +color: rgba(255, 255, 255, 0.15)\ +}\ +.ace-cobalt .ace_keyword,\ +.ace-cobalt .ace_meta {\ +color: #FF9D00\ +}\ +.ace-cobalt .ace_constant,\ +.ace-cobalt .ace_constant.ace_character,\ +.ace-cobalt .ace_constant.ace_character.ace_escape,\ +.ace-cobalt .ace_constant.ace_other {\ +color: #FF628C\ +}\ +.ace-cobalt .ace_invalid {\ +color: #F8F8F8;\ +background-color: #800F00\ +}\ +.ace-cobalt .ace_support {\ +color: #80FFBB\ +}\ +.ace-cobalt .ace_support.ace_constant {\ +color: #EB939A\ +}\ +.ace-cobalt .ace_fold {\ +background-color: #FF9D00;\ +border-color: #FFFFFF\ +}\ +.ace-cobalt .ace_support.ace_function {\ +color: #FFB054\ +}\ +.ace-cobalt .ace_storage {\ +color: #FFEE80\ +}\ +.ace-cobalt .ace_entity {\ +color: #FFDD00\ +}\ +.ace-cobalt .ace_string {\ +color: #3AD900\ +}\ +.ace-cobalt .ace_string.ace_regexp {\ +color: #80FFC2\ +}\ +.ace-cobalt .ace_comment {\ +font-style: italic;\ +color: #0088FF\ +}\ +.ace-cobalt .ace_heading,\ +.ace-cobalt .ace_markup.ace_heading {\ +color: #C8E4FD;\ +background-color: #001221\ +}\ +.ace-cobalt .ace_list,\ +.ace-cobalt .ace_markup.ace_list {\ +background-color: #130D26\ +}\ +.ace-cobalt .ace_variable {\ +color: #CCCCCC\ +}\ +.ace-cobalt .ace_variable.ace_language {\ +color: #FF80E1\ +}\ +.ace-cobalt .ace_meta.ace_tag {\ +color: #9EFFFF\ +}\ +.ace-cobalt .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHCLSvkPAAP3AgSDTRd4AAAAAElFTkSuQmCC) right repeat-y\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-crimson_editor.js b/modules/backend/assets/vendor/ace/theme-crimson_editor.js new file mode 100755 index 0000000..a188552 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-crimson_editor.js @@ -0,0 +1,118 @@ +ace.define("ace/theme/crimson_editor",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +exports.isDark = false; +exports.cssText = ".ace-crimson-editor .ace_gutter {\ +background: #ebebeb;\ +color: #333;\ +overflow : hidden;\ +}\ +.ace-crimson-editor .ace_gutter-layer {\ +width: 100%;\ +text-align: right;\ +}\ +.ace-crimson-editor .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-crimson-editor {\ +background-color: #FFFFFF;\ +color: rgb(64, 64, 64);\ +}\ +.ace-crimson-editor .ace_cursor {\ +color: black;\ +}\ +.ace-crimson-editor .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-crimson-editor .ace_identifier {\ +color: black;\ +}\ +.ace-crimson-editor .ace_keyword {\ +color: blue;\ +}\ +.ace-crimson-editor .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-crimson-editor .ace_constant.ace_language {\ +color: rgb(255, 156, 0);\ +}\ +.ace-crimson-editor .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-crimson-editor .ace_invalid {\ +text-decoration: line-through;\ +color: rgb(224, 0, 0);\ +}\ +.ace-crimson-editor .ace_fold {\ +}\ +.ace-crimson-editor .ace_support.ace_function {\ +color: rgb(192, 0, 0);\ +}\ +.ace-crimson-editor .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-crimson-editor .ace_support.ace_type,\ +.ace-crimson-editor .ace_support.ace_class {\ +color: rgb(109, 121, 222);\ +}\ +.ace-crimson-editor .ace_keyword.ace_operator {\ +color: rgb(49, 132, 149);\ +}\ +.ace-crimson-editor .ace_string {\ +color: rgb(128, 0, 128);\ +}\ +.ace-crimson-editor .ace_comment {\ +color: rgb(76, 136, 107);\ +}\ +.ace-crimson-editor .ace_comment.ace_doc {\ +color: rgb(0, 102, 255);\ +}\ +.ace-crimson-editor .ace_comment.ace_doc.ace_tag {\ +color: rgb(128, 159, 191);\ +}\ +.ace-crimson-editor .ace_constant.ace_numeric {\ +color: rgb(0, 0, 64);\ +}\ +.ace-crimson-editor .ace_variable {\ +color: rgb(0, 64, 128);\ +}\ +.ace-crimson-editor .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_active-line {\ +background: rgb(232, 242, 254);\ +}\ +.ace-crimson-editor .ace_gutter-active-line {\ +background-color : #dcdcdc;\ +}\ +.ace-crimson-editor .ace_meta.ace_tag {\ +color:rgb(28, 2, 255);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-crimson-editor .ace_string.ace_regex {\ +color: rgb(192, 0, 192);\ +}\ +.ace-crimson-editor .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}"; + +exports.cssClass = "ace-crimson-editor"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-dawn.js b/modules/backend/assets/vendor/ace/theme-dawn.js new file mode 100755 index 0000000..f3c15c9 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-dawn.js @@ -0,0 +1,108 @@ +ace.define("ace/theme/dawn",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-dawn"; +exports.cssText = ".ace-dawn .ace_gutter {\ +background: #ebebeb;\ +color: #333\ +}\ +.ace-dawn .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-dawn {\ +background-color: #F9F9F9;\ +color: #080808\ +}\ +.ace-dawn .ace_cursor {\ +color: #000000\ +}\ +.ace-dawn .ace_marker-layer .ace_selection {\ +background: rgba(39, 95, 255, 0.30)\ +}\ +.ace-dawn.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #F9F9F9;\ +}\ +.ace-dawn .ace_marker-layer .ace_step {\ +background: rgb(255, 255, 0)\ +}\ +.ace-dawn .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(75, 75, 126, 0.50)\ +}\ +.ace-dawn .ace_marker-layer .ace_active-line {\ +background: rgba(36, 99, 180, 0.12)\ +}\ +.ace-dawn .ace_gutter-active-line {\ +background-color : #dcdcdc\ +}\ +.ace-dawn .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(39, 95, 255, 0.30)\ +}\ +.ace-dawn .ace_invisible {\ +color: rgba(75, 75, 126, 0.50)\ +}\ +.ace-dawn .ace_keyword,\ +.ace-dawn .ace_meta {\ +color: #794938\ +}\ +.ace-dawn .ace_constant,\ +.ace-dawn .ace_constant.ace_character,\ +.ace-dawn .ace_constant.ace_character.ace_escape,\ +.ace-dawn .ace_constant.ace_other {\ +color: #811F24\ +}\ +.ace-dawn .ace_invalid.ace_illegal {\ +text-decoration: underline;\ +font-style: italic;\ +color: #F8F8F8;\ +background-color: #B52A1D\ +}\ +.ace-dawn .ace_invalid.ace_deprecated {\ +text-decoration: underline;\ +font-style: italic;\ +color: #B52A1D\ +}\ +.ace-dawn .ace_support {\ +color: #691C97\ +}\ +.ace-dawn .ace_support.ace_constant {\ +color: #B4371F\ +}\ +.ace-dawn .ace_fold {\ +background-color: #794938;\ +border-color: #080808\ +}\ +.ace-dawn .ace_list,\ +.ace-dawn .ace_markup.ace_list,\ +.ace-dawn .ace_support.ace_function {\ +color: #693A17\ +}\ +.ace-dawn .ace_storage {\ +font-style: italic;\ +color: #A71D5D\ +}\ +.ace-dawn .ace_string {\ +color: #0B6125\ +}\ +.ace-dawn .ace_string.ace_regexp {\ +color: #CF5628\ +}\ +.ace-dawn .ace_comment {\ +font-style: italic;\ +color: #5A525F\ +}\ +.ace-dawn .ace_heading,\ +.ace-dawn .ace_markup.ace_heading {\ +color: #19356D\ +}\ +.ace-dawn .ace_variable {\ +color: #234A97\ +}\ +.ace-dawn .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-dreamweaver.js b/modules/backend/assets/vendor/ace/theme-dreamweaver.js new file mode 100755 index 0000000..632b1ea --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-dreamweaver.js @@ -0,0 +1,141 @@ +ace.define("ace/theme/dreamweaver",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +exports.isDark = false; +exports.cssClass = "ace-dreamweaver"; +exports.cssText = ".ace-dreamweaver .ace_gutter {\ +background: #e8e8e8;\ +color: #333;\ +}\ +.ace-dreamweaver .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-dreamweaver {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-dreamweaver .ace_fold {\ +background-color: #757AD8;\ +}\ +.ace-dreamweaver .ace_cursor {\ +color: black;\ +}\ +.ace-dreamweaver .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-dreamweaver .ace_storage,\ +.ace-dreamweaver .ace_keyword {\ +color: blue;\ +}\ +.ace-dreamweaver .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-dreamweaver .ace_constant.ace_language {\ +color: rgb(88, 92, 246);\ +}\ +.ace-dreamweaver .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-dreamweaver .ace_invalid {\ +background-color: rgb(153, 0, 0);\ +color: white;\ +}\ +.ace-dreamweaver .ace_support.ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-dreamweaver .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-dreamweaver .ace_support.ace_type,\ +.ace-dreamweaver .ace_support.ace_class {\ +color: #009;\ +}\ +.ace-dreamweaver .ace_support.ace_php_tag {\ +color: #f00;\ +}\ +.ace-dreamweaver .ace_keyword.ace_operator {\ +color: rgb(104, 118, 135);\ +}\ +.ace-dreamweaver .ace_string {\ +color: #00F;\ +}\ +.ace-dreamweaver .ace_comment {\ +color: rgb(76, 136, 107);\ +}\ +.ace-dreamweaver .ace_comment.ace_doc {\ +color: rgb(0, 102, 255);\ +}\ +.ace-dreamweaver .ace_comment.ace_doc.ace_tag {\ +color: rgb(128, 159, 191);\ +}\ +.ace-dreamweaver .ace_constant.ace_numeric {\ +color: rgb(0, 0, 205);\ +}\ +.ace-dreamweaver .ace_variable {\ +color: #06F\ +}\ +.ace-dreamweaver .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-dreamweaver .ace_entity.ace_name.ace_function {\ +color: #00F;\ +}\ +.ace-dreamweaver .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-dreamweaver .ace_list {\ +color:rgb(185, 6, 144);\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-dreamweaver .ace_gutter-active-line {\ +background-color : #DCDCDC;\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-dreamweaver .ace_meta.ace_tag {\ +color:#009;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_anchor {\ +color:#060;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_form {\ +color:#F90;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_image {\ +color:#909;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_script {\ +color:#900;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_style {\ +color:#909;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_table {\ +color:#099;\ +}\ +.ace-dreamweaver .ace_string.ace_regex {\ +color: rgb(255, 0, 0)\ +}\ +.ace-dreamweaver .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-eclipse.js b/modules/backend/assets/vendor/ace/theme-eclipse.js new file mode 100755 index 0000000..63aa334 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-eclipse.js @@ -0,0 +1,98 @@ +ace.define("ace/theme/eclipse",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +exports.isDark = false; +exports.cssText = ".ace-eclipse .ace_gutter {\ +background: #ebebeb;\ +border-right: 1px solid rgb(159, 159, 159);\ +color: rgb(136, 136, 136);\ +}\ +.ace-eclipse .ace_print-margin {\ +width: 1px;\ +background: #ebebeb;\ +}\ +.ace-eclipse {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-eclipse .ace_fold {\ +background-color: rgb(60, 76, 114);\ +}\ +.ace-eclipse .ace_cursor {\ +color: black;\ +}\ +.ace-eclipse .ace_storage,\ +.ace-eclipse .ace_keyword,\ +.ace-eclipse .ace_variable {\ +color: rgb(127, 0, 85);\ +}\ +.ace-eclipse .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-eclipse .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-eclipse .ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-eclipse .ace_string {\ +color: rgb(42, 0, 255);\ +}\ +.ace-eclipse .ace_comment {\ +color: rgb(113, 150, 130);\ +}\ +.ace-eclipse .ace_comment.ace_doc {\ +color: rgb(63, 95, 191);\ +}\ +.ace-eclipse .ace_comment.ace_doc.ace_tag {\ +color: rgb(127, 159, 191);\ +}\ +.ace-eclipse .ace_constant.ace_numeric {\ +color: darkblue;\ +}\ +.ace-eclipse .ace_tag {\ +color: rgb(25, 118, 116);\ +}\ +.ace-eclipse .ace_type {\ +color: rgb(127, 0, 127);\ +}\ +.ace-eclipse .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-eclipse .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-eclipse .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-eclipse .ace_meta.ace_tag {\ +color:rgb(25, 118, 116);\ +}\ +.ace-eclipse .ace_invisible {\ +color: #ddd;\ +}\ +.ace-eclipse .ace_entity.ace_other.ace_attribute-name {\ +color:rgb(127, 0, 127);\ +}\ +.ace-eclipse .ace_marker-layer .ace_step {\ +background: rgb(255, 255, 0);\ +}\ +.ace-eclipse .ace_active-line {\ +background: rgb(232, 242, 254);\ +}\ +.ace-eclipse .ace_gutter-active-line {\ +background-color : #DADADA;\ +}\ +.ace-eclipse .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgb(181, 213, 255);\ +}\ +.ace-eclipse .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}"; + +exports.cssClass = "ace-eclipse"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-github.js b/modules/backend/assets/vendor/ace/theme-github.js new file mode 100755 index 0000000..d19512c --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-github.js @@ -0,0 +1,103 @@ +ace.define("ace/theme/github",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-github"; +exports.cssText = "\ +.ace-github .ace_gutter {\ +background: #e8e8e8;\ +color: #AAA;\ +}\ +.ace-github {\ +background: #fff;\ +color: #000;\ +}\ +.ace-github .ace_keyword {\ +font-weight: bold;\ +}\ +.ace-github .ace_string {\ +color: #D14;\ +}\ +.ace-github .ace_variable.ace_class {\ +color: teal;\ +}\ +.ace-github .ace_constant.ace_numeric {\ +color: #099;\ +}\ +.ace-github .ace_constant.ace_buildin {\ +color: #0086B3;\ +}\ +.ace-github .ace_support.ace_function {\ +color: #0086B3;\ +}\ +.ace-github .ace_comment {\ +color: #998;\ +font-style: italic;\ +}\ +.ace-github .ace_variable.ace_language {\ +color: #0086B3;\ +}\ +.ace-github .ace_paren {\ +font-weight: bold;\ +}\ +.ace-github .ace_boolean {\ +font-weight: bold;\ +}\ +.ace-github .ace_string.ace_regexp {\ +color: #009926;\ +font-weight: normal;\ +}\ +.ace-github .ace_variable.ace_instance {\ +color: teal;\ +}\ +.ace-github .ace_constant.ace_language {\ +font-weight: bold;\ +}\ +.ace-github .ace_cursor {\ +color: black;\ +}\ +.ace-github.ace_focus .ace_marker-layer .ace_active-line {\ +background: rgb(255, 255, 204);\ +}\ +.ace-github .ace_marker-layer .ace_active-line {\ +background: rgb(245, 245, 245);\ +}\ +.ace-github .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-github.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px white;\ +}\ +.ace-github.ace_nobold .ace_line > span {\ +font-weight: normal !important;\ +}\ +.ace-github .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-github .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-github .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-github .ace_gutter-active-line {\ +background-color : rgba(0, 0, 0, 0.07);\ +}\ +.ace-github .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-github .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-github .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-github .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}"; + + var dom = require("../lib/dom"); + dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-idle_fingers.js b/modules/backend/assets/vendor/ace/theme-idle_fingers.js new file mode 100755 index 0000000..7fcf1cb --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-idle_fingers.js @@ -0,0 +1,96 @@ +ace.define("ace/theme/idle_fingers",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-idle-fingers"; +exports.cssText = ".ace-idle-fingers .ace_gutter {\ +background: #3b3b3b;\ +color: rgb(153,153,153)\ +}\ +.ace-idle-fingers .ace_print-margin {\ +width: 1px;\ +background: #3b3b3b\ +}\ +.ace-idle-fingers {\ +background-color: #323232;\ +color: #FFFFFF\ +}\ +.ace-idle-fingers .ace_cursor {\ +color: #91FF00\ +}\ +.ace-idle-fingers .ace_marker-layer .ace_selection {\ +background: rgba(90, 100, 126, 0.88)\ +}\ +.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #323232;\ +}\ +.ace-idle-fingers .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-idle-fingers .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #404040\ +}\ +.ace-idle-fingers .ace_marker-layer .ace_active-line {\ +background: #353637\ +}\ +.ace-idle-fingers .ace_gutter-active-line {\ +background-color: #353637\ +}\ +.ace-idle-fingers .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(90, 100, 126, 0.88)\ +}\ +.ace-idle-fingers .ace_invisible {\ +color: #404040\ +}\ +.ace-idle-fingers .ace_keyword,\ +.ace-idle-fingers .ace_meta {\ +color: #CC7833\ +}\ +.ace-idle-fingers .ace_constant,\ +.ace-idle-fingers .ace_constant.ace_character,\ +.ace-idle-fingers .ace_constant.ace_character.ace_escape,\ +.ace-idle-fingers .ace_constant.ace_other,\ +.ace-idle-fingers .ace_support.ace_constant {\ +color: #6C99BB\ +}\ +.ace-idle-fingers .ace_invalid {\ +color: #FFFFFF;\ +background-color: #FF0000\ +}\ +.ace-idle-fingers .ace_fold {\ +background-color: #CC7833;\ +border-color: #FFFFFF\ +}\ +.ace-idle-fingers .ace_support.ace_function {\ +color: #B83426\ +}\ +.ace-idle-fingers .ace_variable.ace_parameter {\ +font-style: italic\ +}\ +.ace-idle-fingers .ace_string {\ +color: #A5C261\ +}\ +.ace-idle-fingers .ace_string.ace_regexp {\ +color: #CCCC33\ +}\ +.ace-idle-fingers .ace_comment {\ +font-style: italic;\ +color: #BC9458\ +}\ +.ace-idle-fingers .ace_meta.ace_tag {\ +color: #FFE5BB\ +}\ +.ace-idle-fingers .ace_entity.ace_name {\ +color: #FFC66D\ +}\ +.ace-idle-fingers .ace_collab.ace_user1 {\ +color: #323232;\ +background-color: #FFF980\ +}\ +.ace-idle-fingers .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjLyZYiPj/8PAAreAwAI1+g0AAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-iplastic.js b/modules/backend/assets/vendor/ace/theme-iplastic.js new file mode 100755 index 0000000..593aa00 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-iplastic.js @@ -0,0 +1,121 @@ +ace.define("ace/theme/iplastic",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-iplastic"; +exports.cssText = ".ace-iplastic .ace_gutter {\ +background: #dddddd;\ +color: #666666\ +}\ +.ace-iplastic .ace_print-margin {\ +width: 1px;\ +background: #bbbbbb\ +}\ +.ace-iplastic {\ +background-color: #eeeeee;\ +color: #333333\ +}\ +.ace-iplastic .ace_cursor {\ +color: #333\ +}\ +.ace-iplastic .ace_marker-layer .ace_selection {\ +background: #BAD6FD;\ +}\ +.ace-iplastic.ace_multiselect .ace_selection.ace_start {\ +border-radius: 4px\ +}\ +.ace-iplastic .ace_marker-layer .ace_step {\ +background: #444444\ +}\ +.ace-iplastic .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #49483E;\ +background: #FFF799\ +}\ +.ace-iplastic .ace_marker-layer .ace_active-line {\ +background: #e5e5e5\ +}\ +.ace-iplastic .ace_gutter-active-line {\ +background-color: #eeeeee\ +}\ +.ace-iplastic .ace_marker-layer .ace_selected-word {\ +border: 1px solid #555555;\ +border-radius:4px\ +}\ +.ace-iplastic .ace_invisible {\ +color: #999999\ +}\ +.ace-iplastic .ace_entity.ace_name.ace_tag,\ +.ace-iplastic .ace_keyword,\ +.ace-iplastic .ace_meta.ace_tag,\ +.ace-iplastic .ace_storage {\ +color: #0000FF\ +}\ +.ace-iplastic .ace_punctuation,\ +.ace-iplastic .ace_punctuation.ace_tag {\ +color: #000\ +}\ +.ace-iplastic .ace_constant {\ +color: #333333;\ +font-weight: 700\ +}\ +.ace-iplastic .ace_constant.ace_character,\ +.ace-iplastic .ace_constant.ace_language,\ +.ace-iplastic .ace_constant.ace_numeric,\ +.ace-iplastic .ace_constant.ace_other {\ +color: #0066FF;\ +font-weight: 700\ +}\ +.ace-iplastic .ace_constant.ace_numeric{\ +font-weight: 100\ +}\ +.ace-iplastic .ace_invalid {\ +color: #F8F8F0;\ +background-color: #F92672\ +}\ +.ace-iplastic .ace_invalid.ace_deprecated {\ +color: #F8F8F0;\ +background-color: #AE81FF\ +}\ +.ace-iplastic .ace_support.ace_constant,\ +.ace-iplastic .ace_support.ace_function {\ +color: #333333;\ +font-weight: 700\ +}\ +.ace-iplastic .ace_fold {\ +background-color: #464646;\ +border-color: #F8F8F2\ +}\ +.ace-iplastic .ace_storage.ace_type,\ +.ace-iplastic .ace_support.ace_class,\ +.ace-iplastic .ace_support.ace_type {\ +color: #3333fc;\ +font-weight: 700\ +}\ +.ace-iplastic .ace_entity.ace_name.ace_function,\ +.ace-iplastic .ace_entity.ace_other,\ +.ace-iplastic .ace_entity.ace_other.ace_attribute-name,\ +.ace-iplastic .ace_variable {\ +color: #3366cc;\ +font-style: italic\ +}\ +.ace-iplastic .ace_variable.ace_parameter {\ +font-style: italic;\ +color: #2469E0\ +}\ +.ace-iplastic .ace_string {\ +color: #a55f03\ +}\ +.ace-iplastic .ace_comment {\ +color: #777777;\ +font-style: italic\ +}\ +.ace-iplastic .ace_fold-widget {\ +background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==);\ +}\ +.ace-iplastic .ace_indent-guide {\ +background: url(data:image/png;base64,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) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-katzenmilch.js b/modules/backend/assets/vendor/ace/theme-katzenmilch.js new file mode 100755 index 0000000..f65ce4a --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-katzenmilch.js @@ -0,0 +1,121 @@ +ace.define("ace/theme/katzenmilch",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-katzenmilch"; +exports.cssText = ".ace-katzenmilch .ace_gutter,\ +.ace-katzenmilch .ace_gutter {\ +background: #e8e8e8;\ +color: #333\ +}\ +.ace-katzenmilch .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-katzenmilch {\ +background-color: #f3f2f3;\ +color: rgba(15, 0, 9, 1.0)\ +}\ +.ace-katzenmilch .ace_cursor {\ +border-left: 2px solid #100011\ +}\ +.ace-katzenmilch .ace_overwrite-cursors .ace_cursor {\ +border-left: 0px;\ +border-bottom: 1px solid #100011\ +}\ +.ace-katzenmilch .ace_marker-layer .ace_selection {\ +background: rgba(100, 5, 208, 0.27)\ +}\ +.ace-katzenmilch.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #f3f2f3;\ +}\ +.ace-katzenmilch .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174)\ +}\ +.ace-katzenmilch .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(0, 0, 0, 0.33);\ +}\ +.ace-katzenmilch .ace_marker-layer .ace_active-line {\ +background: rgb(232, 242, 254)\ +}\ +.ace-katzenmilch .ace_gutter-active-line {\ +background-color: rgb(232, 242, 254)\ +}\ +.ace-katzenmilch .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(100, 5, 208, 0.27)\ +}\ +.ace-katzenmilch .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-katzenmilch .ace_fold {\ +background-color: rgba(2, 95, 73, 0.97);\ +border-color: rgba(15, 0, 9, 1.0)\ +}\ +.ace-katzenmilch .ace_keyword {\ +color: #674Aa8;\ +rbackground-color: rgba(163, 170, 216, 0.055)\ +}\ +.ace-katzenmilch .ace_constant.ace_language {\ +color: #7D7e52;\ +rbackground-color: rgba(189, 190, 130, 0.059)\ +}\ +.ace-katzenmilch .ace_constant.ace_numeric {\ +color: rgba(79, 130, 123, 0.93);\ +rbackground-color: rgba(119, 194, 187, 0.059)\ +}\ +.ace-katzenmilch .ace_constant.ace_character,\ +.ace-katzenmilch .ace_constant.ace_other {\ +color: rgba(2, 95, 105, 1.0);\ +rbackground-color: rgba(127, 34, 153, 0.063)\ +}\ +.ace-katzenmilch .ace_support.ace_function {\ +color: #9D7e62;\ +rbackground-color: rgba(189, 190, 130, 0.039)\ +}\ +.ace-katzenmilch .ace_support.ace_class {\ +color: rgba(239, 106, 167, 1.0);\ +rbackground-color: rgba(239, 106, 167, 0.063)\ +}\ +.ace-katzenmilch .ace_storage {\ +color: rgba(123, 92, 191, 1.0);\ +rbackground-color: rgba(139, 93, 223, 0.051)\ +}\ +.ace-katzenmilch .ace_invalid {\ +color: #DFDFD5;\ +rbackground-color: #CC1B27\ +}\ +.ace-katzenmilch .ace_string {\ +color: #5a5f9b;\ +rbackground-color: rgba(170, 175, 219, 0.035)\ +}\ +.ace-katzenmilch .ace_comment {\ +font-style: italic;\ +color: rgba(64, 79, 80, 0.67);\ +rbackground-color: rgba(95, 15, 255, 0.0078)\ +}\ +.ace-katzenmilch .ace_entity.ace_name.ace_function,\ +.ace-katzenmilch .ace_variable {\ +color: rgba(2, 95, 73, 0.97);\ +rbackground-color: rgba(34, 255, 73, 0.12)\ +}\ +.ace-katzenmilch .ace_variable.ace_language {\ +color: #316fcf;\ +rbackground-color: rgba(58, 175, 255, 0.039)\ +}\ +.ace-katzenmilch .ace_variable.ace_parameter {\ +font-style: italic;\ +color: rgba(51, 150, 159, 0.87);\ +rbackground-color: rgba(5, 214, 249, 0.043)\ +}\ +.ace-katzenmilch .ace_entity.ace_other.ace_attribute-name {\ +color: rgba(73, 70, 194, 0.93);\ +rbackground-color: rgba(73, 134, 194, 0.035)\ +}\ +.ace-katzenmilch .ace_entity.ace_name.ace_tag {\ +color: #3976a2;\ +rbackground-color: rgba(73, 166, 210, 0.039)\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-kr_theme.js b/modules/backend/assets/vendor/ace/theme-kr_theme.js new file mode 100755 index 0000000..8818b33 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-kr_theme.js @@ -0,0 +1,104 @@ +ace.define("ace/theme/kr_theme",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-kr-theme"; +exports.cssText = ".ace-kr-theme .ace_gutter {\ +background: #1c1917;\ +color: #FCFFE0\ +}\ +.ace-kr-theme .ace_print-margin {\ +width: 1px;\ +background: #1c1917\ +}\ +.ace-kr-theme {\ +background-color: #0B0A09;\ +color: #FCFFE0\ +}\ +.ace-kr-theme .ace_cursor {\ +color: #FF9900\ +}\ +.ace-kr-theme .ace_marker-layer .ace_selection {\ +background: rgba(170, 0, 255, 0.45)\ +}\ +.ace-kr-theme.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #0B0A09;\ +}\ +.ace-kr-theme .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-kr-theme .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 177, 111, 0.32)\ +}\ +.ace-kr-theme .ace_marker-layer .ace_active-line {\ +background: #38403D\ +}\ +.ace-kr-theme .ace_gutter-active-line {\ +background-color : #38403D\ +}\ +.ace-kr-theme .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(170, 0, 255, 0.45)\ +}\ +.ace-kr-theme .ace_invisible {\ +color: rgba(255, 177, 111, 0.32)\ +}\ +.ace-kr-theme .ace_keyword,\ +.ace-kr-theme .ace_meta {\ +color: #949C8B\ +}\ +.ace-kr-theme .ace_constant,\ +.ace-kr-theme .ace_constant.ace_character,\ +.ace-kr-theme .ace_constant.ace_character.ace_escape,\ +.ace-kr-theme .ace_constant.ace_other {\ +color: rgba(210, 117, 24, 0.76)\ +}\ +.ace-kr-theme .ace_invalid {\ +color: #F8F8F8;\ +background-color: #A41300\ +}\ +.ace-kr-theme .ace_support {\ +color: #9FC28A\ +}\ +.ace-kr-theme .ace_support.ace_constant {\ +color: #C27E66\ +}\ +.ace-kr-theme .ace_fold {\ +background-color: #949C8B;\ +border-color: #FCFFE0\ +}\ +.ace-kr-theme .ace_support.ace_function {\ +color: #85873A\ +}\ +.ace-kr-theme .ace_storage {\ +color: #FFEE80\ +}\ +.ace-kr-theme .ace_string {\ +color: rgba(164, 161, 181, 0.8)\ +}\ +.ace-kr-theme .ace_string.ace_regexp {\ +color: rgba(125, 255, 192, 0.65)\ +}\ +.ace-kr-theme .ace_comment {\ +font-style: italic;\ +color: #706D5B\ +}\ +.ace-kr-theme .ace_variable {\ +color: #D1A796\ +}\ +.ace-kr-theme .ace_list,\ +.ace-kr-theme .ace_markup.ace_list {\ +background-color: #0F0040\ +}\ +.ace-kr-theme .ace_variable.ace_language {\ +color: #FF80E1\ +}\ +.ace-kr-theme .ace_meta.ace_tag {\ +color: #BABD9C\ +}\ +.ace-kr-theme .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-kuroir.js b/modules/backend/assets/vendor/ace/theme-kuroir.js new file mode 100755 index 0000000..30e0a8b --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-kuroir.js @@ -0,0 +1,61 @@ +ace.define("ace/theme/kuroir",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-kuroir"; +exports.cssText = "\ +.ace-kuroir .ace_gutter {\ +background: #e8e8e8;\ +color: #333;\ +}\ +.ace-kuroir .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-kuroir {\ +background-color: #E8E9E8;\ +color: #363636;\ +}\ +.ace-kuroir .ace_cursor {\ +color: #202020;\ +}\ +.ace-kuroir .ace_marker-layer .ace_selection {\ +background: rgba(245, 170, 0, 0.57);\ +}\ +.ace-kuroir.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #E8E9E8;\ +}\ +.ace-kuroir .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174);\ +}\ +.ace-kuroir .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(0, 0, 0, 0.29);\ +}\ +.ace-kuroir .ace_marker-layer .ace_active-line {\ +background: rgba(203, 220, 47, 0.22);\ +}\ +.ace-kuroir .ace_gutter-active-line {\ +background-color: rgba(203, 220, 47, 0.22);\ +}\ +.ace-kuroir .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(245, 170, 0, 0.57);\ +}\ +.ace-kuroir .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-kuroir .ace_fold {\ +border-color: #363636;\ +}\ +.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;\ +background-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;\ +font-style:italic;\ +color:#FD1732;\ +background-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;\ +background-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);\ +background-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;\ +background-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-merbivore.js b/modules/backend/assets/vendor/ace/theme-merbivore.js new file mode 100755 index 0000000..fc0a72f --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-merbivore.js @@ -0,0 +1,95 @@ +ace.define("ace/theme/merbivore",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-merbivore"; +exports.cssText = ".ace-merbivore .ace_gutter {\ +background: #202020;\ +color: #E6E1DC\ +}\ +.ace-merbivore .ace_print-margin {\ +width: 1px;\ +background: #555651\ +}\ +.ace-merbivore {\ +background-color: #161616;\ +color: #E6E1DC\ +}\ +.ace-merbivore .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-merbivore .ace_marker-layer .ace_selection {\ +background: #454545\ +}\ +.ace-merbivore.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #161616;\ +}\ +.ace-merbivore .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-merbivore .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #404040\ +}\ +.ace-merbivore .ace_marker-layer .ace_active-line {\ +background: #333435\ +}\ +.ace-merbivore .ace_gutter-active-line {\ +background-color: #333435\ +}\ +.ace-merbivore .ace_marker-layer .ace_selected-word {\ +border: 1px solid #454545\ +}\ +.ace-merbivore .ace_invisible {\ +color: #404040\ +}\ +.ace-merbivore .ace_entity.ace_name.ace_tag,\ +.ace-merbivore .ace_keyword,\ +.ace-merbivore .ace_meta,\ +.ace-merbivore .ace_meta.ace_tag,\ +.ace-merbivore .ace_storage,\ +.ace-merbivore .ace_support.ace_function {\ +color: #FC6F09\ +}\ +.ace-merbivore .ace_constant,\ +.ace-merbivore .ace_constant.ace_character,\ +.ace-merbivore .ace_constant.ace_character.ace_escape,\ +.ace-merbivore .ace_constant.ace_other,\ +.ace-merbivore .ace_support.ace_type {\ +color: #1EDAFB\ +}\ +.ace-merbivore .ace_constant.ace_character.ace_escape {\ +color: #519F50\ +}\ +.ace-merbivore .ace_constant.ace_language {\ +color: #FDC251\ +}\ +.ace-merbivore .ace_constant.ace_library,\ +.ace-merbivore .ace_string,\ +.ace-merbivore .ace_support.ace_constant {\ +color: #8DFF0A\ +}\ +.ace-merbivore .ace_constant.ace_numeric {\ +color: #58C554\ +}\ +.ace-merbivore .ace_invalid {\ +color: #FFFFFF;\ +background-color: #990000\ +}\ +.ace-merbivore .ace_fold {\ +background-color: #FC6F09;\ +border-color: #E6E1DC\ +}\ +.ace-merbivore .ace_comment {\ +font-style: italic;\ +color: #AD2EA4\ +}\ +.ace-merbivore .ace_entity.ace_other.ace_attribute-name {\ +color: #FFFF89\ +}\ +.ace-merbivore .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-merbivore_soft.js b/modules/backend/assets/vendor/ace/theme-merbivore_soft.js new file mode 100755 index 0000000..eff2464 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-merbivore_soft.js @@ -0,0 +1,96 @@ +ace.define("ace/theme/merbivore_soft",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-merbivore-soft"; +exports.cssText = ".ace-merbivore-soft .ace_gutter {\ +background: #262424;\ +color: #E6E1DC\ +}\ +.ace-merbivore-soft .ace_print-margin {\ +width: 1px;\ +background: #262424\ +}\ +.ace-merbivore-soft {\ +background-color: #1C1C1C;\ +color: #E6E1DC\ +}\ +.ace-merbivore-soft .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-merbivore-soft .ace_marker-layer .ace_selection {\ +background: #494949\ +}\ +.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #1C1C1C;\ +}\ +.ace-merbivore-soft .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-merbivore-soft .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #404040\ +}\ +.ace-merbivore-soft .ace_marker-layer .ace_active-line {\ +background: #333435\ +}\ +.ace-merbivore-soft .ace_gutter-active-line {\ +background-color: #333435\ +}\ +.ace-merbivore-soft .ace_marker-layer .ace_selected-word {\ +border: 1px solid #494949\ +}\ +.ace-merbivore-soft .ace_invisible {\ +color: #404040\ +}\ +.ace-merbivore-soft .ace_entity.ace_name.ace_tag,\ +.ace-merbivore-soft .ace_keyword,\ +.ace-merbivore-soft .ace_meta,\ +.ace-merbivore-soft .ace_meta.ace_tag,\ +.ace-merbivore-soft .ace_storage {\ +color: #FC803A\ +}\ +.ace-merbivore-soft .ace_constant,\ +.ace-merbivore-soft .ace_constant.ace_character,\ +.ace-merbivore-soft .ace_constant.ace_character.ace_escape,\ +.ace-merbivore-soft .ace_constant.ace_other,\ +.ace-merbivore-soft .ace_support.ace_type {\ +color: #68C1D8\ +}\ +.ace-merbivore-soft .ace_constant.ace_character.ace_escape {\ +color: #B3E5B4\ +}\ +.ace-merbivore-soft .ace_constant.ace_language {\ +color: #E1C582\ +}\ +.ace-merbivore-soft .ace_constant.ace_library,\ +.ace-merbivore-soft .ace_string,\ +.ace-merbivore-soft .ace_support.ace_constant {\ +color: #8EC65F\ +}\ +.ace-merbivore-soft .ace_constant.ace_numeric {\ +color: #7FC578\ +}\ +.ace-merbivore-soft .ace_invalid,\ +.ace-merbivore-soft .ace_invalid.ace_deprecated {\ +color: #FFFFFF;\ +background-color: #FE3838\ +}\ +.ace-merbivore-soft .ace_fold {\ +background-color: #FC803A;\ +border-color: #E6E1DC\ +}\ +.ace-merbivore-soft .ace_comment,\ +.ace-merbivore-soft .ace_meta {\ +font-style: italic;\ +color: #AC4BB8\ +}\ +.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {\ +color: #EAF1A3\ +}\ +.ace-merbivore-soft .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-mono_industrial.js b/modules/backend/assets/vendor/ace/theme-mono_industrial.js new file mode 100755 index 0000000..0ece030 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-mono_industrial.js @@ -0,0 +1,107 @@ +ace.define("ace/theme/mono_industrial",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-mono-industrial"; +exports.cssText = ".ace-mono-industrial .ace_gutter {\ +background: #1d2521;\ +color: #C5C9C9\ +}\ +.ace-mono-industrial .ace_print-margin {\ +width: 1px;\ +background: #555651\ +}\ +.ace-mono-industrial {\ +background-color: #222C28;\ +color: #FFFFFF\ +}\ +.ace-mono-industrial .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-mono-industrial .ace_marker-layer .ace_selection {\ +background: rgba(145, 153, 148, 0.40)\ +}\ +.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #222C28;\ +}\ +.ace-mono-industrial .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-mono-industrial .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(102, 108, 104, 0.50)\ +}\ +.ace-mono-industrial .ace_marker-layer .ace_active-line {\ +background: rgba(12, 13, 12, 0.25)\ +}\ +.ace-mono-industrial .ace_gutter-active-line {\ +background-color: rgba(12, 13, 12, 0.25)\ +}\ +.ace-mono-industrial .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(145, 153, 148, 0.40)\ +}\ +.ace-mono-industrial .ace_invisible {\ +color: rgba(102, 108, 104, 0.50)\ +}\ +.ace-mono-industrial .ace_string {\ +background-color: #151C19;\ +color: #FFFFFF\ +}\ +.ace-mono-industrial .ace_keyword,\ +.ace-mono-industrial .ace_meta {\ +color: #A39E64\ +}\ +.ace-mono-industrial .ace_constant,\ +.ace-mono-industrial .ace_constant.ace_character,\ +.ace-mono-industrial .ace_constant.ace_character.ace_escape,\ +.ace-mono-industrial .ace_constant.ace_numeric,\ +.ace-mono-industrial .ace_constant.ace_other {\ +color: #E98800\ +}\ +.ace-mono-industrial .ace_entity.ace_name.ace_function,\ +.ace-mono-industrial .ace_keyword.ace_operator,\ +.ace-mono-industrial .ace_variable {\ +color: #A8B3AB\ +}\ +.ace-mono-industrial .ace_invalid {\ +color: #FFFFFF;\ +background-color: rgba(153, 0, 0, 0.68)\ +}\ +.ace-mono-industrial .ace_support.ace_constant {\ +color: #C87500\ +}\ +.ace-mono-industrial .ace_fold {\ +background-color: #A8B3AB;\ +border-color: #FFFFFF\ +}\ +.ace-mono-industrial .ace_support.ace_function {\ +color: #588E60\ +}\ +.ace-mono-industrial .ace_entity.ace_name,\ +.ace-mono-industrial .ace_support.ace_class,\ +.ace-mono-industrial .ace_support.ace_type {\ +color: #5778B6\ +}\ +.ace-mono-industrial .ace_storage {\ +color: #C23B00\ +}\ +.ace-mono-industrial .ace_variable.ace_language,\ +.ace-mono-industrial .ace_variable.ace_parameter {\ +color: #648BD2\ +}\ +.ace-mono-industrial .ace_comment {\ +color: #666C68;\ +background-color: #151C19\ +}\ +.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {\ +color: #909993\ +}\ +.ace-mono-industrial .ace_entity.ace_name.ace_tag {\ +color: #A65EFF\ +}\ +.ace-mono-industrial .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-monokai.js b/modules/backend/assets/vendor/ace/theme-monokai.js new file mode 100755 index 0000000..322c2fa --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-monokai.js @@ -0,0 +1,105 @@ +ace.define("ace/theme/monokai",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-monokai"; +exports.cssText = ".ace-monokai .ace_gutter {\ +background: #2F3129;\ +color: #8F908A\ +}\ +.ace-monokai .ace_print-margin {\ +width: 1px;\ +background: #555651\ +}\ +.ace-monokai {\ +background-color: #272822;\ +color: #F8F8F2\ +}\ +.ace-monokai .ace_cursor {\ +color: #F8F8F0\ +}\ +.ace-monokai .ace_marker-layer .ace_selection {\ +background: #49483E\ +}\ +.ace-monokai.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #272822;\ +}\ +.ace-monokai .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-monokai .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #49483E\ +}\ +.ace-monokai .ace_marker-layer .ace_active-line {\ +background: #202020\ +}\ +.ace-monokai .ace_gutter-active-line {\ +background-color: #272727\ +}\ +.ace-monokai .ace_marker-layer .ace_selected-word {\ +border: 1px solid #49483E\ +}\ +.ace-monokai .ace_invisible {\ +color: #52524d\ +}\ +.ace-monokai .ace_entity.ace_name.ace_tag,\ +.ace-monokai .ace_keyword,\ +.ace-monokai .ace_meta.ace_tag,\ +.ace-monokai .ace_storage {\ +color: #F92672\ +}\ +.ace-monokai .ace_punctuation,\ +.ace-monokai .ace_punctuation.ace_tag {\ +color: #fff\ +}\ +.ace-monokai .ace_constant.ace_character,\ +.ace-monokai .ace_constant.ace_language,\ +.ace-monokai .ace_constant.ace_numeric,\ +.ace-monokai .ace_constant.ace_other {\ +color: #AE81FF\ +}\ +.ace-monokai .ace_invalid {\ +color: #F8F8F0;\ +background-color: #F92672\ +}\ +.ace-monokai .ace_invalid.ace_deprecated {\ +color: #F8F8F0;\ +background-color: #AE81FF\ +}\ +.ace-monokai .ace_support.ace_constant,\ +.ace-monokai .ace_support.ace_function {\ +color: #66D9EF\ +}\ +.ace-monokai .ace_fold {\ +background-color: #A6E22E;\ +border-color: #F8F8F2\ +}\ +.ace-monokai .ace_storage.ace_type,\ +.ace-monokai .ace_support.ace_class,\ +.ace-monokai .ace_support.ace_type {\ +font-style: italic;\ +color: #66D9EF\ +}\ +.ace-monokai .ace_entity.ace_name.ace_function,\ +.ace-monokai .ace_entity.ace_other,\ +.ace-monokai .ace_entity.ace_other.ace_attribute-name,\ +.ace-monokai .ace_variable {\ +color: #A6E22E\ +}\ +.ace-monokai .ace_variable.ace_parameter {\ +font-style: italic;\ +color: #FD971F\ +}\ +.ace-monokai .ace_string {\ +color: #E6DB74\ +}\ +.ace-monokai .ace_comment {\ +color: #75715E\ +}\ +.ace-monokai .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-pastel_on_dark.js b/modules/backend/assets/vendor/ace/theme-pastel_on_dark.js new file mode 100755 index 0000000..2631ae0 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-pastel_on_dark.js @@ -0,0 +1,108 @@ +ace.define("ace/theme/pastel_on_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-pastel-on-dark"; +exports.cssText = ".ace-pastel-on-dark .ace_gutter {\ +background: #353030;\ +color: #8F938F\ +}\ +.ace-pastel-on-dark .ace_print-margin {\ +width: 1px;\ +background: #353030\ +}\ +.ace-pastel-on-dark {\ +background-color: #2C2828;\ +color: #8F938F\ +}\ +.ace-pastel-on-dark .ace_cursor {\ +color: #A7A7A7\ +}\ +.ace-pastel-on-dark .ace_marker-layer .ace_selection {\ +background: rgba(221, 240, 255, 0.20)\ +}\ +.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #2C2828;\ +}\ +.ace-pastel-on-dark .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-pastel-on-dark .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 255, 255, 0.25)\ +}\ +.ace-pastel-on-dark .ace_marker-layer .ace_active-line {\ +background: rgba(255, 255, 255, 0.031)\ +}\ +.ace-pastel-on-dark .ace_gutter-active-line {\ +background-color: rgba(255, 255, 255, 0.031)\ +}\ +.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(221, 240, 255, 0.20)\ +}\ +.ace-pastel-on-dark .ace_invisible {\ +color: rgba(255, 255, 255, 0.25)\ +}\ +.ace-pastel-on-dark .ace_keyword,\ +.ace-pastel-on-dark .ace_meta {\ +color: #757aD8\ +}\ +.ace-pastel-on-dark .ace_constant,\ +.ace-pastel-on-dark .ace_constant.ace_character,\ +.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,\ +.ace-pastel-on-dark .ace_constant.ace_other {\ +color: #4FB7C5\ +}\ +.ace-pastel-on-dark .ace_keyword.ace_operator {\ +color: #797878\ +}\ +.ace-pastel-on-dark .ace_constant.ace_character {\ +color: #AFA472\ +}\ +.ace-pastel-on-dark .ace_constant.ace_language {\ +color: #DE8E30\ +}\ +.ace-pastel-on-dark .ace_constant.ace_numeric {\ +color: #CCCCCC\ +}\ +.ace-pastel-on-dark .ace_invalid,\ +.ace-pastel-on-dark .ace_invalid.ace_illegal {\ +color: #F8F8F8;\ +background-color: rgba(86, 45, 86, 0.75)\ +}\ +.ace-pastel-on-dark .ace_invalid.ace_deprecated {\ +text-decoration: underline;\ +font-style: italic;\ +color: #D2A8A1\ +}\ +.ace-pastel-on-dark .ace_fold {\ +background-color: #757aD8;\ +border-color: #8F938F\ +}\ +.ace-pastel-on-dark .ace_support.ace_function {\ +color: #AEB2F8\ +}\ +.ace-pastel-on-dark .ace_string {\ +color: #66A968\ +}\ +.ace-pastel-on-dark .ace_string.ace_regexp {\ +color: #E9C062\ +}\ +.ace-pastel-on-dark .ace_comment {\ +color: #A6C6FF\ +}\ +.ace-pastel-on-dark .ace_variable {\ +color: #BEBF55\ +}\ +.ace-pastel-on-dark .ace_variable.ace_language {\ +color: #C1C144\ +}\ +.ace-pastel-on-dark .ace_xml-pe {\ +color: #494949\ +}\ +.ace-pastel-on-dark .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-solarized_dark.js b/modules/backend/assets/vendor/ace/theme-solarized_dark.js new file mode 100755 index 0000000..d1acdb4 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-solarized_dark.js @@ -0,0 +1,88 @@ +ace.define("ace/theme/solarized_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-solarized-dark"; +exports.cssText = ".ace-solarized-dark .ace_gutter {\ +background: #01313f;\ +color: #d0edf7\ +}\ +.ace-solarized-dark .ace_print-margin {\ +width: 1px;\ +background: #33555E\ +}\ +.ace-solarized-dark {\ +background-color: #002B36;\ +color: #93A1A1\ +}\ +.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,\ +.ace-solarized-dark .ace_storage {\ +color: #93A1A1\ +}\ +.ace-solarized-dark .ace_cursor,\ +.ace-solarized-dark .ace_string.ace_regexp {\ +color: #D30102\ +}\ +.ace-solarized-dark .ace_marker-layer .ace_active-line,\ +.ace-solarized-dark .ace_marker-layer .ace_selection {\ +background: rgba(255, 255, 255, 0.1)\ +}\ +.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #002B36;\ +}\ +.ace-solarized-dark .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-solarized-dark .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(147, 161, 161, 0.50)\ +}\ +.ace-solarized-dark .ace_gutter-active-line {\ +background-color: #0d3440\ +}\ +.ace-solarized-dark .ace_marker-layer .ace_selected-word {\ +border: 1px solid #073642\ +}\ +.ace-solarized-dark .ace_invisible {\ +color: rgba(147, 161, 161, 0.50)\ +}\ +.ace-solarized-dark .ace_keyword,\ +.ace-solarized-dark .ace_meta,\ +.ace-solarized-dark .ace_support.ace_class,\ +.ace-solarized-dark .ace_support.ace_type {\ +color: #859900\ +}\ +.ace-solarized-dark .ace_constant.ace_character,\ +.ace-solarized-dark .ace_constant.ace_other {\ +color: #CB4B16\ +}\ +.ace-solarized-dark .ace_constant.ace_language {\ +color: #B58900\ +}\ +.ace-solarized-dark .ace_constant.ace_numeric {\ +color: #D33682\ +}\ +.ace-solarized-dark .ace_fold {\ +background-color: #268BD2;\ +border-color: #93A1A1\ +}\ +.ace-solarized-dark .ace_entity.ace_name.ace_function,\ +.ace-solarized-dark .ace_entity.ace_name.ace_tag,\ +.ace-solarized-dark .ace_support.ace_function,\ +.ace-solarized-dark .ace_variable,\ +.ace-solarized-dark .ace_variable.ace_language {\ +color: #268BD2\ +}\ +.ace-solarized-dark .ace_string {\ +color: #2AA198\ +}\ +.ace-solarized-dark .ace_comment {\ +font-style: italic;\ +color: #657B83\ +}\ +.ace-solarized-dark .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-solarized_light.js b/modules/backend/assets/vendor/ace/theme-solarized_light.js new file mode 100755 index 0000000..f0c078a --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-solarized_light.js @@ -0,0 +1,91 @@ +ace.define("ace/theme/solarized_light",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-solarized-light"; +exports.cssText = ".ace-solarized-light .ace_gutter {\ +background: #fbf1d3;\ +color: #333\ +}\ +.ace-solarized-light .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-solarized-light {\ +background-color: #FDF6E3;\ +color: #586E75\ +}\ +.ace-solarized-light .ace_cursor {\ +color: #000000\ +}\ +.ace-solarized-light .ace_marker-layer .ace_selection {\ +background: rgba(7, 54, 67, 0.09)\ +}\ +.ace-solarized-light.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #FDF6E3;\ +}\ +.ace-solarized-light .ace_marker-layer .ace_step {\ +background: rgb(255, 255, 0)\ +}\ +.ace-solarized-light .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(147, 161, 161, 0.50)\ +}\ +.ace-solarized-light .ace_marker-layer .ace_active-line {\ +background: #EEE8D5\ +}\ +.ace-solarized-light .ace_gutter-active-line {\ +background-color : #EDE5C1\ +}\ +.ace-solarized-light .ace_marker-layer .ace_selected-word {\ +border: 1px solid #073642\ +}\ +.ace-solarized-light .ace_invisible {\ +color: rgba(147, 161, 161, 0.50)\ +}\ +.ace-solarized-light .ace_keyword,\ +.ace-solarized-light .ace_meta,\ +.ace-solarized-light .ace_support.ace_class,\ +.ace-solarized-light .ace_support.ace_type {\ +color: #859900\ +}\ +.ace-solarized-light .ace_constant.ace_character,\ +.ace-solarized-light .ace_constant.ace_other {\ +color: #CB4B16\ +}\ +.ace-solarized-light .ace_constant.ace_language {\ +color: #B58900\ +}\ +.ace-solarized-light .ace_constant.ace_numeric {\ +color: #D33682\ +}\ +.ace-solarized-light .ace_fold {\ +background-color: #268BD2;\ +border-color: #586E75\ +}\ +.ace-solarized-light .ace_entity.ace_name.ace_function,\ +.ace-solarized-light .ace_entity.ace_name.ace_tag,\ +.ace-solarized-light .ace_support.ace_function,\ +.ace-solarized-light .ace_variable,\ +.ace-solarized-light .ace_variable.ace_language {\ +color: #268BD2\ +}\ +.ace-solarized-light .ace_storage {\ +color: #073642\ +}\ +.ace-solarized-light .ace_string {\ +color: #2AA198\ +}\ +.ace-solarized-light .ace_string.ace_regexp {\ +color: #D30102\ +}\ +.ace-solarized-light .ace_comment,\ +.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {\ +color: #93A1A1\ +}\ +.ace-solarized-light .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-sqlserver.js b/modules/backend/assets/vendor/ace/theme-sqlserver.js new file mode 100755 index 0000000..91f34f6 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-sqlserver.js @@ -0,0 +1,138 @@ +ace.define("ace/theme/sqlserver",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-sqlserver"; +exports.cssText = ".ace-sqlserver .ace_gutter {\ +background: #ebebeb;\ +color: #333;\ +overflow: hidden;\ +}\ +.ace-sqlserver .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-sqlserver {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-sqlserver .ace_identifier {\ +color: black;\ +}\ +.ace-sqlserver .ace_keyword {\ +color: #0000FF;\ +}\ +.ace-sqlserver .ace_numeric {\ +color: black;\ +}\ +.ace-sqlserver .ace_storage {\ +color: #11B7BE;\ +}\ +.ace-sqlserver .ace_keyword.ace_operator,\ +.ace-sqlserver .ace_lparen,\ +.ace-sqlserver .ace_rparen,\ +.ace-sqlserver .ace_punctuation {\ +color: #808080;\ +}\ +.ace-sqlserver .ace_set.ace_statement {\ +color: #0000FF;\ +text-decoration: underline;\ +}\ +.ace-sqlserver .ace_cursor {\ +color: black;\ +}\ +.ace-sqlserver .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-sqlserver .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-sqlserver .ace_constant.ace_language {\ +color: #979797;\ +}\ +.ace-sqlserver .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-sqlserver .ace_invalid {\ +background-color: rgb(153, 0, 0);\ +color: white;\ +}\ +.ace-sqlserver .ace_support.ace_function {\ +color: #FF00FF;\ +}\ +.ace-sqlserver .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-sqlserver .ace_class {\ +color: #008080;\ +}\ +.ace-sqlserver .ace_support.ace_other {\ +color: #6D79DE;\ +}\ +.ace-sqlserver .ace_variable.ace_parameter {\ +font-style: italic;\ +color: #FD971F;\ +}\ +.ace-sqlserver .ace_comment {\ +color: #008000;\ +}\ +.ace-sqlserver .ace_constant.ace_numeric {\ +color: black;\ +}\ +.ace-sqlserver .ace_variable {\ +color: rgb(49, 132, 149);\ +}\ +.ace-sqlserver .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-sqlserver .ace_support.ace_storedprocedure {\ +color: #800000;\ +}\ +.ace-sqlserver .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-sqlserver .ace_list {\ +color: rgb(185, 6, 144);\ +}\ +.ace-sqlserver .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-sqlserver .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-sqlserver .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-sqlserver .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-sqlserver .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-sqlserver .ace_gutter-active-line {\ +background-color: #dcdcdc;\ +}\ +.ace-sqlserver .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-sqlserver .ace_meta.ace_tag {\ +color: #0000FF;\ +}\ +.ace-sqlserver .ace_string.ace_regex {\ +color: #FF0000;\ +}\ +.ace-sqlserver .ace_string {\ +color: #FF0000;\ +}\ +.ace-sqlserver .ace_entity.ace_other.ace_attribute-name {\ +color: #994409;\ +}\ +.ace-sqlserver .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-terminal.js b/modules/backend/assets/vendor/ace/theme-terminal.js new file mode 100755 index 0000000..def9e69 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-terminal.js @@ -0,0 +1,114 @@ +ace.define("ace/theme/terminal",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-terminal-theme"; +exports.cssText = ".ace-terminal-theme .ace_gutter {\ +background: #1a0005;\ +color: steelblue\ +}\ +.ace-terminal-theme .ace_print-margin {\ +width: 1px;\ +background: #1a1a1a\ +}\ +.ace-terminal-theme {\ +background-color: black;\ +color: #DEDEDE\ +}\ +.ace-terminal-theme .ace_cursor {\ +color: #9F9F9F\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_selection {\ +background: #424242\ +}\ +.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px black;\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_step {\ +background: rgb(0, 0, 0)\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_bracket {\ +background: #090;\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_bracket-start {\ +background: #090;\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_bracket-unmatched {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #900\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_active-line {\ +background: #2A2A2A\ +}\ +.ace-terminal-theme .ace_gutter-active-line {\ +background-color: #2A112A\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_selected-word {\ +border: 1px solid #424242\ +}\ +.ace-terminal-theme .ace_invisible {\ +color: #343434\ +}\ +.ace-terminal-theme .ace_keyword,\ +.ace-terminal-theme .ace_meta,\ +.ace-terminal-theme .ace_storage,\ +.ace-terminal-theme .ace_storage.ace_type,\ +.ace-terminal-theme .ace_support.ace_type {\ +color: tomato\ +}\ +.ace-terminal-theme .ace_keyword.ace_operator {\ +color: deeppink\ +}\ +.ace-terminal-theme .ace_constant.ace_character,\ +.ace-terminal-theme .ace_constant.ace_language,\ +.ace-terminal-theme .ace_constant.ace_numeric,\ +.ace-terminal-theme .ace_keyword.ace_other.ace_unit,\ +.ace-terminal-theme .ace_support.ace_constant,\ +.ace-terminal-theme .ace_variable.ace_parameter {\ +color: #E78C45\ +}\ +.ace-terminal-theme .ace_constant.ace_other {\ +color: gold\ +}\ +.ace-terminal-theme .ace_invalid {\ +color: yellow;\ +background-color: red\ +}\ +.ace-terminal-theme .ace_invalid.ace_deprecated {\ +color: #CED2CF;\ +background-color: #B798BF\ +}\ +.ace-terminal-theme .ace_fold {\ +background-color: #7AA6DA;\ +border-color: #DEDEDE\ +}\ +.ace-terminal-theme .ace_entity.ace_name.ace_function,\ +.ace-terminal-theme .ace_support.ace_function,\ +.ace-terminal-theme .ace_variable {\ +color: #7AA6DA\ +}\ +.ace-terminal-theme .ace_support.ace_class,\ +.ace-terminal-theme .ace_support.ace_type {\ +color: #E7C547\ +}\ +.ace-terminal-theme .ace_heading,\ +.ace-terminal-theme .ace_string {\ +color: #B9CA4A\ +}\ +.ace-terminal-theme .ace_entity.ace_name.ace_tag,\ +.ace-terminal-theme .ace_entity.ace_other.ace_attribute-name,\ +.ace-terminal-theme .ace_meta.ace_tag,\ +.ace-terminal-theme .ace_string.ace_regexp,\ +.ace-terminal-theme .ace_variable {\ +color: #D54E53\ +}\ +.ace-terminal-theme .ace_comment {\ +color: orangered\ +}\ +.ace-terminal-theme .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-textmate.js b/modules/backend/assets/vendor/ace/theme-textmate.js new file mode 100755 index 0000000..0033eda --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-textmate.js @@ -0,0 +1,129 @@ +ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +exports.isDark = false; +exports.cssClass = "ace-tm"; +exports.cssText = ".ace-tm .ace_gutter {\ +background: #f0f0f0;\ +color: #333;\ +}\ +.ace-tm .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-tm .ace_fold {\ +background-color: #6B72E6;\ +}\ +.ace-tm {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-tm .ace_cursor {\ +color: black;\ +}\ +.ace-tm .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-tm .ace_storage,\ +.ace-tm .ace_keyword {\ +color: blue;\ +}\ +.ace-tm .ace_constant {\ +color: rgb(197, 6, 11);\ +}\ +.ace-tm .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-tm .ace_constant.ace_language {\ +color: rgb(88, 92, 246);\ +}\ +.ace-tm .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-tm .ace_invalid {\ +background-color: rgba(255, 0, 0, 0.1);\ +color: red;\ +}\ +.ace-tm .ace_support.ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-tm .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-tm .ace_support.ace_type,\ +.ace-tm .ace_support.ace_class {\ +color: rgb(109, 121, 222);\ +}\ +.ace-tm .ace_keyword.ace_operator {\ +color: rgb(104, 118, 135);\ +}\ +.ace-tm .ace_string {\ +color: rgb(3, 106, 7);\ +}\ +.ace-tm .ace_comment {\ +color: rgb(76, 136, 107);\ +}\ +.ace-tm .ace_comment.ace_doc {\ +color: rgb(0, 102, 255);\ +}\ +.ace-tm .ace_comment.ace_doc.ace_tag {\ +color: rgb(128, 159, 191);\ +}\ +.ace-tm .ace_constant.ace_numeric {\ +color: rgb(0, 0, 205);\ +}\ +.ace-tm .ace_variable {\ +color: rgb(49, 132, 149);\ +}\ +.ace-tm .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-tm .ace_entity.ace_name.ace_function {\ +color: #0000A2;\ +}\ +.ace-tm .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-tm .ace_list {\ +color:rgb(185, 6, 144);\ +}\ +.ace-tm .ace_meta.ace_tag {\ +color:rgb(0, 22, 142);\ +}\ +.ace-tm .ace_string.ace_regex {\ +color: rgb(255, 0, 0)\ +}\ +.ace-tm .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-tm.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px white;\ +}\ +.ace-tm .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-tm .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-tm .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-tm .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-tm .ace_gutter-active-line {\ +background-color : #dcdcdc;\ +}\ +.ace-tm .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-tm .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-tomorrow.js b/modules/backend/assets/vendor/ace/theme-tomorrow.js new file mode 100755 index 0000000..4661be1 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-tomorrow.js @@ -0,0 +1,108 @@ +ace.define("ace/theme/tomorrow",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-tomorrow"; +exports.cssText = ".ace-tomorrow .ace_gutter {\ +background: #f6f6f6;\ +color: #4D4D4C\ +}\ +.ace-tomorrow .ace_print-margin {\ +width: 1px;\ +background: #f6f6f6\ +}\ +.ace-tomorrow {\ +background-color: #FFFFFF;\ +color: #4D4D4C\ +}\ +.ace-tomorrow .ace_cursor {\ +color: #AEAFAD\ +}\ +.ace-tomorrow .ace_marker-layer .ace_selection {\ +background: #D6D6D6\ +}\ +.ace-tomorrow.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #FFFFFF;\ +}\ +.ace-tomorrow .ace_marker-layer .ace_step {\ +background: rgb(255, 255, 0)\ +}\ +.ace-tomorrow .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #D1D1D1\ +}\ +.ace-tomorrow .ace_marker-layer .ace_active-line {\ +background: #EFEFEF\ +}\ +.ace-tomorrow .ace_gutter-active-line {\ +background-color : #dcdcdc\ +}\ +.ace-tomorrow .ace_marker-layer .ace_selected-word {\ +border: 1px solid #D6D6D6\ +}\ +.ace-tomorrow .ace_invisible {\ +color: #D1D1D1\ +}\ +.ace-tomorrow .ace_keyword,\ +.ace-tomorrow .ace_meta,\ +.ace-tomorrow .ace_storage,\ +.ace-tomorrow .ace_storage.ace_type,\ +.ace-tomorrow .ace_support.ace_type {\ +color: #8959A8\ +}\ +.ace-tomorrow .ace_keyword.ace_operator {\ +color: #3E999F\ +}\ +.ace-tomorrow .ace_constant.ace_character,\ +.ace-tomorrow .ace_constant.ace_language,\ +.ace-tomorrow .ace_constant.ace_numeric,\ +.ace-tomorrow .ace_keyword.ace_other.ace_unit,\ +.ace-tomorrow .ace_support.ace_constant,\ +.ace-tomorrow .ace_variable.ace_parameter {\ +color: #F5871F\ +}\ +.ace-tomorrow .ace_constant.ace_other {\ +color: #666969\ +}\ +.ace-tomorrow .ace_invalid {\ +color: #FFFFFF;\ +background-color: #C82829\ +}\ +.ace-tomorrow .ace_invalid.ace_deprecated {\ +color: #FFFFFF;\ +background-color: #8959A8\ +}\ +.ace-tomorrow .ace_fold {\ +background-color: #4271AE;\ +border-color: #4D4D4C\ +}\ +.ace-tomorrow .ace_entity.ace_name.ace_function,\ +.ace-tomorrow .ace_support.ace_function,\ +.ace-tomorrow .ace_variable {\ +color: #4271AE\ +}\ +.ace-tomorrow .ace_support.ace_class,\ +.ace-tomorrow .ace_support.ace_type {\ +color: #C99E00\ +}\ +.ace-tomorrow .ace_heading,\ +.ace-tomorrow .ace_markup.ace_heading,\ +.ace-tomorrow .ace_string {\ +color: #718C00\ +}\ +.ace-tomorrow .ace_entity.ace_name.ace_tag,\ +.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,\ +.ace-tomorrow .ace_meta.ace_tag,\ +.ace-tomorrow .ace_string.ace_regexp,\ +.ace-tomorrow .ace_variable {\ +color: #C82829\ +}\ +.ace-tomorrow .ace_comment {\ +color: #8E908C\ +}\ +.ace-tomorrow .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-tomorrow_night.js b/modules/backend/assets/vendor/ace/theme-tomorrow_night.js new file mode 100755 index 0000000..53e1f39 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-tomorrow_night.js @@ -0,0 +1,108 @@ +ace.define("ace/theme/tomorrow_night",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-tomorrow-night"; +exports.cssText = ".ace-tomorrow-night .ace_gutter {\ +background: #25282c;\ +color: #C5C8C6\ +}\ +.ace-tomorrow-night .ace_print-margin {\ +width: 1px;\ +background: #25282c\ +}\ +.ace-tomorrow-night {\ +background-color: #1D1F21;\ +color: #C5C8C6\ +}\ +.ace-tomorrow-night .ace_cursor {\ +color: #AEAFAD\ +}\ +.ace-tomorrow-night .ace_marker-layer .ace_selection {\ +background: #373B41\ +}\ +.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #1D1F21;\ +}\ +.ace-tomorrow-night .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-tomorrow-night .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #4B4E55\ +}\ +.ace-tomorrow-night .ace_marker-layer .ace_active-line {\ +background: #282A2E\ +}\ +.ace-tomorrow-night .ace_gutter-active-line {\ +background-color: #282A2E\ +}\ +.ace-tomorrow-night .ace_marker-layer .ace_selected-word {\ +border: 1px solid #373B41\ +}\ +.ace-tomorrow-night .ace_invisible {\ +color: #4B4E55\ +}\ +.ace-tomorrow-night .ace_keyword,\ +.ace-tomorrow-night .ace_meta,\ +.ace-tomorrow-night .ace_storage,\ +.ace-tomorrow-night .ace_storage.ace_type,\ +.ace-tomorrow-night .ace_support.ace_type {\ +color: #B294BB\ +}\ +.ace-tomorrow-night .ace_keyword.ace_operator {\ +color: #8ABEB7\ +}\ +.ace-tomorrow-night .ace_constant.ace_character,\ +.ace-tomorrow-night .ace_constant.ace_language,\ +.ace-tomorrow-night .ace_constant.ace_numeric,\ +.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,\ +.ace-tomorrow-night .ace_support.ace_constant,\ +.ace-tomorrow-night .ace_variable.ace_parameter {\ +color: #DE935F\ +}\ +.ace-tomorrow-night .ace_constant.ace_other {\ +color: #CED1CF\ +}\ +.ace-tomorrow-night .ace_invalid {\ +color: #CED2CF;\ +background-color: #DF5F5F\ +}\ +.ace-tomorrow-night .ace_invalid.ace_deprecated {\ +color: #CED2CF;\ +background-color: #B798BF\ +}\ +.ace-tomorrow-night .ace_fold {\ +background-color: #81A2BE;\ +border-color: #C5C8C6\ +}\ +.ace-tomorrow-night .ace_entity.ace_name.ace_function,\ +.ace-tomorrow-night .ace_support.ace_function,\ +.ace-tomorrow-night .ace_variable {\ +color: #81A2BE\ +}\ +.ace-tomorrow-night .ace_support.ace_class,\ +.ace-tomorrow-night .ace_support.ace_type {\ +color: #F0C674\ +}\ +.ace-tomorrow-night .ace_heading,\ +.ace-tomorrow-night .ace_markup.ace_heading,\ +.ace-tomorrow-night .ace_string {\ +color: #B5BD68\ +}\ +.ace-tomorrow-night .ace_entity.ace_name.ace_tag,\ +.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,\ +.ace-tomorrow-night .ace_meta.ace_tag,\ +.ace-tomorrow-night .ace_string.ace_regexp,\ +.ace-tomorrow-night .ace_variable {\ +color: #CC6666\ +}\ +.ace-tomorrow-night .ace_comment {\ +color: #969896\ +}\ +.ace-tomorrow-night .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-tomorrow_night_blue.js b/modules/backend/assets/vendor/ace/theme-tomorrow_night_blue.js new file mode 100755 index 0000000..956e221 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-tomorrow_night_blue.js @@ -0,0 +1,106 @@ +ace.define("ace/theme/tomorrow_night_blue",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-tomorrow-night-blue"; +exports.cssText = ".ace-tomorrow-night-blue .ace_gutter {\ +background: #00204b;\ +color: #7388b5\ +}\ +.ace-tomorrow-night-blue .ace_print-margin {\ +width: 1px;\ +background: #00204b\ +}\ +.ace-tomorrow-night-blue {\ +background-color: #002451;\ +color: #FFFFFF\ +}\ +.ace-tomorrow-night-blue .ace_constant.ace_other,\ +.ace-tomorrow-night-blue .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {\ +background: #003F8E\ +}\ +.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #002451;\ +}\ +.ace-tomorrow-night-blue .ace_marker-layer .ace_step {\ +background: rgb(127, 111, 19)\ +}\ +.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #404F7D\ +}\ +.ace-tomorrow-night-blue .ace_marker-layer .ace_active-line {\ +background: #00346E\ +}\ +.ace-tomorrow-night-blue .ace_gutter-active-line {\ +background-color: #022040\ +}\ +.ace-tomorrow-night-blue .ace_marker-layer .ace_selected-word {\ +border: 1px solid #003F8E\ +}\ +.ace-tomorrow-night-blue .ace_invisible {\ +color: #404F7D\ +}\ +.ace-tomorrow-night-blue .ace_keyword,\ +.ace-tomorrow-night-blue .ace_meta,\ +.ace-tomorrow-night-blue .ace_storage,\ +.ace-tomorrow-night-blue .ace_storage.ace_type,\ +.ace-tomorrow-night-blue .ace_support.ace_type {\ +color: #EBBBFF\ +}\ +.ace-tomorrow-night-blue .ace_keyword.ace_operator {\ +color: #99FFFF\ +}\ +.ace-tomorrow-night-blue .ace_constant.ace_character,\ +.ace-tomorrow-night-blue .ace_constant.ace_language,\ +.ace-tomorrow-night-blue .ace_constant.ace_numeric,\ +.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,\ +.ace-tomorrow-night-blue .ace_support.ace_constant,\ +.ace-tomorrow-night-blue .ace_variable.ace_parameter {\ +color: #FFC58F\ +}\ +.ace-tomorrow-night-blue .ace_invalid {\ +color: #FFFFFF;\ +background-color: #F99DA5\ +}\ +.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {\ +color: #FFFFFF;\ +background-color: #EBBBFF\ +}\ +.ace-tomorrow-night-blue .ace_fold {\ +background-color: #BBDAFF;\ +border-color: #FFFFFF\ +}\ +.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,\ +.ace-tomorrow-night-blue .ace_support.ace_function,\ +.ace-tomorrow-night-blue .ace_variable {\ +color: #BBDAFF\ +}\ +.ace-tomorrow-night-blue .ace_support.ace_class,\ +.ace-tomorrow-night-blue .ace_support.ace_type {\ +color: #FFEEAD\ +}\ +.ace-tomorrow-night-blue .ace_heading,\ +.ace-tomorrow-night-blue .ace_markup.ace_heading,\ +.ace-tomorrow-night-blue .ace_string {\ +color: #D1F1A9\ +}\ +.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,\ +.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,\ +.ace-tomorrow-night-blue .ace_meta.ace_tag,\ +.ace-tomorrow-night-blue .ace_string.ace_regexp,\ +.ace-tomorrow-night-blue .ace_variable {\ +color: #FF9DA4\ +}\ +.ace-tomorrow-night-blue .ace_comment {\ +color: #7285B7\ +}\ +.ace-tomorrow-night-blue .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-tomorrow_night_bright.js b/modules/backend/assets/vendor/ace/theme-tomorrow_night_bright.js new file mode 100755 index 0000000..8514a0d --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-tomorrow_night_bright.js @@ -0,0 +1,121 @@ +ace.define("ace/theme/tomorrow_night_bright",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-tomorrow-night-bright"; +exports.cssText = ".ace-tomorrow-night-bright .ace_gutter {\ +background: #1a1a1a;\ +color: #DEDEDE\ +}\ +.ace-tomorrow-night-bright .ace_print-margin {\ +width: 1px;\ +background: #1a1a1a\ +}\ +.ace-tomorrow-night-bright {\ +background-color: #000000;\ +color: #DEDEDE\ +}\ +.ace-tomorrow-night-bright .ace_cursor {\ +color: #9F9F9F\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_selection {\ +background: #424242\ +}\ +.ace-tomorrow-night-bright.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #000000;\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #888888\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_highlight {\ +border: 1px solid rgb(110, 119, 0);\ +border-bottom: 0;\ +box-shadow: inset 0 -1px rgb(110, 119, 0);\ +margin: -1px 0 0 -1px;\ +background: rgba(255, 235, 0, 0.1)\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_active-line {\ +background: #2A2A2A\ +}\ +.ace-tomorrow-night-bright .ace_gutter-active-line {\ +background-color: #2A2A2A\ +}\ +.ace-tomorrow-night-bright .ace_stack {\ +background-color: rgb(66, 90, 44)\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_selected-word {\ +border: 1px solid #888888\ +}\ +.ace-tomorrow-night-bright .ace_invisible {\ +color: #343434\ +}\ +.ace-tomorrow-night-bright .ace_keyword,\ +.ace-tomorrow-night-bright .ace_meta,\ +.ace-tomorrow-night-bright .ace_storage,\ +.ace-tomorrow-night-bright .ace_storage.ace_type,\ +.ace-tomorrow-night-bright .ace_support.ace_type {\ +color: #C397D8\ +}\ +.ace-tomorrow-night-bright .ace_keyword.ace_operator {\ +color: #70C0B1\ +}\ +.ace-tomorrow-night-bright .ace_constant.ace_character,\ +.ace-tomorrow-night-bright .ace_constant.ace_language,\ +.ace-tomorrow-night-bright .ace_constant.ace_numeric,\ +.ace-tomorrow-night-bright .ace_keyword.ace_other.ace_unit,\ +.ace-tomorrow-night-bright .ace_support.ace_constant,\ +.ace-tomorrow-night-bright .ace_variable.ace_parameter {\ +color: #E78C45\ +}\ +.ace-tomorrow-night-bright .ace_constant.ace_other {\ +color: #EEEEEE\ +}\ +.ace-tomorrow-night-bright .ace_invalid {\ +color: #CED2CF;\ +background-color: #DF5F5F\ +}\ +.ace-tomorrow-night-bright .ace_invalid.ace_deprecated {\ +color: #CED2CF;\ +background-color: #B798BF\ +}\ +.ace-tomorrow-night-bright .ace_fold {\ +background-color: #7AA6DA;\ +border-color: #DEDEDE\ +}\ +.ace-tomorrow-night-bright .ace_entity.ace_name.ace_function,\ +.ace-tomorrow-night-bright .ace_support.ace_function,\ +.ace-tomorrow-night-bright .ace_variable {\ +color: #7AA6DA\ +}\ +.ace-tomorrow-night-bright .ace_support.ace_class,\ +.ace-tomorrow-night-bright .ace_support.ace_type {\ +color: #E7C547\ +}\ +.ace-tomorrow-night-bright .ace_heading,\ +.ace-tomorrow-night-bright .ace_markup.ace_heading,\ +.ace-tomorrow-night-bright .ace_string {\ +color: #B9CA4A\ +}\ +.ace-tomorrow-night-bright .ace_entity.ace_name.ace_tag,\ +.ace-tomorrow-night-bright .ace_entity.ace_other.ace_attribute-name,\ +.ace-tomorrow-night-bright .ace_meta.ace_tag,\ +.ace-tomorrow-night-bright .ace_string.ace_regexp,\ +.ace-tomorrow-night-bright .ace_variable {\ +color: #D54E53\ +}\ +.ace-tomorrow-night-bright .ace_comment {\ +color: #969896\ +}\ +.ace-tomorrow-night-bright .ace_c9searchresults.ace_keyword {\ +color: #C2C280\ +}\ +.ace-tomorrow-night-bright .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-tomorrow_night_eighties.js b/modules/backend/assets/vendor/ace/theme-tomorrow_night_eighties.js new file mode 100755 index 0000000..3665e3f --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-tomorrow_night_eighties.js @@ -0,0 +1,108 @@ +ace.define("ace/theme/tomorrow_night_eighties",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-tomorrow-night-eighties"; +exports.cssText = ".ace-tomorrow-night-eighties .ace_gutter {\ +background: #272727;\ +color: #CCC\ +}\ +.ace-tomorrow-night-eighties .ace_print-margin {\ +width: 1px;\ +background: #272727\ +}\ +.ace-tomorrow-night-eighties {\ +background-color: #2D2D2D;\ +color: #CCCCCC\ +}\ +.ace-tomorrow-night-eighties .ace_constant.ace_other,\ +.ace-tomorrow-night-eighties .ace_cursor {\ +color: #CCCCCC\ +}\ +.ace-tomorrow-night-eighties .ace_marker-layer .ace_selection {\ +background: #515151\ +}\ +.ace-tomorrow-night-eighties.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #2D2D2D;\ +}\ +.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-tomorrow-night-eighties .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #6A6A6A\ +}\ +.ace-tomorrow-night-bright .ace_stack {\ +background: rgb(66, 90, 44)\ +}\ +.ace-tomorrow-night-eighties .ace_marker-layer .ace_active-line {\ +background: #393939\ +}\ +.ace-tomorrow-night-eighties .ace_gutter-active-line {\ +background-color: #393939\ +}\ +.ace-tomorrow-night-eighties .ace_marker-layer .ace_selected-word {\ +border: 1px solid #515151\ +}\ +.ace-tomorrow-night-eighties .ace_invisible {\ +color: #6A6A6A\ +}\ +.ace-tomorrow-night-eighties .ace_keyword,\ +.ace-tomorrow-night-eighties .ace_meta,\ +.ace-tomorrow-night-eighties .ace_storage,\ +.ace-tomorrow-night-eighties .ace_storage.ace_type,\ +.ace-tomorrow-night-eighties .ace_support.ace_type {\ +color: #CC99CC\ +}\ +.ace-tomorrow-night-eighties .ace_keyword.ace_operator {\ +color: #66CCCC\ +}\ +.ace-tomorrow-night-eighties .ace_constant.ace_character,\ +.ace-tomorrow-night-eighties .ace_constant.ace_language,\ +.ace-tomorrow-night-eighties .ace_constant.ace_numeric,\ +.ace-tomorrow-night-eighties .ace_keyword.ace_other.ace_unit,\ +.ace-tomorrow-night-eighties .ace_support.ace_constant,\ +.ace-tomorrow-night-eighties .ace_variable.ace_parameter {\ +color: #F99157\ +}\ +.ace-tomorrow-night-eighties .ace_invalid {\ +color: #CDCDCD;\ +background-color: #F2777A\ +}\ +.ace-tomorrow-night-eighties .ace_invalid.ace_deprecated {\ +color: #CDCDCD;\ +background-color: #CC99CC\ +}\ +.ace-tomorrow-night-eighties .ace_fold {\ +background-color: #6699CC;\ +border-color: #CCCCCC\ +}\ +.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_function,\ +.ace-tomorrow-night-eighties .ace_support.ace_function,\ +.ace-tomorrow-night-eighties .ace_variable {\ +color: #6699CC\ +}\ +.ace-tomorrow-night-eighties .ace_support.ace_class,\ +.ace-tomorrow-night-eighties .ace_support.ace_type {\ +color: #FFCC66\ +}\ +.ace-tomorrow-night-eighties .ace_heading,\ +.ace-tomorrow-night-eighties .ace_markup.ace_heading,\ +.ace-tomorrow-night-eighties .ace_string {\ +color: #99CC99\ +}\ +.ace-tomorrow-night-eighties .ace_comment {\ +color: #999999\ +}\ +.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_tag,\ +.ace-tomorrow-night-eighties .ace_entity.ace_other.ace_attribute-name,\ +.ace-tomorrow-night-eighties .ace_meta.ace_tag,\ +.ace-tomorrow-night-eighties .ace_variable {\ +color: #F2777A\ +}\ +.ace-tomorrow-night-eighties .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-twilight.js b/modules/backend/assets/vendor/ace/theme-twilight.js new file mode 100755 index 0000000..48ec030 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-twilight.js @@ -0,0 +1,109 @@ +ace.define("ace/theme/twilight",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-twilight"; +exports.cssText = ".ace-twilight .ace_gutter {\ +background: #232323;\ +color: #E2E2E2\ +}\ +.ace-twilight .ace_print-margin {\ +width: 1px;\ +background: #232323\ +}\ +.ace-twilight {\ +background-color: #141414;\ +color: #F8F8F8\ +}\ +.ace-twilight .ace_cursor {\ +color: #A7A7A7\ +}\ +.ace-twilight .ace_marker-layer .ace_selection {\ +background: rgba(221, 240, 255, 0.20)\ +}\ +.ace-twilight.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #141414;\ +}\ +.ace-twilight .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-twilight .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 255, 255, 0.25)\ +}\ +.ace-twilight .ace_marker-layer .ace_active-line {\ +background: rgba(255, 255, 255, 0.031)\ +}\ +.ace-twilight .ace_gutter-active-line {\ +background-color: rgba(255, 255, 255, 0.031)\ +}\ +.ace-twilight .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(221, 240, 255, 0.20)\ +}\ +.ace-twilight .ace_invisible {\ +color: rgba(255, 255, 255, 0.25)\ +}\ +.ace-twilight .ace_keyword,\ +.ace-twilight .ace_meta {\ +color: #CDA869\ +}\ +.ace-twilight .ace_constant,\ +.ace-twilight .ace_constant.ace_character,\ +.ace-twilight .ace_constant.ace_character.ace_escape,\ +.ace-twilight .ace_constant.ace_other,\ +.ace-twilight .ace_heading,\ +.ace-twilight .ace_markup.ace_heading,\ +.ace-twilight .ace_support.ace_constant {\ +color: #CF6A4C\ +}\ +.ace-twilight .ace_invalid.ace_illegal {\ +color: #F8F8F8;\ +background-color: rgba(86, 45, 86, 0.75)\ +}\ +.ace-twilight .ace_invalid.ace_deprecated {\ +text-decoration: underline;\ +font-style: italic;\ +color: #D2A8A1\ +}\ +.ace-twilight .ace_support {\ +color: #9B859D\ +}\ +.ace-twilight .ace_fold {\ +background-color: #AC885B;\ +border-color: #F8F8F8\ +}\ +.ace-twilight .ace_support.ace_function {\ +color: #DAD085\ +}\ +.ace-twilight .ace_list,\ +.ace-twilight .ace_markup.ace_list,\ +.ace-twilight .ace_storage {\ +color: #F9EE98\ +}\ +.ace-twilight .ace_entity.ace_name.ace_function,\ +.ace-twilight .ace_meta.ace_tag,\ +.ace-twilight .ace_variable {\ +color: #AC885B\ +}\ +.ace-twilight .ace_string {\ +color: #8F9D6A\ +}\ +.ace-twilight .ace_string.ace_regexp {\ +color: #E9C062\ +}\ +.ace-twilight .ace_comment {\ +font-style: italic;\ +color: #5F5A60\ +}\ +.ace-twilight .ace_variable {\ +color: #7587A6\ +}\ +.ace-twilight .ace_xml-pe {\ +color: #494949\ +}\ +.ace-twilight .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-vibrant_ink.js b/modules/backend/assets/vendor/ace/theme-vibrant_ink.js new file mode 100755 index 0000000..db926c7 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-vibrant_ink.js @@ -0,0 +1,94 @@ +ace.define("ace/theme/vibrant_ink",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-vibrant-ink"; +exports.cssText = ".ace-vibrant-ink .ace_gutter {\ +background: #1a1a1a;\ +color: #BEBEBE\ +}\ +.ace-vibrant-ink .ace_print-margin {\ +width: 1px;\ +background: #1a1a1a\ +}\ +.ace-vibrant-ink {\ +background-color: #0F0F0F;\ +color: #FFFFFF\ +}\ +.ace-vibrant-ink .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-vibrant-ink .ace_marker-layer .ace_selection {\ +background: #6699CC\ +}\ +.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #0F0F0F;\ +}\ +.ace-vibrant-ink .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-vibrant-ink .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #404040\ +}\ +.ace-vibrant-ink .ace_marker-layer .ace_active-line {\ +background: #333333\ +}\ +.ace-vibrant-ink .ace_gutter-active-line {\ +background-color: #333333\ +}\ +.ace-vibrant-ink .ace_marker-layer .ace_selected-word {\ +border: 1px solid #6699CC\ +}\ +.ace-vibrant-ink .ace_invisible {\ +color: #404040\ +}\ +.ace-vibrant-ink .ace_keyword,\ +.ace-vibrant-ink .ace_meta {\ +color: #FF6600\ +}\ +.ace-vibrant-ink .ace_constant,\ +.ace-vibrant-ink .ace_constant.ace_character,\ +.ace-vibrant-ink .ace_constant.ace_character.ace_escape,\ +.ace-vibrant-ink .ace_constant.ace_other {\ +color: #339999\ +}\ +.ace-vibrant-ink .ace_constant.ace_numeric {\ +color: #99CC99\ +}\ +.ace-vibrant-ink .ace_invalid,\ +.ace-vibrant-ink .ace_invalid.ace_deprecated {\ +color: #CCFF33;\ +background-color: #000000\ +}\ +.ace-vibrant-ink .ace_fold {\ +background-color: #FFCC00;\ +border-color: #FFFFFF\ +}\ +.ace-vibrant-ink .ace_entity.ace_name.ace_function,\ +.ace-vibrant-ink .ace_support.ace_function,\ +.ace-vibrant-ink .ace_variable {\ +color: #FFCC00\ +}\ +.ace-vibrant-ink .ace_variable.ace_parameter {\ +font-style: italic\ +}\ +.ace-vibrant-ink .ace_string {\ +color: #66FF00\ +}\ +.ace-vibrant-ink .ace_string.ace_regexp {\ +color: #44B4CC\ +}\ +.ace-vibrant-ink .ace_comment {\ +color: #9933CC\ +}\ +.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {\ +font-style: italic;\ +color: #99CC99\ +}\ +.ace-vibrant-ink .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYNDTc/oPAALPAZ7hxlbYAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/theme-xcode.js b/modules/backend/assets/vendor/ace/theme-xcode.js new file mode 100755 index 0000000..3604a17 --- /dev/null +++ b/modules/backend/assets/vendor/ace/theme-xcode.js @@ -0,0 +1,88 @@ +ace.define("ace/theme/xcode",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-xcode"; +exports.cssText = "\ +.ace-xcode .ace_gutter {\ +background: #e8e8e8;\ +color: #333\ +}\ +.ace-xcode .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-xcode {\ +background-color: #FFFFFF;\ +color: #000000\ +}\ +.ace-xcode .ace_cursor {\ +color: #000000\ +}\ +.ace-xcode .ace_marker-layer .ace_selection {\ +background: #B5D5FF\ +}\ +.ace-xcode.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #FFFFFF;\ +}\ +.ace-xcode .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174)\ +}\ +.ace-xcode .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #BFBFBF\ +}\ +.ace-xcode .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.071)\ +}\ +.ace-xcode .ace_gutter-active-line {\ +background-color: rgba(0, 0, 0, 0.071)\ +}\ +.ace-xcode .ace_marker-layer .ace_selected-word {\ +border: 1px solid #B5D5FF\ +}\ +.ace-xcode .ace_constant.ace_language,\ +.ace-xcode .ace_keyword,\ +.ace-xcode .ace_meta,\ +.ace-xcode .ace_variable.ace_language {\ +color: #C800A4\ +}\ +.ace-xcode .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-xcode .ace_constant.ace_character,\ +.ace-xcode .ace_constant.ace_other {\ +color: #275A5E\ +}\ +.ace-xcode .ace_constant.ace_numeric {\ +color: #3A00DC\ +}\ +.ace-xcode .ace_entity.ace_other.ace_attribute-name,\ +.ace-xcode .ace_support.ace_constant,\ +.ace-xcode .ace_support.ace_function {\ +color: #450084\ +}\ +.ace-xcode .ace_fold {\ +background-color: #C800A4;\ +border-color: #000000\ +}\ +.ace-xcode .ace_entity.ace_name.ace_tag,\ +.ace-xcode .ace_support.ace_class,\ +.ace-xcode .ace_support.ace_type {\ +color: #790EAD\ +}\ +.ace-xcode .ace_storage {\ +color: #C900A4\ +}\ +.ace-xcode .ace_string {\ +color: #DF0002\ +}\ +.ace-xcode .ace_comment {\ +color: #008E00\ +}\ +.ace-xcode .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/modules/backend/assets/vendor/ace/worker-css.js b/modules/backend/assets/vendor/ace/worker-css.js new file mode 100755 index 0000000..28774f7 --- /dev/null +++ b/modules/backend/assets/vendor/ace/worker-css.js @@ -0,0 +1,8762 @@ +"no use strict"; +;(function(window) { +if (typeof window.window != "undefined" && window.document) + return; +if (window.require && window.define) + return; + +if (!window.console) { + window.console = function() { + var msgs = Array.prototype.slice.call(arguments, 0); + postMessage({type: "log", data: msgs}); + }; + window.console.error = + window.console.warn = + window.console.log = + window.console.trace = window.console; +} +window.window = window; +window.ace = window; + +window.onerror = function(message, file, line, col, err) { + postMessage({type: "error", data: { + message: message, + data: err.data, + file: file, + line: line, + col: col, + stack: err.stack + }}); +}; + +window.normalizeModule = function(parentId, moduleName) { + // normalize plugin requires + if (moduleName.indexOf("!") !== -1) { + var chunks = moduleName.split("!"); + return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]); + } + // normalize relative requires + if (moduleName.charAt(0) == ".") { + var base = parentId.split("/").slice(0, -1).join("/"); + moduleName = (base ? base + "/" : "") + moduleName; + + while (moduleName.indexOf(".") !== -1 && previous != moduleName) { + var previous = moduleName; + moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); + } + } + + return moduleName; +}; + +window.require = function require(parentId, id) { + if (!id) { + id = parentId; + parentId = null; + } + if (!id.charAt) + throw new Error("worker.js require() accepts only (parentId, id) as arguments"); + + id = window.normalizeModule(parentId, id); + + var module = window.require.modules[id]; + if (module) { + if (!module.initialized) { + module.initialized = true; + module.exports = module.factory().exports; + } + return module.exports; + } + + if (!window.require.tlns) + return console.log("unable to load " + id); + + var path = resolveModuleId(id, window.require.tlns); + if (path.slice(-3) != ".js") path += ".js"; + + window.require.id = id; + window.require.modules[id] = {}; // prevent infinite loop on broken modules + importScripts(path); + return window.require(parentId, id); +}; +function resolveModuleId(id, paths) { + var testPath = id, tail = ""; + while (testPath) { + var alias = paths[testPath]; + if (typeof alias == "string") { + return alias + tail; + } else if (alias) { + return alias.location.replace(/\/*$/, "/") + (tail || alias.main || alias.name); + } else if (alias === false) { + return ""; + } + var i = testPath.lastIndexOf("/"); + if (i === -1) break; + tail = testPath.substr(i) + tail; + testPath = testPath.slice(0, i); + } + return id; +} +window.require.modules = {}; +window.require.tlns = {}; + +window.define = function(id, deps, factory) { + if (arguments.length == 2) { + factory = deps; + if (typeof id != "string") { + deps = id; + id = window.require.id; + } + } else if (arguments.length == 1) { + factory = id; + deps = []; + id = window.require.id; + } + + if (typeof factory != "function") { + window.require.modules[id] = { + exports: factory, + initialized: true + }; + return; + } + + if (!deps.length) + // If there is no dependencies, we inject "require", "exports" and + // "module" as dependencies, to provide CommonJS compatibility. + deps = ["require", "exports", "module"]; + + var req = function(childId) { + return window.require(id, childId); + }; + + window.require.modules[id] = { + exports: {}, + factory: function() { + var module = this; + var returnExports = factory.apply(this, deps.map(function(dep) { + switch (dep) { + // Because "require", "exports" and "module" aren't actual + // dependencies, we must handle them seperately. + case "require": return req; + case "exports": return module.exports; + case "module": return module; + // But for all other dependencies, we can just go ahead and + // require them. + default: return req(dep); + } + })); + if (returnExports) + module.exports = returnExports; + return module; + } + }; +}; +window.define.amd = {}; +require.tlns = {}; +window.initBaseUrls = function initBaseUrls(topLevelNamespaces) { + for (var i in topLevelNamespaces) + require.tlns[i] = topLevelNamespaces[i]; +}; + +window.initSender = function initSender() { + + var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter; + var oop = window.require("ace/lib/oop"); + + var Sender = function() {}; + + (function() { + + oop.implement(this, EventEmitter); + + this.callback = function(data, callbackId) { + postMessage({ + type: "call", + id: callbackId, + data: data + }); + }; + + this.emit = function(name, data) { + postMessage({ + type: "event", + name: name, + data: data + }); + }; + + }).call(Sender.prototype); + + return new Sender(); +}; + +var main = window.main = null; +var sender = window.sender = null; + +window.onmessage = function(e) { + var msg = e.data; + if (msg.event && sender) { + sender._signal(msg.event, msg.data); + } + else if (msg.command) { + if (main[msg.command]) + main[msg.command].apply(main, msg.args); + else if (window[msg.command]) + window[msg.command].apply(window, msg.args); + else + throw new Error("Unknown command:" + msg.command); + } + else if (msg.init) { + window.initBaseUrls(msg.tlns); + require("ace/lib/es5-shim"); + sender = window.sender = window.initSender(); + var clazz = require(msg.module)[msg.classname]; + main = window.main = new clazz(sender); + } +}; +})(this); + +ace.define("ace/lib/oop",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.inherits = function(ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); +}; + +exports.mixin = function(obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; + } + return obj; +}; + +exports.implement = function(proto, mixin) { + exports.mixin(proto, mixin); +}; + +}); + +ace.define("ace/lib/lang",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.last = function(a) { + return a[a.length - 1]; +}; + +exports.stringReverse = function(string) { + return string.split("").reverse().join(""); +}; + +exports.stringRepeat = function (string, count) { + var result = ''; + while (count > 0) { + if (count & 1) + result += string; + + if (count >>= 1) + string += string; + } + return result; +}; + +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; + +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; + +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; + +exports.copyObject = function(obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; + +exports.copyArray = function(array){ + var copy = []; + for (var i=0, l=array.length; i [" + this.end.row + "/" + this.end.column + "]"); + }; + + this.contains = function(row, column) { + return this.compare(row, column) == 0; + }; + this.compareRange = function(range) { + var cmp, + end = range.end, + start = range.start; + + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } else if (cmp == 0) { + return 1; + } else { + return 0; + } + } else if (cmp == -1) { + return -2; + } else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } else if (cmp == 1) { + return 42; + } else { + return 0; + } + } + }; + this.comparePoint = function(p) { + return this.compare(p.row, p.column); + }; + this.containsRange = function(range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + }; + this.intersects = function(range) { + var cmp = this.compareRange(range); + return (cmp == -1 || cmp == 0 || cmp == 1); + }; + this.isEnd = function(row, column) { + return this.end.row == row && this.end.column == column; + }; + this.isStart = function(row, column) { + return this.start.row == row && this.start.column == column; + }; + this.setStart = function(row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } else { + this.start.row = row; + this.start.column = column; + } + }; + this.setEnd = function(row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } else { + this.end.row = row; + this.end.column = column; + } + }; + this.inside = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideStart = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideEnd = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.compare = function(row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + } + } + + if (row < this.start.row) + return -1; + + if (row > this.end.row) + return 1; + + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + + return 0; + }; + this.compareStart = function(row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.compareEnd = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else { + return this.compare(row, column); + } + }; + this.compareInside = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.clipRows = function(firstRow, lastRow) { + if (this.end.row > lastRow) + var end = {row: lastRow + 1, column: 0}; + else if (this.end.row < firstRow) + var end = {row: firstRow, column: 0}; + + if (this.start.row > lastRow) + var start = {row: lastRow + 1, column: 0}; + else if (this.start.row < firstRow) + var start = {row: firstRow, column: 0}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + this.extend = function(row, column) { + var cmp = this.compare(row, column); + + if (cmp == 0) + return this; + else if (cmp == -1) + var start = {row: row, column: column}; + else + var end = {row: row, column: column}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.isEmpty = function() { + return (this.start.row === this.end.row && this.start.column === this.end.column); + }; + this.isMultiLine = function() { + return (this.start.row !== this.end.row); + }; + this.clone = function() { + return Range.fromPoints(this.start, this.end); + }; + this.collapseRows = function() { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) + else + return new Range(this.start.row, 0, this.end.row, 0) + }; + this.toScreenRange = function(session) { + var screenPosStart = session.documentToScreenPosition(this.start); + var screenPosEnd = session.documentToScreenPosition(this.end); + + return new Range( + screenPosStart.row, screenPosStart.column, + screenPosEnd.row, screenPosEnd.column + ); + }; + this.moveBy = function(row, column) { + this.start.row += row; + this.start.column += column; + this.end.row += row; + this.end.column += column; + }; + +}).call(Range.prototype); +Range.fromPoints = function(start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; +Range.comparePoints = comparePoints; + +Range.comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; + + +exports.Range = Range; +}); + +ace.define("ace/apply_delta",["require","exports","module"], function(require, exports, module) { +"use strict"; + +function throwDeltaError(delta, errorText){ + console.log("Invalid Delta:", delta); + throw "Invalid Delta: " + errorText; +} + +function positionInDocument(docLines, position) { + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; +} + +function validateDelta(docLines, delta) { + if (delta.action != "insert" && delta.action != "remove") + throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); + if (!(delta.lines instanceof Array)) + throwDeltaError(delta, "delta.lines must be an Array"); + if (!delta.start || !delta.end) + throwDeltaError(delta, "delta.start/end must be an present"); + var start = delta.start; + if (!positionInDocument(docLines, delta.start)) + throwDeltaError(delta, "delta.start must be contained in document"); + var end = delta.end; + if (delta.action == "remove" && !positionInDocument(docLines, end)) + throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); + var numRangeRows = end.row - start.row; + var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); + if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) + throwDeltaError(delta, "delta.range must match delta lines"); +} + +exports.applyDelta = function(docLines, delta, doNotValidate) { + + var row = delta.start.row; + var startColumn = delta.start.column; + var line = docLines[row] || ""; + switch (delta.action) { + case "insert": + var lines = delta.lines; + if (lines.length === 1) { + docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); + } else { + var args = [row, 1].concat(delta.lines); + docLines.splice.apply(docLines, args); + docLines[row] = line.substring(0, startColumn) + docLines[row]; + docLines[row + delta.lines.length - 1] += line.substring(startColumn); + } + break; + case "remove": + var endColumn = delta.end.column; + var endRow = delta.end.row; + if (row === endRow) { + docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); + } else { + docLines.splice( + row, endRow - row + 1, + line.substring(0, startColumn) + docLines[endRow].substring(endColumn) + ); + } + break; + } +} +}); + +ace.define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var EventEmitter = {}; +var stopPropagation = function() { this.propagationStopped = true; }; +var preventDefault = function() { this.defaultPrevented = true; }; + +EventEmitter._emit = +EventEmitter._dispatchEvent = function(eventName, e) { + this._eventRegistry || (this._eventRegistry = {}); + this._defaultHandlers || (this._defaultHandlers = {}); + + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + + if (typeof e != "object" || !e) + e = {}; + + if (!e.type) + e.type = eventName; + if (!e.stopPropagation) + e.stopPropagation = stopPropagation; + if (!e.preventDefault) + e.preventDefault = preventDefault; + + listeners = listeners.slice(); + for (var i=0; i this.row) + return; + + var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight); + this.setPosition(point.row, point.column, true); + }; + + function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); + } + + function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + + return { + row: deltaStart.row, + column: deltaStart.column + }; + } + this.setPosition = function(row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } else { + pos = this.$clipPositionToDocument(row, column); + } + + if (this.row == pos.row && this.column == pos.column) + return; + + var old = { + row: this.row, + column: this.column + }; + + this.row = pos.row; + this.column = pos.column; + this._signal("change", { + old: old, + value: pos + }); + }; + this.detach = function() { + this.document.removeEventListener("change", this.$onChange); + }; + this.attach = function(doc) { + this.document = doc || this.document; + this.document.on("change", this.$onChange); + }; + this.$clipPositionToDocument = function(row, column) { + var pos = {}; + + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + + if (column < 0) + pos.column = 0; + + return pos; + }; + +}).call(Anchor.prototype); + +}); + +ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var applyDelta = require("./apply_delta").applyDelta; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; + +var Document = function(textOrLines) { + this.$lines = [""]; + if (textOrLines.length === 0) { + this.$lines = [""]; + } else if (Array.isArray(textOrLines)) { + this.insertMergedLines({row: 0, column: 0}, textOrLines); + } else { + this.insert({row: 0, column:0}, textOrLines); + } +}; + +(function() { + + oop.implement(this, EventEmitter); + this.setValue = function(text) { + var len = this.getLength() - 1; + this.remove(new Range(0, 0, len, this.getLine(len).length)); + this.insert({row: 0, column: 0}, text); + }; + this.getValue = function() { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + this.createAnchor = function(row, column) { + return new Anchor(this, row, column); + }; + if ("aaa".split(/a/).length === 0) { + this.$split = function(text) { + return text.replace(/\r\n|\r/g, "\n").split("\n"); + }; + } else { + this.$split = function(text) { + return text.split(/\r\n|\r|\n/); + }; + } + + + this.$detectNewLine = function(text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + this.$autoNewLine = match ? match[1] : "\n"; + this._signal("changeNewLineMode"); + }; + this.getNewLineCharacter = function() { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; + } + }; + + this.$autoNewLine = ""; + this.$newLineMode = "auto"; + this.setNewLineMode = function(newLineMode) { + if (this.$newLineMode === newLineMode) + return; + + this.$newLineMode = newLineMode; + this._signal("changeNewLineMode"); + }; + this.getNewLineMode = function() { + return this.$newLineMode; + }; + this.isNewLine = function(text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + this.getLine = function(row) { + return this.$lines[row] || ""; + }; + this.getLines = function(firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + this.getAllLines = function() { + return this.getLines(0, this.getLength()); + }; + this.getLength = function() { + return this.$lines.length; + }; + this.getTextRange = function(range) { + return this.getLinesForRange(range).join(this.getNewLineCharacter()); + }; + this.getLinesForRange = function(range) { + var lines; + if (range.start.row === range.end.row) { + lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; + } else { + lines = this.getLines(range.start.row, range.end.row); + lines[0] = (lines[0] || "").substring(range.start.column); + var l = lines.length - 1; + if (range.end.row - range.start.row == l) + lines[l] = lines[l].substring(0, range.end.column); + } + return lines; + }; + this.insertLines = function(row, lines) { + console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); + return this.insertFullLines(row, lines); + }; + this.removeLines = function(firstRow, lastRow) { + console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); + return this.removeFullLines(firstRow, lastRow); + }; + this.insertNewLine = function(position) { + console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\'\', \'\']) instead."); + return this.insertMergedLines(position, ["", ""]); + }; + this.insert = function(position, text) { + if (this.getLength() <= 1) + this.$detectNewLine(text); + + return this.insertMergedLines(position, this.$split(text)); + }; + this.insertInLine = function(position, text) { + var start = this.clippedPos(position.row, position.column); + var end = this.pos(position.row, position.column + text.length); + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: [text] + }, true); + + return this.clonePos(end); + }; + + this.clippedPos = function(row, column) { + var length = this.getLength(); + if (row === undefined) { + row = length; + } else if (row < 0) { + row = 0; + } else if (row >= length) { + row = length - 1; + column = undefined; + } + var line = this.getLine(row); + if (column == undefined) + column = line.length; + column = Math.min(Math.max(column, 0), line.length); + return {row: row, column: column}; + }; + + this.clonePos = function(pos) { + return {row: pos.row, column: pos.column}; + }; + + this.pos = function(row, column) { + return {row: row, column: column}; + }; + + this.$clipPosition = function(position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length - 1).length; + } else { + position.row = Math.max(0, position.row); + position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); + } + return position; + }; + this.insertFullLines = function(row, lines) { + row = Math.min(Math.max(row, 0), this.getLength()); + var column = 0; + if (row < this.getLength()) { + lines = lines.concat([""]); + column = 0; + } else { + lines = [""].concat(lines); + row--; + column = this.$lines[row].length; + } + this.insertMergedLines({row: row, column: column}, lines); + }; + this.insertMergedLines = function(position, lines) { + var start = this.clippedPos(position.row, position.column); + var end = { + row: start.row + lines.length - 1, + column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length + }; + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: lines + }); + + return this.clonePos(end); + }; + this.remove = function(range) { + var start = this.clippedPos(range.start.row, range.start.column); + var end = this.clippedPos(range.end.row, range.end.column); + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }); + return this.clonePos(start); + }; + this.removeInLine = function(row, startColumn, endColumn) { + var start = this.clippedPos(row, startColumn); + var end = this.clippedPos(row, endColumn); + + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }, true); + + return this.clonePos(start); + }; + this.removeFullLines = function(firstRow, lastRow) { + firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1); + var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow ); + var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 ); + var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow ); + var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); + var range = new Range(startRow, startCol, endRow, endCol); + var deletedLines = this.$lines.slice(firstRow, lastRow + 1); + + this.applyDelta({ + start: range.start, + end: range.end, + action: "remove", + lines: this.getLinesForRange(range) + }); + return deletedLines; + }; + this.removeNewLine = function(row) { + if (row < this.getLength() - 1 && row >= 0) { + this.applyDelta({ + start: this.pos(row, this.getLine(row).length), + end: this.pos(row + 1, 0), + action: "remove", + lines: ["", ""] + }); + } + }; + this.replace = function(range, text) { + if (!(range instanceof Range)) + range = Range.fromPoints(range.start, range.end); + if (text.length === 0 && range.isEmpty()) + return range.start; + if (text == this.getTextRange(range)) + return range.end; + + this.remove(range); + var end; + if (text) { + end = this.insert(range.start, text); + } + else { + end = range.start; + } + + return end; + }; + this.applyDeltas = function(deltas) { + for (var i=0; i=0; i--) { + this.revertDelta(deltas[i]); + } + }; + this.applyDelta = function(delta, doNotValidate) { + var isInsert = delta.action == "insert"; + if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] + : !Range.comparePoints(delta.start, delta.end)) { + return; + } + + if (isInsert && delta.lines.length > 20000) + this.$splitAndapplyLargeDelta(delta, 20000); + applyDelta(this.$lines, delta, doNotValidate); + this._signal("change", delta); + }; + + this.$splitAndapplyLargeDelta = function(delta, MAX) { + var lines = delta.lines; + var l = lines.length; + var row = delta.start.row; + var column = delta.start.column; + var from = 0, to = 0; + do { + from = to; + to += MAX - 1; + var chunk = lines.slice(from, to); + if (to > l) { + delta.lines = chunk; + delta.start.row = row + from; + delta.start.column = column; + break; + } + chunk.push(""); + this.applyDelta({ + start: this.pos(row + from, column), + end: this.pos(row + to, column = 0), + action: delta.action, + lines: chunk + }, true); + } while(true); + }; + this.revertDelta = function(delta) { + this.applyDelta({ + start: this.clonePos(delta.start), + end: this.clonePos(delta.end), + action: (delta.action == "insert" ? "remove" : "insert"), + lines: delta.lines.slice() + }); + }; + this.indexToPosition = function(index, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + for (var i = startRow || 0, l = lines.length; i < l; i++) { + index -= lines[i].length + newlineLength; + if (index < 0) + return {row: i, column: index + lines[i].length + newlineLength}; + } + return {row: l-1, column: lines[l-1].length}; + }; + this.positionToIndex = function(pos, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + var index = 0; + var row = Math.min(pos.row, lines.length); + for (var i = startRow || 0; i < row; ++i) + index += lines[i].length + newlineLength; + + return index + pos.column; + }; + +}).call(Document.prototype); + +exports.Document = Document; +}); + +ace.define("ace/worker/mirror",["require","exports","module","ace/range","ace/document","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +var Document = require("../document").Document; +var lang = require("../lib/lang"); + +var Mirror = exports.Mirror = function(sender) { + this.sender = sender; + var doc = this.doc = new Document(""); + + var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this)); + + var _self = this; + sender.on("change", function(e) { + var data = e.data; + if (data[0].start) { + doc.applyDeltas(data); + } else { + for (var i = 0; i < data.length; i += 2) { + if (Array.isArray(data[i+1])) { + var d = {action: "insert", start: data[i], lines: data[i+1]}; + } else { + var d = {action: "remove", start: data[i], end: data[i+1]}; + } + doc.applyDelta(d, true); + } + } + if (_self.$timeout) + return deferredUpdate.schedule(_self.$timeout); + _self.onUpdate(); + }); +}; + +(function() { + + this.$timeout = 500; + + this.setTimeout = function(timeout) { + this.$timeout = timeout; + }; + + this.setValue = function(value) { + this.doc.setValue(value); + this.deferredUpdate.schedule(this.$timeout); + }; + + this.getValue = function(callbackId) { + this.sender.callback(this.doc.getValue(), callbackId); + }; + + this.onUpdate = function() { + }; + + this.isPending = function() { + return this.deferredUpdate.isPending(); + }; + +}).call(Mirror.prototype); + +}); + +ace.define("ace/mode/css/csslint",["require","exports","module"], function(require, exports, module) { +var parserlib = {}; +(function(){ +function EventTarget(){ + this._listeners = {}; +} + +EventTarget.prototype = { + constructor: EventTarget, + addListener: function(type, listener){ + if (!this._listeners[type]){ + this._listeners[type] = []; + } + + this._listeners[type].push(listener); + }, + fire: function(event){ + if (typeof event == "string"){ + event = { type: event }; + } + if (typeof event.target != "undefined"){ + event.target = this; + } + + if (typeof event.type == "undefined"){ + throw new Error("Event object missing 'type' property."); + } + + if (this._listeners[event.type]){ + var listeners = this._listeners[event.type].concat(); + for (var i=0, len=listeners.length; i < len; i++){ + listeners[i].call(this, event); + } + } + }, + removeListener: function(type, listener){ + if (this._listeners[type]){ + var listeners = this._listeners[type]; + for (var i=0, len=listeners.length; i < len; i++){ + if (listeners[i] === listener){ + listeners.splice(i, 1); + break; + } + } + + + } + } +}; +function StringReader(text){ + this._input = text.replace(/\n\r?/g, "\n"); + this._line = 1; + this._col = 1; + this._cursor = 0; +} + +StringReader.prototype = { + constructor: StringReader, + getCol: function(){ + return this._col; + }, + getLine: function(){ + return this._line ; + }, + eof: function(){ + return (this._cursor == this._input.length); + }, + peek: function(count){ + var c = null; + count = (typeof count == "undefined" ? 1 : count); + if (this._cursor < this._input.length){ + c = this._input.charAt(this._cursor + count - 1); + } + + return c; + }, + read: function(){ + var c = null; + if (this._cursor < this._input.length){ + if (this._input.charAt(this._cursor) == "\n"){ + this._line++; + this._col=1; + } else { + this._col++; + } + c = this._input.charAt(this._cursor++); + } + + return c; + }, + mark: function(){ + this._bookmark = { + cursor: this._cursor, + line: this._line, + col: this._col + }; + }, + + reset: function(){ + if (this._bookmark){ + this._cursor = this._bookmark.cursor; + this._line = this._bookmark.line; + this._col = this._bookmark.col; + delete this._bookmark; + } + }, + readTo: function(pattern){ + + var buffer = "", + c; + while (buffer.length < pattern.length || buffer.lastIndexOf(pattern) != buffer.length - pattern.length){ + c = this.read(); + if (c){ + buffer += c; + } else { + throw new Error("Expected \"" + pattern + "\" at line " + this._line + ", col " + this._col + "."); + } + } + + return buffer; + + }, + readWhile: function(filter){ + + var buffer = "", + c = this.read(); + + while(c !== null && filter(c)){ + buffer += c; + c = this.read(); + } + + return buffer; + + }, + readMatch: function(matcher){ + + var source = this._input.substring(this._cursor), + value = null; + if (typeof matcher == "string"){ + if (source.indexOf(matcher) === 0){ + value = this.readCount(matcher.length); + } + } else if (matcher instanceof RegExp){ + if (matcher.test(source)){ + value = this.readCount(RegExp.lastMatch.length); + } + } + + return value; + }, + readCount: function(count){ + var buffer = ""; + + while(count--){ + buffer += this.read(); + } + + return buffer; + } + +}; +function SyntaxError(message, line, col){ + this.col = col; + this.line = line; + this.message = message; + +} +SyntaxError.prototype = new Error(); +function SyntaxUnit(text, line, col, type){ + this.col = col; + this.line = line; + this.text = text; + this.type = type; +} +SyntaxUnit.fromToken = function(token){ + return new SyntaxUnit(token.value, token.startLine, token.startCol); +}; + +SyntaxUnit.prototype = { + constructor: SyntaxUnit, + valueOf: function(){ + return this.text; + }, + toString: function(){ + return this.text; + } + +}; +function TokenStreamBase(input, tokenData){ + this._reader = input ? new StringReader(input.toString()) : null; + this._token = null; + this._tokenData = tokenData; + this._lt = []; + this._ltIndex = 0; + + this._ltIndexCache = []; +} +TokenStreamBase.createTokenData = function(tokens){ + + var nameMap = [], + typeMap = {}, + tokenData = tokens.concat([]), + i = 0, + len = tokenData.length+1; + + tokenData.UNKNOWN = -1; + tokenData.unshift({name:"EOF"}); + + for (; i < len; i++){ + nameMap.push(tokenData[i].name); + tokenData[tokenData[i].name] = i; + if (tokenData[i].text){ + typeMap[tokenData[i].text] = i; + } + } + + tokenData.name = function(tt){ + return nameMap[tt]; + }; + + tokenData.type = function(c){ + return typeMap[c]; + }; + + return tokenData; +}; + +TokenStreamBase.prototype = { + constructor: TokenStreamBase, + match: function(tokenTypes, channel){ + if (!(tokenTypes instanceof Array)){ + tokenTypes = [tokenTypes]; + } + + var tt = this.get(channel), + i = 0, + len = tokenTypes.length; + + while(i < len){ + if (tt == tokenTypes[i++]){ + return true; + } + } + this.unget(); + return false; + }, + mustMatch: function(tokenTypes, channel){ + + var token; + if (!(tokenTypes instanceof Array)){ + tokenTypes = [tokenTypes]; + } + + if (!this.match.apply(this, arguments)){ + token = this.LT(1); + throw new SyntaxError("Expected " + this._tokenData[tokenTypes[0]].name + + " at line " + token.startLine + ", col " + token.startCol + ".", token.startLine, token.startCol); + } + }, + advance: function(tokenTypes, channel){ + + while(this.LA(0) !== 0 && !this.match(tokenTypes, channel)){ + this.get(); + } + + return this.LA(0); + }, + get: function(channel){ + + var tokenInfo = this._tokenData, + reader = this._reader, + value, + i =0, + len = tokenInfo.length, + found = false, + token, + info; + if (this._lt.length && this._ltIndex >= 0 && this._ltIndex < this._lt.length){ + + i++; + this._token = this._lt[this._ltIndex++]; + info = tokenInfo[this._token.type]; + while((info.channel !== undefined && channel !== info.channel) && + this._ltIndex < this._lt.length){ + this._token = this._lt[this._ltIndex++]; + info = tokenInfo[this._token.type]; + i++; + } + if ((info.channel === undefined || channel === info.channel) && + this._ltIndex <= this._lt.length){ + this._ltIndexCache.push(i); + return this._token.type; + } + } + token = this._getToken(); + if (token.type > -1 && !tokenInfo[token.type].hide){ + token.channel = tokenInfo[token.type].channel; + this._token = token; + this._lt.push(token); + this._ltIndexCache.push(this._lt.length - this._ltIndex + i); + if (this._lt.length > 5){ + this._lt.shift(); + } + if (this._ltIndexCache.length > 5){ + this._ltIndexCache.shift(); + } + this._ltIndex = this._lt.length; + } + info = tokenInfo[token.type]; + if (info && + (info.hide || + (info.channel !== undefined && channel !== info.channel))){ + return this.get(channel); + } else { + return token.type; + } + }, + LA: function(index){ + var total = index, + tt; + if (index > 0){ + if (index > 5){ + throw new Error("Too much lookahead."); + } + while(total){ + tt = this.get(); + total--; + } + while(total < index){ + this.unget(); + total++; + } + } else if (index < 0){ + + if(this._lt[this._ltIndex+index]){ + tt = this._lt[this._ltIndex+index].type; + } else { + throw new Error("Too much lookbehind."); + } + + } else { + tt = this._token.type; + } + + return tt; + + }, + LT: function(index){ + this.LA(index); + return this._lt[this._ltIndex+index-1]; + }, + peek: function(){ + return this.LA(1); + }, + token: function(){ + return this._token; + }, + tokenName: function(tokenType){ + if (tokenType < 0 || tokenType > this._tokenData.length){ + return "UNKNOWN_TOKEN"; + } else { + return this._tokenData[tokenType].name; + } + }, + tokenType: function(tokenName){ + return this._tokenData[tokenName] || -1; + }, + unget: function(){ + if (this._ltIndexCache.length){ + this._ltIndex -= this._ltIndexCache.pop();//--; + this._token = this._lt[this._ltIndex - 1]; + } else { + throw new Error("Too much lookahead."); + } + } + +}; + + +parserlib.util = { +StringReader: StringReader, +SyntaxError : SyntaxError, +SyntaxUnit : SyntaxUnit, +EventTarget : EventTarget, +TokenStreamBase : TokenStreamBase +}; +})(); +(function(){ +var EventTarget = parserlib.util.EventTarget, +TokenStreamBase = parserlib.util.TokenStreamBase, +StringReader = parserlib.util.StringReader, +SyntaxError = parserlib.util.SyntaxError, +SyntaxUnit = parserlib.util.SyntaxUnit; + +var Colors = { + aliceblue :"#f0f8ff", + antiquewhite :"#faebd7", + aqua :"#00ffff", + aquamarine :"#7fffd4", + azure :"#f0ffff", + beige :"#f5f5dc", + bisque :"#ffe4c4", + black :"#000000", + blanchedalmond :"#ffebcd", + blue :"#0000ff", + blueviolet :"#8a2be2", + brown :"#a52a2a", + burlywood :"#deb887", + cadetblue :"#5f9ea0", + chartreuse :"#7fff00", + chocolate :"#d2691e", + coral :"#ff7f50", + cornflowerblue :"#6495ed", + cornsilk :"#fff8dc", + crimson :"#dc143c", + cyan :"#00ffff", + darkblue :"#00008b", + darkcyan :"#008b8b", + darkgoldenrod :"#b8860b", + darkgray :"#a9a9a9", + darkgrey :"#a9a9a9", + darkgreen :"#006400", + darkkhaki :"#bdb76b", + darkmagenta :"#8b008b", + darkolivegreen :"#556b2f", + darkorange :"#ff8c00", + darkorchid :"#9932cc", + darkred :"#8b0000", + darksalmon :"#e9967a", + darkseagreen :"#8fbc8f", + darkslateblue :"#483d8b", + darkslategray :"#2f4f4f", + darkslategrey :"#2f4f4f", + darkturquoise :"#00ced1", + darkviolet :"#9400d3", + deeppink :"#ff1493", + deepskyblue :"#00bfff", + dimgray :"#696969", + dimgrey :"#696969", + dodgerblue :"#1e90ff", + firebrick :"#b22222", + floralwhite :"#fffaf0", + forestgreen :"#228b22", + fuchsia :"#ff00ff", + gainsboro :"#dcdcdc", + ghostwhite :"#f8f8ff", + gold :"#ffd700", + goldenrod :"#daa520", + gray :"#808080", + grey :"#808080", + green :"#008000", + greenyellow :"#adff2f", + honeydew :"#f0fff0", + hotpink :"#ff69b4", + indianred :"#cd5c5c", + indigo :"#4b0082", + ivory :"#fffff0", + khaki :"#f0e68c", + lavender :"#e6e6fa", + lavenderblush :"#fff0f5", + lawngreen :"#7cfc00", + lemonchiffon :"#fffacd", + lightblue :"#add8e6", + lightcoral :"#f08080", + lightcyan :"#e0ffff", + lightgoldenrodyellow :"#fafad2", + lightgray :"#d3d3d3", + lightgrey :"#d3d3d3", + lightgreen :"#90ee90", + lightpink :"#ffb6c1", + lightsalmon :"#ffa07a", + lightseagreen :"#20b2aa", + lightskyblue :"#87cefa", + lightslategray :"#778899", + lightslategrey :"#778899", + lightsteelblue :"#b0c4de", + lightyellow :"#ffffe0", + lime :"#00ff00", + limegreen :"#32cd32", + linen :"#faf0e6", + magenta :"#ff00ff", + maroon :"#800000", + mediumaquamarine:"#66cdaa", + mediumblue :"#0000cd", + mediumorchid :"#ba55d3", + mediumpurple :"#9370d8", + mediumseagreen :"#3cb371", + mediumslateblue :"#7b68ee", + mediumspringgreen :"#00fa9a", + mediumturquoise :"#48d1cc", + mediumvioletred :"#c71585", + midnightblue :"#191970", + mintcream :"#f5fffa", + mistyrose :"#ffe4e1", + moccasin :"#ffe4b5", + navajowhite :"#ffdead", + navy :"#000080", + oldlace :"#fdf5e6", + olive :"#808000", + olivedrab :"#6b8e23", + orange :"#ffa500", + orangered :"#ff4500", + orchid :"#da70d6", + palegoldenrod :"#eee8aa", + palegreen :"#98fb98", + paleturquoise :"#afeeee", + palevioletred :"#d87093", + papayawhip :"#ffefd5", + peachpuff :"#ffdab9", + peru :"#cd853f", + pink :"#ffc0cb", + plum :"#dda0dd", + powderblue :"#b0e0e6", + purple :"#800080", + red :"#ff0000", + rosybrown :"#bc8f8f", + royalblue :"#4169e1", + saddlebrown :"#8b4513", + salmon :"#fa8072", + sandybrown :"#f4a460", + seagreen :"#2e8b57", + seashell :"#fff5ee", + sienna :"#a0522d", + silver :"#c0c0c0", + skyblue :"#87ceeb", + slateblue :"#6a5acd", + slategray :"#708090", + slategrey :"#708090", + snow :"#fffafa", + springgreen :"#00ff7f", + steelblue :"#4682b4", + tan :"#d2b48c", + teal :"#008080", + thistle :"#d8bfd8", + tomato :"#ff6347", + turquoise :"#40e0d0", + violet :"#ee82ee", + wheat :"#f5deb3", + white :"#ffffff", + whitesmoke :"#f5f5f5", + yellow :"#ffff00", + yellowgreen :"#9acd32", + activeBorder :"Active window border.", + activecaption :"Active window caption.", + appworkspace :"Background color of multiple document interface.", + background :"Desktop background.", + buttonface :"The face background color for 3-D elements that appear 3-D due to one layer of surrounding border.", + buttonhighlight :"The color of the border facing the light source for 3-D elements that appear 3-D due to one layer of surrounding border.", + buttonshadow :"The color of the border away from the light source for 3-D elements that appear 3-D due to one layer of surrounding border.", + buttontext :"Text on push buttons.", + captiontext :"Text in caption, size box, and scrollbar arrow box.", + graytext :"Grayed (disabled) text. This color is set to #000 if the current display driver does not support a solid gray color.", + greytext :"Greyed (disabled) text. This color is set to #000 if the current display driver does not support a solid grey color.", + highlight :"Item(s) selected in a control.", + highlighttext :"Text of item(s) selected in a control.", + inactiveborder :"Inactive window border.", + inactivecaption :"Inactive window caption.", + inactivecaptiontext :"Color of text in an inactive caption.", + infobackground :"Background color for tooltip controls.", + infotext :"Text color for tooltip controls.", + menu :"Menu background.", + menutext :"Text in menus.", + scrollbar :"Scroll bar gray area.", + threeddarkshadow :"The color of the darker (generally outer) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.", + threedface :"The face background color for 3-D elements that appear 3-D due to two concentric layers of surrounding border.", + threedhighlight :"The color of the lighter (generally outer) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.", + threedlightshadow :"The color of the darker (generally inner) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.", + threedshadow :"The color of the lighter (generally inner) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.", + window :"Window background.", + windowframe :"Window frame.", + windowtext :"Text in windows." +}; +function Combinator(text, line, col){ + + SyntaxUnit.call(this, text, line, col, Parser.COMBINATOR_TYPE); + this.type = "unknown"; + if (/^\s+$/.test(text)){ + this.type = "descendant"; + } else if (text == ">"){ + this.type = "child"; + } else if (text == "+"){ + this.type = "adjacent-sibling"; + } else if (text == "~"){ + this.type = "sibling"; + } + +} + +Combinator.prototype = new SyntaxUnit(); +Combinator.prototype.constructor = Combinator; +function MediaFeature(name, value){ + + SyntaxUnit.call(this, "(" + name + (value !== null ? ":" + value : "") + ")", name.startLine, name.startCol, Parser.MEDIA_FEATURE_TYPE); + this.name = name; + this.value = value; +} + +MediaFeature.prototype = new SyntaxUnit(); +MediaFeature.prototype.constructor = MediaFeature; +function MediaQuery(modifier, mediaType, features, line, col){ + + SyntaxUnit.call(this, (modifier ? modifier + " ": "") + (mediaType ? mediaType : "") + (mediaType && features.length > 0 ? " and " : "") + features.join(" and "), line, col, Parser.MEDIA_QUERY_TYPE); + this.modifier = modifier; + this.mediaType = mediaType; + this.features = features; + +} + +MediaQuery.prototype = new SyntaxUnit(); +MediaQuery.prototype.constructor = MediaQuery; +function Parser(options){ + EventTarget.call(this); + + + this.options = options || {}; + + this._tokenStream = null; +} +Parser.DEFAULT_TYPE = 0; +Parser.COMBINATOR_TYPE = 1; +Parser.MEDIA_FEATURE_TYPE = 2; +Parser.MEDIA_QUERY_TYPE = 3; +Parser.PROPERTY_NAME_TYPE = 4; +Parser.PROPERTY_VALUE_TYPE = 5; +Parser.PROPERTY_VALUE_PART_TYPE = 6; +Parser.SELECTOR_TYPE = 7; +Parser.SELECTOR_PART_TYPE = 8; +Parser.SELECTOR_SUB_PART_TYPE = 9; + +Parser.prototype = function(){ + + var proto = new EventTarget(), //new prototype + prop, + additions = { + constructor: Parser, + DEFAULT_TYPE : 0, + COMBINATOR_TYPE : 1, + MEDIA_FEATURE_TYPE : 2, + MEDIA_QUERY_TYPE : 3, + PROPERTY_NAME_TYPE : 4, + PROPERTY_VALUE_TYPE : 5, + PROPERTY_VALUE_PART_TYPE : 6, + SELECTOR_TYPE : 7, + SELECTOR_PART_TYPE : 8, + SELECTOR_SUB_PART_TYPE : 9, + + _stylesheet: function(){ + + var tokenStream = this._tokenStream, + charset = null, + count, + token, + tt; + + this.fire("startstylesheet"); + this._charset(); + + this._skipCruft(); + while (tokenStream.peek() == Tokens.IMPORT_SYM){ + this._import(); + this._skipCruft(); + } + while (tokenStream.peek() == Tokens.NAMESPACE_SYM){ + this._namespace(); + this._skipCruft(); + } + tt = tokenStream.peek(); + while(tt > Tokens.EOF){ + + try { + + switch(tt){ + case Tokens.MEDIA_SYM: + this._media(); + this._skipCruft(); + break; + case Tokens.PAGE_SYM: + this._page(); + this._skipCruft(); + break; + case Tokens.FONT_FACE_SYM: + this._font_face(); + this._skipCruft(); + break; + case Tokens.KEYFRAMES_SYM: + this._keyframes(); + this._skipCruft(); + break; + case Tokens.VIEWPORT_SYM: + this._viewport(); + this._skipCruft(); + break; + case Tokens.UNKNOWN_SYM: //unknown @ rule + tokenStream.get(); + if (!this.options.strict){ + this.fire({ + type: "error", + error: null, + message: "Unknown @ rule: " + tokenStream.LT(0).value + ".", + line: tokenStream.LT(0).startLine, + col: tokenStream.LT(0).startCol + }); + count=0; + while (tokenStream.advance([Tokens.LBRACE, Tokens.RBRACE]) == Tokens.LBRACE){ + count++; //keep track of nesting depth + } + + while(count){ + tokenStream.advance([Tokens.RBRACE]); + count--; + } + + } else { + throw new SyntaxError("Unknown @ rule.", tokenStream.LT(0).startLine, tokenStream.LT(0).startCol); + } + break; + case Tokens.S: + this._readWhitespace(); + break; + default: + if(!this._ruleset()){ + switch(tt){ + case Tokens.CHARSET_SYM: + token = tokenStream.LT(1); + this._charset(false); + throw new SyntaxError("@charset not allowed here.", token.startLine, token.startCol); + case Tokens.IMPORT_SYM: + token = tokenStream.LT(1); + this._import(false); + throw new SyntaxError("@import not allowed here.", token.startLine, token.startCol); + case Tokens.NAMESPACE_SYM: + token = tokenStream.LT(1); + this._namespace(false); + throw new SyntaxError("@namespace not allowed here.", token.startLine, token.startCol); + default: + tokenStream.get(); //get the last token + this._unexpectedToken(tokenStream.token()); + } + + } + } + } catch(ex) { + if (ex instanceof SyntaxError && !this.options.strict){ + this.fire({ + type: "error", + error: ex, + message: ex.message, + line: ex.line, + col: ex.col + }); + } else { + throw ex; + } + } + + tt = tokenStream.peek(); + } + + if (tt != Tokens.EOF){ + this._unexpectedToken(tokenStream.token()); + } + + this.fire("endstylesheet"); + }, + + _charset: function(emit){ + var tokenStream = this._tokenStream, + charset, + token, + line, + col; + + if (tokenStream.match(Tokens.CHARSET_SYM)){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this._readWhitespace(); + tokenStream.mustMatch(Tokens.STRING); + + token = tokenStream.token(); + charset = token.value; + + this._readWhitespace(); + tokenStream.mustMatch(Tokens.SEMICOLON); + + if (emit !== false){ + this.fire({ + type: "charset", + charset:charset, + line: line, + col: col + }); + } + } + }, + + _import: function(emit){ + + var tokenStream = this._tokenStream, + tt, + uri, + importToken, + mediaList = []; + tokenStream.mustMatch(Tokens.IMPORT_SYM); + importToken = tokenStream.token(); + this._readWhitespace(); + + tokenStream.mustMatch([Tokens.STRING, Tokens.URI]); + uri = tokenStream.token().value.replace(/^(?:url\()?["']?([^"']+?)["']?\)?$/, "$1"); + + this._readWhitespace(); + + mediaList = this._media_query_list(); + tokenStream.mustMatch(Tokens.SEMICOLON); + this._readWhitespace(); + + if (emit !== false){ + this.fire({ + type: "import", + uri: uri, + media: mediaList, + line: importToken.startLine, + col: importToken.startCol + }); + } + + }, + + _namespace: function(emit){ + + var tokenStream = this._tokenStream, + line, + col, + prefix, + uri; + tokenStream.mustMatch(Tokens.NAMESPACE_SYM); + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + this._readWhitespace(); + if (tokenStream.match(Tokens.IDENT)){ + prefix = tokenStream.token().value; + this._readWhitespace(); + } + + tokenStream.mustMatch([Tokens.STRING, Tokens.URI]); + uri = tokenStream.token().value.replace(/(?:url\()?["']([^"']+)["']\)?/, "$1"); + + this._readWhitespace(); + tokenStream.mustMatch(Tokens.SEMICOLON); + this._readWhitespace(); + + if (emit !== false){ + this.fire({ + type: "namespace", + prefix: prefix, + uri: uri, + line: line, + col: col + }); + } + + }, + + _media: function(){ + var tokenStream = this._tokenStream, + line, + col, + mediaList;// = []; + tokenStream.mustMatch(Tokens.MEDIA_SYM); + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this._readWhitespace(); + + mediaList = this._media_query_list(); + + tokenStream.mustMatch(Tokens.LBRACE); + this._readWhitespace(); + + this.fire({ + type: "startmedia", + media: mediaList, + line: line, + col: col + }); + + while(true) { + if (tokenStream.peek() == Tokens.PAGE_SYM){ + this._page(); + } else if (tokenStream.peek() == Tokens.FONT_FACE_SYM){ + this._font_face(); + } else if (tokenStream.peek() == Tokens.VIEWPORT_SYM){ + this._viewport(); + } else if (!this._ruleset()){ + break; + } + } + + tokenStream.mustMatch(Tokens.RBRACE); + this._readWhitespace(); + + this.fire({ + type: "endmedia", + media: mediaList, + line: line, + col: col + }); + }, + _media_query_list: function(){ + var tokenStream = this._tokenStream, + mediaList = []; + + + this._readWhitespace(); + + if (tokenStream.peek() == Tokens.IDENT || tokenStream.peek() == Tokens.LPAREN){ + mediaList.push(this._media_query()); + } + + while(tokenStream.match(Tokens.COMMA)){ + this._readWhitespace(); + mediaList.push(this._media_query()); + } + + return mediaList; + }, + _media_query: function(){ + var tokenStream = this._tokenStream, + type = null, + ident = null, + token = null, + expressions = []; + + if (tokenStream.match(Tokens.IDENT)){ + ident = tokenStream.token().value.toLowerCase(); + if (ident != "only" && ident != "not"){ + tokenStream.unget(); + ident = null; + } else { + token = tokenStream.token(); + } + } + + this._readWhitespace(); + + if (tokenStream.peek() == Tokens.IDENT){ + type = this._media_type(); + if (token === null){ + token = tokenStream.token(); + } + } else if (tokenStream.peek() == Tokens.LPAREN){ + if (token === null){ + token = tokenStream.LT(1); + } + expressions.push(this._media_expression()); + } + + if (type === null && expressions.length === 0){ + return null; + } else { + this._readWhitespace(); + while (tokenStream.match(Tokens.IDENT)){ + if (tokenStream.token().value.toLowerCase() != "and"){ + this._unexpectedToken(tokenStream.token()); + } + + this._readWhitespace(); + expressions.push(this._media_expression()); + } + } + + return new MediaQuery(ident, type, expressions, token.startLine, token.startCol); + }, + _media_type: function(){ + return this._media_feature(); + }, + _media_expression: function(){ + var tokenStream = this._tokenStream, + feature = null, + token, + expression = null; + + tokenStream.mustMatch(Tokens.LPAREN); + + feature = this._media_feature(); + this._readWhitespace(); + + if (tokenStream.match(Tokens.COLON)){ + this._readWhitespace(); + token = tokenStream.LT(1); + expression = this._expression(); + } + + tokenStream.mustMatch(Tokens.RPAREN); + this._readWhitespace(); + + return new MediaFeature(feature, (expression ? new SyntaxUnit(expression, token.startLine, token.startCol) : null)); + }, + _media_feature: function(){ + var tokenStream = this._tokenStream; + + tokenStream.mustMatch(Tokens.IDENT); + + return SyntaxUnit.fromToken(tokenStream.token()); + }, + _page: function(){ + var tokenStream = this._tokenStream, + line, + col, + identifier = null, + pseudoPage = null; + tokenStream.mustMatch(Tokens.PAGE_SYM); + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this._readWhitespace(); + + if (tokenStream.match(Tokens.IDENT)){ + identifier = tokenStream.token().value; + if (identifier.toLowerCase() === "auto"){ + this._unexpectedToken(tokenStream.token()); + } + } + if (tokenStream.peek() == Tokens.COLON){ + pseudoPage = this._pseudo_page(); + } + + this._readWhitespace(); + + this.fire({ + type: "startpage", + id: identifier, + pseudo: pseudoPage, + line: line, + col: col + }); + + this._readDeclarations(true, true); + + this.fire({ + type: "endpage", + id: identifier, + pseudo: pseudoPage, + line: line, + col: col + }); + + }, + _margin: function(){ + var tokenStream = this._tokenStream, + line, + col, + marginSym = this._margin_sym(); + + if (marginSym){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this.fire({ + type: "startpagemargin", + margin: marginSym, + line: line, + col: col + }); + + this._readDeclarations(true); + + this.fire({ + type: "endpagemargin", + margin: marginSym, + line: line, + col: col + }); + return true; + } else { + return false; + } + }, + _margin_sym: function(){ + + var tokenStream = this._tokenStream; + + if(tokenStream.match([Tokens.TOPLEFTCORNER_SYM, Tokens.TOPLEFT_SYM, + Tokens.TOPCENTER_SYM, Tokens.TOPRIGHT_SYM, Tokens.TOPRIGHTCORNER_SYM, + Tokens.BOTTOMLEFTCORNER_SYM, Tokens.BOTTOMLEFT_SYM, + Tokens.BOTTOMCENTER_SYM, Tokens.BOTTOMRIGHT_SYM, + Tokens.BOTTOMRIGHTCORNER_SYM, Tokens.LEFTTOP_SYM, + Tokens.LEFTMIDDLE_SYM, Tokens.LEFTBOTTOM_SYM, Tokens.RIGHTTOP_SYM, + Tokens.RIGHTMIDDLE_SYM, Tokens.RIGHTBOTTOM_SYM])) + { + return SyntaxUnit.fromToken(tokenStream.token()); + } else { + return null; + } + + }, + + _pseudo_page: function(){ + + var tokenStream = this._tokenStream; + + tokenStream.mustMatch(Tokens.COLON); + tokenStream.mustMatch(Tokens.IDENT); + + return tokenStream.token().value; + }, + + _font_face: function(){ + var tokenStream = this._tokenStream, + line, + col; + tokenStream.mustMatch(Tokens.FONT_FACE_SYM); + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this._readWhitespace(); + + this.fire({ + type: "startfontface", + line: line, + col: col + }); + + this._readDeclarations(true); + + this.fire({ + type: "endfontface", + line: line, + col: col + }); + }, + + _viewport: function(){ + var tokenStream = this._tokenStream, + line, + col; + + tokenStream.mustMatch(Tokens.VIEWPORT_SYM); + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this._readWhitespace(); + + this.fire({ + type: "startviewport", + line: line, + col: col + }); + + this._readDeclarations(true); + + this.fire({ + type: "endviewport", + line: line, + col: col + }); + + }, + + _operator: function(inFunction){ + + var tokenStream = this._tokenStream, + token = null; + + if (tokenStream.match([Tokens.SLASH, Tokens.COMMA]) || + (inFunction && tokenStream.match([Tokens.PLUS, Tokens.STAR, Tokens.MINUS]))){ + token = tokenStream.token(); + this._readWhitespace(); + } + return token ? PropertyValuePart.fromToken(token) : null; + + }, + + _combinator: function(){ + + var tokenStream = this._tokenStream, + value = null, + token; + + if(tokenStream.match([Tokens.PLUS, Tokens.GREATER, Tokens.TILDE])){ + token = tokenStream.token(); + value = new Combinator(token.value, token.startLine, token.startCol); + this._readWhitespace(); + } + + return value; + }, + + _unary_operator: function(){ + + var tokenStream = this._tokenStream; + + if (tokenStream.match([Tokens.MINUS, Tokens.PLUS])){ + return tokenStream.token().value; + } else { + return null; + } + }, + + _property: function(){ + + var tokenStream = this._tokenStream, + value = null, + hack = null, + tokenValue, + token, + line, + col; + if (tokenStream.peek() == Tokens.STAR && this.options.starHack){ + tokenStream.get(); + token = tokenStream.token(); + hack = token.value; + line = token.startLine; + col = token.startCol; + } + + if(tokenStream.match(Tokens.IDENT)){ + token = tokenStream.token(); + tokenValue = token.value; + if (tokenValue.charAt(0) == "_" && this.options.underscoreHack){ + hack = "_"; + tokenValue = tokenValue.substring(1); + } + + value = new PropertyName(tokenValue, hack, (line||token.startLine), (col||token.startCol)); + this._readWhitespace(); + } + + return value; + }, + _ruleset: function(){ + + var tokenStream = this._tokenStream, + tt, + selectors; + try { + selectors = this._selectors_group(); + } catch (ex){ + if (ex instanceof SyntaxError && !this.options.strict){ + this.fire({ + type: "error", + error: ex, + message: ex.message, + line: ex.line, + col: ex.col + }); + tt = tokenStream.advance([Tokens.RBRACE]); + if (tt == Tokens.RBRACE){ + } else { + throw ex; + } + + } else { + throw ex; + } + return true; + } + if (selectors){ + + this.fire({ + type: "startrule", + selectors: selectors, + line: selectors[0].line, + col: selectors[0].col + }); + + this._readDeclarations(true); + + this.fire({ + type: "endrule", + selectors: selectors, + line: selectors[0].line, + col: selectors[0].col + }); + + } + + return selectors; + + }, + _selectors_group: function(){ + var tokenStream = this._tokenStream, + selectors = [], + selector; + + selector = this._selector(); + if (selector !== null){ + + selectors.push(selector); + while(tokenStream.match(Tokens.COMMA)){ + this._readWhitespace(); + selector = this._selector(); + if (selector !== null){ + selectors.push(selector); + } else { + this._unexpectedToken(tokenStream.LT(1)); + } + } + } + + return selectors.length ? selectors : null; + }, + _selector: function(){ + + var tokenStream = this._tokenStream, + selector = [], + nextSelector = null, + combinator = null, + ws = null; + nextSelector = this._simple_selector_sequence(); + if (nextSelector === null){ + return null; + } + + selector.push(nextSelector); + + do { + combinator = this._combinator(); + + if (combinator !== null){ + selector.push(combinator); + nextSelector = this._simple_selector_sequence(); + if (nextSelector === null){ + this._unexpectedToken(tokenStream.LT(1)); + } else { + selector.push(nextSelector); + } + } else { + if (this._readWhitespace()){ + ws = new Combinator(tokenStream.token().value, tokenStream.token().startLine, tokenStream.token().startCol); + combinator = this._combinator(); + nextSelector = this._simple_selector_sequence(); + if (nextSelector === null){ + if (combinator !== null){ + this._unexpectedToken(tokenStream.LT(1)); + } + } else { + + if (combinator !== null){ + selector.push(combinator); + } else { + selector.push(ws); + } + + selector.push(nextSelector); + } + } else { + break; + } + + } + } while(true); + + return new Selector(selector, selector[0].line, selector[0].col); + }, + _simple_selector_sequence: function(){ + + var tokenStream = this._tokenStream, + elementName = null, + modifiers = [], + selectorText= "", + components = [ + function(){ + return tokenStream.match(Tokens.HASH) ? + new SelectorSubPart(tokenStream.token().value, "id", tokenStream.token().startLine, tokenStream.token().startCol) : + null; + }, + this._class, + this._attrib, + this._pseudo, + this._negation + ], + i = 0, + len = components.length, + component = null, + found = false, + line, + col; + line = tokenStream.LT(1).startLine; + col = tokenStream.LT(1).startCol; + + elementName = this._type_selector(); + if (!elementName){ + elementName = this._universal(); + } + + if (elementName !== null){ + selectorText += elementName; + } + + while(true){ + if (tokenStream.peek() === Tokens.S){ + break; + } + while(i < len && component === null){ + component = components[i++].call(this); + } + + if (component === null){ + if (selectorText === ""){ + return null; + } else { + break; + } + } else { + i = 0; + modifiers.push(component); + selectorText += component.toString(); + component = null; + } + } + + + return selectorText !== "" ? + new SelectorPart(elementName, modifiers, selectorText, line, col) : + null; + }, + _type_selector: function(){ + + var tokenStream = this._tokenStream, + ns = this._namespace_prefix(), + elementName = this._element_name(); + + if (!elementName){ + if (ns){ + tokenStream.unget(); + if (ns.length > 1){ + tokenStream.unget(); + } + } + + return null; + } else { + if (ns){ + elementName.text = ns + elementName.text; + elementName.col -= ns.length; + } + return elementName; + } + }, + _class: function(){ + + var tokenStream = this._tokenStream, + token; + + if (tokenStream.match(Tokens.DOT)){ + tokenStream.mustMatch(Tokens.IDENT); + token = tokenStream.token(); + return new SelectorSubPart("." + token.value, "class", token.startLine, token.startCol - 1); + } else { + return null; + } + + }, + _element_name: function(){ + + var tokenStream = this._tokenStream, + token; + + if (tokenStream.match(Tokens.IDENT)){ + token = tokenStream.token(); + return new SelectorSubPart(token.value, "elementName", token.startLine, token.startCol); + + } else { + return null; + } + }, + _namespace_prefix: function(){ + var tokenStream = this._tokenStream, + value = ""; + if (tokenStream.LA(1) === Tokens.PIPE || tokenStream.LA(2) === Tokens.PIPE){ + + if(tokenStream.match([Tokens.IDENT, Tokens.STAR])){ + value += tokenStream.token().value; + } + + tokenStream.mustMatch(Tokens.PIPE); + value += "|"; + + } + + return value.length ? value : null; + }, + _universal: function(){ + var tokenStream = this._tokenStream, + value = "", + ns; + + ns = this._namespace_prefix(); + if(ns){ + value += ns; + } + + if(tokenStream.match(Tokens.STAR)){ + value += "*"; + } + + return value.length ? value : null; + + }, + _attrib: function(){ + + var tokenStream = this._tokenStream, + value = null, + ns, + token; + + if (tokenStream.match(Tokens.LBRACKET)){ + token = tokenStream.token(); + value = token.value; + value += this._readWhitespace(); + + ns = this._namespace_prefix(); + + if (ns){ + value += ns; + } + + tokenStream.mustMatch(Tokens.IDENT); + value += tokenStream.token().value; + value += this._readWhitespace(); + + if(tokenStream.match([Tokens.PREFIXMATCH, Tokens.SUFFIXMATCH, Tokens.SUBSTRINGMATCH, + Tokens.EQUALS, Tokens.INCLUDES, Tokens.DASHMATCH])){ + + value += tokenStream.token().value; + value += this._readWhitespace(); + + tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]); + value += tokenStream.token().value; + value += this._readWhitespace(); + } + + tokenStream.mustMatch(Tokens.RBRACKET); + + return new SelectorSubPart(value + "]", "attribute", token.startLine, token.startCol); + } else { + return null; + } + }, + _pseudo: function(){ + + var tokenStream = this._tokenStream, + pseudo = null, + colons = ":", + line, + col; + + if (tokenStream.match(Tokens.COLON)){ + + if (tokenStream.match(Tokens.COLON)){ + colons += ":"; + } + + if (tokenStream.match(Tokens.IDENT)){ + pseudo = tokenStream.token().value; + line = tokenStream.token().startLine; + col = tokenStream.token().startCol - colons.length; + } else if (tokenStream.peek() == Tokens.FUNCTION){ + line = tokenStream.LT(1).startLine; + col = tokenStream.LT(1).startCol - colons.length; + pseudo = this._functional_pseudo(); + } + + if (pseudo){ + pseudo = new SelectorSubPart(colons + pseudo, "pseudo", line, col); + } + } + + return pseudo; + }, + _functional_pseudo: function(){ + + var tokenStream = this._tokenStream, + value = null; + + if(tokenStream.match(Tokens.FUNCTION)){ + value = tokenStream.token().value; + value += this._readWhitespace(); + value += this._expression(); + tokenStream.mustMatch(Tokens.RPAREN); + value += ")"; + } + + return value; + }, + _expression: function(){ + + var tokenStream = this._tokenStream, + value = ""; + + while(tokenStream.match([Tokens.PLUS, Tokens.MINUS, Tokens.DIMENSION, + Tokens.NUMBER, Tokens.STRING, Tokens.IDENT, Tokens.LENGTH, + Tokens.FREQ, Tokens.ANGLE, Tokens.TIME, + Tokens.RESOLUTION, Tokens.SLASH])){ + + value += tokenStream.token().value; + value += this._readWhitespace(); + } + + return value.length ? value : null; + + }, + _negation: function(){ + + var tokenStream = this._tokenStream, + line, + col, + value = "", + arg, + subpart = null; + + if (tokenStream.match(Tokens.NOT)){ + value = tokenStream.token().value; + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + value += this._readWhitespace(); + arg = this._negation_arg(); + value += arg; + value += this._readWhitespace(); + tokenStream.match(Tokens.RPAREN); + value += tokenStream.token().value; + + subpart = new SelectorSubPart(value, "not", line, col); + subpart.args.push(arg); + } + + return subpart; + }, + _negation_arg: function(){ + + var tokenStream = this._tokenStream, + args = [ + this._type_selector, + this._universal, + function(){ + return tokenStream.match(Tokens.HASH) ? + new SelectorSubPart(tokenStream.token().value, "id", tokenStream.token().startLine, tokenStream.token().startCol) : + null; + }, + this._class, + this._attrib, + this._pseudo + ], + arg = null, + i = 0, + len = args.length, + elementName, + line, + col, + part; + + line = tokenStream.LT(1).startLine; + col = tokenStream.LT(1).startCol; + + while(i < len && arg === null){ + + arg = args[i].call(this); + i++; + } + if (arg === null){ + this._unexpectedToken(tokenStream.LT(1)); + } + if (arg.type == "elementName"){ + part = new SelectorPart(arg, [], arg.toString(), line, col); + } else { + part = new SelectorPart(null, [arg], arg.toString(), line, col); + } + + return part; + }, + + _declaration: function(){ + + var tokenStream = this._tokenStream, + property = null, + expr = null, + prio = null, + error = null, + invalid = null, + propertyName= ""; + + property = this._property(); + if (property !== null){ + + tokenStream.mustMatch(Tokens.COLON); + this._readWhitespace(); + + expr = this._expr(); + if (!expr || expr.length === 0){ + this._unexpectedToken(tokenStream.LT(1)); + } + + prio = this._prio(); + propertyName = property.toString(); + if (this.options.starHack && property.hack == "*" || + this.options.underscoreHack && property.hack == "_") { + + propertyName = property.text; + } + + try { + this._validateProperty(propertyName, expr); + } catch (ex) { + invalid = ex; + } + + this.fire({ + type: "property", + property: property, + value: expr, + important: prio, + line: property.line, + col: property.col, + invalid: invalid + }); + + return true; + } else { + return false; + } + }, + + _prio: function(){ + + var tokenStream = this._tokenStream, + result = tokenStream.match(Tokens.IMPORTANT_SYM); + + this._readWhitespace(); + return result; + }, + + _expr: function(inFunction){ + + var tokenStream = this._tokenStream, + values = [], + value = null, + operator = null; + + value = this._term(inFunction); + if (value !== null){ + + values.push(value); + + do { + operator = this._operator(inFunction); + if (operator){ + values.push(operator); + } /*else { + values.push(new PropertyValue(valueParts, valueParts[0].line, valueParts[0].col)); + valueParts = []; + }*/ + + value = this._term(inFunction); + + if (value === null){ + break; + } else { + values.push(value); + } + } while(true); + } + + return values.length > 0 ? new PropertyValue(values, values[0].line, values[0].col) : null; + }, + + _term: function(inFunction){ + + var tokenStream = this._tokenStream, + unary = null, + value = null, + endChar = null, + token, + line, + col; + unary = this._unary_operator(); + if (unary !== null){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + } + if (tokenStream.peek() == Tokens.IE_FUNCTION && this.options.ieFilters){ + + value = this._ie_function(); + if (unary === null){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + } + } else if (inFunction && tokenStream.match([Tokens.LPAREN, Tokens.LBRACE, Tokens.LBRACKET])){ + + token = tokenStream.token(); + endChar = token.endChar; + value = token.value + this._expr(inFunction).text; + if (unary === null){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + } + tokenStream.mustMatch(Tokens.type(endChar)); + value += endChar; + this._readWhitespace(); + } else if (tokenStream.match([Tokens.NUMBER, Tokens.PERCENTAGE, Tokens.LENGTH, + Tokens.ANGLE, Tokens.TIME, + Tokens.FREQ, Tokens.STRING, Tokens.IDENT, Tokens.URI, Tokens.UNICODE_RANGE])){ + + value = tokenStream.token().value; + if (unary === null){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + } + this._readWhitespace(); + } else { + token = this._hexcolor(); + if (token === null){ + if (unary === null){ + line = tokenStream.LT(1).startLine; + col = tokenStream.LT(1).startCol; + } + if (value === null){ + if (tokenStream.LA(3) == Tokens.EQUALS && this.options.ieFilters){ + value = this._ie_function(); + } else { + value = this._function(); + } + } + + } else { + value = token.value; + if (unary === null){ + line = token.startLine; + col = token.startCol; + } + } + + } + + return value !== null ? + new PropertyValuePart(unary !== null ? unary + value : value, line, col) : + null; + + }, + + _function: function(){ + + var tokenStream = this._tokenStream, + functionText = null, + expr = null, + lt; + + if (tokenStream.match(Tokens.FUNCTION)){ + functionText = tokenStream.token().value; + this._readWhitespace(); + expr = this._expr(true); + functionText += expr; + if (this.options.ieFilters && tokenStream.peek() == Tokens.EQUALS){ + do { + + if (this._readWhitespace()){ + functionText += tokenStream.token().value; + } + if (tokenStream.LA(0) == Tokens.COMMA){ + functionText += tokenStream.token().value; + } + + tokenStream.match(Tokens.IDENT); + functionText += tokenStream.token().value; + + tokenStream.match(Tokens.EQUALS); + functionText += tokenStream.token().value; + lt = tokenStream.peek(); + while(lt != Tokens.COMMA && lt != Tokens.S && lt != Tokens.RPAREN){ + tokenStream.get(); + functionText += tokenStream.token().value; + lt = tokenStream.peek(); + } + } while(tokenStream.match([Tokens.COMMA, Tokens.S])); + } + + tokenStream.match(Tokens.RPAREN); + functionText += ")"; + this._readWhitespace(); + } + + return functionText; + }, + + _ie_function: function(){ + + var tokenStream = this._tokenStream, + functionText = null, + expr = null, + lt; + if (tokenStream.match([Tokens.IE_FUNCTION, Tokens.FUNCTION])){ + functionText = tokenStream.token().value; + + do { + + if (this._readWhitespace()){ + functionText += tokenStream.token().value; + } + if (tokenStream.LA(0) == Tokens.COMMA){ + functionText += tokenStream.token().value; + } + + tokenStream.match(Tokens.IDENT); + functionText += tokenStream.token().value; + + tokenStream.match(Tokens.EQUALS); + functionText += tokenStream.token().value; + lt = tokenStream.peek(); + while(lt != Tokens.COMMA && lt != Tokens.S && lt != Tokens.RPAREN){ + tokenStream.get(); + functionText += tokenStream.token().value; + lt = tokenStream.peek(); + } + } while(tokenStream.match([Tokens.COMMA, Tokens.S])); + + tokenStream.match(Tokens.RPAREN); + functionText += ")"; + this._readWhitespace(); + } + + return functionText; + }, + + _hexcolor: function(){ + + var tokenStream = this._tokenStream, + token = null, + color; + + if(tokenStream.match(Tokens.HASH)){ + + token = tokenStream.token(); + color = token.value; + if (!/#[a-f0-9]{3,6}/i.test(color)){ + throw new SyntaxError("Expected a hex color but found '" + color + "' at line " + token.startLine + ", col " + token.startCol + ".", token.startLine, token.startCol); + } + this._readWhitespace(); + } + + return token; + }, + + _keyframes: function(){ + var tokenStream = this._tokenStream, + token, + tt, + name, + prefix = ""; + + tokenStream.mustMatch(Tokens.KEYFRAMES_SYM); + token = tokenStream.token(); + if (/^@\-([^\-]+)\-/.test(token.value)) { + prefix = RegExp.$1; + } + + this._readWhitespace(); + name = this._keyframe_name(); + + this._readWhitespace(); + tokenStream.mustMatch(Tokens.LBRACE); + + this.fire({ + type: "startkeyframes", + name: name, + prefix: prefix, + line: token.startLine, + col: token.startCol + }); + + this._readWhitespace(); + tt = tokenStream.peek(); + while(tt == Tokens.IDENT || tt == Tokens.PERCENTAGE) { + this._keyframe_rule(); + this._readWhitespace(); + tt = tokenStream.peek(); + } + + this.fire({ + type: "endkeyframes", + name: name, + prefix: prefix, + line: token.startLine, + col: token.startCol + }); + + this._readWhitespace(); + tokenStream.mustMatch(Tokens.RBRACE); + + }, + + _keyframe_name: function(){ + var tokenStream = this._tokenStream, + token; + + tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]); + return SyntaxUnit.fromToken(tokenStream.token()); + }, + + _keyframe_rule: function(){ + var tokenStream = this._tokenStream, + token, + keyList = this._key_list(); + + this.fire({ + type: "startkeyframerule", + keys: keyList, + line: keyList[0].line, + col: keyList[0].col + }); + + this._readDeclarations(true); + + this.fire({ + type: "endkeyframerule", + keys: keyList, + line: keyList[0].line, + col: keyList[0].col + }); + + }, + + _key_list: function(){ + var tokenStream = this._tokenStream, + token, + key, + keyList = []; + keyList.push(this._key()); + + this._readWhitespace(); + + while(tokenStream.match(Tokens.COMMA)){ + this._readWhitespace(); + keyList.push(this._key()); + this._readWhitespace(); + } + + return keyList; + }, + + _key: function(){ + + var tokenStream = this._tokenStream, + token; + + if (tokenStream.match(Tokens.PERCENTAGE)){ + return SyntaxUnit.fromToken(tokenStream.token()); + } else if (tokenStream.match(Tokens.IDENT)){ + token = tokenStream.token(); + + if (/from|to/i.test(token.value)){ + return SyntaxUnit.fromToken(token); + } + + tokenStream.unget(); + } + this._unexpectedToken(tokenStream.LT(1)); + }, + _skipCruft: function(){ + while(this._tokenStream.match([Tokens.S, Tokens.CDO, Tokens.CDC])){ + } + }, + _readDeclarations: function(checkStart, readMargins){ + var tokenStream = this._tokenStream, + tt; + + + this._readWhitespace(); + + if (checkStart){ + tokenStream.mustMatch(Tokens.LBRACE); + } + + this._readWhitespace(); + + try { + + while(true){ + + if (tokenStream.match(Tokens.SEMICOLON) || (readMargins && this._margin())){ + } else if (this._declaration()){ + if (!tokenStream.match(Tokens.SEMICOLON)){ + break; + } + } else { + break; + } + this._readWhitespace(); + } + + tokenStream.mustMatch(Tokens.RBRACE); + this._readWhitespace(); + + } catch (ex) { + if (ex instanceof SyntaxError && !this.options.strict){ + this.fire({ + type: "error", + error: ex, + message: ex.message, + line: ex.line, + col: ex.col + }); + tt = tokenStream.advance([Tokens.SEMICOLON, Tokens.RBRACE]); + if (tt == Tokens.SEMICOLON){ + this._readDeclarations(false, readMargins); + } else if (tt != Tokens.RBRACE){ + throw ex; + } + + } else { + throw ex; + } + } + + }, + _readWhitespace: function(){ + + var tokenStream = this._tokenStream, + ws = ""; + + while(tokenStream.match(Tokens.S)){ + ws += tokenStream.token().value; + } + + return ws; + }, + _unexpectedToken: function(token){ + throw new SyntaxError("Unexpected token '" + token.value + "' at line " + token.startLine + ", col " + token.startCol + ".", token.startLine, token.startCol); + }, + _verifyEnd: function(){ + if (this._tokenStream.LA(1) != Tokens.EOF){ + this._unexpectedToken(this._tokenStream.LT(1)); + } + }, + _validateProperty: function(property, value){ + Validation.validate(property, value); + }, + + parse: function(input){ + this._tokenStream = new TokenStream(input, Tokens); + this._stylesheet(); + }, + + parseStyleSheet: function(input){ + return this.parse(input); + }, + + parseMediaQuery: function(input){ + this._tokenStream = new TokenStream(input, Tokens); + var result = this._media_query(); + this._verifyEnd(); + return result; + }, + parsePropertyValue: function(input){ + + this._tokenStream = new TokenStream(input, Tokens); + this._readWhitespace(); + + var result = this._expr(); + this._readWhitespace(); + this._verifyEnd(); + return result; + }, + parseRule: function(input){ + this._tokenStream = new TokenStream(input, Tokens); + this._readWhitespace(); + + var result = this._ruleset(); + this._readWhitespace(); + this._verifyEnd(); + return result; + }, + parseSelector: function(input){ + + this._tokenStream = new TokenStream(input, Tokens); + this._readWhitespace(); + + var result = this._selector(); + this._readWhitespace(); + this._verifyEnd(); + return result; + }, + parseStyleAttribute: function(input){ + input += "}"; // for error recovery in _readDeclarations() + this._tokenStream = new TokenStream(input, Tokens); + this._readDeclarations(); + } + }; + for (prop in additions){ + if (additions.hasOwnProperty(prop)){ + proto[prop] = additions[prop]; + } + } + + return proto; +}(); +var Properties = { + "align-items" : "flex-start | flex-end | center | baseline | stretch", + "align-content" : "flex-start | flex-end | center | space-between | space-around | stretch", + "align-self" : "auto | flex-start | flex-end | center | baseline | stretch", + "-webkit-align-items" : "flex-start | flex-end | center | baseline | stretch", + "-webkit-align-content" : "flex-start | flex-end | center | space-between | space-around | stretch", + "-webkit-align-self" : "auto | flex-start | flex-end | center | baseline | stretch", + "alignment-adjust" : "auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical | | ", + "alignment-baseline" : "baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical", + "animation" : 1, + "animation-delay" : { multi: "
diff --git a/modules/backend/behaviors/importexportcontroller/partials/_export_result_form.php b/modules/backend/behaviors/importexportcontroller/partials/_export_result_form.php new file mode 100644 index 0000000..81038ea --- /dev/null +++ b/modules/backend/behaviors/importexportcontroller/partials/_export_result_form.php @@ -0,0 +1,34 @@ +fatalError): ?> + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/backend/behaviors/importexportcontroller/partials/_import_db_columns.php b/modules/backend/behaviors/importexportcontroller/partials/_import_db_columns.php new file mode 100644 index 0000000..256d8ee --- /dev/null +++ b/modules/backend/behaviors/importexportcontroller/partials/_import_db_columns.php @@ -0,0 +1,23 @@ +
+
    + $label): ?> + importIsColumnRequired($column); + $iconName = $isRequired ? 'icon-asterisk' : 'icon-link'; + ?> +
  • + + + + + +
  • + +
+
+ + \ No newline at end of file diff --git a/modules/backend/behaviors/importexportcontroller/partials/_import_file_columns.php b/modules/backend/behaviors/importexportcontroller/partials/_import_file_columns.php new file mode 100644 index 0000000..d64883c --- /dev/null +++ b/modules/backend/behaviors/importexportcontroller/partials/_import_file_columns.php @@ -0,0 +1,44 @@ +
+ +
    + $column): ?> +
  • +
    + + + + + + + + + +
    +
    +
      +
      +
    • + +
    + +

    + +

    + +
    + + diff --git a/modules/backend/behaviors/importexportcontroller/partials/_import_form.php b/modules/backend/behaviors/importexportcontroller/partials/_import_form.php new file mode 100644 index 0000000..daa43fe --- /dev/null +++ b/modules/backend/behaviors/importexportcontroller/partials/_import_form.php @@ -0,0 +1,50 @@ +
    + fatalError): ?> + + 'importForm']) ?> + + +
    + +
    + + + + + + + + + + + +
    diff --git a/modules/backend/behaviors/importexportcontroller/partials/_import_result_form.php b/modules/backend/behaviors/importexportcontroller/partials/_import_result_form.php new file mode 100644 index 0000000..b559361 --- /dev/null +++ b/modules/backend/behaviors/importexportcontroller/partials/_import_result_form.php @@ -0,0 +1,107 @@ +fatalError): ?> + + + + + + + + + + diff --git a/modules/backend/behaviors/importexportcontroller/partials/_import_toolbar.php b/modules/backend/behaviors/importexportcontroller/partials/_import_toolbar.php new file mode 100644 index 0000000..db503c4 --- /dev/null +++ b/modules/backend/behaviors/importexportcontroller/partials/_import_toolbar.php @@ -0,0 +1,16 @@ + diff --git a/modules/backend/behaviors/importexportcontroller/partials/fields_export.yaml b/modules/backend/behaviors/importexportcontroller/partials/fields_export.yaml new file mode 100644 index 0000000..b6582bb --- /dev/null +++ b/modules/backend/behaviors/importexportcontroller/partials/fields_export.yaml @@ -0,0 +1,58 @@ +# =================================== +# Field Definitions +# =================================== + +fields: + step1_section: + label: backend::lang.import_export.export_output_format + type: section + + format_preset: + label: backend::lang.import_export.file_format + type: dropdown + default: standard + options: + standard: backend::lang.import_export.standard_format + custom: backend::lang.import_export.custom_format + span: left + + format_delimiter: + label: backend::lang.import_export.delimiter_char + default: ',' + span: left + trigger: + action: show + condition: value[custom] + field: format_preset + + format_enclosure: + label: backend::lang.import_export.enclosure_char + span: auto + default: '"' + trigger: + action: show + condition: value[custom] + field: format_preset + + format_escape: + label: backend::lang.import_export.escape_char + span: auto + default: '\' + trigger: + action: show + condition: value[custom] + field: format_preset + + step2_section: + label: backend::lang.import_export.select_columns + type: section + + export_columns: + label: backend::lang.import_export.columns + type: partial + path: ~/modules/backend/behaviors/importexportcontroller/partials/_export_columns.php + span: left + + step3_section: + label: backend::lang.import_export.set_export_options + type: section diff --git a/modules/backend/behaviors/importexportcontroller/partials/fields_import.yaml b/modules/backend/behaviors/importexportcontroller/partials/fields_import.yaml new file mode 100644 index 0000000..139a368 --- /dev/null +++ b/modules/backend/behaviors/importexportcontroller/partials/fields_import.yaml @@ -0,0 +1,95 @@ +# =================================== +# Field Definitions +# =================================== + +fields: + step1_section: + label: backend::lang.import_export.upload_csv_file + type: section + + import_file: + label: backend::lang.import_export.import_file + type: fileupload + mode: file + span: left + fileTypes: csv + useCaption: false + + format_preset: + label: backend::lang.import_export.file_format + type: dropdown + default: standard + options: + standard: backend::lang.import_export.standard_format + custom: backend::lang.import_export.custom_format + span: right + + format_delimiter: + label: backend::lang.import_export.delimiter_char + default: ',' + span: left + trigger: + action: show + condition: value[custom] + field: format_preset + + format_enclosure: + label: backend::lang.import_export.enclosure_char + span: auto + default: '"' + trigger: + action: show + condition: value[custom] + field: format_preset + + format_escape: + label: backend::lang.import_export.escape_char + span: auto + default: '\' + trigger: + action: show + condition: value[custom] + field: format_preset + + format_encoding: + label: backend::lang.import_export.encoding_format + span: auto + default: UTF-8 + type: dropdown + trigger: + action: show + condition: value[custom] + field: format_preset + + first_row_titles: + label: backend::lang.import_export.first_row_contains_titles + comment: backend::lang.import_export.first_row_contains_titles_desc + type: checkbox + default: true + span: left + + step2_section: + label: backend::lang.import_export.match_columns + type: section + + column_control_panel: + type: partial + path: ~/modules/backend/behaviors/importexportcontroller/partials/_import_toolbar.php + + import_file_columns: + label: backend::lang.import_export.file_columns + type: partial + path: ~/modules/backend/behaviors/importexportcontroller/partials/_import_file_columns.php + dependsOn: [import_file, first_row_titles, format_delimiter, format_enclosure, format_escape, format_encoding] + span: left + + import_db_columns: + label: backend::lang.import_export.database_fields + type: partial + path: ~/modules/backend/behaviors/importexportcontroller/partials/_import_db_columns.php + dependsOn: [import_file, first_row_titles, format_delimiter, format_enclosure, format_escape, format_encoding] + span: right + + step3_section: + label: backend::lang.import_export.set_import_options + type: section \ No newline at end of file diff --git a/modules/backend/behaviors/importexportcontroller/views/export.php b/modules/backend/behaviors/importexportcontroller/views/export.php new file mode 100644 index 0000000..6c0be77 --- /dev/null +++ b/modules/backend/behaviors/importexportcontroller/views/export.php @@ -0,0 +1,24 @@ + + makeLayoutPartial('breadcrumb') ?> + + + 'layout']) ?> + +
    + exportRender() ?> +
    + +
    +
    + +
    +
    + + diff --git a/modules/backend/behaviors/importexportcontroller/views/import.php b/modules/backend/behaviors/importexportcontroller/views/import.php new file mode 100644 index 0000000..f40d5b8 --- /dev/null +++ b/modules/backend/behaviors/importexportcontroller/views/import.php @@ -0,0 +1,24 @@ + + makeLayoutPartial('breadcrumb') ?> + + + 'layout']) ?> + +
    + importRender() ?> +
    + +
    +
    + +
    +
    + + diff --git a/modules/backend/behaviors/listcontroller/partials/_container.php b/modules/backend/behaviors/listcontroller/partials/_container.php new file mode 100644 index 0000000..037ba06 --- /dev/null +++ b/modules/backend/behaviors/listcontroller/partials/_container.php @@ -0,0 +1,9 @@ + + render() ?> + + + + render() ?> + + +render() ?> diff --git a/modules/backend/behaviors/listcontroller/views/_list_toolbar.php b/modules/backend/behaviors/listcontroller/views/_list_toolbar.php new file mode 100644 index 0000000..f1dbb6f --- /dev/null +++ b/modules/backend/behaviors/listcontroller/views/_list_toolbar.php @@ -0,0 +1,59 @@ +getClassExtension(\Backend\Behaviors\ListController::class); +$listConfig = $listController->getConfig(); +?> + +
    + isClassExtendedWith(\Backend\Behaviors\FormController::class)): ?> + + trans(\Winter\Storm\Support\Str::before($listConfig->title, '_plural'))])); ?> + + + + showCheckboxes) && $listConfig->showCheckboxes != false): ?> + + + + isClassExtendedWith(\Backend\Behaviors\ReorderController::class)): ?> + + trans($listConfig->title)])); ?> + + + + isClassExtendedWith(\Backend\Behaviors\ImportExportController::class)): ?> +
    + asExtension(\Backend\Behaviors\ImportExportController::class); ?> + userHasAccess('export')): ?> + + + + + userHasAccess('import')): ?> + + + + +
    + +
    diff --git a/modules/backend/behaviors/listcontroller/views/index.php b/modules/backend/behaviors/listcontroller/views/index.php new file mode 100644 index 0000000..ea43a36 --- /dev/null +++ b/modules/backend/behaviors/listcontroller/views/index.php @@ -0,0 +1 @@ +listRender() ?> diff --git a/modules/backend/behaviors/relationcontroller/assets/css/relation.css b/modules/backend/behaviors/relationcontroller/assets/css/relation.css new file mode 100644 index 0000000..ad68855 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/assets/css/relation.css @@ -0,0 +1,39 @@ +.relation-behavior { + margin-bottom: 20px; +} +.relation-behavior .control-list { + border: 1px solid #eeeeee; +} +.relation-behavior .control-list thead > tr > th { + border-top: none !important; + border-color: #eeeeee; +} +.relation-behavior .control-toolbar { + padding: 0 20px 20px 20px; +} +.relation-behavior .control-toolbar .toolbar-item .form-control.search { + padding-top: 5px; + padding-bottom: 5px; +} +.relation-behavior .control-toolbar .loading-indicator-container.size-input-text { + min-height: 0; +} +.relation-behavior .control-toolbar .loading-indicator-container.size-input-text .loading-indicator > span { + top: 4px; +} +.relation-behavior .list-header { + padding: 0; +} +.relation-behavior .control-list:last-child > table { + margin-bottom: 0; +} +.relation-flush .control-list { + border-top: none; +} +.relation-inset { + margin-left: -20px; + margin-right: -20px; +} +.form-group > .relation-behavior .control-toolbar { + padding: 0 0 10px 0; +} diff --git a/modules/backend/behaviors/relationcontroller/assets/js/winter.relation.js b/modules/backend/behaviors/relationcontroller/assets/js/winter.relation.js new file mode 100644 index 0000000..5af54eb --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/assets/js/winter.relation.js @@ -0,0 +1,100 @@ +/* + * Scripts for the Relation controller behavior. + */ ++function ($) { "use strict"; + + var RelationBehavior = function() { + + this.toggleListCheckbox = function(el) { + $(el).closest('.control-list').listWidget('toggleChecked', [el]) + } + + this.clickViewListRecord = function(recordId, relationId, sessionKey) { + var newPopup = $(''), + $container = $('#'+relationId), + requestData = paramToObj('data-request-data', $container.data('request-data')) + + newPopup.popup({ + handler: 'onRelationClickViewList', + size: 'huge', + extraData: $.extend({}, requestData, { + 'manage_id': recordId, + '_session_key': sessionKey + }) + }) + } + + this.clickManageListRecord = function(recordId, relationId, sessionKey) { + var oldPopup = $('#relationManagePopup'), + $container = $('#'+relationId), + requestData = paramToObj('data-request-data', $container.data('request-data')) + + $.request('onRelationClickManageList', { + data: $.extend({}, requestData, { + 'record_id': recordId, + '_session_key': sessionKey + }) + }) + + oldPopup.popup('hide') + } + + this.clickManagePivotListRecord = function(foreignId, relationId, sessionKey) { + var oldPopup = $('#relationManagePivotPopup'), + newPopup = $(''), + $container = $('#'+relationId), + requestData = paramToObj('data-request-data', $container.data('request-data')) + + if (oldPopup.length) { + oldPopup.popup('hide') + } + + newPopup.popup({ + handler: 'onRelationClickManageListPivot', + size: 'huge', + extraData: $.extend({}, requestData, { + 'foreign_id': foreignId, + '_session_key': sessionKey + }) + }) + } + + /* + * This function is called every time a record is created, added, removed + * or deleted using the relation widget. It triggers the change.oc.formwidget + * event to notify other elements on the page about the changed form state. + */ + this.changed = function(relationId, event) { + $('[data-field-name="' + relationId + '"]').trigger('change.oc.formwidget', {event: event}); + } + + /* + * This function transfers the supplied variables as hidden form inputs, + * to any popup that is spawned within the supplied container. The spawned + * popup must contain a form element. + */ + this.bindToPopups = function(container, vars) { + $(container).on('show.oc.popup', function(event, $trigger, $modal){ + var $form = $('form', $modal) + $.each(vars, function(name, value){ + $form.prepend($('').attr({ type: 'hidden', name: name, value: value })) + }) + }) + } + + function paramToObj(name, value) { + if (value === undefined) value = '' + if (typeof value == 'object') return value + + try { + return ocJSON("{" + value + "}") + } + catch (e) { + throw new Error('Error parsing the '+name+' attribute value. '+e) + } + } + + } + + $.wn.relationBehavior = new RelationBehavior; +}(window.jQuery); diff --git a/modules/backend/behaviors/relationcontroller/assets/less/relation.less b/modules/backend/behaviors/relationcontroller/assets/less/relation.less new file mode 100644 index 0000000..a6731fa --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/assets/less/relation.less @@ -0,0 +1,60 @@ +@import "../../../../assets/less/core/boot.less"; + +@color-relation-border: #eeeeee; + +.relation-behavior { + margin-bottom: 20px; + + .control-list { + border: 1px solid @color-relation-border; + + thead > tr > th { + border-top: none !important; + border-color: @color-relation-border; + } + } + + .control-toolbar { + padding: 0 20px 20px 20px; + + .toolbar-item .form-control.search { + padding-top: 5px; + padding-bottom: 5px; + } + + .loading-indicator-container.size-input-text { + min-height: 0; + .loading-indicator > span { + top: 4px; + } + } + } + + .list-header { + padding: 0; + } + + .control-list:last-child > table { + margin-bottom: 0; + } +} + +// Relation manager to sit flush to the element above +.relation-flush { + .control-list { + border-top: none; + } +} + +// Relation manager to sit inset the standard padding (20px) +.relation-inset { + margin-left: -20px; + margin-right: -20px; +} + +// Displayed in a form field +.form-group > .relation-behavior { + .control-toolbar { + padding: 0 0 10px 0; + } +} \ No newline at end of file diff --git a/modules/backend/behaviors/relationcontroller/partials/_button_add.php b/modules/backend/behaviors/relationcontroller/partials/_button_add.php new file mode 100644 index 0000000..08da269 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_button_add.php @@ -0,0 +1,8 @@ + + trans($relationLabel)])) ?> + diff --git a/modules/backend/behaviors/relationcontroller/partials/_button_create.php b/modules/backend/behaviors/relationcontroller/partials/_button_create.php new file mode 100644 index 0000000..b2080b1 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_button_create.php @@ -0,0 +1,8 @@ + + trans($relationLabel)])) ?> + diff --git a/modules/backend/behaviors/relationcontroller/partials/_button_delete.php b/modules/backend/behaviors/relationcontroller/partials/_button_delete.php new file mode 100644 index 0000000..d8df34c --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_button_delete.php @@ -0,0 +1,26 @@ + + + + + diff --git a/modules/backend/behaviors/relationcontroller/partials/_button_link.php b/modules/backend/behaviors/relationcontroller/partials/_button_link.php new file mode 100644 index 0000000..6e1c3d5 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_button_link.php @@ -0,0 +1,8 @@ + + trans($relationLabel)])) ?> + diff --git a/modules/backend/behaviors/relationcontroller/partials/_button_refresh.php b/modules/backend/behaviors/relationcontroller/partials/_button_refresh.php new file mode 100644 index 0000000..993533f --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_button_refresh.php @@ -0,0 +1,6 @@ + diff --git a/modules/backend/behaviors/relationcontroller/partials/_button_remove.php b/modules/backend/behaviors/relationcontroller/partials/_button_remove.php new file mode 100644 index 0000000..a5326e4 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_button_remove.php @@ -0,0 +1,24 @@ + + + + + diff --git a/modules/backend/behaviors/relationcontroller/partials/_button_unlink.php b/modules/backend/behaviors/relationcontroller/partials/_button_unlink.php new file mode 100644 index 0000000..59ea3ec --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_button_unlink.php @@ -0,0 +1,9 @@ + + + diff --git a/modules/backend/behaviors/relationcontroller/partials/_button_update.php b/modules/backend/behaviors/relationcontroller/partials/_button_update.php new file mode 100644 index 0000000..efadc67 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_button_update.php @@ -0,0 +1,9 @@ + + trans($relationLabel)])) ?> + diff --git a/modules/backend/behaviors/relationcontroller/partials/_container.php b/modules/backend/behaviors/relationcontroller/partials/_container.php new file mode 100644 index 0000000..eb66e96 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_container.php @@ -0,0 +1,18 @@ +
    + + relationRenderToolbar()): ?> + +
    + +
    + + + +
    + relationRenderView() ?> +
    + +
    diff --git a/modules/backend/behaviors/relationcontroller/partials/_manage_form.php b/modules/backend/behaviors/relationcontroller/partials/_manage_form.php new file mode 100644 index 0000000..cab9fec --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_manage_form.php @@ -0,0 +1,71 @@ +
    + + + true, + 'sessionKey' => $newSessionKey, + 'data-request-success' => "$.wn.relationBehavior.changed('" . e($relationField) . "', 'updated')", + ]) ?> + + + + + + + + + + + + + + + + + + true, + 'data-request-success' => "$.wn.relationBehavior.changed('" . e($relationField) . "', 'created')", + 'sessionKey' => $newSessionKey + ]) ?> + + + + + + + + + + + + + +
    + + diff --git a/modules/backend/behaviors/relationcontroller/partials/_manage_form_footer_create.php b/modules/backend/behaviors/relationcontroller/partials/_manage_form_footer_create.php new file mode 100644 index 0000000..4a61261 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_manage_form_footer_create.php @@ -0,0 +1,11 @@ + + diff --git a/modules/backend/behaviors/relationcontroller/partials/_manage_form_footer_update.php b/modules/backend/behaviors/relationcontroller/partials/_manage_form_footer_update.php new file mode 100644 index 0000000..a965490 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_manage_form_footer_update.php @@ -0,0 +1,20 @@ +readOnly): ?> + + + + + diff --git a/modules/backend/behaviors/relationcontroller/partials/_manage_list.php b/modules/backend/behaviors/relationcontroller/partials/_manage_list.php new file mode 100644 index 0000000..f3664c9 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_manage_list.php @@ -0,0 +1,24 @@ +
    + + + +
    + + render() ?> + + + render() ?> + + render() ?> +
    + + + +
    diff --git a/modules/backend/behaviors/relationcontroller/partials/_manage_list_footer.php b/modules/backend/behaviors/relationcontroller/partials/_manage_list_footer.php new file mode 100644 index 0000000..a2ddafa --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_manage_list_footer.php @@ -0,0 +1,17 @@ +showCheckboxes): ?> + + + diff --git a/modules/backend/behaviors/relationcontroller/partials/_manage_pivot.php b/modules/backend/behaviors/relationcontroller/partials/_manage_pivot.php new file mode 100644 index 0000000..6ac2419 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_manage_pivot.php @@ -0,0 +1,32 @@ +
    + + + + + +
    + + render() ?> + + + render() ?> + + render() ?> +
    + + + +
    + diff --git a/modules/backend/behaviors/relationcontroller/partials/_manage_pivot_footer.php b/modules/backend/behaviors/relationcontroller/partials/_manage_pivot_footer.php new file mode 100644 index 0000000..4402932 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_manage_pivot_footer.php @@ -0,0 +1,18 @@ +showCheckboxes): ?> + + + diff --git a/modules/backend/behaviors/relationcontroller/partials/_pivot_form.php b/modules/backend/behaviors/relationcontroller/partials/_pivot_form.php new file mode 100644 index 0000000..f93cbd7 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_pivot_form.php @@ -0,0 +1,53 @@ + + + ['_relation_field' => $relationField, 'manage_id' => $relationManageId], + 'data-request-success' => "$.wn.relationBehavior.changed('" . e($relationField) . "', 'updated')", + 'data-popup-load-indicator' => true + ]) ?> + + + + + + + + + + ['_relation_field' => $relationField, 'foreign_id' => $foreignId], + 'data-request-success' => "$.wn.relationBehavior.changed('" . e($relationField) . "', 'created')", + 'data-popup-load-indicator' => true + ]) ?> + + + + + + + + diff --git a/modules/backend/behaviors/relationcontroller/partials/_pivot_form_footer.php b/modules/backend/behaviors/relationcontroller/partials/_pivot_form_footer.php new file mode 100644 index 0000000..a965490 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_pivot_form_footer.php @@ -0,0 +1,20 @@ +readOnly): ?> + + + + + diff --git a/modules/backend/behaviors/relationcontroller/partials/_toolbar.php b/modules/backend/behaviors/relationcontroller/partials/_toolbar.php new file mode 100644 index 0000000..d7f85f5 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_toolbar.php @@ -0,0 +1,18 @@ +
    + + $text): ?> + + + relationMakePartial('button_update', [ + 'relationManageId' => $relationViewModel->getKey(), + 'text' => $text + ]) ?> + + relationMakePartial('button_' . $type, [ + 'text' => $text + ]) ?> + + + + +
    diff --git a/modules/backend/behaviors/relationcontroller/partials/_view.php b/modules/backend/behaviors/relationcontroller/partials/_view.php new file mode 100644 index 0000000..2b14e43 --- /dev/null +++ b/modules/backend/behaviors/relationcontroller/partials/_view.php @@ -0,0 +1,5 @@ + + render() ?> + + +render() ?> diff --git a/modules/backend/behaviors/reordercontroller/assets/js/winter.reorder.js b/modules/backend/behaviors/reordercontroller/assets/js/winter.reorder.js new file mode 100644 index 0000000..de31c2a --- /dev/null +++ b/modules/backend/behaviors/reordercontroller/assets/js/winter.reorder.js @@ -0,0 +1,82 @@ +/* + * Scripts for the Reorder controller behavior. + * + * The following functions are observed: + * - Simple sorting: Post back the original sort orders and the new ordered identifiers. + * - Nested sorting: Post back source and target nodes IDs and the move positioning. + */ ++function ($) { "use strict"; + + var ReorderBehavior = function() { + + this.sortMode = null + + this.simpleSortOrders = [] + + this.initSorting = function (mode) { + this.sortMode = mode + + if (mode == 'simple') { + this.initSortingSimple() + } + + $('#reorderTreeList').on('move.oc.treelist', $.proxy(this.processReorder, this)) + } + + + this.processReorder = function(ev, sortData){ + var postData + + if (this.sortMode == 'simple') { + postData = { sort_orders: this.simpleSortOrders } + } + else if (this.sortMode == 'nested') { + postData = this.getNestedMoveData(sortData) + } + + $('#reorderTreeList').request('onReorder', { + data: postData + }) + } + + this.getNestedMoveData = function (sortData) { + var + $el, + $item = sortData.item, + moveData = { + targetNode: 0, + sourceNode: $item.data('recordId'), + position: 'root' + } + + if (($el = $item.next()) && $el.length) { + moveData.position = 'before' + } + else if (($el = $item.prev()) && $el.length) { + moveData.position = 'after' + } + else if (($el = $item.parents('li:first')) && $el.length) { + moveData.position = 'child' + } + + if ($el.length) { + moveData.targetNode = $el.data('recordId') + } + + return moveData + } + + this.initSortingSimple = function () { + var sortOrders = [] + + $('#reorderTreeList li').each(function(i) { + sortOrders.push(i); + }) + + this.simpleSortOrders = sortOrders + } + + } + + $.wn.reorderBehavior = new ReorderBehavior; +}(window.jQuery); diff --git a/modules/backend/behaviors/reordercontroller/partials/_container.php b/modules/backend/behaviors/reordercontroller/partials/_container.php new file mode 100644 index 0000000..7a28c31 --- /dev/null +++ b/modules/backend/behaviors/reordercontroller/partials/_container.php @@ -0,0 +1,29 @@ + + +
    + render() ?> +
    + + + + +
    + data-handle=" li > .record > a.move' ?>" + data-stripe-load-indicator> + +
      + reorderMakePartial('records', ['records' => $reorderRecords]) ?> +
    + +

    + +
    + + + diff --git a/modules/backend/behaviors/reordercontroller/partials/_records.php b/modules/backend/behaviors/reordercontroller/partials/_records.php new file mode 100644 index 0000000..15100c3 --- /dev/null +++ b/modules/backend/behaviors/reordercontroller/partials/_records.php @@ -0,0 +1,23 @@ + + +
  • + data-record-sort-order="{$record->getSortOrderColumn()} ?>" + + > +
    + + reorderGetRecordName($record)) ?> + +
    + + +
      + children): ?> + reorderMakePartial('records', ['records' => $record->children]) ?> + +
    + +
  • + + diff --git a/modules/backend/behaviors/reordercontroller/views/_reorder_toolbar.php b/modules/backend/behaviors/reordercontroller/views/_reorder_toolbar.php new file mode 100644 index 0000000..6320a60 --- /dev/null +++ b/modules/backend/behaviors/reordercontroller/views/_reorder_toolbar.php @@ -0,0 +1,5 @@ + diff --git a/modules/backend/behaviors/reordercontroller/views/reorder.php b/modules/backend/behaviors/reordercontroller/views/reorder.php new file mode 100644 index 0000000..fc56b60 --- /dev/null +++ b/modules/backend/behaviors/reordercontroller/views/reorder.php @@ -0,0 +1,5 @@ + + makeLayoutPartial('breadcrumb') ?> + + +reorderRender() ?> diff --git a/modules/backend/classes/AuthManager.php b/modules/backend/classes/AuthManager.php new file mode 100644 index 0000000..deb56cc --- /dev/null +++ b/modules/backend/classes/AuthManager.php @@ -0,0 +1,289 @@ + null, + 'label' => null, + 'comment' => null, + 'roles' => null, + 'order' => 500 + ]; + + /** + * @var array Cache of registration callbacks. + */ + protected $callbacks = []; + + /** + * @var array List of registered permissions. + */ + protected $permissions = []; + + /** + * @var array List of owner aliases. ['Aliased.Owner' => 'Real.Owner'] + */ + protected $aliases = []; + + /** + * @var array List of registered permission roles. + */ + protected $permissionRoles = false; + + /** + * @var array Cache of registered permissions. + */ + protected $permissionCache = false; + + protected function init() + { + $this->useThrottle = Config::get('auth.throttle.enabled', true); + parent::init(); + } + + /** + * Registers a callback function that defines authentication permissions. + * The callback function should register permissions by calling the manager's + * registerPermissions() function. The manager instance is passed to the + * callback function as an argument. Usage: + * + * BackendAuth::registerCallback(function ($manager) { + * $manager->registerPermissions([...]); + * }); + * + * @param callable $callback A callable function. + */ + public function registerCallback(callable $callback) + { + $this->callbacks[] = $callback; + } + + /** + * Registers the back-end permission items. + * The argument is an array of the permissions. The array keys represent the + * permission codes, specific for the plugin/module. Each element in the + * array should be an associative array with the following keys: + * - label - specifies the menu label localization string key, required. + * - order - a position of the item in the menu, optional. + * - comment - a brief comment that describes the permission, optional. + * - tab - assign this permission to a tabbed group, optional. + * @param string $owner Specifies the permissions' owner plugin or module in the format Author.Plugin + * @param array $definitions An array of the menu item definitions. + */ + public function registerPermissions($owner, array $definitions) + { + // Resolve alias + $owner = $this->aliases[$owner] ?? $owner; + + foreach ($definitions as $code => $definition) { + $permission = (object) array_merge(self::$permissionDefaults, array_merge($definition, [ + 'code' => $code, + 'owner' => $owner + ])); + + $this->permissions[] = $permission; + } + + // Clear the permission cache + $this->permissionCache = false; + } + + /** + * Register a permission owner alias + * + * @param string $owner The owner to register an alias for. Example: Real.Owner + * @param string $alias The alias to register. Example: Aliased.Owner + * @return void + */ + public function registerPermissionOwnerAlias(string $owner, string $alias) + { + $this->aliases[$alias] = $owner; + } + + /** + * Removes a single back-end permission + * @param string $owner Specifies the permissions' owner plugin or module in the format Author.Plugin + * @param string $code The code of the permission to remove + * @return void + */ + public function removePermission($owner, $code) + { + if (!$this->permissions) { + throw new SystemException('Unable to remove permissions before they are loaded.'); + } + + // Resolve alias + $owner = $this->aliases[$owner] ?? $owner; + + $ownerPermissions = array_filter($this->permissions, function ($permission) use ($owner) { + return $permission->owner === $owner; + }); + + foreach ($ownerPermissions as $key => $permission) { + if ($permission->code === $code) { + unset($this->permissions[$key]); + } + } + + // Clear the permission cache + $this->permissionCache = false; + } + + /** + * Returns a list of the registered permissions items. + * @return array + */ + public function listPermissions() + { + if ($this->permissionCache !== false) { + return $this->permissionCache; + } + + /* + * Load module items + */ + foreach ($this->callbacks as $callback) { + $callback($this); + } + + /* + * Load plugin items + */ + $plugins = PluginManager::instance()->getPlugins(); + + foreach ($plugins as $id => $plugin) { + $items = $plugin->registerPermissions(); + if (!is_array($items)) { + continue; + } + + $this->registerPermissions($id, $items); + } + + /* + * Sort permission items + */ + usort($this->permissions, function ($a, $b) { + if ($a->order == $b->order) { + return 0; + } + + return $a->order > $b->order ? 1 : -1; + }); + + return $this->permissionCache = $this->permissions; + } + + /** + * Returns an array of registered permissions, grouped by tabs. + * @return array + */ + public function listTabbedPermissions() + { + $tabs = []; + + foreach ($this->listPermissions() as $permission) { + $tab = $permission->tab ?? 'backend::lang.form.undefined_tab'; + + if (!array_key_exists($tab, $tabs)) { + $tabs[$tab] = []; + } + + $tabs[$tab][] = $permission; + } + + return $tabs; + } + + /** + * {@inheritdoc} + */ + protected function createUserModelQuery() + { + return parent::createUserModelQuery()->withTrashed(); + } + + + /** + * {@inheritdoc} + */ + protected function validateUserModel($user) + { + if ( ! $user instanceof $this->userModel) { + return false; + } + + // Perform the deleted_at check manually since the relevant migrations + // might not have been run yet during the update to build 444. + // @see https://github.com/octobercms/october/issues/3999 + if (array_key_exists('deleted_at', $user->getAttributes()) && $user->deleted_at !== null) { + return false; + } + + return $user; + } + + /** + * Returns an array of registered permissions belonging to a given role code + * @param string $role + * @param bool $includeOrphans Include any permissons that do not have a default role specified + * @return array + */ + public function listPermissionsForRole($role, $includeOrphans = true) + { + if ($this->permissionRoles === false) { + $this->permissionRoles = []; + + foreach ($this->listPermissions() as $permission) { + if ($permission->roles) { + foreach ((array) $permission->roles as $_role) { + $this->permissionRoles[$_role][$permission->code] = 1; + } + } + else { + $this->permissionRoles['*'][$permission->code] = 1; + } + } + } + + $result = $this->permissionRoles[$role] ?? []; + + if ($includeOrphans) { + $result += $this->permissionRoles['*'] ?? []; + } + + return $result; + } + + public function hasPermissionsForRole($role) + { + return !!$this->listPermissionsForRole($role, false); + } +} diff --git a/modules/backend/classes/BackendController.php b/modules/backend/classes/BackendController.php new file mode 100644 index 0000000..f1771af --- /dev/null +++ b/modules/backend/classes/BackendController.php @@ -0,0 +1,347 @@ +middleware(function ($request, $next) { + // Process the request before retrieving controller middleware, to allow for the session and auth data + // to be made available to the controller's constructor. + $response = $next($request); + + // Find requested controller to determine if any middleware has been attached + $pathParts = explode('/', str_replace(Request::root() . '/', '', Request::url())); + if (count($pathParts)) { + // Drop off preceding backend URL part if needed + if (!empty(Config::get('cms.backendUri', 'backend'))) { + array_shift($pathParts); + } + $path = implode('/', $pathParts); + + $requestedController = $this->getRequestedController($path); + if ( + !is_null($requestedController) + && is_array($requestedController) + && count($requestedController['controller']->getMiddleware()) + ) { + $action = $requestedController['action']; + + // Collect applicable middleware and insert middleware into pipeline + $controllerMiddleware = collect($requestedController['controller']->getMiddleware()) + ->reject(function ($data) use ($action) { + return static::methodExcludedByOptions($action, $data['options']); + }) + ->pluck('middleware'); + + foreach ($controllerMiddleware as $middleware) { + $middleware->call($requestedController['controller'], $request, $response); + } + } + } + + return $response; + }); + + $this->extendableConstruct(); + } + + /** + * @inheritDoc + */ + public function callAction($method, $parameters) + { + return parent::callAction($method, array_values($parameters)); + } + + /** + * Pass unhandled URLs to the CMS Controller, if it exists + * + * @param string $url + * @return Response + */ + protected function passToCmsController($url) + { + if ( + in_array('Cms', Config::get('cms.loadModules', [])) && + class_exists('\Cms\Classes\Controller') + ) { + $this->cmsHandling = true; + $response = App::make('Cms\Classes\Controller')->run($url); + if ($response->getStatusCode() !== 404 || !BackendAuth::check()) { + return $response; + } + } + + return Response::make(View::make('backend::404'), 404); + } + + /** + * Finds and serves the requested backend controller. + * If the controller cannot be found, returns the Cms page with the URL /404. + * If the /404 page doesn't exist, returns the system 404 page. + * @param string $url Specifies the requested page URL. + * If the parameter is omitted, the current URL used. + * @return string Returns the processed page content. + */ + public function run($url = null) + { + // Handle NotFoundHttpExceptions in the backend (usually triggered by abort(404)) + Event::listen('exception.beforeRender', function ($exception, $httpCode, $request) { + if ($this->cmsHandling) { + return; + } + + if ($exception instanceof NotFoundHttpException) { + return View::make('backend::404'); + } elseif ( + $exception instanceof HttpException + && $exception->getStatusCode() === 403 + ) { + return View::make('backend::access_denied'); + } + }, 1); + + /* + * Database check + */ + if (!App::hasDatabase()) { + return Config::get('app.debug', false) + ? Response::make(View::make('backend::no_database'), 200) + : $this->passToCmsController($url); + } + + $controllerRequest = $this->getRequestedController($url); + if (!is_null($controllerRequest)) { + return $controllerRequest['controller']->run( + $controllerRequest['action'], + $controllerRequest['params'] + ); + } + + /* + * Fall back on Cms controller + */ + return $this->passToCmsController($url); + } + + /** + * Determines the controller and action to load in the backend via a provided URL. + * + * If a suitable controller is found, this will return an array with the controller class name as a string, the + * action to call as a string and an array of parameters. If a suitable controller and action cannot be found, + * this method will return null. + * + * @param string $url A URL to determine the requested controller and action for + * @return array|null A suitable controller, action and parameters in an array if found, otherwise null. + */ + protected function getRequestedController($url) + { + $params = RouterHelper::segmentizeUrl($url); + + /* + * Look for a Module controller + */ + $module = $params[0] ?? 'backend'; + $controller = $params[1] ?? 'index'; + self::$action = $action = isset($params[2]) ? $this->parseAction($params[2]) : 'index'; + self::$params = $controllerParams = array_slice($params, 3); + $controllerClass = '\\'.$module.'\Controllers\\'.$controller; + if ($controllerObj = $this->findController( + $controllerClass, + $action, + base_path().'/modules' + )) { + return [ + 'controller' => $controllerObj, + 'action' => $action, + 'params' => $controllerParams + ]; + } + + /* + * Look for a Plugin controller + */ + if (count($params) >= 2) { + list($author, $plugin) = $params; + + $pluginCode = ucfirst($author) . '.' . ucfirst($plugin); + if (PluginManager::instance()->isDisabled($pluginCode)) { + return Response::make(View::make('backend::404'), 404); + } + + $controller = $params[2] ?? 'index'; + self::$action = $action = isset($params[3]) ? $this->parseAction($params[3]) : 'index'; + self::$params = $controllerParams = array_slice($params, 4); + $controllerClass = '\\'.$author.'\\'.$plugin.'\Controllers\\'.$controller; + if ($controllerObj = $this->findController( + $controllerClass, + $action, + plugins_path() + )) { + return [ + 'controller' => $controllerObj, + 'action' => $action, + 'params' => $controllerParams + ]; + } + } + + return null; + } + + /** + * This method is used internally. + * Finds a backend controller with a callable action method. + * @param string $controller Specifies a method name to execute. + * @param string $action Specifies a method name to execute. + * @param string $inPath Base path for class file location. + * @return ControllerBase Returns the backend controller object + */ + protected function findController($controller, $action, $inPath) + { + if (isset($this->requestedController)) { + return $this->requestedController; + } + + /* + * Workaround: Composer does not support case insensitivity. + */ + if (!class_exists($controller)) { + $controller = Str::normalizeClassName($controller); + $controllerFile = $inPath.strtolower(str_replace('\\', '/', $controller)) . '.php'; + if ($controllerFile = File::existsInsensitive($controllerFile)) { + include_once $controllerFile; + } + } + + if (!class_exists($controller)) { + return $this->requestedController = null; + } + + $controllerObj = App::make($controller); + + if ($controllerObj->actionExists($action)) { + return $this->requestedController = $controllerObj; + } + + return $this->requestedController = null; + } + + /** + * Process the action name, since dashes are not supported in PHP methods. + * @param string $actionName + * @return string + */ + protected function parseAction($actionName) + { + if (strpos($actionName, '-') !== false) { + return snake_case(camel_case($actionName)); + } + + return $actionName; + } + + /** + * Determine if the given options exclude a particular method. + * + * @param string $method + * @param array $options + * @return bool + */ + protected static function methodExcludedByOptions($method, array $options) + { + return (isset($options['only']) && !in_array($method, (array) $options['only'])) || + (!empty($options['except']) && in_array($method, (array) $options['except'])); + } + + public function __call($name, $params) + { + if ($name === 'extend') { + if (empty($params[0]) || !is_callable($params[0])) { + throw new \InvalidArgumentException('The extend() method requires a callback parameter or closure.'); + } + if ($params[0] instanceof Closure) { + return $params[0]->call($this, $params[1] ?? $this); + } + return Closure::fromCallable($params[0])->call($this, $params[1] ?? $this); + } + + return $this->extendableCall($name, $params); + } + + public static function __callStatic($name, $params) + { + if ($name === 'extend') { + if (empty($params[0])) { + throw new \InvalidArgumentException('The extend() method requires a callback parameter or closure.'); + } + self::extendableExtendCallback($params[0], $params[1] ?? false, $params[2] ?? null); + return; + } + + return self::extendableCallStatic($name, $params); + } +} diff --git a/modules/backend/classes/Controller.php b/modules/backend/classes/Controller.php new file mode 100644 index 0000000..4183901 --- /dev/null +++ b/modules/backend/classes/Controller.php @@ -0,0 +1,823 @@ +action = BackendController::$action; + $this->params = BackendController::$params; + + /* + * Apply $guarded methods to hidden actions + */ + $this->hiddenActions = array_merge($this->hiddenActions, $this->guarded); + + /* + * Define layout and view paths + */ + $this->layout = $this->layout ?: 'default'; + $this->layoutPath = Skin::getActive()->getLayoutPaths(); + $this->viewPath = $this->configPath = $this->guessViewPath(); + + /* + * Add layout paths from the plugin / module context + */ + $relativePath = dirname(dirname(strtolower(str_replace('\\', '/', get_called_class())))); + $this->layoutPath[] = '~/modules/' . $relativePath . '/layouts'; + $this->layoutPath[] = '~/plugins/' . $relativePath . '/layouts'; + + /* + * Create a new instance of the admin user + */ + $this->user = BackendAuth::getUser(); + + /* + * Media Manager widget is available on all back-end pages + */ + if ($this->user && $this->user->hasAccess('media.*')) { + $manager = new MediaManager($this, 'ocmediamanager'); + $manager->bindToController(); + } + + $this->extendableConstruct(); + } + + public function __get($name) + { + return $this->extendableGet($name); + } + + public function __set($name, $value) + { + $this->extendableSet($name, $value); + } + + public function __call($name, $params) + { + if ($name === 'extend') { + if (empty($params[0]) || !is_callable($params[0])) { + throw new \InvalidArgumentException('The extend() method requires a callback parameter or closure.'); + } + if ($params[0] instanceof \Closure) { + return $params[0]->call($this, $params[1] ?? $this); + } + return \Closure::fromCallable($params[0])->call($this, $params[1] ?? $this); + } + + return $this->extendableCall($name, $params); + } + + public static function __callStatic($name, $params) + { + if ($name === 'extend') { + if (empty($params[0])) { + throw new \InvalidArgumentException('The extend() method requires a callback parameter or closure.'); + } + self::extendableExtendCallback($params[0], $params[1] ?? false, $params[2] ?? null); + return; + } + + return self::extendableCallStatic($name, $params); + } + + /** + * Set the navigation context based on the current action & parameters + */ + protected function setNavigationContext(?string $action = null, array $params = []): void + { + $context = BackendMenu::getContext(); + + // @TODO: Support detecting module controllers as well + $currentClass = explode('\\', get_class($this)); + $author = $currentClass[0]; + $plugin = $currentClass[1]; + $controller = $currentClass[count($currentClass) - 1]; + + $owner = $context->owner ?? "$author.$plugin"; + $mainMenuCode = $context->mainMenuCode ?? strtolower($plugin); + $sideMenuCode = $context->sideMenuCode ?? strtolower($controller); + + BackendMenu::setContext($owner, $mainMenuCode, $sideMenuCode); + } + + /** + * Execute the controller action. + * @param string $action The action name. + * @param array $params Routing parameters to pass to the action. + * @return mixed The action result. + */ + public function run($action = null, $params = []) + { + $this->action = $action; + $this->params = $params; + + /* + * Short circuit requests without a valid CSRF token + * @see \System\Traits\SecurityController + */ + if (!in_array(Request::method(), ['HEAD', 'GET', 'OPTIONS']) && !$this->verifyCsrfToken()) { + return Response::make(Lang::get('system::lang.page.invalid_token.label'), 403); + } + + /* + * Check forced HTTPS protocol. + * @see \System\Traits\SecurityController + */ + if (!$this->verifyForceSecure()) { + return Redirect::secure(Request::path()); + } + + /* + * Determine if this request is a public action. + */ + $isPublicAction = in_array($action, $this->publicActions); + + /* + * Check that user is logged in and has permission to view this page + */ + if (!$isPublicAction) { + /* + * Not logged in, redirect to login screen or show ajax error. + */ + if (!BackendAuth::check()) { + return Request::ajax() + ? Response::make(Lang::get('backend::lang.page.access_denied.label'), 403) + : Backend::redirectGuest('backend/auth'); + } + + /* + * Check access groups against the page definition + */ + if ($this->requiredPermissions && !$this->user->hasAnyAccess($this->requiredPermissions)) { + abort(403); + } + } + + /** + * @event backend.page.beforeDisplay + * Provides an opportunity to override backend page content + * + * Example usage: + * + * Event::listen('backend.page.beforeDisplay', function ((\Backend\Classes\Controller) $backendController, (string) $action, (array) $params) { + * trace_log('redirect all backend pages to google'); + * return \Redirect::to('https://google.com'); + * }); + * + * Or + * + * $backendController->bindEvent('page.beforeDisplay', function ((string) $action, (array) $params) { + * trace_log('redirect all backend pages to google'); + * return \Redirect::to('https://google.com'); + * }); + * + */ + if ($event = $this->fireSystemEvent('backend.page.beforeDisplay', [$action, $params])) { + return $event; + } + + /* + * Set the admin preference locale + */ + BackendPreference::setAppLocale(); + BackendPreference::setAppFallbackLocale(); + + /* + * Set the navigation context + */ + $this->setNavigationContext($action, $params); + + /* + * Execute AJAX event + */ + if ($ajaxResponse = $this->execAjaxHandlers()) { + $result = $ajaxResponse; + } + + /* + * Execute postback handler + */ + elseif ( + ($handler = post('_handler')) && + $this->verifyCsrfToken() + ) { + $this->validateHandlerName($handler); + + if ( + ($handlerResponse = $this->runAjaxHandler($handler)) && + $handlerResponse !== true + ) { + $result = $handlerResponse; + } + } + + /* + * Execute page action + */ + else { + $result = $this->execPageAction($action, $params); + } + + /* + * Prepare and return response + * @see \System\Traits\ResponseMaker + */ + return $this->makeResponse($result); + } + + /** + * This method is used internally. + * Determines whether an action with the specified name exists. + * Action must be a class public method. Action name can not be prefixed with the underscore character. + * @param string $name Specifies the action name. + * @param bool $internal Allow protected actions. + * @return boolean + */ + public function actionExists($name, $internal = false) + { + if (!strlen($name) || substr($name, 0, 1) == '_' || !$this->methodExists($name)) { + return false; + } + + foreach ($this->hiddenActions as $method) { + if (strtolower($name) == strtolower($method)) { + return false; + } + } + + $ownMethod = method_exists($this, $name); + + if ($ownMethod) { + $methodInfo = new \ReflectionMethod($this, $name); + + /* + * Only allow lowercase actions. Compare the resolved method name rather than the + * requested one - PHP method names are case-insensitive, so a lowercased URL + * segment would otherwise pass this check and still resolve to the mixed-case + * method (eg. "index_onemptylog" reaching index_onEmptyLog()). + */ + if (strtolower($methodInfo->getName()) !== $methodInfo->getName()) { + return false; + } + + $public = $methodInfo->isPublic(); + if ($public) { + return true; + } + } + /* + * Extension methods are resolved through a case-sensitive lookup, so the requested + * name is already the canonical one. + */ + elseif (strtolower($name) !== $name) { + return false; + } + + if ($internal && (($ownMethod && $methodInfo->isProtected()) || !$ownMethod)) { + return true; + } + + if (!$ownMethod) { + return true; + } + + return false; + } + + /** + * Returns a URL for this controller and supplied action. + */ + public function actionUrl($action = null, $path = null) + { + if ($action === null) { + $action = $this->action; + } + + $class = get_called_class(); + $uriPath = dirname(dirname(strtolower(str_replace('\\', '/', $class)))); + $controllerName = strtolower(class_basename($class)); + + $url = $uriPath.'/'.$controllerName.'/'.$action; + if ($path) { + $url .= '/'.$path; + } + + return Backend::url($url); + } + + /** + * Invokes the current controller action without rendering a view, + * used by AJAX handler that may rely on the logic inside the action. + */ + public function pageAction() + { + if (!$this->action) { + return; + } + + $this->suppressView = true; + $this->execPageAction($this->action, $this->params); + } + + /** + * This method is used internally. + * Invokes the controller action and loads the corresponding view. + * @param string $actionName Specifies a action name to execute. + * @param array $parameters A list of the action parameters. + */ + protected function execPageAction($actionName, $parameters) + { + $result = null; + + if (!$this->actionExists($actionName)) { + if (Config::get('app.debug', false)) { + throw new SystemException(sprintf( + "Action %s is not found in the controller %s", + $actionName, + get_class($this) + )); + } else { + Response::make(View::make('backend::404'), 404); + } + } + + // Execute the action + $result = call_user_func_array([$this, $actionName], $parameters); + + // Expecting \Response and \RedirectResponse + if ($result instanceof \Symfony\Component\HttpFoundation\Response) { + return $result; + } + + // No page title + if (!$this->pageTitle) { + $this->pageTitle = 'backend::lang.page.untitled'; + } + + // Load the view + if (!$this->suppressView && $result === null) { + return $this->makeView($actionName); + } + + return $this->makeViewContent((string) $result); + } + + /** + * Returns the AJAX handler for the current request, if available. + * @return string + */ + public function getAjaxHandler() + { + if (!Request::ajax() || Request::method() != 'POST') { + return null; + } + + if ($handler = Request::header('X_WINTER_REQUEST_HANDLER')) { + return trim($handler); + } + + return null; + } + + /** + * Validates the AJAX handler name follows the expected format. + * + * @throws \Winter\Storm\Exception\SystemException if the handler name is invalid + */ + protected function validateHandlerName(string $handler): void + { + if (!preg_match('/^(?:\w+\:{2})?on[A-Z]{1}[\w+]*$/', $handler)) { + throw new SystemException(Lang::get('backend::lang.ajax_handler.invalid_name', ['name' => $handler])); + } + } + + /** + * This method is used internally. + * Invokes a controller event handler and loads the supplied partials. + */ + protected function execAjaxHandlers() + { + if ($handler = $this->getAjaxHandler()) { + try { + /* + * Validate the handler name + */ + $this->validateHandlerName($handler); + + /* + * Validate the handler partial list + */ + if ($partialList = trim(Request::header('X_WINTER_REQUEST_PARTIALS'))) { + $partialList = explode('&', $partialList); + + foreach ($partialList as $partial) { + if (!preg_match('/^(?!.*\/\/)[a-z0-9\_][a-z0-9\_\-\/]*$/i', $partial)) { + throw new SystemException(Lang::get('backend::lang.partial.invalid_name', ['name'=>$partial])); + } + } + } + else { + $partialList = []; + } + + $responseContents = []; + + /* + * Execute the handler + */ + if (!$result = $this->runAjaxHandler($handler)) { + throw new SystemException(Lang::get('backend::lang.ajax_handler.not_found', ['name'=>$handler])); + } + + /* + * Render partials and return the response as array that will be converted to JSON automatically. + */ + foreach ($partialList as $partial) { + $responseContents[$partial] = $this->makePartial($partial); + } + + /* + * If the handler returned a redirect, process the URL and dispose of it so + * framework.js knows to redirect the browser and not the request! + */ + if ($result instanceof RedirectResponse) { + $responseContents['X_WINTER_REDIRECT'] = $result->getTargetUrl(); + $result = null; + } + /* + * No redirect is used, look for any flash messages + */ + elseif (Flash::check()) { + $responseContents['#layout-flash-messages'] = $this->makeLayoutPartial('flash_messages'); + } + + /* + * Detect assets + */ + if ($this->hasAssetsDefined()) { + $responseContents['X_WINTER_ASSETS'] = $this->getAssetPaths(); + } + + /* + * If the handler returned an array, we should add it to output for rendering. + * If it is a string, add it to the array with the key "result". + * If an object, pass it to Laravel as a response object. + */ + if (is_array($result)) { + $responseContents = array_merge($responseContents, $result); + } + elseif (is_string($result)) { + $responseContents['result'] = $result; + } + elseif (is_object($result)) { + return $result; + } + + return Response::make()->setContent($responseContents); + } + catch (ValidationException $ex) { + /* + * Handle validation error gracefully + */ + Flash::error($ex->getMessage()); + $responseContents = []; + $responseContents['#layout-flash-messages'] = $this->makeLayoutPartial('flash_messages'); + $responseContents['X_WINTER_ERROR_FIELDS'] = $ex->getFields(); + throw new AjaxException($responseContents); + } + catch (MassAssignmentException $ex) { + throw new ApplicationException(Lang::get('backend::lang.model.mass_assignment_failed', ['attribute' => $ex->getMessage()])); + } + catch (Exception $ex) { + throw $ex; + } + } + + return null; + } + + /** + * Tries to find and run an AJAX handler in the page action. + * The method stops as soon as the handler is found. + * @return boolean Returns true if the handler was found. Returns false otherwise. + */ + protected function runAjaxHandler($handler) + { + /** + * @event backend.ajax.beforeRunHandler + * Provides an opportunity to modify an AJAX request + * + * The parameter provided is `$handler` (the requested AJAX handler to be run) + * + * Example usage (forwards AJAX handlers to a backend widget): + * + * Event::listen('backend.ajax.beforeRunHandler', function ((\Backend\Classes\Controller) $controller, (string) $handler) { + * if (strpos($handler, '::')) { + * list($componentAlias, $handlerName) = explode('::', $handler); + * if ($componentAlias === $this->getBackendWidgetAlias()) { + * return $this->backendControllerProxy->runAjaxHandler($handler); + * } + * } + * }); + * + * Or + * + * $this->controller->bindEvent('ajax.beforeRunHandler', function ((string) $handler) { + * if (strpos($handler, '::')) { + * list($componentAlias, $handlerName) = explode('::', $handler); + * if ($componentAlias === $this->getBackendWidgetAlias()) { + * return $this->backendControllerProxy->runAjaxHandler($handler); + * } + * } + * }); + * + */ + if ($event = $this->fireSystemEvent('backend.ajax.beforeRunHandler', [$handler])) { + return $event; + } + + /* + * Process Widget handler + */ + if (strpos($handler, '::')) { + list($widgetName, $handlerName) = explode('::', $handler); + + /* + * Execute the page action so widgets are initialized + */ + $this->pageAction(); + + if ($this->fatalError) { + throw new SystemException($this->fatalError); + } + + if (!isset($this->widget->{$widgetName})) { + throw new SystemException(Lang::get('backend::lang.widget.not_bound', ['name'=>$widgetName])); + } + + if (($widget = $this->widget->{$widgetName}) && $widget->methodExists($handlerName)) { + $result = $this->runAjaxHandlerForWidget($widget, $handlerName); + return $result ?: true; + } + } + else { + /* + * Process page specific handler (index_onSomething) + */ + $pageHandler = $this->action . '_' . $handler; + + if ($this->methodExists($pageHandler)) { + $result = call_user_func_array([$this, $pageHandler], array_values($this->params)); + return $result ?: true; + } + + /* + * Process page global handler (onSomething) + */ + if ($this->methodExists($handler)) { + $result = call_user_func_array([$this, $handler], array_values($this->params)); + return $result ?: true; + } + + /* + * Cycle each widget to locate a usable handler (widget::onSomething) + */ + $this->suppressView = true; + $this->execPageAction($this->action, $this->params); + + foreach ((array) $this->widget as $widget) { + if ($widget->methodExists($handler)) { + $result = $this->runAjaxHandlerForWidget($widget, $handler); + return $result ?: true; + } + } + } + + /* + * Generic handler that does nothing + */ + if ($handler == 'onAjax') { + return true; + } + + return false; + } + + /** + * Specific code for executing an AJAX handler for a widget. + * This will append the widget view paths to the controller and merge the vars. + * @return mixed + */ + protected function runAjaxHandlerForWidget($widget, $handler) + { + $this->prependViewPath($widget->getViewPaths()); + + $result = call_user_func_array([$widget, $handler], array_values($this->params)); + + $this->vars = $widget->vars + $this->vars; + + return $result; + } + + /** + * Returns the controllers public actions. + */ + public function getPublicActions() + { + return $this->publicActions; + } + + /** + * Returns a unique ID for the controller and route. Useful in creating HTML markup. + */ + public function getId($suffix = null) + { + $id = class_basename(get_called_class()) . '-' . $this->action; + if ($suffix !== null) { + $id .= '-' . $suffix; + } + + return $id; + } + + // + // Hints + // + + /** + * Renders a hint partial, used for displaying informative information that + * can be hidden by the user. If you don't want to render a partial, you can + * supply content via the 'content' key of $params. + * @param string $name Unique key name + * @param string $partial Reference to content (partial name) + * @param array $params Extra parameters + * @return string + */ + public function makeHintPartial($name, $partial = null, $params = []) + { + if (is_array($partial)) { + $params = $partial; + $partial = null; + } + + if (!$partial) { + $partial = array_get($params, 'partial', $name); + } + + return $this->makeLayoutPartial('hint', [ + 'hintName' => $name, + 'hintPartial' => $partial, + 'hintContent' => array_get($params, 'content'), + 'hintParams' => $params + ] + $params); + } + + /** + * Ajax handler to hide a backend hint, once hidden the partial + * will no longer display for the user. + * @return void + */ + public function onHideBackendHint() + { + if (!$name = post('name')) { + throw new ApplicationException('Missing a hint name.'); + } + + $preferences = UserPreference::forUser(); + $hiddenHints = $preferences->get('backend::hints.hidden', []); + $hiddenHints[$name] = 1; + + $preferences->set('backend::hints.hidden', $hiddenHints); + } + + /** + * Checks if a hint has been hidden by the user. + * @param string $name Unique key name + * @return boolean + */ + public function isBackendHintHidden($name) + { + $hiddenHints = UserPreference::forUser()->get('backend::hints.hidden', []); + return array_key_exists($name, $hiddenHints); + } +} diff --git a/modules/backend/classes/ControllerBehavior.php b/modules/backend/classes/ControllerBehavior.php new file mode 100644 index 0000000..9effeb7 --- /dev/null +++ b/modules/backend/classes/ControllerBehavior.php @@ -0,0 +1,168 @@ +controller = $controller; + $this->viewPath = $this->configPath = $this->guessViewPath('/partials'); + $this->assetPath = $this->guessViewPath('/assets', true); + + /* + * Validate controller properties + */ + foreach ($this->requiredProperties as $property) { + if (!isset($controller->{$property})) { + throw new ApplicationException(Lang::get('system::lang.behavior.missing_property', [ + 'class' => get_class($controller), + 'property' => $property, + 'behavior' => get_called_class() + ])); + } + } + + // Hide all methods that aren't explicitly listed as actions + if (is_array($this->actions)) { + $this->hideAction(array_diff(get_class_methods(get_class($this)), $this->actions)); + } + + // Include this behavior's default views in the controller's view paths + $this->controller->appendViewPath($this->guessViewPath('/views')); + } + + /** + * Sets the configuration values + * @param mixed $config Config object or array + * @param array $required Required config items + */ + public function setConfig($config, $required = []) + { + $this->config = $this->makeConfig($config, $required); + } + + /** + * Safe accessor for configuration values. + * @param string $name Config name, supports array names like "field[key]" + * @param mixed $default Default value if nothing is found + * @return string + */ + public function getConfig($name = null, $default = null) + { + /* + * Return all config + */ + if ($name === null) { + return $this->config; + } + + /* + * Array field name, eg: field[key][key2][key3] + */ + $keyParts = HtmlHelper::nameToArray($name); + + /* + * First part will be the field name, pop it off + */ + $fieldName = array_shift($keyParts); + if (!isset($this->config->{$fieldName})) { + return $default; + } + + $result = $this->config->{$fieldName}; + + /* + * Loop the remaining key parts and build a result + */ + foreach ($keyParts as $key) { + if (!is_array($result) || !array_key_exists($key, $result)) { + return $default; + } + + $result = $result[$key]; + } + + return $result; + } + + /** + * Protects a public method from being available as an controller action. + * These methods could be defined in a controller to override a behavior default action. + * Such methods should be defined as public, to allow the behavior object to access it. + * By default public methods of a controller are considered as actions. + * To prevent this occurrence, methods should be hidden by using this method. + * @param mixed $methodName Specifies a method name. + */ + protected function hideAction($methodName) + { + if (!is_array($methodName)) { + $methodName = [$methodName]; + } + + $this->controller->hiddenActions = array_merge($this->controller->hiddenActions, $methodName); + } + + /** + * Makes all views in context of the controller, not the behavior. + * @param string $filePath Absolute path to the view file. + * @param array $extraParams Parameters that should be available to the view. + * @return string + */ + public function makeFileContents($filePath, $extraParams = []) + { + $this->controller->vars = array_merge($this->controller->vars, $this->vars); + return $this->controller->makeFileContents($filePath, $extraParams); + } + + /** + * Returns true in case if a specified method exists in the extended controller. + * @param string $methodName Specifies the method name + * @return bool + */ + protected function controllerMethodExists($methodName) + { + return method_exists($this->controller, $methodName); + } +} diff --git a/modules/backend/classes/FilterScope.php b/modules/backend/classes/FilterScope.php new file mode 100644 index 0000000..1fa39c4 --- /dev/null +++ b/modules/backend/classes/FilterScope.php @@ -0,0 +1,168 @@ +scopeName = $scopeName; + $this->label = $label; + } + + /** + * Specifies a scope control rendering mode. Supported modes are: + * - group - filter by a group of IDs. Default. + * - checkbox - filter by a simple toggle switch. + * @param string $type Specifies a render mode as described above + * @param array $config A list of render mode specific config. + */ + public function displayAs($type, $config = []) + { + $this->type = strtolower($type) ?: $this->type; + $this->config = $this->evalConfig($config); + return $this; + } + + /** + * Process options and apply them to this object. + * @param array $config + * @return array + */ + protected function evalConfig($config) + { + if ($config === null) { + $config = []; + } + + /* + * Standard config:property values + */ + $applyConfigValues = [ + 'options', + 'dependsOn', + 'context', + 'default', + 'conditions', + 'scope', + 'cssClass', + 'nameFrom', + 'descriptionFrom', + 'disabled', + ]; + + foreach ($applyConfigValues as $value) { + if (array_key_exists($value, $config)) { + $this->{$value} = $config[$value]; + } + } + + return $config; + } + + /** + * Returns a value suitable for the scope id property. + */ + public function getId($suffix = null) + { + $id = 'scope'; + $id .= '-'.$this->scopeName; + + if ($suffix) { + $id .= '-'.$suffix; + } + + if ($this->idPrefix) { + $id = $this->idPrefix . '-' . $id; + } + + return HtmlHelper::nameToId($id); + } +} diff --git a/modules/backend/classes/FormField.php b/modules/backend/classes/FormField.php new file mode 100644 index 0000000..53c2a46 --- /dev/null +++ b/modules/backend/classes/FormField.php @@ -0,0 +1,764 @@ + + */ + public $arrayName; + + /** + * @var string A prefix to the field identifier so it can be totally unique. + */ + public $idPrefix; + + /** + * @var string Form field label. + */ + public $label; + + /** + * @var string Form field value. + */ + public $value; + + /** + * @var string Model attribute to use for the display value. + */ + public $valueFrom; + + /** + * @var string Specifies a default value for supported fields. + */ + public $defaults; + + /** + * @var string Model attribute to use for the default value. + */ + public $defaultFrom; + + /** + * @var string Specifies if this field belongs to a tab. + */ + public $tab; + + /** + * @var string Display mode. Text, textarea + */ + public $type = 'text'; + + /** + * @var string Field options. + */ + public $options; + + /** + * @var string Specifies a side. Possible values: auto, left, right, full. + */ + public $span = 'full'; + + /** + * @var string|int Specifies a size. Possible values for textarea: tiny, small, large, huge, giant. + */ + public $size; + + /** + * @var string Specifies contextual visibility of this form field. + */ + public $context; + + /** + * @var bool Specifies if this field is mandatory. + */ + public $required; + + /** + * @var bool Specify if the field is read-only or not. + */ + public $readOnly = false; + + /** + * @var bool Specify if the field is disabled or not. + */ + public $disabled = false; + + /** + * @var bool Specify if the field is hidden. Hiddens fields are not included in postbacks. + */ + public $hidden = false; + + /** + * @var bool Specifies if this field stretch to fit the page height. + */ + public $stretch = false; + + /** + * @var string Specifies a comment to accompany the field + */ + public $comment = ''; + + /** + * @var string Specifies the comment position. + */ + public $commentPosition = 'below'; + + /** + * @var string Specifies if the comment is in HTML format. + */ + public $commentHtml = false; + + /** + * @var string Specifies a message to display when there is no value supplied (placeholder). + */ + public $placeholder = ''; + + /** + * @var array Contains a list of attributes specified in the field configuration. + */ + public $attributes; + + /** + * @var string Specifies a CSS class to attach to the field container. + */ + public $cssClass; + + /** + * @var string Specifies a path for partial-type fields. + */ + public $path; + + /** + * @var array Raw field configuration. + */ + public $config; + + /** + * @var array Other field names this field depends on, when the other fields are modified, this field will update. + */ + public $dependsOn; + + /** + * @var array Other field names this field can be triggered by, see the Trigger API documentation. + */ + public $trigger; + + /** + * @var array Other field names text is converted in to a URL, slug or file name value in this field. + */ + public $preset; + + /** + * Constructor. + * @param string $fieldName The name of the field + * @param string $label The label of the field + */ + public function __construct($fieldName, $label) + { + $this->fieldName = $fieldName; + $this->label = $label; + } + + /** + * If this field belongs to a tab. + */ + public function tab($value) + { + $this->tab = $value; + return $this; + } + + /** + * Sets a side of the field on a form. + * @param string $value Specifies a side. Possible values: left, right, full + */ + public function span($value = 'full') + { + $this->span = $value; + return $this; + } + + /** + * Sets the size of the field on a form. + * @param string $value Specifies a size. Possible values: tiny, small, large, huge, giant + */ + public function size($value = 'large') + { + $this->size = $value; + return $this; + } + + /** + * Sets field options, for dropdowns, radio lists and checkbox lists. + * @param array $value + * @return self + */ + public function options($value = null) + { + if ($value === null) { + if (is_array($this->options)) { + return $this->options; + } elseif (is_callable($this->options)) { + $callable = $this->options; + return $callable(); + } elseif (is_string($this->options) && is_array($options = Lang::get($this->options))) { + return $options; + } + + return []; + } + + $this->options = $value; + + return $this; + } + + /** + * Specifies a field control rendering mode. Supported modes are: + * - text - creates a text field. Default for varchar column types. + * - textarea - creates a textarea control. Default for text column types. + * - dropdown - creates a drop-down list. Default for reference-based columns. + * - radio - creates a set of radio buttons. + * - checkbox - creates a single checkbox. + * - checkboxlist - creates a checkbox list. + * - switch - creates a switch field. + * @param string $type Specifies a render mode as described above + * @param array $config A list of render mode specific config. + */ + public function displayAs($type, $config = []) + { + if (in_array($type, ['textarea', 'widget'])) { + // defaults to 'large' + $this->size = 'large'; + } + + $this->type = strtolower($type) ?: $this->type; + $this->config = $this->evalConfig($config); + + return $this; + } + + /** + * Process options and apply them to this object. + * @param array $config + * @return array + */ + protected function evalConfig($config) + { + if ($config === null) { + $config = []; + } + + /* + * Standard config:property values + */ + $applyConfigValues = [ + 'commentHtml', + 'context', + 'cssClass', + 'dependsOn', + 'disabled', + 'hidden', + 'path', + 'placeholder', + 'preset', + 'readOnly', + 'required', + 'stretch', + 'trigger', + ]; + + foreach ($applyConfigValues as $value) { + if (array_key_exists($value, $config)) { + $this->{$value} = $config[$value]; + } + } + + /* + * Custom applicators + */ + if (isset($config['options'])) { + $this->options($config['options']); + } + if (isset($config['span'])) { + $this->span($config['span']); + } + if (isset($config['size'])) { + $this->size($config['size']); + } + if (isset($config['tab'])) { + $this->tab($config['tab']); + } + if (isset($config['commentAbove'])) { + $this->comment($config['commentAbove'], 'above'); + } + if (isset($config['comment'])) { + $this->comment($config['comment']); + } + if (isset($config['default'])) { + $this->defaults = $config['default']; + } + if (isset($config['defaultFrom'])) { + $this->defaultFrom = $config['defaultFrom']; + } + if (isset($config['attributes'])) { + $this->attributes($config['attributes']); + } + if (isset($config['containerAttributes'])) { + $this->attributes($config['containerAttributes'], 'container'); + } + + if (isset($config['valueFrom'])) { + $this->valueFrom = $config['valueFrom']; + } + else { + $this->valueFrom = $this->fieldName; + } + + return $config; + } + + /** + * Adds a text comment above or below the field. + * @param string $text Specifies a comment text. + * @param string $position Specifies a comment position. + * @param bool $isHtml Set to true if you use HTML formatting in the comment + * Supported values are 'below' and 'above' + */ + public function comment($text, $position = 'below', $isHtml = null) + { + $this->comment = $text; + $this->commentPosition = $position; + + if ($isHtml !== null) { + $this->commentHtml = $isHtml; + } + + return $this; + } + + /** + * Determine if the provided value matches this field's value. + * @param string $value + * @return bool + */ + public function isSelected($value = true) + { + if ($this->value === null) { + return false; + } + + $value = ($value instanceof BackedEnum) ? $value->value : $value; + $currentValue = ($this->value instanceof BackedEnum) ? $this->value->value : $this->value; + + return (string) $value === (string) $currentValue; + } + + /** + * Sets the attributes for this field in a given position. + * - field: Attributes are added to the form field element (input, select, textarea, etc) + * - container: Attributes are added to the form field container (div.form-group) + * @param array $items + * @param string $position + * @return void + */ + public function attributes($items, $position = 'field') + { + if (!is_array($items)) { + return; + } + + $multiArray = array_filter($items, 'is_array'); + if (!$multiArray) { + $this->attributes[$position] = $items; + return; + } + + foreach ($items as $_position => $_items) { + $this->attributes($_items, $_position); + } + + return $this; + } + + /** + * Checks if the field has the supplied [unfiltered] attribute. + * @param string $name + * @param string $position + * @return bool + */ + public function hasAttribute($name, $position = 'field') + { + if (!isset($this->attributes[$position])) { + return false; + } + + return array_key_exists($name, $this->attributes[$position]); + } + + /** + * Returns the attributes for this field at a given position. + * @param string $position + * @return array + */ + public function getAttributes($position = 'field', $htmlBuild = true) + { + $result = array_get($this->attributes, $position, []); + $result = $this->filterAttributes($result, $position); + + // Field is required, so add the "required" attribute + if ($position === 'field' && $this->required && (!isset($result['required']) || $result['required'])) { + $result['required'] = ''; + } elseif ($position === 'field' && isset($result['required']) && !$result['required']) { + // The "required" attribute is set and falsy, so unset it + unset($result['required']); + } + + return $htmlBuild ? Html::attributes($result) : $result; + } + + /** + * Adds any circumstantial attributes to the field based on other + * settings, such as the 'disabled' option. + * @param array $attributes + * @param string $position + * @return array + */ + protected function filterAttributes($attributes, $position = 'field') + { + $position = strtolower($position); + + $attributes = $this->filterTriggerAttributes($attributes, $position); + $attributes = $this->filterPresetAttributes($attributes, $position); + + if ($position == 'field' && $this->disabled) { + $attributes = $attributes + ['disabled' => 'disabled']; + } + + if ($position == 'field' && $this->readOnly) { + $attributes = $attributes + ['readonly' => 'readonly']; + + if ($this->type == 'checkbox' || $this->type == 'switch') { + $attributes = $attributes + ['onclick' => 'return false;']; + } + } + + return $attributes; + } + + /** + * Adds attributes used specifically by the Trigger API + * @param array $attributes + * @param string $position + * @return array + */ + protected function filterTriggerAttributes($attributes, $position = 'field') + { + if (!$this->trigger || !is_array($this->trigger)) { + return $attributes; + } + + $triggerAction = array_get($this->trigger, 'action'); + $triggerField = array_get($this->trigger, 'field'); + $triggerCondition = array_get($this->trigger, 'condition'); + $triggerForm = $this->arrayName; + $triggerMulti = ''; + + // Apply these to container + if (in_array($triggerAction, ['hide', 'show']) && $position != 'container') { + return $attributes; + } + + // Apply these to field/input + if (in_array($triggerAction, ['enable', 'disable', 'empty']) && $position != 'field') { + return $attributes; + } + + // Reduce the field reference for the trigger condition field + $triggerFieldParentLevel = Str::getPrecedingSymbols($triggerField, self::HIERARCHY_UP); + if ($triggerFieldParentLevel > 0) { + // Remove the preceding symbols from the trigger field name + $triggerField = substr($triggerField, $triggerFieldParentLevel); + $triggerForm = HtmlHelper::reduceNameHierarchy($triggerForm, $triggerFieldParentLevel); + } + + // Preserve multi field types + if (Str::endsWith($triggerField, '[]')) { + $triggerField = substr($triggerField, 0, -2); + $triggerMulti = '[]'; + } + + // Final compilation + if ($this->arrayName) { + $fullTriggerField = $triggerForm.'['.implode('][', HtmlHelper::nameToArray($triggerField)).']'.$triggerMulti; + } + else { + $fullTriggerField = $triggerField.$triggerMulti; + } + + $newAttributes = [ + 'data-trigger' => '[name="'.$fullTriggerField.'"]', + 'data-trigger-action' => $triggerAction, + 'data-trigger-condition' => $triggerCondition, + 'data-trigger-closest-parent' => 'form, div[data-control="formwidget"]' + ]; + + return $attributes + $newAttributes; + } + + /** + * Adds attributes used specifically by the Input Preset API + * @param array $attributes + * @param string $position + * @return array + */ + protected function filterPresetAttributes($attributes, $position = 'field') + { + if (!$this->preset || $position != 'field') { + return $attributes; + } + + if (!is_array($this->preset)) { + $this->preset = ['field' => $this->preset, 'type' => 'slug']; + } + + $presetField = array_get($this->preset, 'field'); + $presetType = array_get($this->preset, 'type'); + + if ($this->arrayName) { + $fullPresetField = $this->arrayName.'['.implode('][', HtmlHelper::nameToArray($presetField)).']'; + } + else { + $fullPresetField = $presetField; + } + + $newAttributes = [ + 'data-input-preset' => '[name="'.$fullPresetField.'"]', + 'data-input-preset-type' => $presetType, + 'data-input-preset-closest-parent' => 'form' + ]; + + if ($prefixInput = array_get($this->preset, 'prefixInput')) { + $newAttributes['data-input-preset-prefix-input'] = $prefixInput; + } + + return $attributes + $newAttributes; + } + + /** + * Returns a value suitable for the field name property. + * @param string $arrayName Specify a custom array name + * @return string + */ + public function getName($arrayName = null) + { + if ($arrayName === null) { + $arrayName = $this->arrayName; + } + + if ($arrayName) { + return $arrayName.'['.implode('][', HtmlHelper::nameToArray($this->fieldName)).']'; + } + + return $this->fieldName; + } + + /** + * Returns a value suitable for the field id property. + * @param string $suffix Specify a suffix string + * @return string + */ + public function getId($suffix = null) + { + $id = 'field'; + if ($this->arrayName) { + $id .= '-'.$this->arrayName; + } + + $id .= '-'.$this->fieldName; + + if ($suffix) { + $id .= '-'.$suffix; + } + + if ($this->idPrefix) { + $id = $this->idPrefix . '-' . $id; + } + + return HtmlHelper::nameToId($id); + } + + /** + * Returns a raw config item value. + * @param string $value + * @param string $default + * @return mixed + */ + public function getConfig($value, $default = null) + { + return array_get($this->config, $value, $default); + } + + /** + * Returns this fields value from a supplied data set, which can be + * an array or a model or another generic collection. + * @param mixed $data + * @param mixed $default + * @return mixed + */ + public function getValueFromData($data, $default = null) + { + $fieldName = $this->valueFrom ?: $this->fieldName; + return $this->getFieldNameFromData($fieldName, $data, $default); + } + + /** + * Returns the default value for this field, the supplied data is used + * to source data when defaultFrom is specified. + * @param mixed $data + * @return mixed + */ + public function getDefaultFromData($data) + { + if ($this->defaultFrom) { + return $this->getFieldNameFromData($this->defaultFrom, $data); + } + + if ($this->defaults !== '') { + return $this->defaults; + } + + return null; + } + + /** + * Returns the final model and attribute name of a nested attribute. Eg: + * + * list($model, $attribute) = $this->resolveAttribute('person[phone]'); + * + * @param string $attribute. + * @return array + */ + public function resolveModelAttribute($model, $attribute = null) + { + if ($attribute === null) { + $attribute = $this->valueFrom ?: $this->fieldName; + } + + $parts = is_array($attribute) ? $attribute : HtmlHelper::nameToArray($attribute); + $last = array_pop($parts); + + foreach ($parts as $part) { + $model = $model->{$part}; + } + + return [$model, $last]; + } + + /** + * Internal method to extract the value of a field name from a data set. + * @param string $fieldName + * @param mixed $data + * @param mixed $default + * @return mixed + */ + protected function getFieldNameFromData($fieldName, $data, $default = null) + { + /* + * Array field name, eg: field[key][key2][key3] + */ + $keyParts = HtmlHelper::nameToArray($fieldName); + $lastField = end($keyParts); + $result = $data; + + /* + * Loop the field key parts and build a value. + * To support relations only the last field should return the + * relation value, all others will look up the relation object as normal. + */ + foreach ($keyParts as $key) { + if ($result instanceof Model && $result->hasRelation($key)) { + if ($key == $lastField) { + $result = $result->getRelationValue($key) ?: $default; + } else { + $result = $result->{$key}; + } + } elseif (is_array($result)) { + if (!array_key_exists($key, $result)) { + return $default; + } + $result = $result[$key]; + } else { + if (!isset($result->{$key})) { + return $default; + } + $result = $result->{$key}; + } + } + + if ($result instanceof BackedEnum) { + $result = $result->value; + } + + return $result; + } + + /** + * Implements the getter functionality. + * @param string $name + */ + public function __get($name) + { + if (is_array($this->config) && array_key_exists($name, $this->config)) { + return array_get($this->config, $name); + } + if (property_exists($this, $name)) { + return $this->{$name}; + } + return null; + } + + /** + * Determine if an attribute exists on the object. + * @param string $name + */ + public function __isset($name) + { + if (is_array($this->config) && array_key_exists($name, $this->config)) { + return true; + } + return property_exists($this, $name) && !is_null($this->{$name}); + } +} diff --git a/modules/backend/classes/FormTabs.php b/modules/backend/classes/FormTabs.php new file mode 100644 index 0000000..381b82b --- /dev/null +++ b/modules/backend/classes/FormTabs.php @@ -0,0 +1,279 @@ +section = strtolower($section) ?: $this->section; + $this->evalConfig($config); + + if ($this->section == self::SECTION_OUTSIDE) { + $this->suppressTabs = true; + } + } + + /** + * Process options and apply them to this object. + */ + protected function evalConfig(array $config): void + { + if (array_key_exists('defaultTab', $config)) { + $this->defaultTab = $config['defaultTab']; + } + + if (array_key_exists('icons', $config)) { + $this->icons = $config['icons']; + } + + if (array_key_exists('stretch', $config)) { + $this->stretch = $config['stretch']; + } + + if (array_key_exists('suppressTabs', $config)) { + $this->suppressTabs = $config['suppressTabs']; + } + + if (array_key_exists('cssClass', $config)) { + $this->cssClass = $config['cssClass']; + } + + if (array_key_exists('paneCssClass', $config)) { + $this->paneCssClass = $config['paneCssClass']; + } + + if (array_key_exists('linkable', $config)) { + $this->linkable = (bool) $config['linkable']; + } + + if (array_key_exists('lazy', $config)) { + $this->lazy = $config['lazy']; + } + } + + /** + * Add a field to the collection of tabs. + * @param string $name + * @param FormField $field + * @param string $tab + */ + public function addField($name, FormField $field, $tab = null) + { + if (!$tab) { + $tab = $this->defaultTab; + } + + $this->fields[$tab][$name] = $field; + } + + /** + * Remove a field from all tabs by name. + * @param string $name + * @return boolean + */ + public function removeField($name) + { + foreach ($this->fields as $tab => $fields) { + foreach ($fields as $fieldName => $field) { + if ($fieldName == $name) { + unset($this->fields[$tab][$fieldName]); + + /* + * Remove empty tabs from collection + */ + if (!count($this->fields[$tab])) { + unset($this->fields[$tab]); + } + + return true; + } + } + } + + return false; + } + + /** + * Returns true if any fields have been registered for these tabs + * @return boolean + */ + public function hasFields() + { + return count($this->fields) > 0; + } + + /** + * Returns an array of the registered fields, including tabs. + * @return array + */ + public function getFields() + { + return $this->fields; + } + + /** + * Returns an array of the registered fields, without tabs. + * @return array + */ + public function getAllFields() + { + $tablessFields = []; + + foreach ($this->getFields() as $tab) { + $tablessFields += $tab; + } + + return $tablessFields; + } + + /** + * Returns an icon for the tab based on the tab's name. + * @param string $name + * @return string + */ + public function getIcon($name) + { + if (!empty($this->icons[$name])) { + return $this->icons[$name]; + } + } + + /** + * Returns a tab pane CSS class. + * @param string $index + * @param string $label + * @return string + */ + public function getPaneCssClass($index = null, $label = null) + { + if (is_string($this->paneCssClass)) { + return $this->paneCssClass; + } + + if ($index !== null && isset($this->paneCssClass[$index])) { + return $this->paneCssClass[$index]; + } + + if ($label !== null && isset($this->paneCssClass[$label])) { + return $this->paneCssClass[$label]; + } + } + + /** + * Get an iterator for the items. + */ + public function getIterator(): Traversable + { + return new ArrayIterator( + $this->suppressTabs + ? $this->getAllFields() + : $this->getFields() + ); + } + + /** + * ArrayAccess implementation + */ + public function offsetSet($offset, $value): void + { + $this->fields[$offset] = $value; + } + + /** + * ArrayAccess implementation + */ + public function offsetExists($offset): bool + { + return isset($this->fields[$offset]); + } + + /** + * ArrayAccess implementation + */ + public function offsetUnset($offset): void + { + unset($this->fields[$offset]); + } + + /** + * ArrayAccess implementation + */ + public function offsetGet($offset): mixed + { + return $this->fields[$offset] ?? null; + } +} diff --git a/modules/backend/classes/FormWidgetBase.php b/modules/backend/classes/FormWidgetBase.php new file mode 100644 index 0000000..9d06e12 --- /dev/null +++ b/modules/backend/classes/FormWidgetBase.php @@ -0,0 +1,152 @@ +formField = $formField; + $this->fieldName = $formField->fieldName; + $this->valueFrom = $formField->valueFrom; + + $this->config = $this->makeConfig($configuration); + + $this->fillFromConfig([ + 'model', + 'data', + 'sessionKey', + 'previewMode', + 'showLabels', + 'parentForm', + ]); + + parent::__construct($controller, $configuration); + } + + /** + * Retrieve the parent form for this formwidget + * + * @return Backend\Widgets\Form|null + */ + public function getParentForm() + { + return $this->parentForm; + } + + /** + * Returns the HTML element field name for this widget, used for capturing + * user input, passed back to the getSaveValue method when saving. + * @return string HTML element name + */ + public function getFieldName() + { + return $this->formField->getName(); + } + + /** + * Returns a unique ID for this widget. Useful in creating HTML markup. + */ + public function getId($suffix = null) + { + $id = parent::getId($suffix); + $id .= '-' . $this->fieldName; + return HtmlHelper::nameToId($id); + } + + /** + * Process the postback value for this widget. If the value is omitted from + * postback data, it will be NULL, otherwise it will be an empty string. + * @param mixed $value The existing value for this widget. + * @return string The new value for this widget. + */ + public function getSaveValue($value) + { + return $value; + } + + /** + * Returns the value for this form field, + * supports nesting via HTML array. + * @return string + */ + public function getLoadValue() + { + if ($this->formField->value !== null) { + return $this->formField->value; + } + + $defaultValue = !$this->model->exists + ? $this->formField->getDefaultFromData($this->data ?: $this->model) + : null; + + return $this->formField->getValueFromData($this->data ?: $this->model, $defaultValue); + } +} diff --git a/modules/backend/classes/ListColumn.php b/modules/backend/classes/ListColumn.php new file mode 100644 index 0000000..04bc867 --- /dev/null +++ b/modules/backend/classes/ListColumn.php @@ -0,0 +1,291 @@ +columnName = $columnName; + $this->label = $label; + } + + /** + * Specifies a list column rendering mode. Supported modes are: + * - text - text column, aligned left + * - number - numeric column, aligned right + * @param string $type Specifies a render mode as described above + */ + public function displayAs($type, $config) + { + $this->type = strtolower($type) ?: $this->type; + $this->config = $this->evalConfig($config); + return $this; + } + + /** + * Process options and apply them to this object. + * @param array $config + * @return array + */ + protected function evalConfig($config) + { + if (isset($config['width'])) { + $this->width = $config['width']; + } + if (isset($config['cssClass'])) { + $this->cssClass = $config['cssClass']; + } + if (isset($config['headCssClass'])) { + $this->headCssClass = $config['headCssClass']; + } + if (isset($config['searchable'])) { + $this->searchable = $config['searchable']; + } + if (isset($config['sortable'])) { + $this->sortable = $config['sortable']; + } + if (isset($config['summable'])) { + $this->summable = $config['summable']; + } + if (isset($config['clickable'])) { + $this->clickable = $config['clickable']; + } + if (isset($config['invisible'])) { + $this->invisible = $config['invisible']; + } + if (isset($config['valueFrom'])) { + $this->valueFrom = $config['valueFrom']; + } + if (isset($config['default'])) { + $this->defaults = $config['default']; + } + if (isset($config['select'])) { + $this->sqlSelect = $config['select']; + } + if (isset($config['relation'])) { + $this->relation = $config['relation']; + } + if (isset($config['format'])) { + $this->format = $config['format']; + } + if (isset($config['path'])) { + $this->path = $config['path']; + } + if (isset($config['align']) && \in_array($config['align'], ['left', 'right', 'center'])) { + $this->align = $config['align']; + } + + return $config; + } + + /** + * Returns a HTML valid name for the column name. + * @return string + */ + public function getName() + { + return HtmlHelper::nameToId($this->columnName); + } + + /** + * Returns a value suitable for the column id property. + * @param string $suffix Specify a suffix string + * @return string + */ + public function getId($suffix = null) + { + $id = 'column'; + + $id .= '-'.$this->columnName; + + if ($suffix) { + $id .= '-'.$suffix; + } + + return HtmlHelper::nameToId($id); + } + + /** + * Returns the column specific aligment css class. + * @return string + */ + public function getAlignClass() + { + return $this->align ? 'list-cell-align-' . $this->align : ''; + } + + /** + * Returns a raw config item value. + * @param string $value + * @param string $default + * @return mixed + */ + public function getConfig($value, $default = null) + { + return array_get($this->config, $value, $default); + } + + /** + * Returns this columns value from a supplied data set, which can be + * an array or a model or another generic collection. + * @param mixed $data + * @param mixed $default + * @return mixed + */ + public function getValueFromData($data, $default = null) + { + $columnName = $this->valueFrom ?: $this->columnName; + return $this->getColumnNameFromData($columnName, $data, $default); + } + + /** + * Internal method to extract the value of a column name from a data set. + * @param string $columnName + * @param mixed $data + * @param mixed $default + * @return mixed + */ + protected function getColumnNameFromData($columnName, $data, $default = null) + { + /* + * Array column name, eg: column[key][key2][key3] + */ + $keyParts = HtmlHelper::nameToArray($columnName); + $result = $data; + + /* + * Loop the column key parts and build a value. + * To support relations only the last column should return the + * relation value, all others will look up the relation object as normal. + */ + foreach ($keyParts as $key) { + if ($result instanceof Model && $result->hasRelation($key)) { + $result = $result->{$key}; + } + else { + if (is_array($result) && array_key_exists($key, $result)) { + $result = $result[$key]; + } elseif (!isset($result->{$key})) { + return $default; + } else { + $result = $result->{$key}; + } + } + } + + return $result; + } +} diff --git a/modules/backend/classes/MainMenuItem.php b/modules/backend/classes/MainMenuItem.php new file mode 100644 index 0000000..ef64f56 --- /dev/null +++ b/modules/backend/classes/MainMenuItem.php @@ -0,0 +1,131 @@ +permissions[$permission] = $definition; + } + + /** + * @param SideMenuItem $sideMenu + */ + public function addSideMenuItem(SideMenuItem $sideMenu) + { + $this->sideMenu[$sideMenu->code] = $sideMenu; + } + + /** + * @param string $code + * @return SideMenuItem + * @throws SystemException + */ + public function getSideMenuItem(string $code) + { + if (!array_key_exists($code, $this->sideMenu)) { + throw new SystemException('No sidenavigation item available with code ' . $code); + } + + return $this->sideMenu[$code]; + } + + /** + * @param string $code + */ + public function removeSideMenuItem(string $code) + { + unset($this->sideMenu[$code]); + } + + /** + * @param array $data + * @return static + */ + public static function createFromArray(array $data) + { + $instance = new static(); + $instance->code = $data['code']; + $instance->owner = $data['owner']; + $instance->label = $data['label']; + $instance->url = $data['url']; + $instance->icon = $data['icon'] ?? null; + $instance->iconSvg = $data['iconSvg'] ?? null; + $instance->counter = $data['counter'] ?? null; + $instance->counterLabel = $data['counterLabel'] ?? null; + $instance->badge = $data['badge'] ?? null; + $instance->permissions = $data['permissions'] ?? $instance->permissions; + $instance->order = (!empty($data['order']) || @$data['order'] === 0) ? (int) $data['order'] : $instance->order; + return $instance; + } +} diff --git a/modules/backend/classes/NavigationManager.php b/modules/backend/classes/NavigationManager.php new file mode 100644 index 0000000..d06d7db --- /dev/null +++ b/modules/backend/classes/NavigationManager.php @@ -0,0 +1,796 @@ + 'Real.Owner'] + */ + protected $aliases = []; + + /** + * @var MainMenuItem[] List of registered items. + */ + protected $items; + + /** + * @var QuickActionItem[] List of registered quick actions. + */ + protected $quickActions; + + protected $contextSidenavPartials = []; + + protected $contextOwner; + protected $contextMainMenuItemCode; + protected $contextSideMenuItemCode; + + /** + * @var PluginManager + */ + protected $pluginManager; + + /** + * Initialize this singleton. + */ + protected function init() + { + foreach (static::$lazyAliases as $alias => $owner) { + $this->registerOwnerAlias($owner, $alias); + } + $this->pluginManager = PluginManager::instance(); + } + + /** + * Loads the menu items from modules and plugins + * @return void + * @throws SystemException + */ + protected function loadItems() + { + $this->items = []; + $this->quickActions = []; + + /* + * Load module items + */ + foreach ($this->callbacks as $callback) { + $callback($this); + } + + /* + * Load plugin items + */ + $plugins = $this->pluginManager->getPlugins(); + + foreach ($plugins as $id => $plugin) { + $items = $plugin->registerNavigation(); + $quickActions = $plugin->registerQuickActions(); + + if (!is_array($items) && !is_array($quickActions)) { + continue; + } + + if (is_array($items)) { + $this->registerMenuItems($id, $items); + } + if (is_array($quickActions)) { + $this->registerQuickActions($id, $quickActions); + } + } + + /** + * @event backend.menu.extendItems + * Provides an opportunity to manipulate the backend navigation + * + * Example usage: + * + * Event::listen('backend.menu.extendItems', function ((\Backend\Classes\NavigationManager) $navigationManager) { + * $navigationManager->addMainMenuItems(...) + * $navigationManager->addSideMenuItems(...) + * $navigationManager->removeMainMenuItem(...) + * }); + * + */ + Event::fire('backend.menu.extendItems', [$this]); + + /* + * Sort menu items and quick actions + */ + $this->applyDefaultOrders($this->items); + uasort($this->items, static function ($a, $b) { + return $a->order - $b->order; + }); + $this->applyDefaultOrders($this->quickActions); + uasort($this->quickActions, static function ($a, $b) { + return $a->order - $b->order; + }); + + /* + * Filter items and quick actions that the user lacks permission for + */ + $user = BackendAuth::getUser(); + $this->items = $this->filterItemPermissions($user, $this->items); + $this->quickActions = $this->filterItemPermissions($user, $this->quickActions); + + foreach ($this->items as $item) { + if (!$item->sideMenu || !count($item->sideMenu)) { + continue; + } + + $this->applyDefaultOrders($item->sideMenu); + + /* + * Sort side menu items + */ + uasort($item->sideMenu, static function ($a, $b) { + return $a->order - $b->order; + }); + + /* + * Filter items user lacks permission for + */ + $item->sideMenu = $this->filterItemPermissions($user, $item->sideMenu); + } + } + + /** + * Apply incremental default orders to items with the explicit auto-order value (-1) + * or that have invalid order values (non-integer). + * + * @param array $items Array of MainMenuItem, SideMenuItem, or QuickActionItem objects + * @return void + */ + protected function applyDefaultOrders(array $items) + { + $orderCount = 0; + foreach ($items as $item) { + if ($item->order !== -1 && is_integer($item->order)) { + continue; + } + $item->order = ($orderCount += 100); + } + } + + /** + * Registers a callback function that defines menu items. + * The callback function should register menu items by calling the manager's + * `registerMenuItems` method. The manager instance is passed to the callback + * function as an argument. Usage: + * + * BackendMenu::registerCallback(function ($manager) { + * $manager->registerMenuItems([...]); + * }); + * + * @param callable $callback A callable function. + */ + public function registerCallback(callable $callback) + { + $this->callbacks[] = $callback; + } + + /** + * Registers the back-end menu items. + * The argument is an array of the main menu items. The array keys represent the + * menu item codes, specific for the plugin/module. Each element in the + * array should be an associative array with the following keys: + * - label - specifies the menu label localization string key, required. + * - icon - an icon name from the Font Awesome icon collection, required. + * - url - the back-end relative URL the menu item should point to, required. + * - permissions - an array of permissions the back-end user should have, optional. + * The item will be displayed if the user has any of the specified permissions. + * - order - a position of the item in the menu, optional. + * - counter - an optional numeric value to output near the menu icon. The value should be + * a number or a callable returning a number. + * - counterLabel - an optional string value to describe the numeric reference in counter. + * - sideMenu - an array of side menu items, optional. If provided, the array items + * should represent the side menu item code, and each value should be an associative + * array with the following keys: + * - label - specifies the menu label localization string key, required. + * - icon - an icon name from the Font Awesome icon collection, required. + * - url - the back-end relative URL the menu item should point to, required. + * - attributes - an array of attributes and values to apply to the menu item, optional. + * - permissions - an array of permissions the back-end user should have, optional. + * - counter - an optional numeric value to output near the menu icon. The value should be + * a number or a callable returning a number. + * - counterLabel - an optional string value to describe the numeric reference in counter. + * - badge - an optional string value to output near the menu icon. The value should be + * a string. This value will override the counter if set. + * @param string $owner Specifies the menu items owner plugin or module in the format Author.Plugin. + * @param array $definitions An array of the menu item definitions. + * @throws SystemException + */ + public function registerMenuItems($owner, array $definitions) + { + $validator = Validator::make($definitions, [ + '*.label' => 'required', + '*.icon' => 'required_without:*.iconSvg', + '*.url' => 'required', + '*.sideMenu.*.label' => 'nullable|required', + '*.sideMenu.*.icon' => 'nullable|required_without:*.sideMenu.*.iconSvg', + '*.sideMenu.*.url' => 'nullable|required', + ]); + + if ($validator->fails()) { + $errorMessage = 'Invalid menu item detected in ' . $owner . '. Contact the plugin author to fix (' . $validator->errors()->first() . ')'; + if (Config::get('app.debug', false)) { + throw new SystemException($errorMessage); + } + + Log::error($errorMessage); + } + + $this->addMainMenuItems($owner, $definitions); + } + + /** + * Register an owner alias + * + * @param string $owner The owner to register an alias for. Example: Real.Owner + * @param string $alias The alias to register. Example: Aliased.Owner + * @return void + */ + public function registerOwnerAlias(string $owner, string $alias) + { + $this->aliases[strtoupper($alias)] = strtoupper($owner); + } + + /** + * Dynamically add an array of main menu items + * @param string $owner + * @param array $definitions + */ + public function addMainMenuItems($owner, array $definitions) + { + foreach ($definitions as $code => $definition) { + $this->addMainMenuItem($owner, $code, $definition); + } + } + + /** + * Dynamically add a single main menu item + * @param string $owner + * @param string $code + * @param array $definition + */ + public function addMainMenuItem($owner, $code, array $definition) + { + $itemKey = $this->makeItemKey($owner, $code); + + if (isset($this->items[$itemKey])) { + $definition = array_merge((array) $this->items[$itemKey], $definition); + } + + $item = array_merge($definition, [ + 'code' => $code, + 'owner' => $owner + ]); + + $this->items[$itemKey] = MainMenuItem::createFromArray($item); + + if (array_key_exists('sideMenu', $item)) { + $this->addSideMenuItems($owner, $code, $item['sideMenu']); + } + } + + /** + * @param string $owner + * @param string $code + * @return MainMenuItem + * @throws SystemException + */ + public function getMainMenuItem(string $owner, string $code) + { + $itemKey = $this->makeItemKey($owner, $code); + + if (!array_key_exists($itemKey, $this->items)) { + throw new SystemException('No main menu item found with key ' . $itemKey); + } + + return $this->items[$itemKey]; + } + + /** + * Removes a single main menu item + * @param $owner + * @param $code + */ + public function removeMainMenuItem($owner, $code) + { + $itemKey = $this->makeItemKey($owner, $code); + unset($this->items[$itemKey]); + } + + /** + * Dynamically add an array of side menu items + * @param string $owner + * @param string $code + * @param array $definitions + */ + public function addSideMenuItems($owner, $code, array $definitions) + { + foreach ($definitions as $sideCode => $definition) { + $this->addSideMenuItem($owner, $code, $sideCode, (array) $definition); + } + } + + /** + * Dynamically add a single side menu item + * @param string $owner + * @param string $code + * @param string $sideCode + * @param array $definition + * @return bool + */ + public function addSideMenuItem($owner, $code, $sideCode, array $definition) + { + $itemKey = $this->makeItemKey($owner, $code); + + if (!isset($this->items[$itemKey])) { + return false; + } + + $mainItem = $this->items[$itemKey]; + + $definition = array_merge($definition, [ + 'code' => $sideCode, + 'owner' => $owner + ]); + + if (isset($mainItem->sideMenu[$sideCode])) { + $definition = array_merge((array) $mainItem->sideMenu[$sideCode], $definition); + } + + $item = SideMenuItem::createFromArray($definition); + + $this->items[$itemKey]->addSideMenuItem($item); + return true; + } + + /** + * Remove multiple side menu items + * + * @param string $owner + * @param string $code + * @param array $sideCodes + * @return void + */ + public function removeSideMenuItems($owner, $code, $sideCodes) + { + foreach ($sideCodes as $sideCode) { + $this->removeSideMenuItem($owner, $code, $sideCode); + } + } + + /** + * Removes a single main menu item + * @param string $owner + * @param string $code + * @param string $sideCode + * @return bool + */ + public function removeSideMenuItem($owner, $code, $sideCode) + { + $itemKey = $this->makeItemKey($owner, $code); + if (!isset($this->items[$itemKey])) { + return false; + } + + $mainItem = $this->items[$itemKey]; + $mainItem->removeSideMenuItem($sideCode); + return true; + } + + /** + * Returns a list of the main menu items. + * @return array + * @throws SystemException + */ + public function listMainMenuItems() + { + if ($this->items === null && $this->quickActions === null) { + $this->loadItems(); + } + + if ($this->items === null) { + return []; + } + + foreach ($this->items as $item) { + if ($item->badge) { + $item->counter = (string) $item->badge; + continue; + } + if ($item->counter === false) { + continue; + } + + if ($item->counter !== null && is_callable($item->counter)) { + $item->counter = call_user_func($item->counter, $item); + } elseif (!empty((int) $item->counter)) { + $item->counter = (int) $item->counter; + } elseif (!empty($sideItems = $this->listSideMenuItems($item->owner, $item->code))) { + $item->counter = 0; + foreach ($sideItems as $sideItem) { + if ($sideItem->badge) { + continue; + } + $item->counter += $sideItem->counter; + } + } + + if (empty($item->counter) || !is_numeric($item->counter)) { + $item->counter = null; + } + } + + return $this->items; + } + + /** + * Returns a list of side menu items for the currently active main menu item. + * The currently active main menu item is set with the setContext methods. + * @param null $owner + * @param null $code + * @return SideMenuItem[] + * @throws SystemException + */ + public function listSideMenuItems($owner = null, $code = null) + { + $activeItem = null; + + if ($owner !== null && $code !== null) { + $activeItem = @$this->items[$this->makeItemKey($owner, $code)]; + } else { + foreach ($this->listMainMenuItems() as $item) { + if ($this->isMainMenuItemActive($item)) { + $activeItem = $item; + break; + } + } + } + + if (!$activeItem) { + return []; + } + + $items = $activeItem->sideMenu; + + foreach ($items as $item) { + if ($item->badge) { + $item->counter = (string) $item->badge; + continue; + } + if ($item->counter !== null && is_callable($item->counter)) { + $item->counter = call_user_func($item->counter, $item); + if (empty($item->counter)) { + $item->counter = null; + } + } + if (!is_null($item->counter) && !is_numeric($item->counter)) { + throw new SystemException("The menu item {$activeItem->code}.{$item->code}'s counter property is invalid. Check to make sure it's numeric or callable. Value: " . var_export($item->counter, true)); + } + } + + return $items; + } + + /** + * Registers quick actions in the main navigation. + * + * Quick actions are single purpose links displayed to the left of the user menu in the + * backend main navigation. + * + * The argument is an array of the quick action items. The array keys represent the + * quick action item codes, specific for the plugin/module. Each element in the + * array should be an associative array with the following keys: + * - label - specifies the action label localization string key, used as a tooltip, required. + * - icon - an icon name from the Font Awesome icon collection, required if iconSvg is unspecified. + * - iconSvg - a custom SVG icon to use for the icon, required if icon is unspecified. + * - url - the back-end relative URL the quick action item should point to, required. + * - permissions - an array of permissions the back-end user should have, optional. + * The item will be displayed if the user has any of the specified permissions. + * - order - a position of the item in the menu, optional. + * + * @param string $owner Specifies the quick action items owner plugin or module in the format Author.Plugin. + * @param array $definitions An array of the quick action item definitions. + * @return void + * @throws SystemException If the validation of the quick action configuration fails + */ + public function registerQuickActions($owner, array $definitions) + { + $validator = Validator::make($definitions, [ + '*.label' => 'required', + '*.icon' => 'required_without:*.iconSvg', + '*.url' => 'required' + ]); + + if ($validator->fails()) { + $errorMessage = 'Invalid quick action item detected in ' . $owner . '. Contact the plugin author to fix (' . $validator->errors()->first() . ')'; + if (Config::get('app.debug', false)) { + throw new SystemException($errorMessage); + } + + Log::error($errorMessage); + } + + $this->addQuickActionItems($owner, $definitions); + } + + /** + * Dynamically add an array of quick action items + * + * @param string $owner + * @param array $definitions + * @return void + */ + public function addQuickActionItems($owner, array $definitions) + { + foreach ($definitions as $code => $definition) { + $this->addQuickActionItem($owner, $code, $definition); + } + } + + /** + * Dynamically add a single quick action item + * + * @param string $owner + * @param string $code + * @param array $definition + * @return void + */ + public function addQuickActionItem($owner, $code, array $definition) + { + $itemKey = $this->makeItemKey($owner, $code); + + if (isset($this->quickActions[$itemKey])) { + $definition = array_merge((array) $this->quickActions[$itemKey], $definition); + } + + $item = array_merge($definition, [ + 'code' => $code, + 'owner' => $owner + ]); + + $this->quickActions[$itemKey] = QuickActionItem::createFromArray($item); + } + + /** + * Gets the instance of a specified quick action item. + * + * @param string $owner + * @param string $code + * @return QuickActionItem + * @throws SystemException + */ + public function getQuickActionItem(string $owner, string $code) + { + $itemKey = $this->makeItemKey($owner, $code); + + if (!array_key_exists($itemKey, $this->quickActions)) { + throw new SystemException('No quick action item found with key ' . $itemKey); + } + + return $this->quickActions[$itemKey]; + } + + /** + * Removes a single quick action item + * + * @param $owner + * @param $code + * @return void + */ + public function removeQuickActionItem($owner, $code) + { + $itemKey = $this->makeItemKey($owner, $code); + unset($this->quickActions[$itemKey]); + } + + /** + * Returns a list of quick action items. + * + * @return array + * @throws SystemException + */ + public function listQuickActionItems() + { + if ($this->items === null && $this->quickActions === null) { + $this->loadItems(); + } + + if ($this->quickActions === null) { + return []; + } + + return $this->quickActions; + } + + /** + * Sets the navigation context. + * The function sets the navigation owner, main menu item code and the side menu item code. + * @param string $owner Specifies the navigation owner in the format Vendor/Module + * @param string $mainMenuItemCode Specifies the main menu item code + * @param string $sideMenuItemCode Specifies the side menu item code + */ + public function setContext($owner, $mainMenuItemCode, $sideMenuItemCode = null) + { + $this->setContextOwner($owner); + $this->setContextMainMenu($mainMenuItemCode); + $this->setContextSideMenu($sideMenuItemCode); + } + + /** + * Sets the navigation context owner. + * + * @param string $owner Specifies the navigation owner in the format Vendor/Module + */ + public function setContextOwner($owner) + { + $this->contextOwner = strtoupper($owner); + } + + /** + * Gets the navigation context owner + */ + public function getContextOwner() + { + return $this->aliases[$this->contextOwner] ?? $this->contextOwner; + } + + /** + * Specifies a code of the main menu item in the current navigation context. + * @param string $mainMenuItemCode Specifies the main menu item code + */ + public function setContextMainMenu($mainMenuItemCode) + { + $this->contextMainMenuItemCode = $mainMenuItemCode; + } + + /** + * Returns information about the current navigation context. + * @return mixed Returns an object with the following fields: + * - mainMenuCode + * - sideMenuCode + * - owner + */ + public function getContext() + { + return (object)[ + 'mainMenuCode' => $this->contextMainMenuItemCode, + 'sideMenuCode' => $this->contextSideMenuItemCode, + 'owner' => $this->getContextOwner(), + ]; + } + + /** + * Specifies a code of the side menu item in the current navigation context. + * If the code is set to TRUE, the first item will be flagged as active. + * @param string $sideMenuItemCode Specifies the side menu item code + */ + public function setContextSideMenu($sideMenuItemCode) + { + $this->contextSideMenuItemCode = $sideMenuItemCode; + } + + /** + * Determines if a main menu item is active. + * @param MainMenuItem $item Specifies the item object. + * @return boolean Returns true if the menu item is active. + */ + public function isMainMenuItemActive($item) + { + return $this->getContextOwner() === strtoupper($item->owner) && $this->contextMainMenuItemCode === $item->code; + } + + /** + * Returns the currently active main menu item + * @return null|MainMenuItem $item Returns the item object or null. + * @throws SystemException + */ + public function getActiveMainMenuItem() + { + foreach ($this->listMainMenuItems() as $item) { + if ($this->isMainMenuItemActive($item)) { + return $item; + } + } + + return null; + } + + /** + * Determines if a side menu item is active. + * @param SideMenuItem $item Specifies the item object. + * @return boolean Returns true if the side item is active. + */ + public function isSideMenuItemActive($item) + { + if ($this->contextSideMenuItemCode === true) { + $this->contextSideMenuItemCode = null; + return true; + } + + return $this->getContextOwner() === strtoupper($item->owner) && $this->contextSideMenuItemCode === $item->code; + } + + /** + * Registers a special side navigation partial for a specific main menu. + * The sidenav partial replaces the standard side navigation. + * @param string $owner Specifies the navigation owner in the format Vendor/Module. + * @param string $mainMenuItemCode Specifies the main menu item code. + * @param string $partial Specifies the partial name. + */ + public function registerContextSidenavPartial($owner, $mainMenuItemCode, $partial) + { + $this->contextSidenavPartials[$this->makeItemKey($owner, $mainMenuItemCode)] = $partial; + } + + /** + * Returns the side navigation partial for a specific main menu previously registered + * with the registerContextSidenavPartial() method. + * + * @param string $owner Specifies the navigation owner in the format Vendor/Module. + * @param string $mainMenuItemCode Specifies the main menu item code. + * @return mixed Returns the partial name or null. + */ + public function getContextSidenavPartial($owner, $mainMenuItemCode) + { + return $this->contextSidenavPartials[$this->makeItemKey($owner, $mainMenuItemCode)] ?? null; + } + + /** + * Removes menu items from an array if the supplied user lacks permission. + * @param \Backend\Models\User $user A user object + * @param MainMenuItem[]|SideMenuItem[] $items A collection of menu items + * @return array The filtered menu items + */ + protected function filterItemPermissions($user, array $items) + { + if (!$user) { + return $items; + } + + $items = array_filter($items, static function ($item) use ($user) { + if (!$item->permissions || !count($item->permissions)) { + return true; + } + + return $user->hasAnyAccess($item->permissions); + }); + + return $items; + } + + /** + * Internal method to make a unique key for an item. + * @param string $owner + * @param string $code + * @return string + */ + protected function makeItemKey($owner, $code) + { + $owner = strtoupper($owner); + return ($this->aliases[$owner] ?? $owner) . '.' . strtoupper($code); + } +} diff --git a/modules/backend/classes/QuickActionItem.php b/modules/backend/classes/QuickActionItem.php new file mode 100644 index 0000000..8dab2e7 --- /dev/null +++ b/modules/backend/classes/QuickActionItem.php @@ -0,0 +1,105 @@ +attributes[$attribute] = $value; + } + + public function removeAttribute($attribute) + { + unset($this->attributes[$attribute]); + } + + /** + * @param string $permission + * @param array $definition + */ + public function addPermission(string $permission, array $definition) + { + $this->permissions[$permission] = $definition; + } + + /** + * @param string $permission + * @return void + */ + public function removePermission(string $permission) + { + unset($this->permissions[$permission]); + } + + /** + * @param array $data + * @return static + */ + public static function createFromArray(array $data) + { + $instance = new static(); + $instance->code = $data['code']; + $instance->owner = $data['owner']; + $instance->label = $data['label']; + $instance->url = $data['url']; + $instance->icon = $data['icon'] ?? null; + $instance->iconSvg = $data['iconSvg'] ?? null; + $instance->attributes = $data['attributes'] ?? $instance->attributes; + $instance->permissions = $data['permissions'] ?? $instance->permissions; + $instance->order = (!empty($data['order']) || @$data['order'] === 0) ? (int) $data['order'] : $instance->order; + return $instance; + } +} diff --git a/modules/backend/classes/ReportWidgetBase.php b/modules/backend/classes/ReportWidgetBase.php new file mode 100644 index 0000000..ac7b091 --- /dev/null +++ b/modules/backend/classes/ReportWidgetBase.php @@ -0,0 +1,28 @@ +properties = $this->validateProperties($properties); + + /* + * Ensure the provided alias (if present) takes effect as the widget configuration is + * not passed to the WidgetBase constructor which would normally take care of that + */ + if (!isset($this->alias)) { + $this->alias = $properties['alias'] ?? $this->defaultAlias; + } + + parent::__construct($controller); + } +} diff --git a/modules/backend/classes/SideMenuItem.php b/modules/backend/classes/SideMenuItem.php new file mode 100644 index 0000000..a7fd9b6 --- /dev/null +++ b/modules/backend/classes/SideMenuItem.php @@ -0,0 +1,123 @@ +attributes[$attribute] = $value; + } + + public function removeAttribute($attribute) + { + unset($this->attributes[$attribute]); + } + + /** + * @param string $permission + * @param array $definition + */ + public function addPermission(string $permission, array $definition) + { + $this->permissions[$permission] = $definition; + } + + /** + * @param string $permission + * @return void + */ + public function removePermission(string $permission) + { + unset($this->permissions[$permission]); + } + + /** + * @param array $data + * @return static + */ + public static function createFromArray(array $data) + { + $instance = new static(); + $instance->code = $data['code']; + $instance->owner = $data['owner']; + $instance->label = $data['label']; + $instance->url = $data['url']; + $instance->icon = $data['icon'] ?? null; + $instance->iconSvg = $data['iconSvg'] ?? null; + $instance->counter = $data['counter'] ?? null; + $instance->counterLabel = $data['counterLabel'] ?? null; + $instance->attributes = $data['attributes'] ?? $instance->attributes; + $instance->badge = $data['badge'] ?? null; + $instance->permissions = $data['permissions'] ?? $instance->permissions; + $instance->order = (!empty($data['order']) || @$data['order'] === 0) ? (int) $data['order'] : $instance->order; + return $instance; + } +} diff --git a/modules/backend/classes/Skin.php b/modules/backend/classes/Skin.php new file mode 100644 index 0000000..b64b83c --- /dev/null +++ b/modules/backend/classes/Skin.php @@ -0,0 +1,111 @@ +defaultSkinPath = base_path() . '/modules/backend'; + + /* + * Guess the skin path + */ + $class = get_called_class(); + $classFolder = strtolower(class_basename($class)); + $classFile = realpath(dirname(File::fromClass($class))); + $this->skinPath = $classFile + ? $classFile . '/' . $classFolder + : $this->defaultSkinPath; + + $this->publicSkinPath = File::localToPublic($this->skinPath); + $this->defaultPublicSkinPath = File::localToPublic($this->defaultSkinPath); + } + + /** + * Looks up a path to a skin-based file, if it doesn't exist, the default path is used. + * @param string $path + * @param boolean $isPublic + * @return string + */ + public function getPath($path = null, $isPublic = false) + { + $path = RouterHelper::normalizeUrl($path); + $assetFile = $this->skinPath . $path; + + if (File::isFile($assetFile)) { + return $isPublic + ? $this->publicSkinPath . $path + : $this->skinPath . $path; + } + + return $isPublic + ? $this->defaultPublicSkinPath . $path + : $this->defaultSkinPath . $path; + } + + /** + * Returns an array of paths where skin layouts can be found. + * @return array + */ + public function getLayoutPaths() + { + return [$this->skinPath.'/layouts', $this->defaultSkinPath.'/layouts']; + } + + /** + * Returns the active skin. + */ + public static function getActive() + { + if (self::$skinCache !== null) { + return self::$skinCache; + } + + $skinClass = Config::get('cms.backendSkin'); + $skinObject = new $skinClass(); + return self::$skinCache = $skinObject; + } +} diff --git a/modules/backend/classes/WidgetBase.php b/modules/backend/classes/WidgetBase.php new file mode 100644 index 0000000..91f1ec5 --- /dev/null +++ b/modules/backend/classes/WidgetBase.php @@ -0,0 +1,216 @@ +controller = $controller; + $this->viewPath = $this->configPath = $this->guessViewPath('/partials'); + $this->assetPath = $this->guessViewPath('/assets', true); + + /* + * Apply configuration values to a new config object, if a parent + * constructor hasn't done it already. + */ + if ($this->config === null) { + $this->config = $this->makeConfig($configuration); + } + + /* + * If no alias is set by the configuration. + */ + if (!isset($this->alias)) { + $this->alias = $this->config->alias ?? $this->defaultAlias; + } + + /* + * Prepare assets used by this widget. + */ + $this->loadAssets(); + + parent::__construct(); + + /* + * Initialize the widget. + */ + if (!$this->getConfig('noInit', false)) { + $this->init(); + } + } + + /** + * Initialize the widget, called by the constructor and free from its parameters. + * @return void + */ + public function init() + { + } + + /** + * Renders the widget's primary contents. + * @return string HTML markup supplied by this widget. + */ + public function render() + { + } + + /** + * Adds widget specific asset files. Use $this->addJs() and $this->addCss() + * to register new assets to include on the page. + * @return void + */ + protected function loadAssets() + { + } + + /** + * Binds a widget to the controller for safe use. + * @return void + */ + public function bindToController() + { + if ($this->controller->widget === null) { + $this->controller->widget = new stdClass; + } + + $this->controller->widget->{$this->alias} = $this; + } + + /** + * Transfers config values stored inside the $config property directly + * on to the root object properties. If no properties are defined + * all config will be transferred if it finds a matching property. + * @param array $properties + * @return void + */ + protected function fillFromConfig($properties = null) + { + if ($properties === null) { + $properties = array_keys((array) $this->config); + } + + foreach ($properties as $property) { + if (property_exists($this, $property)) { + $this->{$property} = $this->getConfig($property, $this->{$property}); + } + } + } + + /** + * Returns a unique ID for this widget. Useful in creating HTML markup. + * @param string $suffix An extra string to append to the ID. + * @return string A unique identifier. + */ + public function getId($suffix = null) + { + $id = class_basename(get_called_class()); + + if ($this->alias != $this->defaultAlias) { + $id .= '-' . $this->alias; + } + + if ($suffix !== null) { + $id .= '-' . $suffix; + } + + return HtmlHelper::nameToId($id); + } + + /** + * Returns a fully qualified event handler name for this widget. + * @param string $name The ajax event handler name. + * @return string + */ + public function getEventHandler($name) + { + return $this->alias . '::' . $name; + } + + /** + * Safe accessor for configuration values. + * @param string $name Config name, supports array names like "field[key]" + * @param string $default Default value if nothing is found + * @return string + */ + public function getConfig($name, $default = null) + { + /* + * Array field name, eg: field[key][key2][key3] + */ + $keyParts = HtmlHelper::nameToArray($name); + + /* + * First part will be the field name, pop it off + */ + $fieldName = array_shift($keyParts); + if (!isset($this->config->{$fieldName})) { + return $default; + } + + $result = $this->config->{$fieldName}; + + /* + * Loop the remaining key parts and build a result + */ + foreach ($keyParts as $key) { + if (!array_key_exists($key, $result)) { + return $default; + } + + $result = $result[$key]; + } + + return $result; + } + + /** + * Returns the controller using this widget. + */ + public function getController() + { + return $this->controller; + } +} diff --git a/modules/backend/classes/WidgetManager.php b/modules/backend/classes/WidgetManager.php new file mode 100644 index 0000000..302ef4b --- /dev/null +++ b/modules/backend/classes/WidgetManager.php @@ -0,0 +1,268 @@ + $formWidgetInfo]. + */ + protected $formWidgets; + + /** + * @var array Cache of form widget registration callbacks. + */ + protected $formWidgetCallbacks = []; + + /** + * @var array An array of form widgets keyed by their code. Stored in the form of ['formwidgetcode' => 'FormWidgetClass']. + */ + protected $formWidgetHints; + + /** + * @var array An array of report widgets. + */ + protected $reportWidgets; + + /** + * @var array Cache of report widget registration callbacks. + */ + protected $reportWidgetCallbacks = []; + + /** + * @var System\Classes\PluginManager + */ + protected $pluginManager; + + /** + * Initialize this singleton. + */ + protected function init() + { + $this->pluginManager = PluginManager::instance(); + } + + // + // Form Widgets + // + + /** + * Returns a list of registered form widgets. + * @return array Array keys are class names. + */ + public function listFormWidgets() + { + if ($this->formWidgets === null) { + $this->formWidgets = []; + + /* + * Load module widgets + */ + foreach ($this->formWidgetCallbacks as $callback) { + $callback($this); + } + + /* + * Load plugin widgets + */ + $plugins = $this->pluginManager->getPlugins(); + + foreach ($plugins as $plugin) { + if (!is_array($widgets = $plugin->registerFormWidgets())) { + continue; + } + + foreach ($widgets as $className => $widgetInfo) { + $this->registerFormWidget($className, $widgetInfo); + } + } + } + + return $this->formWidgets; + } + + /** + * Registers a single form widget. + * @param string $className Widget class name. + * @param array $widgetInfo Registration information, can contain a `code` key. + * @return void + */ + public function registerFormWidget($className, $widgetInfo = null) + { + if (!is_array($widgetInfo)) { + $widgetInfo = ['code' => $widgetInfo]; + } + + $widgetCode = $widgetInfo['code'] ?? null; + + if (!$widgetCode) { + $widgetCode = Str::getClassId($className); + } + + $this->formWidgets[$className] = $widgetInfo; + $this->formWidgetHints[$widgetCode] = $className; + } + + /** + * Manually registers form widget for consideration. Usage: + * + * WidgetManager::registerFormWidgets(function ($manager) { + * $manager->registerFormWidget('Backend\FormWidgets\CodeEditor', 'codeeditor'); + * }); + * + */ + public function registerFormWidgets(callable $definitions) + { + $this->formWidgetCallbacks[] = $definitions; + } + + /** + * Returns a class name from a form widget code + * Normalizes a class name or converts an code to its class name. + * @param string $name Class name or form widget code. + * @return string The class name resolved, or the original name. + */ + public function resolveFormWidget($name) + { + if ($this->formWidgets === null) { + $this->listFormWidgets(); + } + + $hints = $this->formWidgetHints; + + if (isset($hints[$name])) { + return $hints[$name]; + } + + $_name = Str::normalizeClassName($name); + if (isset($this->formWidgets[$_name])) { + return $_name; + } + + return $name; + } + + // + // Report Widgets + // + + /** + * Returns a list of registered report widgets. + * @return array Array keys are class names. + */ + public function listReportWidgets() + { + if ($this->reportWidgets === null) { + $this->reportWidgets = []; + + /* + * Load module widgets + */ + foreach ($this->reportWidgetCallbacks as $callback) { + $callback($this); + } + + /* + * Load plugin widgets + */ + $plugins = $this->pluginManager->getPlugins(); + + foreach ($plugins as $plugin) { + if (!is_array($widgets = $plugin->registerReportWidgets())) { + continue; + } + + foreach ($widgets as $className => $widgetInfo) { + $this->registerReportWidget($className, $widgetInfo); + } + } + } + + /** + * @event system.reportwidgets.extendItems + * Enables adding or removing report widgets. + * + * You will have access to the WidgetManager instance and be able to call the appropiate methods + * $manager->registerReportWidget(); + * $manager->removeReportWidget(); + * + * Example usage: + * + * Event::listen('system.reportwidgets.extendItems', function ($manager) { + * $manager->removeReportWidget('Acme\ReportWidgets\YourWidget'); + * }); + * + */ + Event::fire('system.reportwidgets.extendItems', [$this]); + + $user = BackendAuth::getUser(); + foreach ($this->reportWidgets as $widget => $config) { + if (!empty($config['permissions'])) { + if (!$user->hasAccess($config['permissions'], false)) { + unset($this->reportWidgets[$widget]); + } + } + } + + return $this->reportWidgets; + } + + /** + * Returns the raw array of registered report widgets. + * @return array Array keys are class names. + */ + public function getReportWidgets() + { + return $this->reportWidgets; + } + + /* + * Registers a single report widget. + */ + public function registerReportWidget($className, $widgetInfo) + { + $this->reportWidgets[$className] = $widgetInfo; + } + + /** + * Manually registers report widget for consideration. Usage: + * + * WidgetManager::registerReportWidgets(function ($manager) { + * $manager->registerReportWidget('Winter\GoogleAnalytics\ReportWidgets\TrafficOverview', [ + * 'name' => 'Google Analytics traffic overview', + * 'context' => 'dashboard' + * ]); + * }); + * + */ + public function registerReportWidgets(callable $definitions) + { + $this->reportWidgetCallbacks[] = $definitions; + } + + /** + * Remove a registered ReportWidget. + * @param string $className Widget class name. + * @return void + */ + public function removeReportWidget($className) + { + if (!$this->reportWidgets) { + throw new SystemException('Unable to remove a widget before widgets are loaded.'); + } + + unset($this->reportWidgets[$className]); + } +} diff --git a/modules/backend/composer.json b/modules/backend/composer.json new file mode 100644 index 0000000..bb18309 --- /dev/null +++ b/modules/backend/composer.json @@ -0,0 +1,39 @@ +{ + "name": "winter/wn-backend-module", + "type": "winter-module", + "description": "Backend module for Winter CMS", + "homepage": "https://wintercms.com", + "keywords": ["winter cms", "winter", "backend"], + "license": "MIT", + "authors": [ + { + "name": "Alexey Bobkov", + "email": "aleksey.bobkov@gmail.com", + "role": "Original Author" + }, + { + "name": "Samuel Georges", + "email": "daftspunky@gmail.com", + "role": "Original Author" + }, + { + "name": "Luke Towers", + "email": "wintercms@luketowers.ca", + "role": "Lead Maintainer" + } + ], + "require": { + "php": ">=8.1", + "composer/installers": "~1.11.0", + "laravel/framework": "^9.1" + }, + "replace": { + "october/backend": "1.1.*" + }, + "autoload": { + "psr-4": { + "Backend\\": "" + } + }, + "minimum-stability": "dev" +} diff --git a/modules/backend/console/CreateController.php b/modules/backend/console/CreateController.php new file mode 100644 index 0000000..107e1a3 --- /dev/null +++ b/modules/backend/console/CreateController.php @@ -0,0 +1,119 @@ +(eg: Winter.Blog)} + {controller : The name of the controller to generate. (eg: Posts)} + {--stubs : Create view files for local overwrites.} + {--force : Overwrite existing files with generated files.} + {--model= : Defines the model name to use. If not provided, the singular name of the controller is used.} + {--l|layout=standard : Set the formLayout to use (standard, sidebar, fancy)} + {--uninspiring : Disable inspirational quotes} + '; + + /** + * @var string The console command description. + */ + protected $description = 'Creates a new controller.'; + + /** + * @var string The type of class being generated. + */ + protected $type = 'Controller'; + + /** + * @var string The argument that the generated class name comes from + */ + protected $nameFrom = 'controller'; + + /** + * @var bool Allows the process to continue if an existing file is detected + */ + protected bool $throwOverwriteException = false; + + /** + * @var array A mapping of stub to generated file. + */ + protected $stubs = [ + 'scaffold/controller/config_form.stub' => 'controllers/{{lower_name}}/config_form.yaml', + 'scaffold/controller/config_list.stub' => 'controllers/{{lower_name}}/config_list.yaml', + 'scaffold/controller/controller.stub' => 'controllers/{{studly_name}}.php', + ]; + + /** + * Prepare variables for stubs. + */ + protected function prepareVars(): array + { + $vars = parent::prepareVars(); + $layout = $this->option('layout'); + /* + * Determine the model name to use, + * either supplied or singular from the controller name. + */ + $model = $this->option('model'); + if (!$model) { + $model = Str::singular($vars['name']); + } + $vars['model'] = $model; + $vars['sidebar'] = $layout === 'sidebar'; + $vars['fancy'] = $layout === 'fancy'; + $vars['stubs'] = $this->option('stubs'); + + if ($this->option('stubs')) { + $this->stubs['scaffold/controller/index.stub'] = 'controllers/{{lower_name}}/index.php'; + $this->stubs['scaffold/controller/_list_toolbar.stub'] = 'controllers/{{lower_name}}/_list_toolbar.php'; + $this->stubs["scaffold/controller/{$layout}/create.stub"] = 'controllers/{{lower_name}}/create.php'; + $this->stubs["scaffold/controller/{$layout}/update.stub"] = 'controllers/{{lower_name}}/update.php'; + $this->stubs["scaffold/controller/{$layout}/preview.stub"] = 'controllers/{{lower_name}}/preview.php'; + + if ($layout === 'fancy') { + $this->stubs['scaffold/controller/fancy/_toolbar.stub'] = 'controllers/{{lower_name}}/_toolbar.php'; + } + } + + return $vars; + } + + /** + * Adds controller & model lang helpers to the vars + */ + protected function processVars($vars): array + { + $vars = parent::processVars($vars); + + $vars['controller_url'] = "{$vars['plugin_url']}/{$vars['lower_name']}"; + $vars['model_lang_key_short'] = "models.{$vars['lower_model']}"; + $vars['model_lang_key'] = "{$vars['plugin_id']}::lang.{$vars['model_lang_key_short']}"; + + return $vars; + } + + /** + * Gets the localization keys and values to be stored in the plugin's localization files + * Can reference $this->vars and $this->laravel->getLocale() internally + */ + protected function getLangKeys(): array + { + return [ + "{$this->vars['model_lang_key_short']}.label" => $this->vars['title_singular_name'], + "{$this->vars['model_lang_key_short']}.label_plural" => $this->vars['title_plural_name'], + ]; + } +} diff --git a/modules/backend/console/CreateFormWidget.php b/modules/backend/console/CreateFormWidget.php new file mode 100644 index 0000000..d5ba0f4 --- /dev/null +++ b/modules/backend/console/CreateFormWidget.php @@ -0,0 +1,56 @@ +(eg: Winter.Blog)} + {widget : The name of the form widget to generate. (eg: PostList)} + {--force : Overwrite existing files with generated files.} + {--uninspiring : Disable inspirational quotes} + '; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Creates a new form widget.'; + + /** + * The type of class being generated. + * + * @var string + */ + protected $type = 'FormWidget'; + + /** + * @var string The argument that the generated class name comes from + */ + protected $nameFrom = 'widget'; + + /** + * A mapping of stub to generated file. + * + * @var array + */ + protected $stubs = [ + 'scaffold/formwidget/formwidget.stub' => 'formwidgets/{{studly_name}}.php', + 'scaffold/formwidget/partial.stub' => 'formwidgets/{{lower_name}}/partials/_{{lower_name}}.php', + 'scaffold/formwidget/stylesheet.stub' => 'formwidgets/{{lower_name}}/assets/css/{{lower_name}}.css', + 'scaffold/formwidget/javascript.stub' => 'formwidgets/{{lower_name}}/assets/js/{{lower_name}}.js', + ]; +} diff --git a/modules/backend/console/CreateReportWidget.php b/modules/backend/console/CreateReportWidget.php new file mode 100644 index 0000000..33e329a --- /dev/null +++ b/modules/backend/console/CreateReportWidget.php @@ -0,0 +1,54 @@ +(eg: Winter.Blog)} + {widget : The name of the report widget to generate. (eg: PostViews)} + {--force : Overwrite existing files with generated files.} + {--uninspiring : Disable inspirational quotes} + '; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Creates a new report widget.'; + + /** + * The type of class being generated. + * + * @var string + */ + protected $type = 'ReportWidget'; + + /** + * @var string The argument that the generated class name comes from + */ + protected $nameFrom = 'widget'; + + /** + * A mapping of stub to generated file. + * + * @var array + */ + protected $stubs = [ + 'scaffold/reportwidget/reportwidget.stub' => 'reportwidgets/{{studly_name}}.php', + 'scaffold/reportwidget/widget.stub' => 'reportwidgets/{{lower_name}}/partials/_{{lower_name}}.php', + ]; +} diff --git a/modules/backend/console/UserCreate.php b/modules/backend/console/UserCreate.php new file mode 100644 index 0000000..b1ec787 --- /dev/null +++ b/modules/backend/console/UserCreate.php @@ -0,0 +1,87 @@ +Use the role\'s code} + {--f|force : Force the operation to run and ignore production warnings and confirmation questions.}'; + + /** + * @var string The console command description. + */ + protected $description = 'Creates a backend user.'; + + /** + * Execute the console command. + */ + public function handle(): int + { + $email = $this->argument('email'); + + if ( + Config::get('app.env', 'production') !== 'local' + && !$this->option('force') + && !$this->confirmWithInput("CAUTION, currently working with non-local data. Please confirm the user email address", $email) + ) { + return 1; + } + + if (User::where('email', $email)->exists()) { + $this->error('A user with that email already exists.'); + return 1; + } + + $data = [ + 'email' => $email, + 'password' => $this->option('password') ?: $this->secret('Password'), + 'first_name' => $this->option('fname') ?: $this->ask('First name', ''), + 'last_name' => $this->option('lname') ?: $this->ask('Last name', ''), + 'role_id' => ( + UserRole::where( + 'code', + $this->option('role') ?: $this->choice( + 'Role', + UserRole::lists('name', 'code') + ) + )->firstOrFail() + )->id, + ]; + + $data['password_confirmation'] = $data['password']; + + $user = User::create([ + 'first_name' => $data['first_name'], + 'last_name' => $data['last_name'], + 'login' => $data['email'], + 'email' => $data['email'], + 'role_id' => $data['role_id'], + 'password' => $data['password'], + 'password_confirmation' => $data['password'], + ]); + + $this->info("User {$user->email} created successfully with the {$role->name} role."); + + return 0; + } +} diff --git a/modules/backend/console/WinterPasswd.php b/modules/backend/console/WinterPasswd.php new file mode 100644 index 0000000..d6a96b2 --- /dev/null +++ b/modules/backend/console/WinterPasswd.php @@ -0,0 +1,135 @@ +(eg: admin or admin@example.com)} + {password? : The new password to set.} + '; + + /** + * @var string The console command description. + */ + protected $description = 'Change the password of a Backend user.'; + + /** + * @var array List of commands that this command replaces (aliases) + */ + protected $replaces = [ + 'october:passwd', + 'winter:password', + ]; + + /** + * @var bool Was the password automatically generated? + */ + protected $generatedPassword = false; + + /** + * Execute the console command. + * @return int + */ + public function handle() + { + $username = $this->argument('username') + ?? $this->ask('Username to reset'); + + // Check that the user exists + try { + $user = User::where('login', $username) + ->orWhere('email', $username) + ->firstOrFail(); + } catch (ModelNotFoundException $e) { + $this->error('The specified user does not exist.'); + return 1; + } + + $password = $this->argument('password') + ?? ( + $this->optionalSecret( + 'Enter new password (leave blank for generated password)', + false, + false + ) ?: $this->generatePassword() + ); + + // Change password + $user->password = $password; + $user->forceSave(); + + $this->info('Password successfully changed.'); + if ($this->generatedPassword) { + $this->output->writeLn('Password set to ' . $password . ''); + } + return 0; + } + + /** + * Return the 20 most recently updated users for autocompletion of the "username" argument + */ + public function suggestUsernameValues(): array + { + $options = []; + $users = User::orderBy('updated_at', 'desc')->limit(20)->get(); + foreach ($users as $user) { + if ($user->email) { + $options[] = $user->email; + } elseif ($user->username) { + $options[] = $user->username; + } + } + + return $options; + } + + /** + * Prompt the user for input but hide the answer from the console. + * + * Also allows for a default to be specified. + * + * @param string $question + * @param bool $fallback + * @return string + */ + protected function optionalSecret($question, $fallback = true, $default = null) + { + $question = new Question($question, $default); + + $question->setHidden(true)->setHiddenFallback($fallback); + + return $this->output->askQuestion($question); + } + + /** + * Generate a password and flag it as an automatically-generated password. + * + * @return string + */ + protected function generatePassword() + { + $this->generatedPassword = true; + + return Str::random(22); + } +} diff --git a/modules/backend/console/scaffold/controller/_list_toolbar.stub b/modules/backend/console/scaffold/controller/_list_toolbar.stub new file mode 100644 index 0000000..f062a1c --- /dev/null +++ b/modules/backend/console/scaffold/controller/_list_toolbar.stub @@ -0,0 +1,21 @@ + diff --git a/modules/backend/console/scaffold/controller/config_form.stub b/modules/backend/console/scaffold/controller/config_form.stub new file mode 100644 index 0000000..27320fc --- /dev/null +++ b/modules/backend/console/scaffold/controller/config_form.stub @@ -0,0 +1,31 @@ +# =================================== +# Form Behavior Config +# =================================== + +# Record name +name: '{{ model_lang_key }}.label' + +# Model Form Field configuration +form: $/{{ plugin_folder }}/models/{{ lower_model }}/fields.yaml + +# Model Class name +modelClass: {{ plugin_namespace }}\Models\{{ studly_model }} + +# Default redirect location +defaultRedirect: {{ controller_url }} + +# Create page +create: + title: backend::lang.form.create_title + redirect: {{ controller_url }}/update/:id + redirectClose: {{ controller_url }} + +# Update page +update: + title: backend::lang.form.update_title + redirect: {{ controller_url }} + redirectClose: {{ controller_url }} + +# Preview page +preview: + title: backend::lang.form.preview_title diff --git a/modules/backend/console/scaffold/controller/config_list.stub b/modules/backend/console/scaffold/controller/config_list.stub new file mode 100644 index 0000000..0725e06 --- /dev/null +++ b/modules/backend/console/scaffold/controller/config_list.stub @@ -0,0 +1,50 @@ +# =================================== +# List Behavior Config +# =================================== + +# Model List Column configuration +list: $/{{ plugin_folder }}/models/{{ lower_model }}/columns.yaml + +# Model Class name +modelClass: {{ plugin_namespace }}\Models\{{ studly_model }} + +# List Title +title: '{{ model_lang_key }}.label_plural' + +# Link URL for each record +recordUrl: {{ controller_url }}/update/:id + +# Message to display if the list is empty +noRecordsMessage: backend::lang.list.no_records + +# Records to display per page +recordsPerPage: 20 + +# Options to provide the user when selecting how many records to display per page +perPageOptions: [20, 40, 80, 100, 120] + +# Display page numbers with pagination, disable to improve performance +showPageNumbers: true + +# Displays the list column set up button +showSetup: true + +# Displays the sorting link on each column +showSorting: true + +# Default sorting column +# defaultSort: +# column: created_at +# direction: desc + +# Display checkboxes next to each record +showCheckboxes: true + +# Toolbar widget configuration +toolbar: + # Partial for toolbar buttons + buttons: list_toolbar + + # Search widget configuration + search: + prompt: backend::lang.list.search_prompt diff --git a/modules/backend/console/scaffold/controller/controller.stub b/modules/backend/console/scaffold/controller/controller.stub new file mode 100644 index 0000000..aacd5dc --- /dev/null +++ b/modules/backend/console/scaffold/controller/controller.stub @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + url): ?> + + + + + + + + + + + +
    diff --git a/modules/backend/console/scaffold/controller/fancy/create.stub b/modules/backend/console/scaffold/controller/fancy/create.stub new file mode 100644 index 0000000..0e7a77d --- /dev/null +++ b/modules/backend/console/scaffold/controller/fancy/create.stub @@ -0,0 +1,21 @@ + + makeLayoutPartial('breadcrumb') ?> + + +fatalError): ?> +
    + $this->formGetId(), + 'class' => 'layout', + 'data-change-monitor' => 'true', + 'data-window-close-confirm' => 'true', + ]) ?> +
    + formRender() ?> +
    + +
    + +

    fatalError) ?>

    +

    + diff --git a/modules/backend/console/scaffold/controller/fancy/preview.stub b/modules/backend/console/scaffold/controller/fancy/preview.stub new file mode 100644 index 0000000..5180edc --- /dev/null +++ b/modules/backend/console/scaffold/controller/fancy/preview.stub @@ -0,0 +1,17 @@ + + makeLayoutPartial('breadcrumb') ?> + + +fatalError): ?> + $this->formGetId(), + 'class' => 'layout', + ]) ?> +
    + formRenderPreview() ?> +
    + + +

    fatalError) ?>

    +

    + diff --git a/modules/backend/console/scaffold/controller/fancy/update.stub b/modules/backend/console/scaffold/controller/fancy/update.stub new file mode 100644 index 0000000..0e7a77d --- /dev/null +++ b/modules/backend/console/scaffold/controller/fancy/update.stub @@ -0,0 +1,21 @@ + + makeLayoutPartial('breadcrumb') ?> + + +fatalError): ?> +
    + $this->formGetId(), + 'class' => 'layout', + 'data-change-monitor' => 'true', + 'data-window-close-confirm' => 'true', + ]) ?> +
    + formRender() ?> +
    + +
    + +

    fatalError) ?>

    +

    + diff --git a/modules/backend/console/scaffold/controller/index.stub b/modules/backend/console/scaffold/controller/index.stub new file mode 100644 index 0000000..ea43a36 --- /dev/null +++ b/modules/backend/console/scaffold/controller/index.stub @@ -0,0 +1 @@ +listRender() ?> diff --git a/modules/backend/console/scaffold/controller/sidebar/create.stub b/modules/backend/console/scaffold/controller/sidebar/create.stub new file mode 100644 index 0000000..c367b04 --- /dev/null +++ b/modules/backend/console/scaffold/controller/sidebar/create.stub @@ -0,0 +1,39 @@ + + makeLayoutPartial('breadcrumb') ?> + + +fatalError): ?> + +
    +
    + formRenderOutsideFields() ?> + formRenderPrimaryTabs() ?> +
    + +
    + formMakePartial('toolbar') ?> +
    +
    + + + +
    formRenderSecondaryTabs() ?>
    + + + + $this->formGetId(), + 'class'=>'layout stretch', + ]) ?> + makeLayout('form-with-sidebar') ?> + + + +
    + +
    +
    +

    fatalError)) ?>

    +

    +
    + diff --git a/modules/backend/console/scaffold/controller/sidebar/preview.stub b/modules/backend/console/scaffold/controller/sidebar/preview.stub new file mode 100644 index 0000000..dcfe79f --- /dev/null +++ b/modules/backend/console/scaffold/controller/sidebar/preview.stub @@ -0,0 +1,39 @@ + + makeLayoutPartial('breadcrumb') ?> + + +fatalError): ?> + + +
    + +
    + formRenderOutsideFields() ?> + formRenderPrimaryTabs() ?> +
    + +
    + + + +
    formRenderSecondaryTabs() ?>
    + + + + $this->formGetId(), + 'class'=>'layout stretch', + ]) ?> + makeLayout('form-with-sidebar') ?> + + + + +
    + +
    +
    +

    fatalError)) ?>

    +

    +
    + diff --git a/modules/backend/console/scaffold/controller/sidebar/update.stub b/modules/backend/console/scaffold/controller/sidebar/update.stub new file mode 100644 index 0000000..b7fd53c --- /dev/null +++ b/modules/backend/console/scaffold/controller/sidebar/update.stub @@ -0,0 +1,38 @@ + + makeLayoutPartial('breadcrumb') ?> + + +fatalError): ?> + +
    +
    + formRenderOutsideFields() ?> + formRenderPrimaryTabs() ?> +
    +
    + formMakePartial('toolbar') ?> +
    +
    + + + +
    formRenderSecondaryTabs() ?>
    + + + + $this->formGetId(), + 'class'=>'layout stretch', + ]) ?> + makeLayout('form-with-sidebar') ?> + + + +
    + +
    +
    +

    fatalError)) ?>

    +

    +
    + diff --git a/modules/backend/console/scaffold/controller/standard/create.stub b/modules/backend/console/scaffold/controller/standard/create.stub new file mode 100644 index 0000000..74d7075 --- /dev/null +++ b/modules/backend/console/scaffold/controller/standard/create.stub @@ -0,0 +1,21 @@ + + makeLayoutPartial('breadcrumb') ?> + + +fatalError): ?> + $this->formGetId(), + 'class' => 'layout'], + ) ?> +
    + formRender() ?> +
    + +
    + formMakePartial('toolbar') ?> +
    + + +

    fatalError) ?>

    +

    + diff --git a/modules/backend/console/scaffold/controller/standard/preview.stub b/modules/backend/console/scaffold/controller/standard/preview.stub new file mode 100644 index 0000000..d50dd41 --- /dev/null +++ b/modules/backend/console/scaffold/controller/standard/preview.stub @@ -0,0 +1,16 @@ + + makeLayoutPartial('breadcrumb') ?> + + +fatalError): ?> + +
    + formRenderPreview() ?> +
    + + + +

    fatalError) ?>

    +

    + + diff --git a/modules/backend/console/scaffold/controller/standard/update.stub b/modules/backend/console/scaffold/controller/standard/update.stub new file mode 100644 index 0000000..98ac41e --- /dev/null +++ b/modules/backend/console/scaffold/controller/standard/update.stub @@ -0,0 +1,20 @@ + + makeLayoutPartial('breadcrumb') ?> + + +fatalError): ?> + $this->formGetId(), + 'class' => 'layout', + ]) ?> +
    + formRender() ?> +
    +
    + formMakePartial('toolbar') ?> +
    + + +

    fatalError) ?>

    +

    + diff --git a/modules/backend/console/scaffold/formwidget/formwidget.stub b/modules/backend/console/scaffold/formwidget/formwidget.stub new file mode 100644 index 0000000..091fb61 --- /dev/null +++ b/modules/backend/console/scaffold/formwidget/formwidget.stub @@ -0,0 +1,59 @@ +prepareVars(); + return $this->makePartial('{{lower_name}}'); + } + + /** + * Prepares the form widget view data + */ + public function prepareVars() + { + $this->vars['name'] = $this->formField->getName(); + $this->vars['value'] = $this->getLoadValue(); + $this->vars['model'] = $this->model; + } + + /** + * @inheritDoc + */ + public function loadAssets() + { + $this->addCss('css/{{lower_name}}.css', '{{author}}.{{plugin}}'); + $this->addJs('js/{{lower_name}}.js', '{{author}}.{{plugin}}'); + } + + /** + * @inheritDoc + */ + public function getSaveValue($value) + { + return $value; + } +} diff --git a/modules/backend/console/scaffold/formwidget/javascript.stub b/modules/backend/console/scaffold/formwidget/javascript.stub new file mode 100644 index 0000000..d4765f0 --- /dev/null +++ b/modules/backend/console/scaffold/formwidget/javascript.stub @@ -0,0 +1,5 @@ +/* + * This is a sample JavaScript file used by {{name}} + * + * You can delete this file if you want + */ diff --git a/modules/backend/console/scaffold/formwidget/partial.stub b/modules/backend/console/scaffold/formwidget/partial.stub new file mode 100644 index 0000000..f311f17 --- /dev/null +++ b/modules/backend/console/scaffold/formwidget/partial.stub @@ -0,0 +1,17 @@ +previewMode): ?> + +
    + +
    + + + + + + diff --git a/modules/backend/console/scaffold/formwidget/stylesheet.stub b/modules/backend/console/scaffold/formwidget/stylesheet.stub new file mode 100644 index 0000000..203c17a --- /dev/null +++ b/modules/backend/console/scaffold/formwidget/stylesheet.stub @@ -0,0 +1,5 @@ +/* + * This is a sample StyleSheet file used by {{name}} + * + * You can delete this file if you want + */ diff --git a/modules/backend/console/scaffold/reportwidget/reportwidget.stub b/modules/backend/console/scaffold/reportwidget/reportwidget.stub new file mode 100644 index 0000000..f58a265 --- /dev/null +++ b/modules/backend/console/scaffold/reportwidget/reportwidget.stub @@ -0,0 +1,65 @@ + [ + 'title' => 'backend::lang.dashboard.widget_title_label', + 'default' => '{{title_name}} Report Widget', + 'type' => 'string', + 'validationPattern' => '^.+$', + 'validationMessage' => 'backend::lang.dashboard.widget_title_error', + ], + ]; + } + + /** + * Adds widget specific asset files. Use $this->addJs() and $this->addCss() + * to register new assets to include on the page. + * @return void + */ + protected function loadAssets() + { + } + + /** + * Renders the widget's primary contents. + * @return string HTML markup supplied by this widget. + */ + public function render() + { + try { + $this->prepareVars(); + } catch (Exception $ex) { + $this->vars['error'] = $ex->getMessage(); + } + + return $this->makePartial('{{lower_name}}'); + } + + /** + * Prepares the report widget view data + */ + public function prepareVars() + { + } +} diff --git a/modules/backend/console/scaffold/reportwidget/widget.stub b/modules/backend/console/scaffold/reportwidget/widget.stub new file mode 100644 index 0000000..13f9152 --- /dev/null +++ b/modules/backend/console/scaffold/reportwidget/widget.stub @@ -0,0 +1,9 @@ +
    +

    property('title')) ?>

    + + +

    This is the default partial content.

    + +

    + +
    diff --git a/modules/backend/controllers/AccessLogs.php b/modules/backend/controllers/AccessLogs.php new file mode 100644 index 0000000..05391cb --- /dev/null +++ b/modules/backend/controllers/AccessLogs.php @@ -0,0 +1,43 @@ +listRefresh(); + } +} diff --git a/modules/backend/controllers/Auth.php b/modules/backend/controllers/Auth.php new file mode 100644 index 0000000..549d96f --- /dev/null +++ b/modules/backend/controllers/Auth.php @@ -0,0 +1,241 @@ +layout = 'auth'; + } + + /** + * Default route, redirects to signin. + */ + public function index() + { + return Backend::redirect('backend/auth/signin'); + } + + /** + * Displays the log in page. + */ + public function signin() + { + if (BackendAuth::user()) { + return Backend::redirect('backend'); + } + + $this->bodyClass = 'signin'; + + // Clear Cache and any previous data to fix invalid security token issue + $this->setResponseHeader('Cache-Control', 'no-cache, no-store, must-revalidate'); + + try { + if (post('postback')) { + return $this->signin_onSubmit(); + } + + $this->bodyClass .= ' preload'; + } catch (Exception $ex) { + Flash::error($ex->getMessage()); + } + } + + public function signin_onSubmit() + { + $rules = [ + 'login' => 'required|between:2,255', + 'password' => 'required|between:4,255' + ]; + + $validation = Validator::make(post(), $rules); + if ($validation->fails()) { + throw new ValidationException($validation); + } + + if (is_null($remember = Config::get('cms.backendForceRemember', true))) { + $remember = (bool) post('remember'); + } + + // Authenticate user + $user = BackendAuth::authenticate([ + 'login' => post('login'), + 'password' => post('password') + ], $remember); + + // Redirect to the intended page after successful sign in + return Backend::redirectIntended('backend'); + } + + /** + * Logs out a backend user. + */ + public function signout() + { + if (BackendAuth::isImpersonator()) { + BackendAuth::stopImpersonate(); + } else { + BackendAuth::logout(); + } + + // Add HTTP Header 'Clear Site Data' to purge all sensitive data upon signout + if (Request::secure()) { + $this->setResponseHeader('Clear-Site-Data', 'cache, cookies, storage, executionContexts'); + } + + return Backend::redirect('backend'); + } + + /** + * Request a password reset verification code. + */ + public function restore() + { + $this->bodyClass = 'restore'; + + try { + if (post('postback')) { + return $this->restore_onSubmit(); + } + } catch (Exception $ex) { + Flash::error($ex->getMessage()); + } + } + + /** + * Submits the restore form. + */ + public function restore_onSubmit() + { + // Force Trusted Host verification on password reset link generation + // regardless of config to protect against host header poisoning + $trustedHosts = Config::get('app.trustedHosts', false); + if ($trustedHosts === false) { + $hosts = CheckForTrustedHost::processTrustedHosts(true); + + if (count($hosts)) { + Request::setTrustedHosts($hosts); + + // Trigger the host validation logic + Request::getHost(); + } + } + + $rules = [ + 'login' => 'required|between:2,255' + ]; + + $validation = Validator::make(post(), $rules); + if ($validation->fails()) { + throw new ValidationException($validation); + } + + $user = BackendAuth::findUserByLogin(post('login')); + + if ($user) { + $code = $user->getResetPasswordCode(); + $link = Backend::url('backend/auth/reset/' . $user->id . '/' . $code); + + $data = [ + 'name' => $user->full_name, + 'link' => $link, + ]; + + Mail::send('backend::mail.restore', $data, function ($message) use ($user) { + $message->to($user->email, $user->full_name)->subject(trans('backend::lang.account.password_reset')); + }); + } + + Flash::success(trans('backend::lang.account.restore_success')); + + return Backend::redirect('backend/auth/signin'); + } + + /** + * Reset backend user password using verification code. + */ + public function reset($userId = null, $code = null) + { + $this->bodyClass = 'reset'; + + try { + if (post('postback')) { + return $this->reset_onSubmit(); + } + + if (!$userId || !$code) { + throw new ApplicationException(trans('backend::lang.account.reset_error')); + } + } catch (Exception $ex) { + Flash::error($ex->getMessage()); + } + + $this->vars['code'] = $code; + $this->vars['id'] = $userId; + } + + /** + * Submits the reset form. + */ + public function reset_onSubmit() + { + if (!post('id') || !post('code')) { + throw new ApplicationException(trans('backend::lang.account.reset_error')); + } + + $rules = [ + 'password' => 'required|between:4,255' + ]; + + $validation = Validator::make(post(), $rules); + if ($validation->fails()) { + throw new ValidationException($validation); + } + + $code = post('code'); + $user = BackendAuth::findUserById(post('id')); + + if (!$user || !$user->checkResetPasswordCode($code)) { + throw new ApplicationException(trans('backend::lang.account.reset_error')); + } + + if (!$user->attemptResetPassword($code, post('password'))) { + throw new ApplicationException(trans('backend::lang.account.reset_fail')); + } + + $user->clearResetPassword(); + + Flash::success(trans('backend::lang.account.reset_success')); + + return Backend::redirect('backend/auth/signin'); + } +} diff --git a/modules/backend/controllers/Files.php b/modules/backend/controllers/Files.php new file mode 100644 index 0000000..37ad192 --- /dev/null +++ b/modules/backend/controllers/Files.php @@ -0,0 +1,196 @@ +findFileObject($code)->output('inline', true); + } + catch (Exception $ex) { + } + + return Response::make(View::make('backend::404'), 404); + } + + /** + * Output thumbnail, or fall back on the 404 page + */ + public function thumb($code = null, $width = 100, $height = 100, $mode = 'auto', $extension = 'auto') + { + try { + return $this->findFileObject($code)->outputThumb( + $width, + $height, + compact('mode', 'extension'), + true + ); + } + catch (Exception $ex) { + } + + return Response::make(View::make('backend::404'), 404); + } + + /** + * Attempt to return a redirect to a temporary URL to the asset instead of streaming the asset - if supported + * + * @param System|Models\File $file + * @param string|null $path Optional, defaults to the getDiskPath() of the file + * @return string|null + */ + protected static function getTemporaryUrl($file, $path = null) + { + // Get the disk used + $disk = $file->getDisk(); + + if (empty($path)) { + $path = $file->getDiskPath(); + } + + // Check to see if the URL has already been generated + $pathKey = 'backend.file:' . $path; + $url = Cache::get($pathKey, null); + + if (is_null($url) && $disk->exists($path)) { + $expires = now()->addSeconds(Config::get('cms.storage.uploads.temporaryUrlTTL', 3600)); + $url = Cache::remember($pathKey, $expires, function () use ($disk, $path, $expires) { + // Attempt to generate a temporary URL, if a RuntimeException occurs it's "probably" + // because the driver doesn't support that method + try { + return $disk->temporaryUrl($path, $expires); + } catch (RuntimeException $ex) { + return false; + } + }); + } + + // Limit the return types to strings or null + if (!is_string($url) || empty($url)) { + $url = null; + } + + return $url; + } + + /** + * Returns the URL for downloading a system file. + * @param $file System\Models\File + * @return string + */ + public static function getDownloadUrl($file) + { + $url = static::getTemporaryUrl($file); + + if (!empty($url)) { + return $url; + } else { + return Backend::url('backend/files/get/' . self::getUniqueCode($file)); + } + } + + /** + * Returns the URL for downloading a system file. + * @param $file System\Models\File + * @param $width int + * @param $height int + * @param $options array + * @return string + */ + public static function getThumbUrl($file, $width, $height, $options) + { + $url = static::getTemporaryUrl($file, $file->getDiskPath($file->getThumbFilename($width, $height, $options))); + + if (!empty($url)) { + return $url; + } else { + return Backend::url('backend/files/thumb/' . self::getUniqueCode($file)) . '/' . $width . '/' . $height . '/' . $options['mode'] . '/' . $options['extension']; + } + } + + /** + * Returns a unique code used for masking the file identifier. + * @param $file System\Models\File + * @return string + */ + public static function getUniqueCode($file) + { + if (!$file) { + return null; + } + + $hash = md5($file->file_name . '!' . $file->disk_name); + return base64_encode($file->id . '!' . $hash); + } + + /** + * Locates a file model based on the unique code. + * @param $code string + * @return System\Models\File + */ + protected function findFileObject($code) + { + if (!$code) { + throw new ApplicationException('Missing code'); + } + + $parts = explode('!', base64_decode($code)); + if (count($parts) < 2) { + throw new ApplicationException('Invalid code'); + } + + list($id, $hash) = $parts; + + if (!$file = FileModel::find((int) $id)) { + throw new ApplicationException('Unable to find file'); + } + + /** + * Ensure that the file model utilized for this request is + * the one specified in the relationship configuration + */ + if ($file->attachment) { + $fileModel = $file->attachment->{$file->field}()->getRelated(); + + /** + * Only attempt to get file model through its assigned class + * when the assigned class differs from the default one that + * the file has already been loaded from + */ + if (get_class($file) !== get_class($fileModel)) { + $file = $fileModel->find($file->id); + } + } + + $verifyCode = self::getUniqueCode($file); + if ($code != $verifyCode) { + throw new ApplicationException('Invalid hash'); + } + + return $file; + } +} diff --git a/modules/backend/controllers/Index.php b/modules/backend/controllers/Index.php new file mode 100644 index 0000000..6856a9b --- /dev/null +++ b/modules/backend/controllers/Index.php @@ -0,0 +1,81 @@ +addCss('/modules/backend/assets/css/dashboard/dashboard.css', 'core'); + } + + public function index() + { + if ($redirect = $this->checkPermissionRedirect()) { + return $redirect; + } + + $this->initReportContainer(); + + $this->pageTitle = 'backend::lang.dashboard.menu_label'; + + BackendMenu::setContextMainMenu('dashboard'); + } + + public function index_onInitReportContainer() + { + $this->initReportContainer(); + + return ['#dashReportContainer' => $this->widget->reportContainer->render()]; + } + + /** + * Prepare the report widget used by the dashboard + * @param Model $model + * @return void + */ + protected function initReportContainer() + { + new ReportContainer($this, 'config_dashboard.yaml'); + } + + /** + * Custom permissions check that will redirect to the next + * available menu item, if permission to this page is denied. + */ + protected function checkPermissionRedirect() + { + if (!$this->user->hasAccess('backend.access_dashboard')) { + if ($first = array_first(BackendMenu::listMainMenuItems())) { + return Redirect::intended($first->url); + } + return Backend::redirect('backend/myaccount'); + } + } +} diff --git a/modules/backend/controllers/Media.php b/modules/backend/controllers/Media.php new file mode 100644 index 0000000..7a3a743 --- /dev/null +++ b/modules/backend/controllers/Media.php @@ -0,0 +1,38 @@ +pageTitle = 'backend::lang.media.menu_label'; + + $manager = new MediaManager($this, 'manager'); + $manager->bindToController(); + } + + public function index() + { + $this->bodyClass = 'compact-container'; + } +} diff --git a/modules/backend/controllers/MyAccount.php b/modules/backend/controllers/MyAccount.php new file mode 100644 index 0000000..55e2723 --- /dev/null +++ b/modules/backend/controllers/MyAccount.php @@ -0,0 +1,92 @@ +whereKey($this->user->getKey()); + } + + /** + * My Account page + */ + public function index() + { + $this->pageTitle = 'backend::lang.myaccount.menu_label'; + return $this->asExtension('FormController')->update($this->user->id, 'myaccount'); + } + + /** + * Save handler for the My Account form + */ + public function index_onSave() + { + $result = $this->asExtension('FormController')->update_onSave($this->user->id, 'myaccount'); + + /* + * If the password or login name has been updated, reauthenticate the user + */ + $loginChanged = $this->user->login != post('User[login]'); + $passwordChanged = strlen(post('User[password]')); + if ($loginChanged || $passwordChanged) { + BackendAuth::login($this->user->reload(), true); + } + + return $result; + } +} diff --git a/modules/backend/controllers/Preferences.php b/modules/backend/controllers/Preferences.php new file mode 100644 index 0000000..8bfcd53 --- /dev/null +++ b/modules/backend/controllers/Preferences.php @@ -0,0 +1,79 @@ +addJs('/modules/backend/assets/js/preferences/preferences.js', 'core'); + + BackendMenu::setContext('Winter.System', 'system', 'mysettings'); + SettingsManager::setContext('Winter.Backend', 'preferences'); + } + + public function index() + { + $this->pageTitle = 'backend::lang.backend_preferences.menu_label'; + $this->asExtension('FormController')->update(); + } + + /** + * Remove the code editor tab if there is no permission. + */ + public function formExtendFields($form) + { + if (!$this->user->hasAccess('backend.manage_own_editor')) { + $form->removeTab('backend::lang.backend_preferences.code_editor'); + } + } + + public function index_onSave() + { + return $this->asExtension('FormController')->update_onSave(); + } + + public function index_onResetDefault() + { + $model = $this->formFindModelObject(); + $model->resetDefault(); + + Flash::success(Lang::get('backend::lang.form.reset_success')); + + return Backend::redirect('backend/preferences'); + } + + public function formFindModelObject() + { + return PreferenceModel::instance(); + } +} diff --git a/modules/backend/controllers/UserGroups.php b/modules/backend/controllers/UserGroups.php new file mode 100644 index 0000000..10bc257 --- /dev/null +++ b/modules/backend/controllers/UserGroups.php @@ -0,0 +1,39 @@ +bindEvent('page.beforeDisplay', function () { + if (!$this->user->isSuperUser()) { + abort(403); + } + }); + } +} diff --git a/modules/backend/controllers/Users.php b/modules/backend/controllers/Users.php new file mode 100644 index 0000000..ef0813f --- /dev/null +++ b/modules/backend/controllers/Users.php @@ -0,0 +1,258 @@ +user->isSuperUser()) { + $query->where('is_superuser', false); + } + } + + /** + * Prevents non-superusers from even seeing the is_superuser filter + */ + public function listFilterExtendScopes($filterWidget) + { + if (!$this->user->isSuperUser()) { + $filterWidget->removeScope('is_superuser'); + } + } + + /** + * Strike out deleted records + */ + public function listInjectRowClass($record, $definition = null) + { + if ($record->trashed()) { + return 'strike'; + } + } + + /** + * Extends the form query to prevent non-superusers from accessing superusers at all + */ + public function formExtendQuery($query) + { + if (!$this->user->isSuperUser()) { + $query->where('is_superuser', false); + } + + // Ensure soft-deleted records can still be managed + $query->withTrashed(); + } + + /** + * Before creating a new user, generate password if auto-generate is enabled + */ + public function formBeforeCreate($model) + { + if (post('User._auto_generate_password')) { + $password = Str::random(22); + $model->password = $password; + $model->password_confirmation = $password; + } + } + + /** + * Update controller + */ + public function update($recordId, $context = null) + { + // Users cannot edit themselves, only use My Account + if ($context != 'myaccount' && $recordId == $this->user->id) { + return Backend::redirect('backend/myaccount'); + } + + return $this->asExtension('FormController')->update($recordId, $context); + } + + /** + * Handle restoring users + */ + public function update_onRestore($recordId) + { + $this->formFindModelObject($recordId)->restore(); + + Flash::success(Lang::get('backend::lang.form.restore_success', ['name' => Lang::get('backend::lang.user.name')])); + + return Redirect::refresh(); + } + + /** + * Impersonate this user + */ + public function update_onImpersonateUser($recordId) + { + if (!$this->user->hasAccess('backend.impersonate_users')) { + return Response::make(Lang::get('backend::lang.page.access_denied.label'), 403); + } + + $model = $this->formFindModelObject($recordId); + + BackendAuth::impersonate($model); + + Flash::success(Lang::get('backend::lang.account.impersonate_success')); + + return Backend::redirect('backend/myaccount'); + } + + /** + * Unsuspend this user + */ + public function update_onUnsuspendUser($recordId) + { + $model = $this->formFindModelObject($recordId); + + $model->unsuspend(); + + Flash::success(Lang::get('backend::lang.account.unsuspend_success')); + + return Redirect::refresh(); + } + + /** + * Backward compatibility redirect to the new MyAccount controller. + */ + public function myaccount() + { + return Backend::redirect('backend/myaccount'); + } + + /** + * Add available permission fields to the User form. + * Mark default groups as checked for new Users. + */ + public function formExtendFields($form) + { + if ($form->getContext() == 'myaccount') { + return; + } + + if (!$this->user->isSuperUser()) { + $form->removeField('is_superuser'); + } + + /* + * Add permissions tab + */ + $form->addTabFields($this->generatePermissionsField()); + + /* + * Mark default groups + */ + if (!$form->model->exists) { + $defaultGroupIds = UserGroup::where('is_new_user_default', true)->lists('id'); + + $groupField = $form->getField('groups'); + if ($groupField) { + $groupField->value = $defaultGroupIds; + } + } + } + + /** + * Adds the permissions editor widget to the form. + * @return array + */ + protected function generatePermissionsField() + { + return [ + 'permissions' => [ + 'tab' => 'backend::lang.user.permissions', + 'type' => 'Backend\FormWidgets\PermissionEditor', + 'trigger' => [ + 'action' => 'disable', + 'field' => 'is_superuser', + 'condition' => 'checked' + ] + ] + ]; + } + + /** + * Send password reset mail + */ + public function update_onManualPasswordReset($recordId) + { + $user = $this->formFindModelObject($recordId); + + if ($user) { + $code = $user->getResetPasswordCode(); + $link = Backend::url('backend/auth/reset/' . $user->id . '/' . $code); + + $data = [ + 'name' => $user->full_name, + 'link' => $link, + ]; + + Mail::send('backend::mail.restore', $data, function ($message) use ($user) { + $message->to($user->email, $user->full_name)->subject(trans('backend::lang.account.password_reset')); + }); + } + + Flash::success(Lang::get('backend::lang.account.manual_password_reset_success')); + + return Redirect::refresh(); + } +} diff --git a/modules/backend/controllers/accesslogs/_hint.php b/modules/backend/controllers/accesslogs/_hint.php new file mode 100644 index 0000000..66c293f --- /dev/null +++ b/modules/backend/controllers/accesslogs/_hint.php @@ -0,0 +1,4 @@ + +

    + 60])) ?> +

    \ No newline at end of file diff --git a/modules/backend/controllers/accesslogs/_list_toolbar.php b/modules/backend/controllers/accesslogs/_list_toolbar.php new file mode 100644 index 0000000..81bfa64 --- /dev/null +++ b/modules/backend/controllers/accesslogs/_list_toolbar.php @@ -0,0 +1,9 @@ + diff --git a/modules/backend/controllers/accesslogs/config_filter.yaml b/modules/backend/controllers/accesslogs/config_filter.yaml new file mode 100644 index 0000000..2e35941 --- /dev/null +++ b/modules/backend/controllers/accesslogs/config_filter.yaml @@ -0,0 +1,16 @@ +# =================================== +# Filter Scope Definitions +# =================================== + +scopes: + + created_at: + label: backend::lang.access_log.created_at + type: daterange + conditions: created_at >= ':after' AND created_at <= ':before' + + user: + label: backend::lang.access_log.login + modelClass: Backend\Models\User + conditions: user_id in (:filtered) + nameFrom: login diff --git a/modules/backend/controllers/accesslogs/config_list.yaml b/modules/backend/controllers/accesslogs/config_list.yaml new file mode 100644 index 0000000..c146ba8 --- /dev/null +++ b/modules/backend/controllers/accesslogs/config_list.yaml @@ -0,0 +1,17 @@ +# =================================== +# List Behavior Config +# =================================== + +title: backend::lang.access_log.menu_label +list: ~/modules/backend/models/accesslog/columns.yaml +modelClass: Backend\Models\AccessLog +noRecordsMessage: backend::lang.list.no_records +recordsPerPage: 30 +showSetup: true + +toolbar: + buttons: list_toolbar + search: + prompt: backend::lang.list.search_prompt + +filter: config_filter.yaml diff --git a/modules/backend/controllers/accesslogs/index.php b/modules/backend/controllers/accesslogs/index.php new file mode 100644 index 0000000..7dab755 --- /dev/null +++ b/modules/backend/controllers/accesslogs/index.php @@ -0,0 +1,5 @@ +
    + makeHintPartial('backend_accesslogs_hint', 'hint') ?> +
    + +listRender() ?> \ No newline at end of file diff --git a/modules/backend/controllers/auth/reset.php b/modules/backend/controllers/auth/reset.php new file mode 100644 index 0000000..279a899 --- /dev/null +++ b/modules/backend/controllers/auth/reset.php @@ -0,0 +1,33 @@ +

    + + + + + + +
    +
    + + + + + + +
    + +

    + + + +

    +
    + diff --git a/modules/backend/controllers/auth/restore.php b/modules/backend/controllers/auth/restore.php new file mode 100644 index 0000000..59d2bc7 --- /dev/null +++ b/modules/backend/controllers/auth/restore.php @@ -0,0 +1,31 @@ +

    + + + + +
    +
    + + + + +
    + +

    + + + +

    +
    + + +fireViewEvent('backend.auth.extendRestoreView') ?> diff --git a/modules/backend/controllers/auth/signin.php b/modules/backend/controllers/auth/signin.php new file mode 100644 index 0000000..c8512a2 --- /dev/null +++ b/modules/backend/controllers/auth/signin.php @@ -0,0 +1,60 @@ +

    + + + + +
    +
    + + + + + + + + + +
    + + + +
    +
    + + +
    +
    + + +

    + + + + +

    + +
    + + +fireViewEvent('backend.auth.extendSigninView') ?> diff --git a/modules/backend/controllers/index/config_dashboard.yaml b/modules/backend/controllers/index/config_dashboard.yaml new file mode 100644 index 0000000..de3a20e --- /dev/null +++ b/modules/backend/controllers/index/config_dashboard.yaml @@ -0,0 +1,23 @@ +# =================================== +# Dashboard Config +# =================================== + +defaultWidgets: + + welcome: + class: Backend\ReportWidgets\Welcome + sortOrder: 50 + configuration: + ocWidgetWidth: 7 + + systemStatus: + class: System\ReportWidgets\Status + sortOrder: 60 + configuration: + ocWidgetWidth: 7 + + activeTheme: + class: Cms\ReportWidgets\ActiveTheme + sortOrder: 70 + configuration: + ocWidgetWidth: 5 diff --git a/modules/backend/controllers/index/index.php b/modules/backend/controllers/index/index.php new file mode 100644 index 0000000..971d2d6 --- /dev/null +++ b/modules/backend/controllers/index/index.php @@ -0,0 +1,23 @@ +'layout-relative dashboard-container']) ?> +
    + +
    +
    + +
    +
    +
    +
    + + + + + diff --git a/modules/backend/controllers/media/index.php b/modules/backend/controllers/media/index.php new file mode 100644 index 0000000..7ff071e --- /dev/null +++ b/modules/backend/controllers/media/index.php @@ -0,0 +1,5 @@ + + 'layout', 'onsubmit'=>'return false']) ?> + widget->manager->render() ?> + + diff --git a/modules/backend/controllers/myaccount/config_form.yaml b/modules/backend/controllers/myaccount/config_form.yaml new file mode 100644 index 0000000..060251d --- /dev/null +++ b/modules/backend/controllers/myaccount/config_form.yaml @@ -0,0 +1,12 @@ +# =================================== +# Form Behavior Config +# =================================== + +name: backend::lang.user.name +form: ~/modules/backend/models/user/fields.yaml +modelClass: Backend\Models\User +defaultRedirect: backend/myaccount + +update: + redirect: backend/myaccount + redirectClose: backend/myaccount diff --git a/modules/backend/controllers/myaccount/index.php b/modules/backend/controllers/myaccount/index.php new file mode 100644 index 0000000..a9e49f5 --- /dev/null +++ b/modules/backend/controllers/myaccount/index.php @@ -0,0 +1,56 @@ +user->hasAccess('backend.manage_users')): ?> + +
      +
    • +
    • pageTitle)) ?>
    • +
    + + + +fatalError): ?> + + +
    + +
    + formRenderOutsideFields() ?> + formRenderPrimaryTabs() ?> +
    + +
    +
    + +
    +
    + +
    + + + +
    formRenderSecondaryTabs() ?>
    + + + + 'layout stretch']) ?> + makeLayout('form-with-sidebar') ?> + + + + +
    + +
    +
    +

    fatalError)) ?>

    +

    +
    + diff --git a/modules/backend/controllers/preferences/_example_code.php b/modules/backend/controllers/preferences/_example_code.php new file mode 100644 index 0000000..7369211 --- /dev/null +++ b/modules/backend/controllers/preferences/_example_code.php @@ -0,0 +1,24 @@ +form, fieldset, h5, h6, pre, blockquote, ol, dl, dt, dd, address, dd, dtm, div, td, th, hr { + margin: 0; + padding: 0; +} + +/* This is a comment */ +body { + background-color: white; + font: 62.5% Helvetica, Arial, Tahoma, Verdana, Helvetica, sans-serif; +} + +p { + font-size: 12px; +} + +strong { + font-weight: bold; +} + +span.alert { + color: #ff0000; + border: 1px solid #ff0000; + padding: 2rem; +} diff --git a/modules/backend/controllers/preferences/_field_editor_preview_lang.php b/modules/backend/controllers/preferences/_field_editor_preview_lang.php new file mode 100644 index 0000000..33c709e --- /dev/null +++ b/modules/backend/controllers/preferences/_field_editor_preview_lang.php @@ -0,0 +1,122 @@ +

    + : + CSS | + HTML | + JavaScript | + Twig | + PHP +

    + + + + + + + + + + diff --git a/modules/backend/controllers/preferences/config_form.yaml b/modules/backend/controllers/preferences/config_form.yaml new file mode 100644 index 0000000..c9647ef --- /dev/null +++ b/modules/backend/controllers/preferences/config_form.yaml @@ -0,0 +1,8 @@ +# =================================== +# Form Behavior Config +# =================================== + +name: backend::lang.backend_preferences.menu_label +form: ~/modules/backend/models/preference/fields.yaml +modelClass: Backend\Models\Preference +defaultRedirect: system/settings diff --git a/modules/backend/controllers/preferences/index.php b/modules/backend/controllers/preferences/index.php new file mode 100644 index 0000000..1266aba --- /dev/null +++ b/modules/backend/controllers/preferences/index.php @@ -0,0 +1,41 @@ +fatalError): ?> + + 'layout']) ?> + +
    + formRender() ?> +
    + +
    +
    + + + + + + + +
    +
    + + + +

    fatalError)) ?>

    +

    + \ No newline at end of file diff --git a/modules/backend/controllers/usergroups/_list_toolbar.php b/modules/backend/controllers/usergroups/_list_toolbar.php new file mode 100644 index 0000000..bccd962 --- /dev/null +++ b/modules/backend/controllers/usergroups/_list_toolbar.php @@ -0,0 +1,8 @@ + diff --git a/modules/backend/controllers/usergroups/config_form.yaml b/modules/backend/controllers/usergroups/config_form.yaml new file mode 100644 index 0000000..9d20458 --- /dev/null +++ b/modules/backend/controllers/usergroups/config_form.yaml @@ -0,0 +1,16 @@ +# =================================== +# Form Behavior Config +# =================================== + +name: backend::lang.user.group.name +form: ~/modules/backend/models/usergroup/fields.yaml +modelClass: Backend\Models\UserGroup +defaultRedirect: backend/usergroups + +create: + redirect: backend/usergroups/update/:id + redirectClose: backend/usergroups + +update: + redirect: backend/usergroups + redirectClose: backend/usergroups diff --git a/modules/backend/controllers/usergroups/config_list.yaml b/modules/backend/controllers/usergroups/config_list.yaml new file mode 100644 index 0000000..e88b417 --- /dev/null +++ b/modules/backend/controllers/usergroups/config_list.yaml @@ -0,0 +1,16 @@ +# =================================== +# List Behavior Config +# =================================== + +title: backend::lang.user.group.list_title +list: ~/modules/backend/models/usergroup/columns.yaml +modelClass: Backend\Models\UserGroup +recordUrl: backend/usergroups/update/:id +noRecordsMessage: backend::lang.list.no_records +recordsPerPage: 25 +showSetup: true + +toolbar: + buttons: list_toolbar + search: + prompt: backend::lang.list.search_prompt diff --git a/modules/backend/controllers/usergroups/create.php b/modules/backend/controllers/usergroups/create.php new file mode 100644 index 0000000..3401241 --- /dev/null +++ b/modules/backend/controllers/usergroups/create.php @@ -0,0 +1,46 @@ + +
      +
    • +
    • +
    • pageTitle)) ?>
    • +
    + + +fatalError): ?> + + 'layout']) ?> + +
    + formRender() ?> +
    + +
    +
    + + +
    +
    + + + + +

    fatalError)) ?>

    +

    + diff --git a/modules/backend/controllers/usergroups/update.php b/modules/backend/controllers/usergroups/update.php new file mode 100644 index 0000000..fa1462d --- /dev/null +++ b/modules/backend/controllers/usergroups/update.php @@ -0,0 +1,54 @@ + +
      +
    • +
    • +
    • pageTitle)) ?>
    • +
    + + +fatalError): ?> + + 'layout']) ?> + +
    + formRender() ?> +
    + +
    +
    + + + +
    +
    + + + + +

    fatalError)) ?>

    +

    + diff --git a/modules/backend/controllers/userroles/__users.php b/modules/backend/controllers/userroles/__users.php new file mode 100644 index 0000000..f4b08fc --- /dev/null +++ b/modules/backend/controllers/userroles/__users.php @@ -0,0 +1 @@ +relationRender('users') ?> diff --git a/modules/backend/controllers/userroles/_list_toolbar.php b/modules/backend/controllers/userroles/_list_toolbar.php new file mode 100644 index 0000000..d99bf7c --- /dev/null +++ b/modules/backend/controllers/userroles/_list_toolbar.php @@ -0,0 +1,8 @@ + diff --git a/modules/backend/controllers/userroles/config_form.yaml b/modules/backend/controllers/userroles/config_form.yaml new file mode 100644 index 0000000..68b4063 --- /dev/null +++ b/modules/backend/controllers/userroles/config_form.yaml @@ -0,0 +1,16 @@ +# =================================== +# Form Behavior Config +# =================================== + +name: backend::lang.user.role.name +form: ~/modules/backend/models/userrole/fields.yaml +modelClass: Backend\Models\UserRole +defaultRedirect: backend/userroles + +create: + redirect: backend/userroles/update/:id + redirectClose: backend/userroles + +update: + redirect: backend/userroles + redirectClose: backend/userroles diff --git a/modules/backend/controllers/userroles/config_list.yaml b/modules/backend/controllers/userroles/config_list.yaml new file mode 100644 index 0000000..520fb6e --- /dev/null +++ b/modules/backend/controllers/userroles/config_list.yaml @@ -0,0 +1,16 @@ +# =================================== +# List Behavior Config +# =================================== + +title: backend::lang.user.role.list_title +list: ~/modules/backend/models/userrole/columns.yaml +modelClass: Backend\Models\UserRole +recordUrl: backend/userroles/update/:id +noRecordsMessage: backend::lang.list.no_records +recordsPerPage: 25 +showSetup: true + +toolbar: + buttons: list_toolbar + search: + prompt: backend::lang.list.search_prompt diff --git a/modules/backend/controllers/userroles/config_relation.yaml b/modules/backend/controllers/userroles/config_relation.yaml new file mode 100644 index 0000000..aa9b855 --- /dev/null +++ b/modules/backend/controllers/userroles/config_relation.yaml @@ -0,0 +1,10 @@ +# =================================== +# Relation Behavior Config +# =================================== + +users: + label: backend::lang.user.name + view: + list: ~/modules/backend/models/user/columns.yaml + toolbarButtons: add|remove + recordUrl: backend/users/update/:id diff --git a/modules/backend/controllers/userroles/create.php b/modules/backend/controllers/userroles/create.php new file mode 100644 index 0000000..0ba5e30 --- /dev/null +++ b/modules/backend/controllers/userroles/create.php @@ -0,0 +1,46 @@ + +
      +
    • +
    • +
    • pageTitle)) ?>
    • +
    + + +fatalError): ?> + + 'layout']) ?> + +
    + formRender() ?> +
    + +
    +
    + + +
    +
    + + + + +

    fatalError)) ?>

    +

    + diff --git a/modules/backend/controllers/userroles/update.php b/modules/backend/controllers/userroles/update.php new file mode 100644 index 0000000..888c15e --- /dev/null +++ b/modules/backend/controllers/userroles/update.php @@ -0,0 +1,54 @@ + +
      +
    • +
    • +
    • pageTitle)) ?>
    • +
    + + +fatalError): ?> + + 'layout']) ?> + +
    + formRender() ?> +
    + +
    +
    + + + +
    +
    + + + + +

    fatalError)) ?>

    +

    + diff --git a/modules/backend/controllers/users/_btn_impersonate.php b/modules/backend/controllers/users/_btn_impersonate.php new file mode 100644 index 0000000..4fe629a --- /dev/null +++ b/modules/backend/controllers/users/_btn_impersonate.php @@ -0,0 +1,14 @@ +user->hasAccess('backend.impersonate_users')): ?> +
    + +
    + \ No newline at end of file diff --git a/modules/backend/controllers/users/_btn_password_reset.php b/modules/backend/controllers/users/_btn_password_reset.php new file mode 100644 index 0000000..78dc211 --- /dev/null +++ b/modules/backend/controllers/users/_btn_password_reset.php @@ -0,0 +1,12 @@ +
    + +
    diff --git a/modules/backend/controllers/users/_btn_unsuspend.php b/modules/backend/controllers/users/_btn_unsuspend.php new file mode 100644 index 0000000..e917ee3 --- /dev/null +++ b/modules/backend/controllers/users/_btn_unsuspend.php @@ -0,0 +1,14 @@ +isSuspended()): ?> +
    + +
    + diff --git a/modules/backend/controllers/users/_hint_trashed.php b/modules/backend/controllers/users/_hint_trashed.php new file mode 100644 index 0000000..7c15ebd --- /dev/null +++ b/modules/backend/controllers/users/_hint_trashed.php @@ -0,0 +1,9 @@ +
    +
    +
    + +

    +

    +
    +
    +
    \ No newline at end of file diff --git a/modules/backend/controllers/users/_list_toolbar.php b/modules/backend/controllers/users/_list_toolbar.php new file mode 100644 index 0000000..f81c1c2 --- /dev/null +++ b/modules/backend/controllers/users/_list_toolbar.php @@ -0,0 +1,29 @@ +
    + + + + user->isSuperUser()): ?> + + + + + + + + + + +
    + */ ?> +
    diff --git a/modules/backend/controllers/users/config_filter.yaml b/modules/backend/controllers/users/config_filter.yaml new file mode 100644 index 0000000..d9660cc --- /dev/null +++ b/modules/backend/controllers/users/config_filter.yaml @@ -0,0 +1,30 @@ +# =================================== +# Filter Scope Definitions +# =================================== + +scopes: + + is_superuser: + label: backend::lang.user.superuser + type: switch + conditions: + - is_superuser = 0 + - is_superuser = 1 + + login_date: + label: backend::lang.user.last_login + type: daterange + conditions: last_login >= ':after' AND last_login <= ':before' + + role_id: + label: backend::lang.user.role.name + modelClass: Backend\Models\UserRole + conditions: role_id in (:filtered) + nameFrom: name + + show_deleted: + label: backend::lang.user.show_deleted + type: checkbox + modelClass: Backend\Models\User + scope: withTrashed + default: 0 diff --git a/modules/backend/controllers/users/config_form.yaml b/modules/backend/controllers/users/config_form.yaml new file mode 100644 index 0000000..cb83a00 --- /dev/null +++ b/modules/backend/controllers/users/config_form.yaml @@ -0,0 +1,16 @@ +# =================================== +# Form Behavior Config +# =================================== + +name: backend::lang.user.name +form: ~/modules/backend/models/user/fields.yaml +modelClass: Backend\Models\User +defaultRedirect: backend/users + +create: + redirect: backend/users/update/:id + redirectClose: backend/users + +update: + redirect: backend/users + redirectClose: backend/users diff --git a/modules/backend/controllers/users/config_list.yaml b/modules/backend/controllers/users/config_list.yaml new file mode 100644 index 0000000..5dcd9ee --- /dev/null +++ b/modules/backend/controllers/users/config_list.yaml @@ -0,0 +1,19 @@ +# =================================== +# List Behavior Config +# =================================== + +title: backend::lang.user.list_title +list: ~/modules/backend/models/user/columns.yaml +modelClass: Backend\Models\User +recordUrl: backend/users/update/:id +noRecordsMessage: backend::lang.list.no_records +recordsPerPage: 20 +showSetup: true +# showCheckboxes: true + +toolbar: + buttons: list_toolbar + search: + prompt: backend::lang.list.search_prompt + +filter: config_filter.yaml diff --git a/modules/backend/controllers/users/config_relation.yaml b/modules/backend/controllers/users/config_relation.yaml new file mode 100644 index 0000000..bcb19cd --- /dev/null +++ b/modules/backend/controllers/users/config_relation.yaml @@ -0,0 +1,31 @@ +# =================================== +# Relation Behavior Config +# =================================== + +throttle: + label: backend::lang.user.throttle_tab_label + view: + list: + columns: + ip_address: + label: backend::lang.user.throttle_ip_address + searchable: true + attempts: + label: backend::lang.user.throttle_attempts + width: 100px + align: center + last_attempt_at: + label: backend::lang.user.throttle_last_attempt + type: datetime + searchable: true + suspended_at: + label: backend::lang.user.throttle_suspended_at + type: datetime + searchable: true + toolbarButtons: delete|refresh + showSearch: true + showSorting: true + recordsPerPage: 10 + defaultSort: + column: last_attempt_at + direction: desc diff --git a/modules/backend/controllers/users/myaccount.php b/modules/backend/controllers/users/myaccount.php new file mode 100644 index 0000000..9c91187 --- /dev/null +++ b/modules/backend/controllers/users/myaccount.php @@ -0,0 +1,68 @@ +user->hasAccess('backend.manage_users')): ?> + +
      +
    • +
    • pageTitle)) ?>
    • +
    + + + +fatalError): ?> + + +
    + +
    + formRenderOutsideFields() ?> + formRenderPrimaryTabs() ?> +
    + +
    +
    + + user->hasAccess('backend.manage_users')): ?> + + +
    +
    + +
    + + + +
    formRenderSecondaryTabs() ?>
    + + + + 'layout stretch']) ?> + makeLayout('form-with-sidebar') ?> + + + + +
    + +
    +
    +

    fatalError)) ?>

    +

    +
    + diff --git a/modules/backend/controllers/users/update.php b/modules/backend/controllers/users/update.php new file mode 100644 index 0000000..6317998 --- /dev/null +++ b/modules/backend/controllers/users/update.php @@ -0,0 +1,88 @@ + +
      +
    • +
    • pageTitle)) ?>
    • +
    + + +fatalError): ?> + + + trashed()): ?> + makePartial('hint_trashed') ?> + + +
    + +
    + formRenderOutsideFields() ?> + formRenderPrimaryTabs() ?> +
    + +
    +
    + + + + + + trashed()): ?> + + + + +
    +
    + +
    + + + +
    formRenderSecondaryTabs() ?>
    + + + + 'layout stretch']) ?> + makeLayout('form-with-sidebar') ?> + + + + +
    + +
    +
    +

    fatalError)) ?>

    +

    +
    + diff --git a/modules/backend/database/migrations/2013_10_01_000001_Db_Backend_Users.php b/modules/backend/database/migrations/2013_10_01_000001_Db_Backend_Users.php new file mode 100644 index 0000000..1f6808a --- /dev/null +++ b/modules/backend/database/migrations/2013_10_01_000001_Db_Backend_Users.php @@ -0,0 +1,35 @@ +engine = 'InnoDB'; + $table->increments('id'); + $table->string('first_name')->nullable(); + $table->string('last_name')->nullable(); + $table->string('login')->unique('login_unique')->index('login_index'); + $table->string('email')->unique('email_unique'); + $table->string('password'); + $table->string('activation_code')->nullable()->index('act_code_index'); + $table->string('persist_code')->nullable(); + $table->string('reset_password_code')->nullable()->index('reset_code_index'); + $table->text('permissions')->nullable(); + $table->boolean('is_activated')->default(0); + $table->integer('role_id')->unsigned()->nullable()->index('admin_role_index'); + $table->timestamp('activated_at')->nullable(); + $table->timestamp('last_login')->nullable(); + $table->timestamps(); + $table->timestamp('deleted_at')->nullable(); + }); + } + + public function down() + { + Schema::dropIfExists('backend_users'); + } +} diff --git a/modules/backend/database/migrations/2013_10_01_000002_Db_Backend_User_Groups.php b/modules/backend/database/migrations/2013_10_01_000002_Db_Backend_User_Groups.php new file mode 100644 index 0000000..d465beb --- /dev/null +++ b/modules/backend/database/migrations/2013_10_01_000002_Db_Backend_User_Groups.php @@ -0,0 +1,22 @@ +engine = 'InnoDB'; + $table->increments('id'); + $table->string('name')->unique('name_unique'); + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('backend_user_groups'); + } +} diff --git a/modules/backend/database/migrations/2013_10_01_000003_Db_Backend_Users_Groups.php b/modules/backend/database/migrations/2013_10_01_000003_Db_Backend_Users_Groups.php new file mode 100644 index 0000000..c1f1728 --- /dev/null +++ b/modules/backend/database/migrations/2013_10_01_000003_Db_Backend_Users_Groups.php @@ -0,0 +1,22 @@ +engine = 'InnoDB'; + $table->integer('user_id')->unsigned(); + $table->integer('user_group_id')->unsigned(); + $table->primary(['user_id', 'user_group_id'], 'user_group'); + }); + } + + public function down() + { + Schema::dropIfExists('backend_users_groups'); + } +} diff --git a/modules/backend/database/migrations/2013_10_01_000004_Db_Backend_User_Throttle.php b/modules/backend/database/migrations/2013_10_01_000004_Db_Backend_User_Throttle.php new file mode 100644 index 0000000..df03520 --- /dev/null +++ b/modules/backend/database/migrations/2013_10_01_000004_Db_Backend_User_Throttle.php @@ -0,0 +1,28 @@ +engine = 'InnoDB'; + $table->increments('id'); + $table->integer('user_id')->unsigned()->nullable()->index(); + $table->string('ip_address')->nullable()->index(); + $table->integer('attempts')->default(0); + $table->timestamp('last_attempt_at')->nullable(); + $table->boolean('is_suspended')->default(0); + $table->timestamp('suspended_at')->nullable(); + $table->boolean('is_banned')->default(0); + $table->timestamp('banned_at')->nullable(); + }); + } + + public function down() + { + Schema::dropIfExists('backend_user_throttle'); + } +} diff --git a/modules/backend/database/migrations/2014_01_04_000005_Db_Backend_User_Preferences.php b/modules/backend/database/migrations/2014_01_04_000005_Db_Backend_User_Preferences.php new file mode 100644 index 0000000..5b98eb3 --- /dev/null +++ b/modules/backend/database/migrations/2014_01_04_000005_Db_Backend_User_Preferences.php @@ -0,0 +1,26 @@ +engine = 'InnoDB'; + $table->increments('id'); + $table->integer('user_id')->unsigned(); + $table->string('namespace', 100); + $table->string('group', 50); + $table->string('item', 150); + $table->text('value')->nullable(); + $table->index(['user_id', 'namespace', 'group', 'item'], 'user_item_index'); + }); + } + + public function down() + { + Schema::dropIfExists('backend_user_preferences'); + } +} diff --git a/modules/backend/database/migrations/2014_10_01_000006_Db_Backend_Access_Log.php b/modules/backend/database/migrations/2014_10_01_000006_Db_Backend_Access_Log.php new file mode 100644 index 0000000..fa0692f --- /dev/null +++ b/modules/backend/database/migrations/2014_10_01_000006_Db_Backend_Access_Log.php @@ -0,0 +1,23 @@ +engine = 'InnoDB'; + $table->increments('id'); + $table->integer('user_id')->unsigned(); + $table->string('ip_address')->nullable(); + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('backend_access_log'); + } +} diff --git a/modules/backend/database/migrations/2014_10_01_000007_Db_Backend_Add_Description_Field.php b/modules/backend/database/migrations/2014_10_01_000007_Db_Backend_Add_Description_Field.php new file mode 100644 index 0000000..5252fae --- /dev/null +++ b/modules/backend/database/migrations/2014_10_01_000007_Db_Backend_Add_Description_Field.php @@ -0,0 +1,25 @@ +string('code')->nullable()->index('code_index'); + $table->text('description')->nullable(); + $table->boolean('is_new_user_default')->default(false); + }); + } + + public function down() + { + // Schema::table('backend_user_groups', function (Blueprint $table) { + // $table->dropColumn('code'); + // $table->dropColumn('description'); + // $table->dropColumn('is_new_user_default'); + // }); + } +} diff --git a/modules/backend/database/migrations/2015_10_01_000008_Db_Backend_Add_Superuser_Flag.php b/modules/backend/database/migrations/2015_10_01_000008_Db_Backend_Add_Superuser_Flag.php new file mode 100644 index 0000000..e72897e --- /dev/null +++ b/modules/backend/database/migrations/2015_10_01_000008_Db_Backend_Add_Superuser_Flag.php @@ -0,0 +1,29 @@ +boolean('is_superuser')->default(false); + }); + + AdminModel::all()->each(function ($user) { + if ($user->hasPermission('superuser')) { + $user->is_superuser = true; + $user->save(); + } + }); + } + + public function down() + { + // Schema::table('backend_users', function (Blueprint $table) { + // $table->dropColumn('is_superuser'); + // }); + } +} diff --git a/modules/backend/database/migrations/2016_10_01_000009_Db_Backend_Timestamp_Fix.php b/modules/backend/database/migrations/2016_10_01_000009_Db_Backend_Timestamp_Fix.php new file mode 100644 index 0000000..553dec7 --- /dev/null +++ b/modules/backend/database/migrations/2016_10_01_000009_Db_Backend_Timestamp_Fix.php @@ -0,0 +1,39 @@ +backendTables as $table) { + DbDongle::convertTimestamps($table); + } + + // Use this opportunity to reset backend preferences for stable + Db::table('backend_user_preferences') + ->where('namespace', 'backend') + ->where('group', 'backend') + ->where('item', 'preferences') + ->delete(); + } + + public function down() + { + // ... + } +} diff --git a/modules/backend/database/migrations/2017_10_01_000010_Db_Backend_User_Roles.php b/modules/backend/database/migrations/2017_10_01_000010_Db_Backend_User_Roles.php new file mode 100644 index 0000000..fe6f15b --- /dev/null +++ b/modules/backend/database/migrations/2017_10_01_000010_Db_Backend_User_Roles.php @@ -0,0 +1,165 @@ +engine = 'InnoDB'; + $table->increments('id'); + $table->string('name')->unique('role_unique'); + $table->string('code')->nullable()->index('role_code_index'); + $table->text('description')->nullable(); + $table->text('permissions')->nullable(); + $table->boolean('is_system')->default(0); + $table->timestamps(); + }); + + // This detects older builds and performs a migration to include + // the new role system. This column will exist for new installs + // so this heavy migration process does not need to execute. + $this->migratePreviousBuild(); + } + + public function down() + { + Schema::dropIfExists('backend_user_roles'); + } + + protected function migratePreviousBuild() + { + // Role not found in the users table, perform a complete migration. + // Merging group permissions with the user and assigning the user + // with the first available role. + if (!Schema::hasColumn('backend_users', 'role_id')) { + Schema::table('backend_users', function (Blueprint $table) { + $table->integer('role_id')->unsigned()->nullable()->index('admin_role_index'); + }); + + $this->createSystemUserRoles(); + $this->migratePermissionsFromGroupsToRoles(); + } + + // Drop permissions column on groups table as it is no longer needed. + if (Schema::hasColumn('backend_user_groups', 'permissions')) { + Schema::table('backend_user_groups', function (Blueprint $table) { + $table->dropColumn('permissions'); + }); + } + } + + protected function createSystemUserRoles() + { + Db::table('backend_user_roles')->insert([ + 'name' => 'Publisher', + 'code' => UserRole::CODE_PUBLISHER, + 'description' => 'Site editor with access to publishing tools.', + ]); + + Db::table('backend_user_roles')->insert([ + 'name' => 'Developer', + 'code' => UserRole::CODE_DEVELOPER, + 'description' => 'Site administrator with access to developer tools.', + ]); + } + + protected function migratePermissionsFromGroupsToRoles() + { + $groups = Db::table('backend_user_groups')->get(); + $roles = []; + $permissions = []; + + /* + * Carbon copy groups to roles + */ + foreach ($groups as $group) { + if (!isset($group->name) || !$group->name) { + continue; + } + + try { + $roles[$group->id] = Db::table('backend_user_roles')->insertGetId([ + 'name' => $group->name, + 'description' => $group->description, + 'permissions' => $group->permissions ?? null + ]); + } + catch (Exception $ex) { + } + + $permissions[$group->id] = $group->permissions ?? null; + } + + /* + * Assign a user with the first available role + */ + $found = []; + $joins = Db::table('backend_users_groups')->get(); + + foreach ($joins as $join) { + if (!$roleId = array_get($roles, $join->user_group_id)) { + continue; + } + + $userId = $join->user_id; + + if (!isset($found[$userId])) { + Db::table('backend_users')->where('id', $userId)->update([ + 'role_id' => $roleId + ]); + } + + $found[$userId][] = $join->user_group_id; + } + + /* + * Merge group permissions in to user + */ + foreach ($found as $userId => $groups) { + $userPerms = []; + + foreach ($groups as $groupId) { + if (!$permString = array_get($permissions, $groupId)) { + continue; + } + + try { + $perms = json_decode($permString, true); + $userPerms = array_merge($userPerms, $perms); + } + catch (Exception $ex) { + } + } + + if (count($userPerms) > 0) { + $this->splicePermissionsForUser($userId, $userPerms); + } + } + } + + protected function splicePermissionsForUser($userId, $permissions) + { + /* + * Look up user and splice the provided permissions in + */ + $user = Db::table('backend_users')->where('id', $userId)->first(); + if (!$user) { + return; + } + + try { + $currentPerms = $user->permissions ? json_decode($user->permissions, true) : []; + $newPerms = array_merge($permissions, $currentPerms); + + Db::table('backend_users')->where('id', $userId)->update([ + 'permissions' => json_encode($newPerms) + ]); + } + catch (Exception $ex) { + } + } +} diff --git a/modules/backend/database/migrations/2018_12_16_000011_Db_Backend_Add_Deleted_At.php b/modules/backend/database/migrations/2018_12_16_000011_Db_Backend_Add_Deleted_At.php new file mode 100644 index 0000000..50aee8c --- /dev/null +++ b/modules/backend/database/migrations/2018_12_16_000011_Db_Backend_Add_Deleted_At.php @@ -0,0 +1,25 @@ +timestamp('deleted_at')->nullable()->after('updated_at'); + }); + } + } + + public function down() + { + if (Schema::hasColumn('backend_users', 'deleted_at')) { + Schema::table('backend_users', function (Blueprint $table) { + $table->dropColumn('deleted_at'); + }); + } + } +} diff --git a/modules/backend/database/migrations/2023_02_16_000012_Db_Backend_Add_User_Metadata.php b/modules/backend/database/migrations/2023_02_16_000012_Db_Backend_Add_User_Metadata.php new file mode 100644 index 0000000..b60735c --- /dev/null +++ b/modules/backend/database/migrations/2023_02_16_000012_Db_Backend_Add_User_Metadata.php @@ -0,0 +1,25 @@ +mediumText('metadata')->nullable()->after('permissions'); + }); + } + } + + public function down() + { + if (Schema::hasColumn('backend_users', 'metadata')) { + Schema::table('backend_users', function (Blueprint $table) { + $table->dropColumn('metadata'); + }); + } + } +} diff --git a/modules/backend/database/migrations/2023_09_09_000013_Db_Backend_Add_Users_Groups_Delete_At.php b/modules/backend/database/migrations/2023_09_09_000013_Db_Backend_Add_Users_Groups_Delete_At.php new file mode 100644 index 0000000..3db016b --- /dev/null +++ b/modules/backend/database/migrations/2023_09_09_000013_Db_Backend_Add_Users_Groups_Delete_At.php @@ -0,0 +1,25 @@ +timestamp('deleted_at')->nullable()->after('user_group_id'); + }); + } + } + + public function down() + { + if (Schema::hasColumn('backend_users_groups', 'deleted_at')) { + Schema::table('backend_users_groups', function (Blueprint $table) { + $table->dropColumn('deleted_at'); + }); + } + } +} diff --git a/modules/backend/database/seeds/DatabaseSeeder.php b/modules/backend/database/seeds/DatabaseSeeder.php new file mode 100644 index 0000000..3a8d6d7 --- /dev/null +++ b/modules/backend/database/seeds/DatabaseSeeder.php @@ -0,0 +1,33 @@ +setDefaults([ + 'password' => $adminPassword + ]); + $this->call($adminSeeder); + }); + + return ($shouldRandomizePassword) + ? 'The following password has been automatically generated for the "admin" account: ' . $adminPassword . '' + : ''; + } +} diff --git a/modules/backend/database/seeds/SeedSetupAdmin.php b/modules/backend/database/seeds/SeedSetupAdmin.php new file mode 100644 index 0000000..7796738 --- /dev/null +++ b/modules/backend/database/seeds/SeedSetupAdmin.php @@ -0,0 +1,62 @@ + $value) { + static::$$attribute = $value; + } + } + + public function run() + { + UserRole::create([ + 'name' => 'Publisher', + 'code' => UserRole::CODE_PUBLISHER, + 'description' => 'Site editor with access to publishing tools.', + ]); + + $role = UserRole::create([ + 'name' => 'Developer', + 'code' => UserRole::CODE_DEVELOPER, + 'description' => 'Site administrator with access to developer tools.', + ]); + + $group = UserGroup::create([ + 'name' => 'Owners', + 'code' => UserGroup::CODE_OWNERS, + 'description' => 'Default group for website owners.', + 'is_new_user_default' => false + ]); + + $user = User::create([ + 'email' => static::$email, + 'login' => static::$login, + 'password' => static::$password, + 'password_confirmation' => static::$password, + 'first_name' => static::$firstName, + 'last_name' => static::$lastName, + 'permissions' => [], + 'is_superuser' => true, + 'is_activated' => true, + 'role_id' => $role->id + ]); + + $user->addGroup($group); + } +} diff --git a/modules/backend/facades/Backend.php b/modules/backend/facades/Backend.php new file mode 100644 index 0000000..1d679a0 --- /dev/null +++ b/modules/backend/facades/Backend.php @@ -0,0 +1,29 @@ +applyEditorPreferences(); + + if ($this->formField->disabled) { + $this->readOnly = true; + } + + $this->fillFromConfig([ + 'language', + 'showGutter', + 'wordWrap', + 'codeFolding', + 'autoClosing', + 'useSoftTabs', + 'tabSize', + 'fontSize', + 'margin', + 'scrollPastEnd', + 'theme', + 'showInvisibles', + 'highlightActiveLine', + 'readOnly', + 'displayIndentGuides', + 'showPrintMargin', + 'showMinimap', + 'bracketColors', + 'showColors', + ]); + } + + /** + * @inheritDoc + */ + public function render() + { + $this->prepareVars(); + return $this->makePartial('codeeditor'); + } + + /** + * Prepares the widget data + */ + public function prepareVars() + { + $this->vars['fontSize'] = $this->fontSize; + $this->vars['wordWrap'] = $this->wordWrap; + $this->vars['codeFolding'] = $this->codeFolding; + $this->vars['autoClosing'] = $this->autoClosing; + $this->vars['tabSize'] = $this->tabSize; + $this->vars['theme'] = $this->theme; + $this->vars['showInvisibles'] = $this->showInvisibles; + $this->vars['highlightActiveLine'] = $this->highlightActiveLine; + $this->vars['useSoftTabs'] = $this->useSoftTabs; + $this->vars['showGutter'] = $this->showGutter; + $this->vars['language'] = $this->language; + $this->vars['margin'] = $this->margin; + $this->vars['scrollPastEnd'] = $this->scrollPastEnd; + $this->vars['stretch'] = $this->formField->stretch; + $this->vars['size'] = $this->formField->size; + $this->vars['readOnly'] = $this->readOnly; + $this->vars['displayIndentGuides'] = $this->displayIndentGuides; + $this->vars['showPrintMargin'] = $this->showPrintMargin; + $this->vars['showMinimap'] = $this->showMinimap; + $this->vars['bracketColors'] = $this->bracketColors; + $this->vars['showColors'] = $this->showColors; + + // Double encode when escaping + $this->vars['value'] = htmlentities($this->getLoadValue(), ENT_QUOTES, 'UTF-8', true); + $this->vars['name'] = $this->getFieldName(); + } + + /** + * @inheritDoc + */ + protected function loadAssets() + { + $this->addCss('css/codeeditor.css', 'core'); + $this->addJs('js/build/codeeditor.bundle.js', 'core'); + } + + /** + * Looks at the user preferences and overrides any set values. + * @return void + */ + protected function applyEditorPreferences() + { + // Load the editor system settings + $preferences = BackendPreference::instance(); + + $this->fontSize = $preferences->editor_font_size; + $this->wordWrap = $preferences->editor_word_wrap; + $this->codeFolding = $preferences->editor_enable_folding ?? ($preferences->editor_code_folding !== 'manual'); + $this->autoClosing = $preferences->editor_auto_closing; + $this->tabSize = $preferences->editor_tab_size; + $this->theme = $preferences->editor_theme; + $this->showInvisibles = $preferences->editor_show_invisibles; + $this->highlightActiveLine = $preferences->editor_highlight_active_line; + $this->useSoftTabs = !$preferences->editor_use_hard_tabs; + $this->showGutter = $preferences->editor_show_gutter; + $this->displayIndentGuides = $preferences->editor_display_indent_guides; + $this->showPrintMargin = $preferences->editor_show_print_margin; + $this->showMinimap = $preferences->editor_show_minimap; + $this->bracketColors = $preferences->editor_bracket_colors; + $this->showColors = $preferences->editor_show_colors; + } +} diff --git a/modules/backend/formwidgets/ColorPicker.php b/modules/backend/formwidgets/ColorPicker.php new file mode 100644 index 0000000..248b078 --- /dev/null +++ b/modules/backend/formwidgets/ColorPicker.php @@ -0,0 +1,286 @@ + '/^cmyk\((\d{1,2}\.?\d{0,2}%,? ?){4}\)$/', + 'hex' => '/^#[\w\d]{6,8}$/', + 'hsl' => '/^hsla\((\d{1,3}\.?\d{0,2}%?, ?){3}\d\.?\d{0,2}?\)$/', + 'rgb' => '/^rgba\((\d{1,3}\.?\d{0,2}, ?){3}\d\.?\d{0,2}?\)$/', + ]; + + // + // Object properties + // + + /** + * @inheritDoc + */ + protected $defaultAlias = 'colorpicker'; + + /** + * @inheritDoc + */ + public function init() + { + $this->fillFromConfig([ + 'availableColors', + 'formats', + 'allowEmpty', + 'allowCustom', + 'showAlpha', + 'readOnly', + 'disabled', + ]); + } + + /** + * @inheritDoc + */ + public function render() + { + $this->prepareVars(); + return $this->makePartial('colorpicker'); + } + + /** + * Prepares the list data + */ + public function prepareVars() + { + $this->vars['name'] = $this->getFieldName(); + $this->vars['value'] = $this->getLoadValue(); + $this->vars['availableColors'] = $this->getAvailableColors(); + $this->vars['formats'] = $this->getFormats(); + $this->vars['allowEmpty'] = (bool) $this->allowEmpty; + $this->vars['allowCustom'] = (bool) $this->allowCustom; + $this->vars['showAlpha'] = (bool) $this->showAlpha; + $this->vars['readOnly'] = (bool) $this->readOnly; + $this->vars['disabled'] = (bool) $this->disabled; + } + + /** + * Gets the appropriate list of colors. + * + * @return array + */ + protected function getAvailableColors() + { + $availableColors = $this->availableColors; + + if (is_array($availableColors)) { + return $availableColors; + } elseif (is_string($availableColors) && !empty($availableColors)) { + if ($this->model->methodExists($availableColors)) { + return $this->availableColors = $this->model->{$availableColors}( + $this->formField->fieldName, + $this->formField->value, + $this->formField->config + ); + } else { + throw new ApplicationException(Lang::get('backend::lang.field.colors_method_not_exists', [ + 'model' => get_class($this->model), + 'method' => $availableColors, + 'field' => $this->formField->fieldName + ])); + } + } else { + return $this->availableColors = array_map(function ($color) { + return $color['color']; + }, BrandSetting::get('default_colors', [ + [ + 'color' => '#1abc9c', + ], + [ + 'color' => '#16a085', + ], + [ + 'color' => '#6cc551', + ], + [ + 'color' => '#52a838', + ], + [ + 'color' => '#b1dbef', + ], + [ + 'color' => '#88c9e7', + ], + [ + 'color' => '#2da7c7', + ], + [ + 'color' => '#227f96', + ], + [ + 'color' => '#b281c5', + ], + [ + 'color' => '#7b4e8e', + ], + [ + 'color' => '#103141', + ], + [ + 'color' => '#081821', + ], + [ + 'color' => '#f8e095', + ], + [ + 'color' => '#dcb22d', + ], + [ + 'color' => '#de8754', + ], + [ + 'color' => '#d66829', + ], + [ + 'color' => '#b33f32', + ], + [ + 'color' => '#ab2a1c', + ], + [ + 'color' => '#95a5a6', + ], + [ + 'color' => '#7f8c8d', + ], + ])); + } + } + + /** + * Returns the allowed color formats. + * + * If no valid formats are specified, the "hex" format will be used. + * + * @return array + */ + protected function getFormats() + { + if ($this->formats === 'all') { + return static::ALL_FORMATS; + } + + $availableFormats = []; + $configFormats = (is_string($this->formats)) + ? [$this->formats] + : $this->formats; + + foreach ($configFormats as $format) { + if (in_array($format, static::ALL_FORMATS)) { + $availableFormats[] = $format; + } + } + + return (count($availableFormats)) + ? $availableFormats + : ['hex']; + } + + /** + * @inheritDoc + */ + protected function loadAssets() + { + $this->addJs('js/dist/colorpicker.js', 'core'); + } + + /** + * @inheritDoc + */ + public function getSaveValue($value) + { + if (!strlen($value)) { + return null; + } + + switch (is_array($this->formats) ? 'all' : $this->formats) { + case 'cmyk': + case 'hex': + case 'hsl': + case 'rgb': + if (!preg_match($this->validationPatterns[$this->formats], $value)) { + throw new ApplicationException(Lang::get('backend::lang.field.colors_invalid_input')); + } + break; + case 'all': + $valid = false; + foreach ($this->validationPatterns as $pattern) { + if (preg_match($pattern, $value)) { + $valid = true; + break; + } + } + if (!$valid) { + throw new ApplicationException(Lang::get('backend::lang.field.colors_invalid_input')); + } + break; + } + + return $value; + } +} diff --git a/modules/backend/formwidgets/DataTable.php b/modules/backend/formwidgets/DataTable.php new file mode 100644 index 0000000..3a5c26c --- /dev/null +++ b/modules/backend/formwidgets/DataTable.php @@ -0,0 +1,205 @@ +fillFromConfig([ + 'size', + 'rowSorting', + ]); + + $this->table = $this->makeTableWidget(); + $this->table->bindToController(); + } + + /** + * @return Backend\Widgets\Table The table to be displayed. + */ + public function getTable() + { + return $this->table; + } + + /** + * @inheritDoc + */ + public function render() + { + $this->prepareVars(); + return $this->makePartial('datatable'); + } + + /** + * Prepares the list data + */ + public function prepareVars() + { + $this->populateTableWidget(); + $this->vars['table'] = $this->table; + $this->vars['size'] = $this->size; + $this->vars['rowSorting'] = $this->rowSorting; + } + + /** + * @inheritDoc + */ + public function getLoadValue() + { + $value = (array) parent::getLoadValue(); + + // Sync the array keys as the ID to make the + // table widget happy! + foreach ($value as $key => $_value) { + $value[$key] = ['id' => $key] + (array) $_value; + } + + return $value; + } + + /** + * @inheritDoc + */ + public function getSaveValue($value) + { + // TODO: provide a streaming implementation of saving + // data to the model. The current implementation returns + // all records at once. -ab + + $dataSource = $this->table->getDataSource(); + + $result = []; + while ($records = $dataSource->readRecords()) { + $result = array_merge($result, $records); + } + + // We should be dealing with a simple array, so + // strip out the id columns in the final array. + foreach ($result as $key => $_result) { + unset($result[$key]['id']); + } + + return $result; + } + + /* + * Populate data + */ + protected function populateTableWidget() + { + $dataSource = $this->table->getDataSource(); + + // TODO: provide a streaming implementation of loading + // data from the model. The current implementation loads + // all records at once. -ab + + $records = $this->getLoadValue() ?: []; + + $dataSource->purge(); + $dataSource->initRecords((array) $records); + } + + protected function makeTableWidget() + { + $config = $this->makeConfig((array) $this->config); + + $config->dataSource = 'client'; + if (isset($this->getParentForm()->arrayName)) { + $config->alias = studly_case(HtmlHelper::nameToId($this->getParentForm()->arrayName . '[' . $this->fieldName . ']')) . 'datatable'; + $config->fieldName = $this->getParentForm()->arrayName . '[' . $this->fieldName . ']'; + } else { + $config->alias = studly_case(HtmlHelper::nameToId($this->fieldName)) . 'datatable'; + $config->fieldName = $this->fieldName; + } + + $table = new Table($this->controller, $config); + + $table->bindEvent('table.getDropdownOptions', [$this, 'getDataTableOptions']); + + return $table; + } + + /** + * Dropdown/autocomplete option callback handler + * + * Looks at the model for getXXXDataTableOptions or getDataTableOptions methods + * to obtain values for autocomplete and dropdown column types. + * + * @param string $columnName The name of the column to pass through to the callback. + * @param array $rowData The data provided for the current row in the datatable. + * @return array The options to make available to the dropdown or autocomplete, in format ["value" => "label"] + */ + public function getDataTableOptions($columnName, $rowData) + { + $methodName = 'get' . studly_case($this->fieldName) . 'DataTableOptions'; + + if (!$this->model->methodExists($methodName) && !$this->model->methodExists('getDataTableOptions')) { + throw new ApplicationException( + Lang::get( + 'backend::lang.model.missing_method', + [ + 'class' => get_class($this->model), + 'method' => 'getDataTableOptions' + ] + ) + ); + } + + if ($this->model->methodExists($methodName)) { + $result = $this->model->$methodName($columnName, $rowData); + } else { + $result = $this->model->getDataTableOptions($this->fieldName, $columnName, $rowData); + } + + if (!is_array($result)) { + $result = []; + } + + return $result; + } +} diff --git a/modules/backend/formwidgets/DatePicker.php b/modules/backend/formwidgets/DatePicker.php new file mode 100644 index 0000000..893c961 --- /dev/null +++ b/modules/backend/formwidgets/DatePicker.php @@ -0,0 +1,207 @@ +fillFromConfig([ + 'format', + 'mode', + 'minDate', + 'maxDate', + 'yearRange', + 'firstDay', + 'showWeekNumber', + 'ignoreTimezone', + ]); + + $this->mode = strtolower($this->mode); + + if ($this->minDate !== null) { + $this->minDate = is_int($this->minDate) + ? Carbon::createFromTimestamp($this->minDate) + : Carbon::parse($this->minDate); + } + + if ($this->maxDate !== null) { + $this->maxDate = is_int($this->maxDate) + ? Carbon::createFromTimestamp($this->maxDate) + : Carbon::parse($this->maxDate); + } + } + + /** + * @inheritDoc + */ + public function render() + { + try { + $this->prepareVars(); + } catch (ApplicationException $ex) { + $this->vars['error'] = $ex->getMessage(); + } + + return $this->makePartial('datepicker'); + } + + /** + * Prepares the list data + */ + public function prepareVars() + { + if ($value = $this->getLoadValue()) { + $value = DateTimeHelper::makeCarbon($value, false); + + if (!($value instanceof Carbon)) { + $this->vars['error'] = (sprintf('"%s" is not a valid date / time value.', $value)); + } else { + if ($this->mode === 'date' && !$this->ignoreTimezone) { + $backendTimeZone = \Backend\Models\Preference::get('timezone'); + $value->setTimezone($backendTimeZone); + $value->setTime(0, 0, 0); + $value->setTimezone(Config::get('app.timezone')); + } + $value = $value->toDateTimeString(); + } + } + + // Disable the datepicker visually when readOnly is enabled + if ($this->formField->readOnly) { + $this->formField->disabled = true; + } + + $this->vars['name'] = $this->getFieldName(); + $this->vars['value'] = $value ?: ''; + $this->vars['field'] = $this->formField; + $this->vars['mode'] = $this->mode; + $this->vars['minDate'] = $this->minDate; + $this->vars['maxDate'] = $this->maxDate; + $this->vars['yearRange'] = $this->yearRange; + $this->vars['firstDay'] = $this->firstDay; + $this->vars['showWeekNumber'] = $this->showWeekNumber; + $this->vars['ignoreTimezone'] = $this->ignoreTimezone; + $this->vars['format'] = $this->format; + $this->vars['formatMoment'] = $this->getDateFormatMoment(); + $this->vars['formatAlias'] = $this->getDateFormatAlias(); + } + + /** + * @inheritDoc + */ + public function getSaveValue($value) + { + if ($this->formField->disabled || $this->formField->hidden) { + return FormField::NO_SAVE_DATA; + } + + if (!strlen($value)) { + return null; + } + + return $value; + } + + /** + * Convert PHP format to JS format + */ + protected function getDateFormatMoment() + { + if ($this->format) { + return DateTimeHelper::momentFormat($this->format); + } + } + + /* + * Display alias, used by preview mode + */ + protected function getDateFormatAlias() + { + if ($this->format) { + return null; + } + + if ($this->mode == 'time') { + return 'time'; + } + elseif ($this->mode == 'date') { + return 'dateLong'; + } + else { + return 'dateTimeLong'; + } + } +} diff --git a/modules/backend/formwidgets/FieldSet.php b/modules/backend/formwidgets/FieldSet.php new file mode 100644 index 0000000..70da8e0 --- /dev/null +++ b/modules/backend/formwidgets/FieldSet.php @@ -0,0 +1,102 @@ + + */ +class FieldSet extends FormWidgetBase +{ + /** + * @inheritDoc + */ + protected $defaultAlias = 'fieldset'; + + /** + * @var array Field configuration + */ + public $fields; + + /** + * @var bool Determines if this form field should display comments and labels. + */ + public $showLabels = false; + + /** + * @var Form form widget reference + */ + protected $formWidget; + + /** + * @inheritDoc + */ + public function init() + { + $this->fillFromConfig([ + 'fields', + ]); + + if ($this->formField->disabled) { + $this->previewMode = true; + } + + $config = $this->makeConfig(['fields' => $this->fields]); + $config->model = $this->model; + $config->data = $this->getLoadValue(); + $config->alias = $this->alias . $this->defaultAlias; + // set arrayName from parent form to save fields to the model + $config->arrayName = $this->getParentForm()->arrayName; + $config->isNested = true; + + $widget = $this->formWidget = $this->makeWidget(Form::class, $config); + $widget->previewMode = $this->previewMode; + $widget->bindToController(); + } + + protected function loadAssets() + { + $this->addCss('css/fieldset.css', 'core'); + } + + /** + * Returns the save data for the nested fields, to be merged into the parent + * form's data as if these fields were defined at that level. Reusing the nested + * form's getSaveData() ensures number casting, widget getSaveValue() handling, + * NO_SAVE_DATA exclusion and disabled/hidden skipping all behave identically to + * a regular field. + */ + public function getSaveData(): array + { + return $this->formWidget->getSaveData(); + } + + /** + * @inheritdoc + */ + public function render() + { + $this->prepareVars(); + return $this->makePartial('fieldset'); + } + + public function prepareVars() + { + $this->formWidget->previewMode = $this->previewMode; + } + + /** + * @inheritDoc + */ + public function getSaveValue($value) + { + return FormField::NO_SAVE_DATA; + } +} diff --git a/modules/backend/formwidgets/FileUpload.php b/modules/backend/formwidgets/FileUpload.php new file mode 100644 index 0000000..1d6cc8f --- /dev/null +++ b/modules/backend/formwidgets/FileUpload.php @@ -0,0 +1,561 @@ + 'crop', + 'extension' => 'auto' + ]; + + /** + * @var boolean Allow the user to set a caption. + */ + public $useCaption = true; + + /** + * @var boolean Automatically attaches the uploaded file on upload if the parent record exists instead of using deferred binding to attach on save of the parent record. Defaults to false. + */ + public $attachOnUpload = false; + + // + // Object properties + // + + /** + * @inheritDoc + */ + protected $defaultAlias = 'fileupload'; + + /** + * @var Form The embedded form for modifying the properties of the selected file + */ + protected $configFormWidget; + + /** + * @inheritDoc + */ + public function init() + { + $this->maxFilesize = $this->getUploadMaxFilesize(); + + $this->fillFromConfig([ + 'iconClass', + 'prompt', + 'imageWidth', + 'imageHeight', + 'fileTypes', + 'maxFilesize', + 'mimeTypes', + 'thumbOptions', + 'useCaption', + 'attachOnUpload', + ]); + + $this->iconClass = $this->iconClass ?? 'icon-upload'; + + if ($this->formField->disabled) { + $this->previewMode = true; + } + + $this->getConfigFormWidget(); + } + + /** + * @inheritDoc + */ + public function render() + { + $this->prepareVars(); + return $this->makePartial('fileupload'); + } + + /** + * Prepares the view data + */ + protected function prepareVars() + { + if ($this->formField->disabled) { + $this->previewMode = true; + } + + if ($this->previewMode) { + $this->useCaption = false; + } + + if ($this->maxFilesize > $this->getUploadMaxFilesize()) { + throw new ApplicationException('Maximum allowed size for uploaded files: ' . $this->getUploadMaxFilesize()); + } + + $this->vars['fileList'] = $fileList = $this->getFileList(); + $this->vars['singleFile'] = $fileList->first(); + $this->vars['displayMode'] = $this->getDisplayMode(); + $this->vars['emptyIcon'] = $this->getConfig('emptyIcon', 'icon-upload'); + $this->vars['imageHeight'] = $this->imageHeight; + $this->vars['imageWidth'] = $this->imageWidth; + $this->vars['acceptedFileTypes'] = $this->getAcceptedFileTypes(true); + $this->vars['maxFilesize'] = $this->maxFilesize; + $this->vars['cssDimensions'] = $this->getCssDimensions(); + $this->vars['cssBlockDimensions'] = $this->getCssDimensions('block'); + $this->vars['useCaption'] = $this->useCaption; + $this->vars['iconClass'] = $this->iconClass; + $this->vars['prompt'] = $this->getPromptText(); + } + + /** + * Get the file record for this request, returns false if none available + * + * @return File|false + */ + protected function getFileRecord() + { + $record = false; + + if (!empty(post('file_id'))) { + // Scope the lookup to this widget's own relation (including any files + // bound via the current deferred-binding session) so that an + // attacker-controlled file_id cannot reference an arbitrary + // System\Models\File record belonging to another model. See + // GHSA-3277-h8g9-qj5f. + $record = $this->getRelationObject() + ->withDeferred($this->sessionKey) + ->find(post('file_id')) ?: false; + } + + return $record; + } + + /** + * Get the instantiated config Form widget + */ + public function getConfigFormWidget(): Form + { + if ($this->configFormWidget) { + return $this->configFormWidget; + } + + $config = $this->makeConfig('~/modules/system/models/file/fields.yaml'); + $config->model = $this->getFileRecord() ?: $this->getRelationModel(); + $config->alias = $this->alias . $this->defaultAlias; + $config->arrayName = $this->getFieldName(); + + $widget = $this->makeWidget(Form::class, $config); + $widget->bindToController(); + + return $this->configFormWidget = $widget; + } + + protected function getFileList() + { + $list = $this + ->getRelationObject() + ->withDeferred($this->sessionKey) + ->orderBy('sort_order') + ->get() + ; + + /* + * Decorate each file with thumb and custom download path + */ + $list->each(function ($file) { + $this->decorateFileAttributes($file); + }); + + return $list; + } + + /** + * Returns the display mode for the file upload. Eg: file-multi, image-single, etc. + */ + protected function getDisplayMode(): string + { + $mode = $this->getConfig('mode', 'image'); + + if (str_contains($mode, '-')) { + return $mode; + } + + $relationType = $this->getRelationType(); + $mode .= ($relationType === 'attachMany' || $relationType === 'morphMany') ? '-multi' : '-single'; + + return $mode; + } + + /** + * Returns the escaped and translated prompt text to display according to the type. + */ + protected function getPromptText(): string + { + if ($this->prompt === null) { + $isMulti = ends_with($this->getDisplayMode(), 'multi'); + $this->prompt = $isMulti + ? 'backend::lang.fileupload.upload_file' + : 'backend::lang.fileupload.default_prompt'; + } + + $uploadIconStr = sprintf('', $this->iconClass); + return str_replace('%s', $uploadIconStr, e(trans($this->prompt))); + } + + /** + * Returns the CSS dimensions for the uploaded image, + * uses auto where no dimension is provided. + */ + protected function getCssDimensions(?string $mode = null): string + { + if (!$this->imageWidth && !$this->imageHeight) { + return ''; + } + + $cssDimensions = ''; + + if ($mode == 'block') { + $cssDimensions .= $this->imageWidth + ? 'width: ' . $this->imageWidth . 'px;' + : 'width: ' . $this->imageHeight . 'px;'; + + $cssDimensions .= ($this->imageHeight) + ? 'max-height: ' . $this->imageHeight . 'px;' + : 'height: auto;'; + } else { + $cssDimensions .= $this->imageWidth + ? 'width: ' . $this->imageWidth . 'px;' + : 'width: auto;'; + + $cssDimensions .= ($this->imageHeight) + ? 'max-height: ' . $this->imageHeight . 'px;' + : 'height: auto;'; + } + + return $cssDimensions; + } + + /** + * Returns the specified accepted file types, or the default + * based on the mode. Image mode will return: + * - jpg,jpeg,bmp,png,gif,svg + * @return string + */ + public function getAcceptedFileTypes($includeDot = false) + { + $types = $this->fileTypes; + + if ($types === false) { + $isImage = starts_with($this->getDisplayMode(), 'image'); + $types = implode(',', FileDefinitions::get($isImage ? 'imageExtensions' : 'defaultExtensions')); + } + + if (!$types || $types == '*') { + return null; + } + + if (!is_array($types)) { + $types = explode(',', $types); + } + + $types = array_map(function ($value) use ($includeDot) { + $value = trim($value); + + if (substr($value, 0, 1) == '.') { + $value = substr($value, 1); + } + + if ($includeDot) { + $value = '.'.$value; + } + + return $value; + }, $types); + + return implode(',', $types); + } + + /** + * Removes a file attachment. + */ + public function onRemoveAttachment(): void + { + if ($file = $this->getFileRecord()) { + $this->getRelationObject()->remove($file, $this->sessionKey); + } + } + + /** + * Sorts file attachments. + * + * Expects (array) sortOrder [$fileId => $fileOrder] in the POST data. + */ + public function onSortAttachments(): void + { + if ($sortData = post('sortOrder')) { + // Only reorder files that actually belong to this widget's relation + // (including the current deferred-binding session), never arbitrary + // System\Models\File rows referenced by a posted id. See + // GHSA-3277-h8g9-qj5f. + $keyName = $this->getRelationModel()->getKeyName(); + $validIds = $this->getRelationObject() + ->withDeferred($this->sessionKey) + ->pluck($keyName) + ->all(); + + $sortData = array_intersect_key($sortData, array_flip($validIds)); + if (empty($sortData)) { + return; + } + + $ids = array_keys($sortData); + $orders = array_values($sortData); + + $this->getRelationModel()->setSortableOrder($ids, $orders); + } + } + + /** + * Loads the configuration form for an attachment, allowing title and description to be set. + * + * @throws ApplicationException if unable to find the file record + */ + public function onLoadAttachmentConfig(): string + { + if ($file = $this->getFileRecord()) { + $file = $this->decorateFileAttributes($file); + + $this->vars['file'] = $file; + $this->vars['displayMode'] = $this->getDisplayMode(); + $this->vars['cssDimensions'] = $this->getCssDimensions(); + $this->vars['parentElementId'] = $this->getId(); + + return $this->makePartial('config_form'); + } + + throw new ApplicationException('Unable to find file, it may no longer exist'); + } + + /** + * Commit the changes of the attachment configuration form. + */ + public function onSaveAttachmentConfig() + { + try { + $formWidget = $this->getConfigFormWidget(); + if ($file = $formWidget->model) { + $modelsToSave = $this->prepareModelsToSave($file, $formWidget->getSaveData()); + Db::transaction(function () use ($modelsToSave, $formWidget) { + foreach ($modelsToSave as $modelToSave) { + $modelToSave->save(null, $formWidget->getSessionKey()); + } + }); + + return ['displayName' => $file->title ?: $file->file_name]; + } + + throw new ApplicationException('Unable to find file, it may no longer exist'); + } + catch (Exception $ex) { + return json_encode(['error' => $ex->getMessage()]); + } + } + + /** + * @inheritDoc + */ + protected function loadAssets() + { + $this->addCss('css/fileupload.css', 'core'); + $this->addJs('js/fileupload.js', 'core'); + } + + /** + * @inheritDoc + */ + public function getSaveValue($value) + { + return FormField::NO_SAVE_DATA; + } + + /** + * Upload handler for the server-side processing of uploaded files + */ + public function onUpload() + { + try { + $file = $this->getRelationModel(); + $fileRelation = $this->getRelationObject(); + $file->is_public = $fileRelation->isPublic(); + + /** + * @event backend.formwidgets.fileupload.onUpload + * Provides an opportunity to process the file upload using custom logic. + * + * Example usage () + */ + if (!($data = Event::fire('backend.formwidgets.fileupload.onUpload', [$this, $file], true))) { + if (!Input::hasFile('file_data')) { + throw new ApplicationException('File missing from request'); + } + + $validationRules = ['max:'.$file::getMaxFilesize()]; + $data = Input::file('file_data'); + + if (!$data->isValid()) { + throw new ApplicationException('File is not valid'); + } + + if ($fileTypes = $this->getAcceptedFileTypes()) { + $validationRules[] = 'extensions:'.$fileTypes; + } + + if ($this->mimeTypes) { + $validationRules[] = 'mimes:'.$this->mimeTypes; + } + + $validation = Validator::make( + ['file_data' => $data], + ['file_data' => $validationRules] + ); + + if ($validation->fails()) { + throw new ValidationException($validation); + } + } + + $file->data = $data; + $file->save(); + + /** + * Attach directly to the parent model if it exists and attachOnUpload has been set to true + * else attach via deferred binding + */ + $parent = $fileRelation->getParent(); + if ($this->attachOnUpload && $parent && $parent->exists) { + $fileRelation->add($file); + } + else { + $fileRelation->add($file, $this->sessionKey); + } + + $file = $this->decorateFileAttributes($file); + + $result = [ + 'id' => $file->id, + 'thumb' => $file->thumbUrl, + 'path' => $file->pathUrl + ]; + + $response = Response::make($result, 200); + } + catch (Exception $ex) { + $response = Response::make($ex->getMessage(), 400); + } + + return $response; + } + + /** + * Adds the bespoke attributes used internally by this widget. + * - thumbUrl + * - pathUrl + * @return System\Models\File + */ + protected function decorateFileAttributes($file) + { + $path = $thumb = $file->getPath(); + + if ($this->imageWidth || $this->imageHeight) { + $thumb = $file->getThumb($this->imageWidth, $this->imageHeight, $this->thumbOptions); + } + + $file->pathUrl = $path; + $file->thumbUrl = $thumb; + + return $file; + } + + /** + * Return max upload filesize in Mb + * @return integer + */ + protected function getUploadMaxFilesize() + { + $size = ini_get('upload_max_filesize'); + if (preg_match('/^([\d\.]+)([KMG])$/i', $size, $match)) { + $pos = array_search(strtoupper($match[2]), ['K', 'M', 'G']); + if ($pos !== false) { + $size = $match[1] * pow(1024, $pos + 1); + } + } + return floor($size / 1024 / 1024); + } +} diff --git a/modules/backend/formwidgets/IconPicker.php b/modules/backend/formwidgets/IconPicker.php new file mode 100644 index 0000000..33eafc6 --- /dev/null +++ b/modules/backend/formwidgets/IconPicker.php @@ -0,0 +1,59 @@ +prepareVars(); + return $this->makePartial('iconpicker'); + } + + /** + * Prepares the list data + */ + public function prepareVars() + { + $this->vars['field'] = $this; + } + + /** + * @inheritDoc + */ + public function loadAssets(): void + { + $this->addJs('js/dist/iconpicker.js', 'core'); + } + + public function onLoadIconLibrary() + { + $libraries = $this->config->libraries ?? static::DEFAULT_LIBRARIES; + + if (is_string($libraries)) { + $libraries = Yaml::parseFile(File::symbolizePath($libraries)); + } + + return json_encode($libraries); + } +} diff --git a/modules/backend/formwidgets/MarkdownEditor.php b/modules/backend/formwidgets/MarkdownEditor.php new file mode 100644 index 0000000..105e0d5 --- /dev/null +++ b/modules/backend/formwidgets/MarkdownEditor.php @@ -0,0 +1,142 @@ +fillFromConfig([ + 'mode', + 'safe', + 'readOnly', + 'disabled', + ]); + } + + /** + * {@inheritDoc} + */ + public function render() + { + $this->prepareVars(); + return $this->makePartial('markdowneditor'); + } + + /** + * Prepares the widget data + */ + public function prepareVars() + { + $this->vars['mode'] = $this->mode; + $this->vars['stretch'] = $this->formField->stretch; + $this->vars['size'] = $this->formField->size; + $this->vars['name'] = $this->getFieldName(); + $this->vars['value'] = $this->getLoadValue(); + $this->vars['readOnly'] = $this->readOnly; + $this->vars['disabled'] = $this->disabled; + $this->vars['useMediaManager'] = BackendAuth::getUser()->hasAccess('media.manage_media'); + } + + /** + * {@inheritDoc} + */ + protected function loadAssets() + { + $this->addCss('css/markdowneditor.css', 'core'); + $this->addJs('js/markdowneditor.js', 'core'); + $this->addJs('/modules/backend/assets/vendor/ace-codeeditor/build-min.js', 'core'); + } + + /** + * Check to see if the generated HTML should be cleaned to remove any potential XSS + * + * @return boolean + */ + protected function shouldCleanHtml() + { + $user = BackendAuth::getUser(); + return !$user || !$user->hasAccess('backend.allow_unsafe_markdown'); + } + + /** + * {@inheritDoc} + */ + public function getSaveValue($value) + { + if ($this->shouldCleanHtml()) { + $value = Html::clean($value); + } + + return $value; + } + + /** + * AJAX handler to render the markdown as HTML + * + * @return array ['preview' => $generatedHTML] + */ + public function onRefresh() + { + $value = post($this->getFieldName()); + $previewHtml = $this->safe + ? Markdown::parseSafe($value) + : Markdown::parse($value); + + if ($this->shouldCleanHtml()) { + $previewHtml = Html::clean($previewHtml); + } + + return [ + 'preview' => $previewHtml + ]; + } +} diff --git a/modules/backend/formwidgets/MediaFinder.php b/modules/backend/formwidgets/MediaFinder.php new file mode 100644 index 0000000..ee3b707 --- /dev/null +++ b/modules/backend/formwidgets/MediaFinder.php @@ -0,0 +1,126 @@ +fillFromConfig([ + 'mode', + 'prompt', + 'imageWidth', + 'imageHeight' + ]); + + $user = BackendAuth::getUser(); + + if ($this->formField->disabled + || $this->formField->readOnly + || !$user + || !$user->hasAccess('media.manage_media') + ) { + $this->previewMode = true; + } + } + + /** + * @inheritDoc + */ + public function render() + { + $this->prepareVars(); + + return $this->makePartial('mediafinder'); + } + + /** + * Prepares the list data + */ + public function prepareVars() + { + $value = $this->getLoadValue(); + $isImage = $this->mode === 'image'; + + $this->vars['value'] = $value; + $this->vars['imageUrl'] = $isImage && $value ? MediaLibrary::url($value) : ''; + $this->vars['imageExists'] = $isImage && $value ? MediaLibrary::instance()->exists($value) : ''; + $this->vars['field'] = $this->formField; + $this->vars['prompt'] = str_replace('%s', '', trans($this->prompt)); + $this->vars['mode'] = $this->mode; + $this->vars['imageWidth'] = $this->imageWidth; + $this->vars['imageHeight'] = $this->imageHeight; + } + + /** + * @inheritDoc + */ + public function getSaveValue($value) + { + if ($this->formField->disabled || $this->formField->hidden) { + return FormField::NO_SAVE_DATA; + } + + return $value; + } + + /** + * @inheritDoc + */ + protected function loadAssets() + { + $this->addJs('js/mediafinder.js', 'core'); + $this->addCss('css/mediafinder.css', 'core'); + } +} diff --git a/modules/backend/formwidgets/NestedForm.php b/modules/backend/formwidgets/NestedForm.php new file mode 100644 index 0000000..c4479f5 --- /dev/null +++ b/modules/backend/formwidgets/NestedForm.php @@ -0,0 +1,85 @@ +fillFromConfig([ + 'form', + 'usePanelStyles', + ]); + + if ($this->formField->disabled) { + $this->previewMode = true; + } + + $config = $this->makeConfig($this->form); + $config->model = $this->model; + $config->data = $this->getLoadValue(); + $config->alias = $this->alias . $this->defaultAlias; + $config->arrayName = $this->getFieldName(); + $config->isNested = true; + + if (object_get($this->getParentForm()->config, 'enableDefaults') === true) { + $config->enableDefaults = true; + } + + $widget = $this->makeWidget(Form::class, $config); + $widget->previewMode = $this->previewMode; + $widget->bindToController(); + + $this->formWidget = $widget; + } + + protected function loadAssets() + { + $this->addCss('css/nestedform.css', 'core'); + } + + /** + * @inheritdoc + */ + public function render() + { + $this->prepareVars(); + return $this->makePartial('nestedform'); + } + + public function prepareVars() + { + $this->formWidget->previewMode = $this->previewMode; + } +} diff --git a/modules/backend/formwidgets/PermissionEditor.php b/modules/backend/formwidgets/PermissionEditor.php new file mode 100644 index 0000000..86edc6b --- /dev/null +++ b/modules/backend/formwidgets/PermissionEditor.php @@ -0,0 +1,171 @@ +fillFromConfig([ + 'mode', + 'availablePermissions', + ]); + + $this->user = BackendAuth::getUser(); + } + + /** + * @inheritDoc + */ + public function render() + { + $this->prepareVars(); + return $this->makePartial('permissioneditor'); + } + + /** + * Prepares the list data + */ + public function prepareVars() + { + if ($this->formField->disabled) { + $this->previewMode = true; + } + + $permissionsData = $this->formField->getValueFromData($this->model); + if (!is_array($permissionsData)) { + $permissionsData = []; + } + + $this->vars['mode'] = $this->mode; + $this->vars['permissions'] = $this->getFilteredPermissions(); + $this->vars['baseFieldName'] = $this->getFieldName(); + $this->vars['permissionsData'] = $permissionsData; + $this->vars['field'] = $this->formField; + } + + /** + * @inheritDoc + */ + public function getSaveValue($value) + { + if ($this->user->isSuperUser()) { + return is_array($value) ? $value : []; + } + + return $this->getSaveValueSecure($value); + } + + /** + * @inheritDoc + */ + protected function loadAssets() + { + $this->addCss('css/permissioneditor.css', 'core'); + $this->addJs('js/permissioneditor.js', 'core'); + } + + /** + * Returns a safely parsed set of permissions, ensuring the user cannot elevate + * their own permissions or permissions of another user above their own. + * + * @param string $value + * @return array + */ + protected function getSaveValueSecure($value) + { + $newPermissions = is_array($value) ? array_map('intval', $value) : []; + + if (!empty($newPermissions)) { + $existingPermissions = $this->model->permissions ?: []; + + $allowedPermissions = array_map(function ($permissionObject) { + return $permissionObject->code; + }, array_flatten($this->getFilteredPermissions())); + + foreach ($newPermissions as $permission => $code) { + if (in_array($permission, $allowedPermissions)) { + $existingPermissions[$permission] = $code; + } + } + + $newPermissions = $existingPermissions; + } + + return $newPermissions; + } + + /** + * Returns the available permissions; removing those that the logged-in user does not have access to + * + * @return array The permissions that the logged-in user does have access to ['permission-tab' => $arrayOfAllowedPermissionObjects] + */ + protected function getFilteredPermissions() + { + $permissions = BackendAuth::listTabbedPermissions(); + + foreach ($permissions as $tab => $permissionsArray) { + foreach ($permissionsArray as $index => $permission) { + if (!$this->user->hasAccess($permission->code) || + ( + is_array($this->availablePermissions) && + !in_array($permission->code, $this->availablePermissions) + )) { + unset($permissionsArray[$index]); + } + } + + if (empty($permissionsArray)) { + unset($permissions[$tab]); + } + else { + $permissions[$tab] = $permissionsArray; + } + } + + return $permissions; + } +} diff --git a/modules/backend/formwidgets/RecordFinder.php b/modules/backend/formwidgets/RecordFinder.php new file mode 100644 index 0000000..0e5799c --- /dev/null +++ b/modules/backend/formwidgets/RecordFinder.php @@ -0,0 +1,380 @@ +fillFromConfig([ + 'title', + 'prompt', + 'keyFrom', + 'nameFrom', + 'descriptionFrom', + 'scope', + 'conditions', + 'searchMode', + 'searchScope', + 'recordsPerPage', + 'useRelation', + 'modelClass', + ]); + + if (!isset($this->prompt)) { + $this->prompt = Lang::get('backend::lang.recordfinder.default_prompt'); + } + + if (!$this->useRelation && !class_exists($this->modelClass)) { + throw new ApplicationException(Lang::get('backend::lang.recordfinder.invalid_model_class', ['modelClass' => $this->modelClass])); + } + + $modelKey = $this->getRecordModel()->getKeyName(); + if ($this->keyFrom === 'id' && $modelKey !== 'id') { + $this->keyFrom = $modelKey; + } + + if (post('recordfinder_flag')) { + $this->listWidget = $this->makeListWidget(); + $this->listWidget->bindToController(); + + $this->searchWidget = $this->makeSearchWidget(); + $this->searchWidget->bindToController(); + + $this->listWidget->setSearchTerm($this->searchWidget->getActiveTerm()); + + /* + * Link the Search Widget to the List Widget + */ + $this->searchWidget->bindEvent('search.submit', function () { + $this->listWidget->setSearchTerm($this->searchWidget->getActiveTerm()); + return $this->listWidget->onRefresh(); + }); + } + } + + /** + * @inheritDoc + */ + public function render() + { + $this->prepareVars(); + return $this->makePartial('container'); + } + + public function onRefresh() + { + $value = post($this->getFieldName()); + if ($this->useRelation) { + list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom); + $model->{$attribute} = $value; + } else { + $this->formField->value = $value; + } + + $this->prepareVars(); + return ['#'.$this->getId('container') => $this->makePartial('recordfinder')]; + } + + public function onClearRecord() + { + if ($this->useRelation) { + list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom); + $model->{$attribute} = null; + } else { + $this->formField->value = null; + } + + $this->prepareVars(); + return ['#'.$this->getId('container') => $this->makePartial('recordfinder')]; + } + + /** + * Prepares the list data + */ + public function prepareVars() + { + $this->relationModel = $this->getLoadValue(); + + if ($this->formField->disabled) { + $this->previewMode = true; + } + + $this->vars['value'] = $this->getKeyValue(); + $this->vars['field'] = $this->formField; + $this->vars['nameValue'] = $this->getNameValue(); + $this->vars['descriptionValue'] = $this->getDescriptionValue(); + $this->vars['listWidget'] = $this->listWidget; + $this->vars['searchWidget'] = $this->searchWidget; + $this->vars['title'] = $this->title; + $this->vars['prompt'] = str_replace('%s', '', e(trans($this->prompt))); + } + + /** + * @inheritDoc + */ + protected function loadAssets() + { + $this->addJs('js/recordfinder.js', 'core'); + } + + /** + * @inheritDoc + */ + public function getSaveValue($value) + { + return strlen($value) ? $value : null; + } + + /** + * @inheritDoc + */ + public function getLoadValue() + { + $value = null; + + if ($this->useRelation) { + list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom); + if ($model !== null) { + $value = $model->{$attribute}; + } + } else { + $value = $this->modelClass::where($this->keyFrom, parent::getLoadValue())->first(); + } + + return $value; + } + + public function getKeyValue() + { + if (!$this->relationModel) { + return null; + } + + return $this->useRelation ? + $this->relationModel->{$this->keyFrom} : + $this->formField->value; + } + + public function getNameValue() + { + if (!$this->relationModel || !$this->nameFrom) { + return null; + } + + return $this->relationModel->{$this->nameFrom}; + } + + public function getDescriptionValue() + { + if (!$this->relationModel || !$this->descriptionFrom) { + return null; + } + + return $this->relationModel->{$this->descriptionFrom}; + } + + public function onFindRecord() + { + $this->prepareVars(); + + // Attach the parent element ID to the popup + $this->vars['parentElementId'] = $this->getId('popupTrigger'); + + /* + * Purge the search term stored in session + */ + if ($this->searchWidget) { + $this->listWidget->setSearchTerm(null); + $this->searchWidget->setActiveTerm(null); + } + + return $this->makePartial('recordfinder_form'); + } + + /** + * Gets the base model instance used by this field + */ + protected function getRecordModel(): Model + { + $model = null; + if ($this->useRelation) { + $model = $this->getRelationModel(); + } else { + $model = new $this->modelClass; + } + return $model; + } + + protected function makeListWidget() + { + $config = $this->makeConfig($this->getConfig('list')); + + $config->model = $this->getRecordModel(); + $config->alias = $this->alias . 'List'; + $config->showSetup = false; + $config->showCheckboxes = false; + $config->recordsPerPage = $this->recordsPerPage; + $config->recordOnClick = sprintf("$('#%s').recordFinder('updateRecord', this, ':" . $this->keyFrom . "')", $this->getId()); + $widget = $this->makeWidget('Backend\Widgets\Lists', $config); + + $widget->setSearchOptions([ + 'mode' => $this->searchMode, + 'scope' => $this->searchScope, + ]); + + if ($sqlConditions = $this->conditions) { + $widget->bindEvent('list.extendQueryBefore', function ($query) use ($sqlConditions) { + $query->whereRaw($sqlConditions); + }); + } + elseif ($scopeMethod = $this->scope) { + $widget->bindEvent('list.extendQueryBefore', function ($query) use ($scopeMethod) { + $query->$scopeMethod($this->model); + }); + } + else { + if ($this->useRelation) { + $widget->bindEvent('list.extendQueryBefore', function ($query) { + $this->getRelationObject()->addDefinedConstraintsToQuery($query); + }); + } + } + + return $widget; + } + + protected function makeSearchWidget() + { + $config = $this->makeConfig(); + $config->alias = $this->alias . 'Search'; + $config->growable = false; + $config->prompt = 'backend::lang.list.search_prompt'; + $widget = $this->makeWidget('Backend\Widgets\Search', $config); + $widget->cssClasses[] = 'recordfinder-search'; + return $widget; + } +} diff --git a/modules/backend/formwidgets/Relation.php b/modules/backend/formwidgets/Relation.php new file mode 100644 index 0000000..830af3b --- /dev/null +++ b/modules/backend/formwidgets/Relation.php @@ -0,0 +1,198 @@ +fillFromConfig([ + 'nameFrom', + 'emptyOption', + 'scope', + 'order', + ]); + + if (isset($this->config->select)) { + $this->sqlSelect = $this->config->select; + } + } + + /** + * @inheritDoc + */ + public function render() + { + $this->prepareVars(); + return $this->makePartial('relation'); + } + + /** + * Prepares the view data + */ + public function prepareVars() + { + $this->vars['field'] = $this->makeRenderFormField(); + } + + /** + * Makes the form object used for rendering a simple field type + * @throws SystemException if an unsupported relation type is used. + */ + protected function makeRenderFormField() + { + return $this->renderFormField = RelationBase::noConstraints(function () { + + $field = clone $this->formField; + $relationObject = $this->getRelationObject(); + $query = $relationObject->newQuery(); + + list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom); + $relationType = $model->getRelationType($attribute); + $relationModel = $model->makeRelation($attribute); + + if (in_array($relationType, ['belongsToMany', 'morphToMany', 'morphedByMany', 'hasMany'])) { + $field->type = 'checkboxlist'; + } elseif (in_array($relationType, ['belongsTo', 'hasOne'])) { + $field->type = 'dropdown'; + } else { + throw new SystemException( + Lang::get('backend::lang.relation.relationwidget_unsupported_type', [ + 'type' => $relationType + ]) + ); + } + + // Order query by the configured option. + if ($this->order) { + // Using "raw" to allow authors to use a string to define the order clause. + $query->orderByRaw($this->order); + } + + // It is safe to assume that if the model and related model are of + // the exact same class, then it cannot be related to itself + if ($model->exists && (get_class($model) == get_class($relationModel))) { + $query->where($relationModel->getKeyName(), '<>', $model->getKey()); + } + + // Even though "no constraints" is applied, belongsToMany constrains the query + // by joining its pivot table. Remove all joins from the query. + $query->getQuery()->getQuery()->joins = []; + + if ($scopeMethod = $this->scope) { + $query->$scopeMethod($model); + } + + // Determine if the model uses a tree trait + $treeTraits = ['Winter\Storm\Database\Traits\NestedTree', 'Winter\Storm\Database\Traits\SimpleTree']; + $usesTree = count(array_intersect($treeTraits, class_uses($relationModel))) > 0; + + // The "sqlSelect" config takes precedence over "nameFrom". + // A virtual column called "selection" will contain the result. + // Tree models must select all columns to return parent columns, etc. + if ($this->sqlSelect) { + $nameFrom = 'selection'; + $selectColumn = $usesTree ? '*' : $relationModel->getKeyName(); + $result = $query->select($selectColumn, Db::raw($this->sqlSelect . ' AS ' . $nameFrom)); + } + else { + $nameFrom = $this->nameFrom; + $result = $query->getQuery()->get(); + } + + // Some simpler relations can specify a custom local or foreign "other" key, + // which can be detected and implemented here automagically. + $primaryKeyName = in_array($relationType, ['hasMany', 'belongsTo', 'hasOne']) + ? $relationObject->getOtherKey() + : $relationModel->getKeyName(); + + $field->options = $usesTree + ? $result->listsNested($nameFrom, $primaryKeyName) + : $result->lists($nameFrom, $primaryKeyName); + + return $field; + }); + } + + /** + * @inheritDoc + */ + public function getSaveValue($value) + { + if ($this->formField->disabled || $this->formField->hidden) { + return FormField::NO_SAVE_DATA; + } + + if (is_string($value) && !strlen($value)) { + return null; + } + + if (is_array($value) && !count($value)) { + return null; + } + + return $value; + } +} diff --git a/modules/backend/formwidgets/RelationManager.php b/modules/backend/formwidgets/RelationManager.php new file mode 100644 index 0000000..b116588 --- /dev/null +++ b/modules/backend/formwidgets/RelationManager.php @@ -0,0 +1,84 @@ +fillFromConfig([ + 'readOnly', + 'recordUrl', + 'recordOnClick', + 'relation', + ]); + + if (!isset($this->readOnly) && $this->config->previewMode) { + $this->readOnly = $this->config->previewMode; + } + } + + public function render() + { + if (!$this->controller->isClassExtendedWith(\Backend\Behaviors\RelationController::class)) { + $error = Lang::get('backend::lang.relation.missing_behavior', [ + 'field' => $this->formField->fieldName, + 'controller' => get_class($this->controller), + ]); + throw new SystemException($error); + } + + $options = []; + + if (!is_null($this->readOnly)) { + $options['readOnly'] = $this->readOnly; + } + + if (!is_null($this->recordUrl)) { + $options['recordUrl'] = $this->recordUrl; + } + + if (!is_null($this->recordOnClick)) { + $options['recordOnClick'] = $this->recordOnClick; + } + + $relation = $this->relation ?: $this->formField->fieldName; + + return $this->controller->relationRender($relation, $options); + } + + public function getSaveValue($value) + { + return FormField::NO_SAVE_DATA; + } +} diff --git a/modules/backend/formwidgets/Repeater.php b/modules/backend/formwidgets/Repeater.php new file mode 100644 index 0000000..4e834c8 --- /dev/null +++ b/modules/backend/formwidgets/Repeater.php @@ -0,0 +1,535 @@ +fillFromConfig([ + 'form', + 'mode', + 'style', + 'prompt', + 'sortable', + 'titleFrom', + 'minItems', + 'maxItems', + 'columns', + 'rowHeight', + ]); + + if ($this->formField->disabled) { + $this->previewMode = true; + } + + if ($this->columns < 2 || $this->columns > 6) { + $this->columns = 4; + } + + // Check for loaded flag in POST + if ((bool) post($this->alias . '_loaded') === true) { + $this->loaded = true; + } + + $this->checkAddItemRequest(); + $this->processGroupMode(); + + if (!self::$onAddItemCalled) { + $this->processItems(); + } + } + + /** + * {@inheritDoc} + */ + public function render() + { + $this->prepareVars(); + return $this->makePartial('repeater'); + } + + /** + * Prepares the form widget view data + */ + public function prepareVars() + { + // Refresh the loaded data to support being modified by filterFields + // @see https://github.com/octobercms/october/issues/2613 + if (!self::$onAddItemCalled) { + $this->processItems(); + } + + if ($this->previewMode) { + foreach ($this->formWidgets as $widget) { + $widget->previewMode = true; + } + } + + $this->vars['prompt'] = $this->prompt; + $this->vars['mode'] = in_array($this->mode, ['list', 'grid']) ? $this->mode : 'list'; + $this->vars['formWidgets'] = $this->formWidgets; + $this->vars['titleFrom'] = $this->titleFrom; + $this->vars['minItems'] = (int) $this->minItems; + $this->vars['maxItems'] = (int) $this->maxItems; + $this->vars['sortable'] = (bool) $this->sortable; + $this->vars['style'] = in_array($this->style, ['default', 'collapsed', 'accordion']) ? $this->style : 'default'; + $this->vars['columns'] = (int) $this->columns; + $this->vars['rowHeight'] = (int) $this->rowHeight; + + $this->vars['useGroups'] = $this->useGroups; + $this->vars['groupDefinitions'] = $this->groupDefinitions; + } + + /** + * @inheritDoc + */ + protected function loadAssets() + { + $this->addCss('css/repeater.css', 'core'); + $this->addJs('js/repeater.js', 'core'); + } + + /** + * @inheritDoc + */ + public function getSaveValue($value) + { + return $this->processSaveValue($value); + } + + /** + * Splices in some meta data (group and index values) to the dataset. + * @param array $value + * @return array|null + */ + protected function processSaveValue($value) + { + if (!is_array($value) || !$value) { + return null; + } + + if ($this->minItems && count($value) < $this->minItems) { + throw new ApplicationException(Lang::get('backend::lang.repeater.min_items_failed', ['name' => $this->fieldName, 'min' => $this->minItems, 'items' => count($value)])); + } + if ($this->maxItems && count($value) > $this->maxItems) { + throw new ApplicationException(Lang::get('backend::lang.repeater.max_items_failed', ['name' => $this->fieldName, 'max' => $this->maxItems, 'items' => count($value)])); + } + + /* + * Give repeated form field widgets an opportunity to process the data. + */ + foreach ($value as $index => $data) { + if (isset($this->formWidgets[$index])) { + if ($this->useGroups) { + $value[$index] = array_merge($this->formWidgets[$index]->getSaveData(), ['_group' => $data['_group']]); + } else { + $value[$index] = $this->formWidgets[$index]->getSaveData(); + } + } + } + + return array_values($value); + } + + /** + * Processes form data and applies it to the form widgets. + * @return void + */ + protected function processItems() + { + $currentValue = ($this->loaded === true) + ? post($this->formField->getName()) + : $this->getLoadValue(); + + // Detect when a child widget is trying to run an AJAX handler + // outside of the form element that contains all the repeater + // fields that would normally be used to identify that case + $handler = $this->controller->getAjaxHandler(); + if (!$this->loaded && starts_with($handler, $this->alias . 'Form')) { + // Attempt to get the index of the repeater + $handler = str_after($handler, $this->alias . 'Form'); + preg_match("~^(\d+)~", $handler, $matches); + + if (isset($matches[1])) { + $index = $matches[1]; + $this->makeItemFormWidget($index); + } + } + + // Ensure that the minimum number of items are preinitialized + // ONLY DONE WHEN NOT IN GROUP MODE + if (!$this->useGroups && $this->minItems > 0) { + if (!is_array($currentValue)) { + $currentValue = []; + for ($i = 0; $i < $this->minItems; $i++) { + $currentValue[$i] = []; + } + } elseif (count($currentValue) < $this->minItems) { + for ($i = 0; $i < ($this->minItems - count($currentValue)); $i++) { + $currentValue[] = []; + } + } + } + + if (!$this->childAddItemCalled && $currentValue === null) { + $this->formWidgets = []; + return; + } + + if ($this->childAddItemCalled && !isset($currentValue[$this->childIndexCalled])) { + // If no value is available but a child repeater has added an item, add a "stub" repeater item + $this->makeItemFormWidget($this->childIndexCalled); + } + + if (!is_array($currentValue)) { + return; + } + + collect($currentValue)->each(function ($value, $index) { + $this->makeItemFormWidget($index, array_get($value, '_group', null)); + }); + } + + /** + * Creates a form widget based on a field index and optional group code. + * @param int $index + * @param string $index + * @return \Backend\Widgets\Form + */ + protected function makeItemFormWidget($index = 0, $groupCode = null) + { + $configDefinition = $this->useGroups + ? $this->getGroupFormFieldConfig($groupCode) + : $this->form; + + $config = $this->makeConfig($configDefinition); + $config->model = $this->model; + $config->data = $this->getValueFromIndex($index); + $config->alias = $this->alias . 'Form' . $index; + $config->arrayName = $this->getFieldName().'['.$index.']'; + $config->isNested = true; + if (self::$onAddItemCalled || $this->minItems > 0) { + $config->enableDefaults = true; + } + + $widget = $this->makeWidget('Backend\Widgets\Form', $config); + $widget->previewMode = $this->previewMode; + $widget->bindToController(); + + $this->indexMeta[$index] = [ + 'groupCode' => $groupCode + ]; + + return $this->formWidgets[$index] = $widget; + } + + /** + * Returns the data at a given index. + * @param int $index + */ + protected function getValueFromIndex($index) + { + $value = ($this->loaded === true) + ? post($this->formField->getName()) + : $this->getLoadValue(); + + if (!is_array($value)) { + $value = []; + } + + return array_get($value, $index, []); + } + + // + // AJAX handlers + // + + public function onAddItem() + { + $groupCode = post('_repeater_group'); + + $index = $this->getNextIndex(); + + $this->prepareVars(); + $this->vars['widget'] = $this->makeItemFormWidget($index, $groupCode); + $this->vars['indexValue'] = $index; + + $itemContainer = '@#' . $this->getId('items'); + $addItemContainer = '#' . $this->getId('add-item'); + + return [ + $addItemContainer => '', + $itemContainer => $this->makePartial('repeater_item') . $this->makePartial('repeater_add_item') + ]; + } + + public function onRemoveItem() + { + // Useful for deleting relations + } + + public function onRefresh() + { + $index = post('_repeater_index'); + $group = post('_repeater_group'); + + $widget = $this->makeItemFormWidget($index, $group); + + return $widget->onRefresh(); + } + + /** + * Determines the next available index number for assigning to a new repeater item. + * + * @return int + */ + protected function getNextIndex() + { + if ($this->loaded === true) { + $data = post($this->formField->getName()); + + if (is_array($data) && count($data)) { + return (max(array_keys($data)) + 1); + } + } else { + $data = $this->getLoadValue(); + + if (is_array($data)) { + return count($data); + } + } + + return 0; + } + + /** + * Determines the repeater that has triggered an AJAX request to add an item. + * + * @return void + */ + protected function checkAddItemRequest() + { + $handler = $this->getParentForm() + ->getController() + ->getAjaxHandler(); + + if ($handler === null || strpos($handler, '::') === false) { + return; + } + + list($widgetName, $handlerName) = explode('::', $handler); + if ($handlerName !== 'onAddItem') { + return; + } + + if ($this->alias === $widgetName) { + // This repeater has made the AJAX request + self::$onAddItemCalled = true; + } else if (strpos($widgetName, $this->alias . 'Form') === 0) { + // A child repeater has made the AJAX request + + // Get index from AJAX handler + $handlerSuffix = str_replace($this->alias . 'Form', '', $widgetName); + if (preg_match('/^[0-9]+/', $handlerSuffix, $matches)) { + $this->childAddItemCalled = true; + $this->childIndexCalled = (int) $matches[0]; + } + } + } + + // + // Group mode + // + + /** + * Returns the form field configuration for a group, identified by code. + * @param string $code + * @return array|null + */ + protected function getGroupFormFieldConfig($code) + { + if (!$code) { + return null; + } + + $fields = array_get($this->groupDefinitions, $code.'.fields'); + + if (!$fields) { + return null; + } + + return ['fields' => $fields, 'enableDefaults' => object_get($this->config, 'enableDefaults')]; + } + + /** + * Process features related to group mode. + * @return void + */ + protected function processGroupMode() + { + $palette = []; + + if (!$group = $this->getConfig('groups', [])) { + $this->useGroups = false; + return; + } + + if (is_string($group)) { + $group = $this->makeConfig($group); + } + + foreach ($group as $code => $config) { + $palette[$code] = [ + 'code' => $code, + 'name' => array_get($config, 'name'), + 'icon' => array_get($config, 'icon', 'icon-square-o'), + 'description' => array_get($config, 'description'), + 'fields' => array_get($config, 'fields') + ]; + } + + $this->groupDefinitions = $palette; + $this->useGroups = true; + } + + /** + * Returns a field group code from its index. + * @param $index int + * @return string + */ + public function getGroupCodeFromIndex($index) + { + return array_get($this->indexMeta, $index.'.groupCode'); + } + + /** + * Returns the group title from its unique code. + * @param $groupCode string + * @return string + */ + public function getGroupTitle($groupCode) + { + return array_get($this->groupDefinitions, $groupCode.'.name'); + } +} diff --git a/modules/backend/formwidgets/RichEditor.php b/modules/backend/formwidgets/RichEditor.php new file mode 100644 index 0000000..02c9949 --- /dev/null +++ b/modules/backend/formwidgets/RichEditor.php @@ -0,0 +1,315 @@ +formField->disabled) { + $this->readOnly = true; + } + + $this->fillFromConfig([ + 'fullPage', + 'readOnly', + 'toolbarButtons', + ]); + } + + /** + * @inheritDoc + */ + public function render() + { + $this->prepareVars(); + return $this->makePartial('richeditor'); + } + + /** + * Prepares the list data + */ + public function prepareVars() + { + $this->vars['field'] = $this->formField; + $this->vars['editorLang'] = $this->getValidEditorLang(); + $this->vars['fullPage'] = $this->fullPage; + $this->vars['stretch'] = $this->formField->stretch; + $this->vars['size'] = $this->formField->size; + $this->vars['readOnly'] = $this->readOnly; + $this->vars['name'] = $this->getFieldName(); + $this->vars['value'] = $this->getLoadValue(); + $this->vars['toolbarButtons'] = $this->evalToolbarButtons(); + $this->vars['useMediaManager'] = BackendAuth::getUser()->hasAccess('media.manage_media'); + + $this->vars['globalToolbarButtons'] = EditorSetting::getConfigured('html_toolbar_buttons'); + $this->vars['allowEmptyTags'] = EditorSetting::getConfigured('html_allow_empty_tags'); + $this->vars['allowTags'] = EditorSetting::getConfigured('html_allow_tags'); + $this->vars['allowAttributes'] = EditorSetting::getConfigured('html_allow_attributes'); + $this->vars['noWrapTags'] = EditorSetting::getConfigured('html_no_wrap_tags'); + $this->vars['removeTags'] = EditorSetting::getConfigured('html_remove_tags'); + $this->vars['lineBreakerTags'] = EditorSetting::getConfigured('html_line_breaker_tags'); + + $this->vars['imageStyles'] = EditorSetting::getConfiguredStyles('html_style_image'); + $this->vars['linkStyles'] = EditorSetting::getConfiguredStyles('html_style_link'); + $this->vars['paragraphStyles'] = EditorSetting::getConfiguredStyles('html_style_paragraph'); + $this->vars['paragraphFormats'] = EditorSetting::getConfiguredFormats('html_paragraph_formats'); + $this->vars['tableStyles'] = EditorSetting::getConfiguredStyles('html_style_table'); + $this->vars['tableCellStyles'] = EditorSetting::getConfiguredStyles('html_style_table_cell'); + } + + /** + * Determine the toolbar buttons to use based on config. + * @return string + */ + protected function evalToolbarButtons() + { + $buttons = $this->toolbarButtons; + + if (is_string($buttons)) { + $buttons = array_map(function ($button) { + return strlen($button) ? $button : '|'; + }, explode('|', $buttons)); + } + + return $buttons; + } + + public function onLoadPageLinksForm() + { + $this->vars['links'] = $this->getPageLinksArray(); + return $this->makePartial('page_links_form'); + } + + /** + * @inheritDoc + */ + protected function loadAssets() + { + $this->addCss('css/richeditor.css', 'core'); + $this->addJs('js/build-min.js', 'core'); + + if (Config::get('develop.decompileBackendAssets', false)) { + $scripts = Backend::decompileAsset($this->getAssetPath('js/build-plugins.js')); + foreach ($scripts as $script) { + $this->addJs($script, 'core'); + } + } else { + $this->addJs('js/build-plugins-min.js', 'core'); + } + + $this->addJs('/modules/backend/assets/vendor/ace-codeeditor/build-min.js', 'core'); + + if ($lang = $this->getValidEditorLang()) { + $this->addJs('vendor/froala/js/languages/'.$lang.'.js', 'core'); + } + } + + /** + * Returns a valid language code for Redactor. + * @return string|mixed + */ + protected function getValidEditorLang() + { + $locale = App::getLocale(); + + // English is baked in + if ($locale == 'en') { + return null; + } + + $locale = str_replace('-', '_', strtolower($locale)); + $path = base_path('modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/'.$locale.'.js'); + + return File::exists($path) ? $locale : false; + } + + /** + * Returns a list of registered page link types. + * This is reserved functionality for separating the links by type. + * @return array Returns an array of registered page link types + */ + protected function getPageLinkTypes() + { + $result = []; + + /** + * @event backend.richeditor.listTypes + * Register additional "page link types" to the RichEditor FormWidget + * + * Example usage: + * + * Event::listen('backend.richeditor.listTypes', function () { + * return [ + * 'my-identifier' => 'author.plugin::lang.richeditor.link_types.my_identifier', + * ]; + * }); + * + */ + $apiResult = Event::fire('backend.richeditor.listTypes'); + if (is_array($apiResult)) { + foreach ($apiResult as $typeList) { + if (!is_array($typeList)) { + continue; + } + + foreach ($typeList as $typeCode => $typeName) { + $result[$typeCode] = $typeName; + } + } + } + + return $result; + } + + protected function getPageLinks($type) + { + $result = []; + + /** + * @event backend.richeditor.getTypeInfo + * Register additional "page link types" to the RichEditor FormWidget + * + * Example usage: + * + * Event::listen('backend.richeditor.getTypeInfo', function ($type) { + * if ($type === 'my-identifier') { + * return [ + * 'https://example.com/page1' => 'Page 1', + * 'https://example.com/parent-page' => [ + * 'title' => 'Parent Page', + * 'links' => [ + * 'https://example.com/child-page' => 'Child Page', + * ], + * ], + * ]; + * } + * }); + * + */ + $apiResult = Event::fire('backend.richeditor.getTypeInfo', [$type]); + if (is_array($apiResult)) { + foreach ($apiResult as $typeInfo) { + if (!is_array($typeInfo)) { + continue; + } + + foreach ($typeInfo as $name => $value) { + $result[$name] = $value; + } + } + } + + return $result; + } + + /** + * Returns a single collection of available page links. + * This implementation has room to place links under + * different groups based on the link type. + * @return array + */ + protected function getPageLinksArray() + { + $links = []; + $types = $this->getPageLinkTypes(); + + $links[] = ['name' => Lang::get('backend::lang.pagelist.select_page'), 'url' => false]; + + $iterator = function ($links, $level = 0) use (&$iterator) { + $result = []; + + foreach ($links as $linkUrl => $link) { + /* + * Remove scheme and host from URL + */ + $baseUrl = Request::getSchemeAndHttpHost(); + if (strpos($linkUrl, $baseUrl) === 0) { + $linkUrl = substr($linkUrl, strlen($baseUrl)); + } + + /* + * Root page fallback. + */ + if (strlen($linkUrl) === 0) { + $linkUrl = '/'; + } + + $linkName = str_repeat(' ', $level * 4); + $linkName .= is_array($link) ? array_get($link, 'title', '') : $link; + $result[] = ['name' => $linkName, 'url' => $linkUrl]; + + if (is_array($link)) { + $result = array_merge( + $result, + $iterator(array_get($link, 'links', []), $level + 1) + ); + } + } + + return $result; + }; + + foreach ($types as $typeCode => $typeName) { + $links = array_merge($links, $iterator($this->getPageLinks($typeCode))); + } + + return $links; + } +} diff --git a/modules/backend/formwidgets/Sensitive.php b/modules/backend/formwidgets/Sensitive.php new file mode 100644 index 0000000..8ab91b8 --- /dev/null +++ b/modules/backend/formwidgets/Sensitive.php @@ -0,0 +1,116 @@ +fillFromConfig([ + 'readOnly', + 'disabled', + 'allowCopy', + 'hiddenPlaceholder', + 'hideOnTabChange', + ]); + + if ($this->formField->disabled || $this->formField->readOnly) { + $this->previewMode = true; + } + } + + /** + * @inheritDoc + */ + public function render() + { + $this->prepareVars(); + + return $this->makePartial('sensitive'); + } + + /** + * Prepares the view data for the widget partial. + */ + public function prepareVars() + { + $this->vars['readOnly'] = $this->readOnly; + $this->vars['disabled'] = $this->disabled; + $this->vars['hasValue'] = !empty($this->getLoadValue()); + $this->vars['allowCopy'] = $this->allowCopy; + $this->vars['hiddenPlaceholder'] = $this->hiddenPlaceholder; + $this->vars['hideOnTabChange'] = $this->hideOnTabChange; + } + + /** + * Reveals the value of a hidden, unmodified sensitive field. + * + * @return array + */ + public function onShowValue() + { + return [ + 'value' => $this->getLoadValue() + ]; + } + + /** + * @inheritDoc + */ + public function getSaveValue($value) + { + if ($value === $this->hiddenPlaceholder) { + $value = $this->getLoadValue(); + } + + return $value; + } + + /** + * @inheritDoc + */ + protected function loadAssets() + { + $this->addJs('js/dist/sensitive.js', 'core'); + } +} diff --git a/modules/backend/formwidgets/TagList.php b/modules/backend/formwidgets/TagList.php new file mode 100644 index 0000000..620fde1 --- /dev/null +++ b/modules/backend/formwidgets/TagList.php @@ -0,0 +1,242 @@ +fillFromConfig([ + 'separator', + 'customTags', + 'options', + 'mode', + 'nameFrom', + 'useKey', + 'placeholder' + ]); + } + + /** + * @inheritDoc + */ + public function render() + { + $this->prepareVars(); + + return $this->makePartial('taglist'); + } + + /** + * Prepares the form widget view data + */ + public function prepareVars() + { + $this->vars['placeholder'] = $this->placeholder; + $this->vars['useKey'] = $this->useKey; + $this->vars['field'] = $this->formField; + $this->vars['fieldOptions'] = $this->getFieldOptions(); + $this->vars['selectedValues'] = $this->getLoadValue(); + $this->vars['customSeparators'] = $this->getCustomSeparators(); + } + + /** + * @inheritDoc + */ + public function getSaveValue($value) + { + if (!is_array($value)) { + $value = [$value]; + } + + $value = array_values(array_filter($value)); + + if ($this->mode === static::MODE_RELATION) { + return $this->hydrateRelationSaveValue($value); + } + + if ($this->mode === static::MODE_STRING) { + return implode($this->getSeparatorCharacter(), $value); + } + + return $value; + } + + /** + * Returns an array suitable for saving against a relation (array of keys). + * This method also creates non-existent tags. + */ + protected function hydrateRelationSaveValue(array $names): ?array + { + $relation = $this->getRelationObject(); + $relationModel = $this->getRelationModel(); + + $keyName = $relationModel->getKeyName(); + $pivot = in_array(get_class($relation), [BelongsToMany::class, MorphToMany::class]); + + if ($pivot) { + $existingTags = $relationModel->whereIn($this->nameFrom, $names)->lists($this->nameFrom, $keyName); + } else { + $existingTags = $relation->lists($this->nameFrom, $keyName); + } + + $newTags = $this->customTags ? array_diff($names, $existingTags) : []; + $deletedTags = $this->customTags ? array_diff($existingTags, $names) : []; + + foreach ($newTags as $newTag) { + if ($pivot) { + $newModel = new $relationModel; + $newModel->{$this->nameFrom} = $newTag; + $newModel->save(); + } else { + $newModel = $relation->create([$this->nameFrom => $newTag]); + } + $existingTags[$newModel->getKey()] = $newTag; + } + + if (!$pivot && $deletedTags) { + $deletedKeys = array_keys($deletedTags); + $relation->whereIn($keyName, $deletedKeys)->delete(); + foreach ($deletedTags as $id) { + unset($existingTags[$id]); + } + } + + return array_keys($existingTags); + } + + /** + * @inheritDoc + */ + public function getLoadValue() + { + $value = parent::getLoadValue(); + + if ($this->mode === static::MODE_RELATION) { + return $this->getRelationObject()->lists($this->nameFrom); + } + + return $this->mode === static::MODE_STRING + ? explode($this->getSeparatorCharacter(), $value) + : $value; + } + + /** + * Returns defined field options, or from the relation if available. + * @return array + */ + public function getFieldOptions() + { + $options = $this->formField->options(); + + if (!$options && $this->mode === static::MODE_RELATION) { + $options = RelationBase::noConstraints(function () { + $query = $this->getRelationObject()->newQuery(); + + // Even though "no constraints" is applied, belongsToMany constrains the query + // by joining its pivot table. Remove all joins from the query. + $query->getQuery()->getQuery()->joins = []; + + return $query->lists($this->nameFrom); + }); + } + + return $options; + } + + /** + * Returns character(s) to use for separating keywords. + * @return mixed + */ + protected function getCustomSeparators() + { + if (!$this->customTags) { + return false; + } + + $separators = []; + + $separators[] = $this->getSeparatorCharacter(); + + return implode('|', $separators); + } + + /** + * Convert the character word to the singular character. + * @return string + */ + protected function getSeparatorCharacter() + { + switch (strtolower($this->separator)) { + case 'comma': + return ','; + case 'space': + return ' '; + } + } +} diff --git a/modules/backend/formwidgets/codeeditor/README.md b/modules/backend/formwidgets/codeeditor/README.md new file mode 100644 index 0000000..e8989c5 --- /dev/null +++ b/modules/backend/formwidgets/codeeditor/README.md @@ -0,0 +1,586 @@ +# Monaco Code Editor for Winter CMS + +This is the Monaco Editor integration for Winter CMS Backend, replacing the legacy Ace Editor with Microsoft's Monaco Editor (the same editor that powers VS Code). + +## Overview + +**Monaco Editor** provides a rich, modern code editing experience with: +- IntelliSense (code completion) +- Syntax highlighting for 15+ languages +- Advanced find/replace with regex support +- Multi-cursor editing +- Code folding +- Bracket matching and colorization +- Minimap overview +- Color picker for CSS colors +- And many more VS Code features + +## Features + +### Supported Languages (15) + +1. **TypeScript** - Full TypeScript support with type checking +2. **JavaScript** - Modern ES6+ support +3. **CSS** - Including CSS3 properties +4. **JSON** - With schema validation +5. **HTML** - HTML5 support +6. **INI** - Configuration files +7. **LESS** - CSS preprocessor +8. **Markdown** - Rich markdown editing +9. **MySQL** - SQL syntax highlighting +10. **PHP** - Full PHP support +11. **SCSS** - Sass CSS preprocessor +12. **Twig** - Template engine syntax +13. **XML** - Markup language support +14. **YAML** - Configuration file support + +### Monaco Features (20+) + +Enabled features include: +- Anchor select +- Bracket matching +- Caret operations +- Clipboard operations +- Code lens +- Color picker +- Comment toggling +- Context menu +- Cursor undo/redo +- Find and replace +- Code folding +- Go to symbol +- Hover information +- In-place replace +- Indentation +- Inline hints +- Links +- Multi-cursor editing +- Parameter hints +- Rename symbol +- Smart select +- Snippets +- Suggest (autocomplete) +- Word highlighter +- Word operations + +### Themes (35+) + +Includes legacy tmTheme themes plus modern JSON themes + +### User Preferences + +All editor preferences are configurable from **Backend → Preferences → Code editor**: + +**Appearance:** +- Font size (default: 12px) +- Theme selection +- Show/hide line numbers (gutter) +- Show/hide invisibles (whitespace) +- Highlight active line +- Show minimap +- Bracket colorization +- Color picker for CSS + +**Behavior:** +- Tab size (default: 4 spaces) +- Use soft tabs (spaces) vs hard tabs +- Word wrap +- Auto-closing brackets/quotes +- Code folding +- Indent guides +- Print margin + +All preferences persist across sessions and are stored per-user. + +## Editor Architecture + +Winter CMS uses a **dual-editor architecture** to optimize for different use cases: + +### Monaco Editor (this FormWidget) +**Used by:** CodeEditor FormWidget +**Location:** `/modules/backend/formwidgets/codeeditor/` +**Purpose:** Advanced code editing with IntelliSense, syntax highlighting, and modern IDE features +**Bundle Size:** ~15 MB gzipped (main bundle + workers) +**Best for:** Writing PHP, JavaScript, CSS, YAML, and other code files + +### Ace Editor (preserved) +**Used by:** RichEditor and MarkdownEditor FormWidgets +**Location:** `/modules/backend/assets/vendor/ace-codeeditor/` +**Purpose:** HTML source code editing within WYSIWYG editors +**Bundle Size:** ~500 KB (significantly lighter) +**Best for:** Viewing/editing raw HTML in rich text contexts + +### Why Both? + +**Monaco for CodeEditor:** +- Full IntelliSense and code completion +- Advanced refactoring tools +- Multi-cursor editing +- Rich language support +- Worth the bundle size for dedicated code editing + +**Ace for RichEditor/MarkdownEditor:** +- Users rarely need advanced IDE features for HTML source view +- Lighter bundle improves page load performance +- Sufficient for basic HTML editing needs +- Reduces total application bundle by keeping WYSIWYG tools lean + +This architecture balances modern features where they matter most (code editing) with performance optimization for general-purpose rich text editing. + +## Technical Details + +### Architecture + +```text +modules/backend/formwidgets/codeeditor/ +├── assets/ +│ ├── css/ +│ │ └── codeeditor.css - Compiled styles +│ ├── fonts/ +│ │ └── codicon.ttf - Monaco icons font +│ ├── js/ +│ │ ├── codeeditor.js - Main Monaco integration +│ │ └── build/ +│ │ ├── codeeditor.bundle.js - Main bundle (19 MB) +│ │ ├── css.worker.js - CSS language worker +│ │ ├── editor.worker.js - Base editor worker +│ │ ├── html.worker.js - HTML language worker +│ │ ├── json.worker.js - JSON language worker +│ │ ├── ts.worker.js - TypeScript worker +│ │ └── [language-chunks] - 15 language modules +│ ├── less/ +│ │ └── codeeditor.less - Source styles +│ ├── themes/ +│ │ ├── [34 .tmTheme files] - Legacy TextMate themes +│ │ ├── one-dark-pro.json - Modern JSON theme +│ │ └── winter.json - Modern JSON theme +│ ├── winter.mix.js - Laravel Mix build configuration +│ └── package.json - NPM dependencies (in parent) +├── partials/ +│ └── codeeditor.htm - Widget template +└── CodeEditor.php - FormWidget class +``` + +### Build System + +**Current:** Laravel Mix 6 with Webpack 5 + +#### Build Command +```bash +php artisan mix:compile --package=module-backend.formwidgets.codeeditor -f +``` + +#### Build Configuration + +See `assets/winter.mix.js`: +- Uses `monaco-editor-webpack-plugin` for proper worker splitting +- Polyfills for browser compatibility (> 0.5%, last 2 versions, Firefox ESR) +- Removes inline codicon font CSS (post-build hook) +- Minification and terser optimization + +### Web Workers + +Monaco Editor uses Web Workers for language services: + +| Worker | Size | Purpose | +|--------|------|---------| +| editor.worker.js | 1.6 MB | Base editor operations | +| ts.worker.js | 22 MB | TypeScript/JavaScript IntelliSense | +| css.worker.js | 4.7 MB | CSS validation and completion | +| html.worker.js | 3.3 MB | HTML validation | +| json.worker.js | 2.2 MB | JSON schema validation | + +Workers are loaded asynchronously and run in separate threads for better performance. + +### Theme System + +Themes are loaded directly as static assets via HTTP fetch (no PHP handler required). Theme preference values include the file extension (e.g., `twilight.tmTheme`, `one-dark-pro.json`). + +#### Supported Formats + +**1. TextMate Themes (.tmTheme)** +Legacy XML-based themes. Converted to Monaco format at runtime using `fast-plist` library. + +**2. JSON Themes (.json)** +Modern VS Code theme format. Parsed and mapped to Monaco's theme structure. + +```javascript +// codeeditor.js - Themes loaded via static fetch +async fetchTheme(themeName) { + // Theme name includes extension (e.g., "twilight.tmTheme", "one-dark-pro.json") + // Legacy values without extension default to .tmTheme + const basePath = window.Snowboard.url().asset('/modules/backend/formwidgets/codeeditor/assets/themes/'); + const response = await fetch(`${basePath}${themeName}`); + // Format determined from file extension +} +``` + +## Usage + +### Basic Usage + +```yaml +# fields.yaml +code: + type: codeeditor + size: giant + language: php +``` + +### Available Options + +```yaml +code: + type: codeeditor + # Editor size + size: tiny|small|large|huge|giant # Default: large + + # Programming language + language: php|javascript|css|html|twig|yaml|etc # Default: php + + # Theme (overrides user preference) + theme: twilight|monokai|github|one-dark-pro|etc + + # Line numbers + showGutter: true|false # Default: true + + # Word wrapping + wordWrap: true|false # Default: true + + # Code folding + codeFolding: true|false # Default: true + + # Auto-closing brackets + autoClosing: true|false # Default: true + + # Soft tabs (spaces) + useSoftTabs: true|false # Default: true + tabSize: 2|4|8 # Default: 4 + + # Font size (px) + fontSize: 10|12|14|16|18 # Default: 12 + + # Read-only mode + readOnly: true|false # Default: false + disabled: true|false # Sets readOnly + + # Display options + showInvisibles: true|false # Default: false + highlightActiveLine: true|false # Default: true + displayIndentGuides: true|false # Default: true + showPrintMargin: true|false # Default: false + showMinimap: true|false # Default: true + bracketColors: true|false # Default: false + showColors: true|false # Default: true (CSS color picker) +``` + +### JavaScript API + +```javascript +// Get editor instance +const $editor = $('#my-editor'); +const wrapper = $editor.data('oc.codeeditor'); + +// Access Monaco instance directly +const monacoEditor = wrapper.editor; + +// Get/set content (via wrapper) +const code = wrapper.getValue(); +wrapper.setValue('function test() {}'); + +// Get/set language +wrapper.setLanguage('javascript'); + +// Change theme +wrapper.setTheme('one-dark-pro'); + +// Insert at cursor +wrapper.insert('code here'); + +// Get cursor position +const position = wrapper.getPosition(); // { lineNumber: 1, column: 1 } + +// Fullscreen +wrapper.enterFullscreen(); +wrapper.exitFullscreen(); +``` + +### Migrating from ACE to Monaco API + +Winter CMS has migrated from ACE Editor to Monaco Editor. While backward compatibility is maintained for accessing the editor instance via jQuery `.data('oc.codeEditor')`, direct ACE API calls need to be updated. + +#### Breaking Changes + +**ACE's Session API is Removed:** +- `editor.getSession()` → No longer available +- ACE used a separate "session" object for document operations +- Monaco combines session and model into a single API + +**Position Indexing Changed:** +- ACE uses **0-indexed** positions (rows and columns start at 0) +- Monaco uses **1-indexed** positions (lines and columns start at 1) +- Example: ACE row 5 = Monaco line 6, ACE column 0 = Monaco column 1 + +**Annotations Replaced with Markers:** +- ACE's `setAnnotations()` → Monaco's `monaco.editor.setModelMarkers()` +- Different data structure and API + +#### Quick Migration Guide + +**Getting/Setting Editor Value:** + +```javascript +// ❌ OLD (ACE API - Deprecated) +const editor = $('[data-control=codeeditor]').data('oc.codeEditor').editor; +const value = editor.getSession().getValue(); +editor.getSession().setValue('new value'); + +// ✅ NEW (Recommended - Use Wrapper) +const wrapper = $('[data-control=codeeditor]').data('oc.codeEditor'); +const value = wrapper.getValue(); +wrapper.setValue('new value'); + +// ✅ ALTERNATIVE (Direct Monaco API) +const monacoEditor = wrapper.editor; +const value = monacoEditor.getModel().getValue(); +monacoEditor.getModel().setValue('new value'); +``` + +**Inserting Text at Cursor:** + +```javascript +// ❌ OLD (ACE API) +editor.insert('text'); + +// ✅ NEW (Wrapper provides this method) +wrapper.insert('text'); +``` + +**Working with Annotations/Markers:** + +```javascript +// ❌ OLD (ACE Annotations) +editor.getSession().setAnnotations([ + { row: 5, column: 0, text: 'Warning message', type: 'warning' } +]); + +// Clear annotations +editor.getSession().setAnnotations([]); + +// ✅ NEW (Monaco Wrapper Method - Recommended) +wrapper.setMarkers('sourceId', [ + { + startLineNumber: 6, // ACE row 5 = Monaco line 6 (1-indexed!) + startColumn: 1, // ACE column 0 = Monaco column 1 + endLineNumber: 6, + endColumn: Number.MAX_VALUE, // End of line + message: 'Warning message', + severity: wrapper.monaco.MarkerSeverity.Warning // Info, Warning, or Error + } +]); + +// Clear markers +wrapper.setMarkers('sourceId', []); +``` + +**Getting Cursor Position:** + +```javascript +// ❌ OLD (ACE API) +const cursor = editor.getCursorPosition(); // { row: 5, column: 10 } (0-indexed) + +// ✅ NEW (Wrapper) +const position = wrapper.getPosition(); // { lineNumber: 6, column: 11 } (1-indexed) + +// ✅ ALTERNATIVE (Direct Monaco) +const position = wrapper.editor.getPosition(); +``` + +**Getting Selection:** + +```javascript +// ❌ OLD (ACE API) +const range = editor.getSelection().getRange(); + +// ✅ NEW (Wrapper) +const selection = wrapper.getSelection(); + +// ✅ ALTERNATIVE (Direct Monaco) +const selection = wrapper.editor.getSelection(); +``` + +#### API Comparison Table + +| Operation | ACE API (Deprecated) | Monaco Wrapper (Recommended) | Direct Monaco API | +|-----------|---------------------|------------------------------|-------------------| +| Get value | `editor.getSession().getValue()` | `wrapper.getValue()` | `editor.getModel().getValue()` | +| Set value | `editor.getSession().setValue(v)` | `wrapper.setValue(v)` | `editor.getModel().setValue(v)` | +| Insert text | `editor.insert(text)` | `wrapper.insert(text)` | Complex - use wrapper | +| Get position | `editor.getCursorPosition()` | `wrapper.getPosition()` | `editor.getPosition()` | +| Get selection | `editor.getSelection()` | `wrapper.getSelection()` | `editor.getSelection()` | +| Set annotations | `editor.getSession().setAnnotations()` | `wrapper.setMarkers(id, markers)` | `monaco.editor.setModelMarkers()` | +| Focus editor | `editor.focus()` | `wrapper.focus()` | `editor.focus()` | +| Set language | N/A | `wrapper.setLanguage(lang)` | Complex - use wrapper | + +#### Migration Checklist for Plugin Developers + +If your plugin interacts with the CodeEditor widget, follow these steps: + +1. **Update Editor Instance Access:** + - ✅ Keep: `.data('oc.codeEditor')` - Returns the wrapper + - ⚠️ Avoid: `.data('oc.codeEditor').editor` - Returns raw Monaco (advanced use only) + +2. **Replace ACE Session Methods:** + - ❌ Remove all: `getSession().getValue()` → ✅ Use: `getValue()` + - ❌ Remove all: `getSession().setValue()` → ✅ Use: `setValue()` + +3. **Update Annotations:** + - ❌ Remove: `getSession().setAnnotations(annotations)` + - ✅ Add: `wrapper.setMarkers(sourceId, markers)` + - ⚠️ Remember: Convert 0-indexed row/column to 1-indexed line/column + - Use `wrapper.monaco.MarkerSeverity` for severity constants + +4. **Test Thoroughly:** + - Verify all editor interactions work + - Check that cursor operations use correct indexing + - Ensure markers/warnings display correctly + +#### Available Wrapper Methods + +The Monaco Snowboard editor wrapper provides these convenience methods: + +```javascript +const wrapper = $('[data-control=codeeditor]').data('oc.codeEditor'); + +// Content +wrapper.getValue() // Get editor content +wrapper.setValue(value) // Set editor content +wrapper.insert(text) // Insert at cursor position + +// Position & Selection +wrapper.getPosition() // Get cursor position (1-indexed) +wrapper.getSelection() // Get selection range + +// Markers (Errors/Warnings/Info with squiggly underlines) +wrapper.setMarkers(sourceId, markers) // Set error/warning markers in editor +// Example: wrapper.setMarkers('myPlugin', [{ startLineNumber: 5, startColumn: 1, +// endLineNumber: 5, endColumn: Number.MAX_VALUE, message: 'Warning', +// severity: wrapper.monaco.MarkerSeverity.Warning }]) + +// Decorations (Visual highlights WITHOUT error semantics) +wrapper.setDecorations(sourceId, decorations) // Set visual highlights (no squiggles) +// Example: wrapper.setDecorations('myHighlight', [{ range: new monaco.Range(5, 1, 5, Number.MAX_VALUE), +// options: { isWholeLine: true, className: 'myHighlightClass', +// linesDecorationsClassName: 'myGutterClass' } }]) + +// Configuration +wrapper.setLanguage(lang) // Change syntax highlighting language +wrapper.setTheme(theme) // Change color theme +wrapper.focus() // Focus the editor + +// View +wrapper.enterFullscreen() // Enter fullscreen mode +wrapper.exitFullscreen() // Exit fullscreen mode +wrapper.refresh() // Refresh editor (re-create instance) + +// Direct Access (Advanced) +wrapper.editor // Access Monaco editor instance +wrapper.getEditor() // Same as wrapper.editor +wrapper.getModel() // Get Monaco model +wrapper.monaco // Access Monaco namespace (for constants like MarkerSeverity) +``` + +#### Example: Winter.Builder Plugin Migration + +The Winter.Builder plugin was migrated to use Monaco API. Here's a real example: + +**Before (ACE):** +```javascript +Localization.prototype.copyStringsFromDone = function(data) { + var codeEditor = this.getCodeEditor($masterTabPane); + + // Set value using ACE Session API + codeEditor.getSession().setValue(responseData.strings); + + // Set annotations using ACE + var annotations = []; + for (var i = 0; i < updatedLines.length; i++) { + annotations.push({ + row: updatedLines[i], // 0-indexed + column: 0, + text: 'New String', + type: 'warning' + }); + } + codeEditor.getSession().setAnnotations(annotations); +} +``` + +**After (Monaco):** +```javascript +Localization.prototype.copyStringsFromDone = function(data) { + var wrapper = this.getCodeEditor($masterTabPane); + + // Set value using wrapper method + wrapper.setValue(responseData.strings); + + // Convert to Monaco decorations (visual highlights without error semantics) + var decorations = []; + for (var i = 0; i < updatedLines.length; i++) { + decorations.push({ + range: new wrapper.monaco.Range( + updatedLines[i] + 1, // Convert to 1-indexed! + 1, // Start column + updatedLines[i] + 1, // End line (same line) + Number.MAX_VALUE // End column (end of line) + ), + options: { + isWholeLine: true, + className: 'builder-new-translation-line', // Background highlight + linesDecorationsClassName: 'builder-new-translation-gutter', // Gutter indicator + hoverMessage: { value: 'New string or section' } // Tooltip on hover + } + }); + } + wrapper.setDecorations('builderLocalization', decorations); +} +``` + +## Testing + +### Playwright E2E Tests + +Comprehensive test suite with 55+ tests: + +```bash +# Run all tests +npm run test:e2e + +# Run with UI +npm run test:e2e:ui + +# Run specific test file +npx playwright test fullscreen.spec.js + +# Debug tests +npm run test:e2e:debug +``` + +### Test Coverage + +- **Fullscreen functionality** (6 tests) +- **Theme loading and switching** (9 tests) +- **Language support** (14 tests for all 15 languages) +- **Monaco features** (14 tests: find, replace, folding, multi-cursor, etc.) +- **Preferences persistence** (12 tests) + +See `tests/e2e/README-TESTING.md` for full testing documentation. + +## Resources + +- **Monaco Editor Documentation:** https://microsoft.github.io/monaco-editor/ +- **Monaco Editor GitHub:** https://github.com/microsoft/monaco-editor +- **VS Code Themes:** https://marketplace.visualstudio.com/search?target=VSCode&category=Themes +- **Winter CMS Docs:** https://wintercms.com/docs +- **PR #801:** https://github.com/wintercms/winter/pull/801 +- **Issue #431:** https://github.com/wintercms/winter/issues/431 diff --git a/modules/backend/formwidgets/codeeditor/assets/css/codeeditor.css b/modules/backend/formwidgets/codeeditor/assets/css/codeeditor.css new file mode 100644 index 0000000..20a9699 --- /dev/null +++ b/modules/backend/formwidgets/codeeditor/assets/css/codeeditor.css @@ -0,0 +1 @@ +.field-codeeditor{border:2px solid #d1d6d9;border-radius:3px;display:flex;flex-direction:column;position:relative;width:100%}.field-codeeditor.editor-focus{border:2px solid #d1d6d9}.field-codeeditor .editor-code{border-radius:3px}.field-codeeditor.size-tiny{height:50px}.field-codeeditor.size-small{height:100px}.field-codeeditor.size-large{height:200px}.field-codeeditor.size-huge{height:250px}.field-codeeditor.size-giant{height:350px}.field-codeeditor .editor-container{flex-grow:1;flex-shrink:1;height:100%;width:100%}.field-codeeditor .editor-toolbar{align-items:center;background:rgba(0,0,0,.8);display:flex;flex-direction:row;flex-grow:0;flex-shrink:0;font-size:11px;gap:20px;height:24px;padding:2px 8px;position:relative;z-index:10}.field-codeeditor .editor-toolbar:before{background:rgba(0,0,0,.08);content:"";height:100%;left:0;position:absolute;top:0;width:100%;z-index:9}.field-codeeditor .editor-toolbar.is-dark:before{background:hsla(0,0%,100%,.08)}.field-codeeditor .editor-toolbar>div{z-index:11}.field-codeeditor .editor-toolbar .position{flex-grow:1}.field-codeeditor .editor-toolbar .actions .action{color:inherit;font-size:1.1rem;margin:-2px 0;opacity:.4;padding:0 5px}.field-codeeditor .editor-toolbar .actions .action:hover{opacity:.8}.field-codeeditor .editor-toolbar .actions .action.active{opacity:1}@font-face{font-display:block;font-family:codicon;src:url(../fonts/codicon.ttf?9d44d5a6cc2c9ad0152755e704fa37ba) format("truetype")}.codicon[class*=codicon-]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font:normal normal normal 16px/1 codicon;text-align:center;text-decoration:none;text-rendering:auto;-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none}@keyframes codicon-spin{to{transform:rotate(1turn)}}.codicon-gear.codicon-modifier-spin,.codicon-loading.codicon-modifier-spin,.codicon-sync.codicon-modifier-spin{animation:codicon-spin 1.5s steps(30) infinite}.codicon-modifier-disabled{opacity:.5}.codicon-modifier-hidden{opacity:0}.codicon-loading{animation-duration:1s!important;animation-timing-function:cubic-bezier(.53,.21,.29,.67)!important}.codicon-add:before,.codicon-gist-new:before,.codicon-plus:before,.codicon-repo-create:before{content:"\ea60"}.codicon-light-bulb:before,.codicon-lightbulb:before{content:"\ea61"}.codicon-repo-delete:before,.codicon-repo:before{content:"\ea62"}.codicon-gist-fork:before,.codicon-repo-forked:before{content:"\ea63"}.codicon-git-pull-request-abandoned:before,.codicon-git-pull-request:before{content:"\ea64"}.codicon-keyboard:before,.codicon-record-keys:before{content:"\ea65"}.codicon-tag-add:before,.codicon-tag-remove:before,.codicon-tag:before{content:"\ea66"}.codicon-person-filled:before,.codicon-person-follow:before,.codicon-person-outline:before,.codicon-person:before{content:"\ea67"}.codicon-git-branch-create:before,.codicon-git-branch-delete:before,.codicon-git-branch:before,.codicon-source-control:before{content:"\ea68"}.codicon-mirror-public:before,.codicon-mirror:before{content:"\ea69"}.codicon-star-add:before,.codicon-star-delete:before,.codicon-star-empty:before,.codicon-star:before{content:"\ea6a"}.codicon-comment-add:before,.codicon-comment:before{content:"\ea6b"}.codicon-alert:before,.codicon-warning:before{content:"\ea6c"}.codicon-search-save:before,.codicon-search:before{content:"\ea6d"}.codicon-log-out:before,.codicon-sign-out:before{content:"\ea6e"}.codicon-log-in:before,.codicon-sign-in:before{content:"\ea6f"}.codicon-eye-unwatch:before,.codicon-eye-watch:before,.codicon-eye:before{content:"\ea70"}.codicon-circle-filled:before,.codicon-close-dirty:before,.codicon-debug-breakpoint-disabled:before,.codicon-debug-breakpoint:before,.codicon-debug-hint:before,.codicon-primitive-dot:before,.codicon-terminal-decoration-success:before{content:"\ea71"}.codicon-primitive-square:before{content:"\ea72"}.codicon-edit:before,.codicon-pencil:before{content:"\ea73"}.codicon-info:before,.codicon-issue-opened:before{content:"\ea74"}.codicon-gist-private:before,.codicon-git-fork-private:before,.codicon-lock:before,.codicon-mirror-private:before{content:"\ea75"}.codicon-close:before,.codicon-remove-close:before,.codicon-x:before{content:"\ea76"}.codicon-repo-sync:before,.codicon-sync:before{content:"\ea77"}.codicon-clone:before,.codicon-desktop-download:before{content:"\ea78"}.codicon-beaker:before,.codicon-microscope:before{content:"\ea79"}.codicon-device-desktop:before,.codicon-vm:before{content:"\ea7a"}.codicon-file-text:before,.codicon-file:before{content:"\ea7b"}.codicon-ellipsis:before,.codicon-kebab-horizontal:before,.codicon-more:before{content:"\ea7c"}.codicon-mail-reply:before,.codicon-reply:before{content:"\ea7d"}.codicon-organization-filled:before,.codicon-organization-outline:before,.codicon-organization:before{content:"\ea7e"}.codicon-file-add:before,.codicon-new-file:before{content:"\ea7f"}.codicon-file-directory-create:before,.codicon-new-folder:before{content:"\ea80"}.codicon-trash:before,.codicon-trashcan:before{content:"\ea81"}.codicon-clock:before,.codicon-history:before{content:"\ea82"}.codicon-file-directory:before,.codicon-folder:before,.codicon-symbol-folder:before{content:"\ea83"}.codicon-github:before,.codicon-logo-github:before,.codicon-mark-github:before{content:"\ea84"}.codicon-console:before,.codicon-repl:before,.codicon-terminal:before{content:"\ea85"}.codicon-symbol-event:before,.codicon-zap:before{content:"\ea86"}.codicon-error:before,.codicon-stop:before{content:"\ea87"}.codicon-symbol-variable:before,.codicon-variable:before{content:"\ea88"}.codicon-array:before,.codicon-symbol-array:before{content:"\ea8a"}.codicon-symbol-module:before,.codicon-symbol-namespace:before,.codicon-symbol-object:before,.codicon-symbol-package:before{content:"\ea8b"}.codicon-symbol-constructor:before,.codicon-symbol-function:before,.codicon-symbol-method:before{content:"\ea8c"}.codicon-symbol-boolean:before,.codicon-symbol-null:before{content:"\ea8f"}.codicon-symbol-number:before,.codicon-symbol-numeric:before{content:"\ea90"}.codicon-symbol-struct:before,.codicon-symbol-structure:before{content:"\ea91"}.codicon-symbol-parameter:before,.codicon-symbol-type-parameter:before{content:"\ea92"}.codicon-symbol-key:before,.codicon-symbol-text:before{content:"\ea93"}.codicon-go-to-file:before,.codicon-symbol-reference:before{content:"\ea94"}.codicon-symbol-enum:before,.codicon-symbol-value:before{content:"\ea95"}.codicon-symbol-ruler:before,.codicon-symbol-unit:before{content:"\ea96"}.codicon-activate-breakpoints:before{content:"\ea97"}.codicon-archive:before{content:"\ea98"}.codicon-arrow-both:before{content:"\ea99"}.codicon-arrow-down:before{content:"\ea9a"}.codicon-arrow-left:before{content:"\ea9b"}.codicon-arrow-right:before{content:"\ea9c"}.codicon-arrow-small-down:before{content:"\ea9d"}.codicon-arrow-small-left:before{content:"\ea9e"}.codicon-arrow-small-right:before{content:"\ea9f"}.codicon-arrow-small-up:before{content:"\eaa0"}.codicon-arrow-up:before{content:"\eaa1"}.codicon-bell:before{content:"\eaa2"}.codicon-bold:before{content:"\eaa3"}.codicon-book:before{content:"\eaa4"}.codicon-bookmark:before{content:"\eaa5"}.codicon-debug-breakpoint-conditional-unverified:before{content:"\eaa6"}.codicon-debug-breakpoint-conditional-disabled:before,.codicon-debug-breakpoint-conditional:before{content:"\eaa7"}.codicon-debug-breakpoint-data-unverified:before{content:"\eaa8"}.codicon-debug-breakpoint-data-disabled:before,.codicon-debug-breakpoint-data:before{content:"\eaa9"}.codicon-debug-breakpoint-log-unverified:before{content:"\eaaa"}.codicon-debug-breakpoint-log-disabled:before,.codicon-debug-breakpoint-log:before{content:"\eaab"}.codicon-briefcase:before{content:"\eaac"}.codicon-broadcast:before{content:"\eaad"}.codicon-browser:before{content:"\eaae"}.codicon-bug:before{content:"\eaaf"}.codicon-calendar:before{content:"\eab0"}.codicon-case-sensitive:before{content:"\eab1"}.codicon-check:before{content:"\eab2"}.codicon-checklist:before{content:"\eab3"}.codicon-chevron-down:before{content:"\eab4"}.codicon-chevron-left:before{content:"\eab5"}.codicon-chevron-right:before{content:"\eab6"}.codicon-chevron-up:before{content:"\eab7"}.codicon-chrome-close:before{content:"\eab8"}.codicon-chrome-maximize:before{content:"\eab9"}.codicon-chrome-minimize:before{content:"\eaba"}.codicon-chrome-restore:before{content:"\eabb"}.codicon-circle-outline:before,.codicon-circle:before,.codicon-debug-breakpoint-unverified:before,.codicon-terminal-decoration-incomplete:before{content:"\eabc"}.codicon-circle-slash:before{content:"\eabd"}.codicon-circuit-board:before{content:"\eabe"}.codicon-clear-all:before{content:"\eabf"}.codicon-clippy:before{content:"\eac0"}.codicon-close-all:before{content:"\eac1"}.codicon-cloud-download:before{content:"\eac2"}.codicon-cloud-upload:before{content:"\eac3"}.codicon-code:before{content:"\eac4"}.codicon-collapse-all:before{content:"\eac5"}.codicon-color-mode:before{content:"\eac6"}.codicon-comment-discussion:before{content:"\eac7"}.codicon-credit-card:before{content:"\eac9"}.codicon-dash:before{content:"\eacc"}.codicon-dashboard:before{content:"\eacd"}.codicon-database:before{content:"\eace"}.codicon-debug-continue:before{content:"\eacf"}.codicon-debug-disconnect:before{content:"\ead0"}.codicon-debug-pause:before{content:"\ead1"}.codicon-debug-restart:before{content:"\ead2"}.codicon-debug-start:before{content:"\ead3"}.codicon-debug-step-into:before{content:"\ead4"}.codicon-debug-step-out:before{content:"\ead5"}.codicon-debug-step-over:before{content:"\ead6"}.codicon-debug-stop:before{content:"\ead7"}.codicon-debug:before{content:"\ead8"}.codicon-device-camera-video:before{content:"\ead9"}.codicon-device-camera:before{content:"\eada"}.codicon-device-mobile:before{content:"\eadb"}.codicon-diff-added:before{content:"\eadc"}.codicon-diff-ignored:before{content:"\eadd"}.codicon-diff-modified:before{content:"\eade"}.codicon-diff-removed:before{content:"\eadf"}.codicon-diff-renamed:before{content:"\eae0"}.codicon-diff:before{content:"\eae1"}.codicon-discard:before{content:"\eae2"}.codicon-editor-layout:before{content:"\eae3"}.codicon-empty-window:before{content:"\eae4"}.codicon-exclude:before{content:"\eae5"}.codicon-extensions:before{content:"\eae6"}.codicon-eye-closed:before{content:"\eae7"}.codicon-file-binary:before{content:"\eae8"}.codicon-file-code:before{content:"\eae9"}.codicon-file-media:before{content:"\eaea"}.codicon-file-pdf:before{content:"\eaeb"}.codicon-file-submodule:before{content:"\eaec"}.codicon-file-symlink-directory:before{content:"\eaed"}.codicon-file-symlink-file:before{content:"\eaee"}.codicon-file-zip:before{content:"\eaef"}.codicon-files:before{content:"\eaf0"}.codicon-filter:before{content:"\eaf1"}.codicon-flame:before{content:"\eaf2"}.codicon-fold-down:before{content:"\eaf3"}.codicon-fold-up:before{content:"\eaf4"}.codicon-fold:before{content:"\eaf5"}.codicon-folder-active:before{content:"\eaf6"}.codicon-folder-opened:before{content:"\eaf7"}.codicon-gear:before{content:"\eaf8"}.codicon-gift:before{content:"\eaf9"}.codicon-gist-secret:before{content:"\eafa"}.codicon-gist:before{content:"\eafb"}.codicon-git-commit:before{content:"\eafc"}.codicon-compare-changes:before,.codicon-git-compare:before{content:"\eafd"}.codicon-git-merge:before{content:"\eafe"}.codicon-github-action:before{content:"\eaff"}.codicon-github-alt:before{content:"\eb00"}.codicon-globe:before{content:"\eb01"}.codicon-grabber:before{content:"\eb02"}.codicon-graph:before{content:"\eb03"}.codicon-gripper:before{content:"\eb04"}.codicon-heart:before{content:"\eb05"}.codicon-home:before{content:"\eb06"}.codicon-horizontal-rule:before{content:"\eb07"}.codicon-hubot:before{content:"\eb08"}.codicon-inbox:before{content:"\eb09"}.codicon-issue-reopened:before{content:"\eb0b"}.codicon-issues:before{content:"\eb0c"}.codicon-italic:before{content:"\eb0d"}.codicon-jersey:before{content:"\eb0e"}.codicon-json:before{content:"\eb0f"}.codicon-kebab-vertical:before{content:"\eb10"}.codicon-key:before{content:"\eb11"}.codicon-law:before{content:"\eb12"}.codicon-lightbulb-autofix:before{content:"\eb13"}.codicon-link-external:before{content:"\eb14"}.codicon-link:before{content:"\eb15"}.codicon-list-ordered:before{content:"\eb16"}.codicon-list-unordered:before{content:"\eb17"}.codicon-live-share:before{content:"\eb18"}.codicon-loading:before{content:"\eb19"}.codicon-location:before{content:"\eb1a"}.codicon-mail-read:before{content:"\eb1b"}.codicon-mail:before{content:"\eb1c"}.codicon-markdown:before{content:"\eb1d"}.codicon-megaphone:before{content:"\eb1e"}.codicon-mention:before{content:"\eb1f"}.codicon-milestone:before{content:"\eb20"}.codicon-mortar-board:before{content:"\eb21"}.codicon-move:before{content:"\eb22"}.codicon-multiple-windows:before{content:"\eb23"}.codicon-mute:before{content:"\eb24"}.codicon-no-newline:before{content:"\eb25"}.codicon-note:before{content:"\eb26"}.codicon-octoface:before{content:"\eb27"}.codicon-open-preview:before{content:"\eb28"}.codicon-package:before{content:"\eb29"}.codicon-paintcan:before{content:"\eb2a"}.codicon-pin:before{content:"\eb2b"}.codicon-play:before,.codicon-run:before{content:"\eb2c"}.codicon-plug:before{content:"\eb2d"}.codicon-preserve-case:before{content:"\eb2e"}.codicon-preview:before{content:"\eb2f"}.codicon-project:before{content:"\eb30"}.codicon-pulse:before{content:"\eb31"}.codicon-question:before{content:"\eb32"}.codicon-quote:before{content:"\eb33"}.codicon-radio-tower:before{content:"\eb34"}.codicon-reactions:before{content:"\eb35"}.codicon-references:before{content:"\eb36"}.codicon-refresh:before{content:"\eb37"}.codicon-regex:before{content:"\eb38"}.codicon-remote-explorer:before{content:"\eb39"}.codicon-remote:before{content:"\eb3a"}.codicon-remove:before{content:"\eb3b"}.codicon-replace-all:before{content:"\eb3c"}.codicon-replace:before{content:"\eb3d"}.codicon-repo-clone:before{content:"\eb3e"}.codicon-repo-force-push:before{content:"\eb3f"}.codicon-repo-pull:before{content:"\eb40"}.codicon-repo-push:before{content:"\eb41"}.codicon-report:before{content:"\eb42"}.codicon-request-changes:before{content:"\eb43"}.codicon-rocket:before{content:"\eb44"}.codicon-root-folder-opened:before{content:"\eb45"}.codicon-root-folder:before{content:"\eb46"}.codicon-rss:before{content:"\eb47"}.codicon-ruby:before{content:"\eb48"}.codicon-save-all:before{content:"\eb49"}.codicon-save-as:before{content:"\eb4a"}.codicon-save:before{content:"\eb4b"}.codicon-screen-full:before{content:"\eb4c"}.codicon-screen-normal:before{content:"\eb4d"}.codicon-search-stop:before{content:"\eb4e"}.codicon-server:before{content:"\eb50"}.codicon-settings-gear:before{content:"\eb51"}.codicon-settings:before{content:"\eb52"}.codicon-shield:before{content:"\eb53"}.codicon-smiley:before{content:"\eb54"}.codicon-sort-precedence:before{content:"\eb55"}.codicon-split-horizontal:before{content:"\eb56"}.codicon-split-vertical:before{content:"\eb57"}.codicon-squirrel:before{content:"\eb58"}.codicon-star-full:before{content:"\eb59"}.codicon-star-half:before{content:"\eb5a"}.codicon-symbol-class:before{content:"\eb5b"}.codicon-symbol-color:before{content:"\eb5c"}.codicon-symbol-constant:before{content:"\eb5d"}.codicon-symbol-enum-member:before{content:"\eb5e"}.codicon-symbol-field:before{content:"\eb5f"}.codicon-symbol-file:before{content:"\eb60"}.codicon-symbol-interface:before{content:"\eb61"}.codicon-symbol-keyword:before{content:"\eb62"}.codicon-symbol-misc:before{content:"\eb63"}.codicon-symbol-operator:before{content:"\eb64"}.codicon-symbol-property:before,.codicon-wrench-subaction:before,.codicon-wrench:before{content:"\eb65"}.codicon-symbol-snippet:before{content:"\eb66"}.codicon-tasklist:before{content:"\eb67"}.codicon-telescope:before{content:"\eb68"}.codicon-text-size:before{content:"\eb69"}.codicon-three-bars:before{content:"\eb6a"}.codicon-thumbsdown:before{content:"\eb6b"}.codicon-thumbsup:before{content:"\eb6c"}.codicon-tools:before{content:"\eb6d"}.codicon-triangle-down:before{content:"\eb6e"}.codicon-triangle-left:before{content:"\eb6f"}.codicon-triangle-right:before{content:"\eb70"}.codicon-triangle-up:before{content:"\eb71"}.codicon-twitter:before{content:"\eb72"}.codicon-unfold:before{content:"\eb73"}.codicon-unlock:before{content:"\eb74"}.codicon-unmute:before{content:"\eb75"}.codicon-unverified:before{content:"\eb76"}.codicon-verified:before{content:"\eb77"}.codicon-versions:before{content:"\eb78"}.codicon-vm-active:before{content:"\eb79"}.codicon-vm-outline:before{content:"\eb7a"}.codicon-vm-running:before{content:"\eb7b"}.codicon-watch:before{content:"\eb7c"}.codicon-whitespace:before{content:"\eb7d"}.codicon-whole-word:before{content:"\eb7e"}.codicon-window:before{content:"\eb7f"}.codicon-word-wrap:before{content:"\eb80"}.codicon-zoom-in:before{content:"\eb81"}.codicon-zoom-out:before{content:"\eb82"}.codicon-list-filter:before{content:"\eb83"}.codicon-list-flat:before{content:"\eb84"}.codicon-list-selection:before,.codicon-selection:before{content:"\eb85"}.codicon-list-tree:before{content:"\eb86"}.codicon-debug-breakpoint-function-unverified:before{content:"\eb87"}.codicon-debug-breakpoint-function-disabled:before,.codicon-debug-breakpoint-function:before{content:"\eb88"}.codicon-debug-stackframe-active:before{content:"\eb89"}.codicon-circle-small-filled:before,.codicon-debug-stackframe-dot:before,.codicon-terminal-decoration-mark:before{content:"\eb8a"}.codicon-debug-stackframe-focused:before,.codicon-debug-stackframe:before{content:"\eb8b"}.codicon-debug-breakpoint-unsupported:before{content:"\eb8c"}.codicon-symbol-string:before{content:"\eb8d"}.codicon-debug-reverse-continue:before{content:"\eb8e"}.codicon-debug-step-back:before{content:"\eb8f"}.codicon-debug-restart-frame:before{content:"\eb90"}.codicon-debug-alt:before{content:"\eb91"}.codicon-call-incoming:before{content:"\eb92"}.codicon-call-outgoing:before{content:"\eb93"}.codicon-menu:before{content:"\eb94"}.codicon-expand-all:before{content:"\eb95"}.codicon-feedback:before{content:"\eb96"}.codicon-group-by-ref-type:before{content:"\eb97"}.codicon-ungroup-by-ref-type:before{content:"\eb98"}.codicon-account:before{content:"\eb99"}.codicon-bell-dot:before{content:"\eb9a"}.codicon-debug-console:before{content:"\eb9b"}.codicon-library:before{content:"\eb9c"}.codicon-output:before{content:"\eb9d"}.codicon-run-all:before{content:"\eb9e"}.codicon-sync-ignored:before{content:"\eb9f"}.codicon-pinned:before{content:"\eba0"}.codicon-github-inverted:before{content:"\eba1"}.codicon-server-process:before{content:"\eba2"}.codicon-server-environment:before{content:"\eba3"}.codicon-issue-closed:before,.codicon-pass:before{content:"\eba4"}.codicon-stop-circle:before{content:"\eba5"}.codicon-play-circle:before{content:"\eba6"}.codicon-record:before{content:"\eba7"}.codicon-debug-alt-small:before{content:"\eba8"}.codicon-vm-connect:before{content:"\eba9"}.codicon-cloud:before{content:"\ebaa"}.codicon-merge:before{content:"\ebab"}.codicon-export:before{content:"\ebac"}.codicon-graph-left:before{content:"\ebad"}.codicon-magnet:before{content:"\ebae"}.codicon-notebook:before{content:"\ebaf"}.codicon-redo:before{content:"\ebb0"}.codicon-check-all:before{content:"\ebb1"}.codicon-pinned-dirty:before{content:"\ebb2"}.codicon-pass-filled:before{content:"\ebb3"}.codicon-circle-large-filled:before{content:"\ebb4"}.codicon-circle-large-outline:before,.codicon-circle-large:before{content:"\ebb5"}.codicon-combine:before,.codicon-gather:before{content:"\ebb6"}.codicon-table:before{content:"\ebb7"}.codicon-variable-group:before{content:"\ebb8"}.codicon-type-hierarchy:before{content:"\ebb9"}.codicon-type-hierarchy-sub:before{content:"\ebba"}.codicon-type-hierarchy-super:before{content:"\ebbb"}.codicon-git-pull-request-create:before{content:"\ebbc"}.codicon-run-above:before{content:"\ebbd"}.codicon-run-below:before{content:"\ebbe"}.codicon-notebook-template:before{content:"\ebbf"}.codicon-debug-rerun:before{content:"\ebc0"}.codicon-workspace-trusted:before{content:"\ebc1"}.codicon-workspace-untrusted:before{content:"\ebc2"}.codicon-workspace-unknown:before{content:"\ebc3"}.codicon-terminal-cmd:before{content:"\ebc4"}.codicon-terminal-debian:before{content:"\ebc5"}.codicon-terminal-linux:before{content:"\ebc6"}.codicon-terminal-powershell:before{content:"\ebc7"}.codicon-terminal-tmux:before{content:"\ebc8"}.codicon-terminal-ubuntu:before{content:"\ebc9"}.codicon-terminal-bash:before{content:"\ebca"}.codicon-arrow-swap:before{content:"\ebcb"}.codicon-copy:before{content:"\ebcc"}.codicon-person-add:before{content:"\ebcd"}.codicon-filter-filled:before{content:"\ebce"}.codicon-wand:before{content:"\ebcf"}.codicon-debug-line-by-line:before{content:"\ebd0"}.codicon-inspect:before{content:"\ebd1"}.codicon-layers:before{content:"\ebd2"}.codicon-layers-dot:before{content:"\ebd3"}.codicon-layers-active:before{content:"\ebd4"}.codicon-compass:before{content:"\ebd5"}.codicon-compass-dot:before{content:"\ebd6"}.codicon-compass-active:before{content:"\ebd7"}.codicon-azure:before{content:"\ebd8"}.codicon-issue-draft:before{content:"\ebd9"}.codicon-git-pull-request-closed:before{content:"\ebda"}.codicon-git-pull-request-draft:before{content:"\ebdb"}.codicon-debug-all:before{content:"\ebdc"}.codicon-debug-coverage:before{content:"\ebdd"}.codicon-run-errors:before{content:"\ebde"}.codicon-folder-library:before{content:"\ebdf"}.codicon-debug-continue-small:before{content:"\ebe0"}.codicon-beaker-stop:before{content:"\ebe1"}.codicon-graph-line:before{content:"\ebe2"}.codicon-graph-scatter:before{content:"\ebe3"}.codicon-pie-chart:before{content:"\ebe4"}.codicon-bracket:before{content:"\eb0f"}.codicon-bracket-dot:before{content:"\ebe5"}.codicon-bracket-error:before{content:"\ebe6"}.codicon-lock-small:before{content:"\ebe7"}.codicon-azure-devops:before{content:"\ebe8"}.codicon-verified-filled:before{content:"\ebe9"}.codicon-newline:before{content:"\ebea"}.codicon-layout:before{content:"\ebeb"}.codicon-layout-activitybar-left:before{content:"\ebec"}.codicon-layout-activitybar-right:before{content:"\ebed"}.codicon-layout-panel-left:before{content:"\ebee"}.codicon-layout-panel-center:before{content:"\ebef"}.codicon-layout-panel-justify:before{content:"\ebf0"}.codicon-layout-panel-right:before{content:"\ebf1"}.codicon-layout-panel:before{content:"\ebf2"}.codicon-layout-sidebar-left:before{content:"\ebf3"}.codicon-layout-sidebar-right:before{content:"\ebf4"}.codicon-layout-statusbar:before{content:"\ebf5"}.codicon-layout-menubar:before{content:"\ebf6"}.codicon-layout-centered:before{content:"\ebf7"}.codicon-target:before{content:"\ebf8"}.codicon-indent:before{content:"\ebf9"}.codicon-record-small:before{content:"\ebfa"}.codicon-error-small:before,.codicon-terminal-decoration-error:before{content:"\ebfb"}.codicon-arrow-circle-down:before{content:"\ebfc"}.codicon-arrow-circle-left:before{content:"\ebfd"}.codicon-arrow-circle-right:before{content:"\ebfe"}.codicon-arrow-circle-up:before{content:"\ebff"}.codicon-layout-sidebar-right-off:before{content:"\ec00"}.codicon-layout-panel-off:before{content:"\ec01"}.codicon-layout-sidebar-left-off:before{content:"\ec02"}.codicon-blank:before{content:"\ec03"}.codicon-heart-filled:before{content:"\ec04"}.codicon-map:before{content:"\ec05"}.codicon-map-filled:before{content:"\ec06"}.codicon-circle-small:before{content:"\ec07"}.codicon-bell-slash:before{content:"\ec08"}.codicon-bell-slash-dot:before{content:"\ec09"}.codicon-comment-unresolved:before{content:"\ec0a"}.codicon-git-pull-request-go-to-changes:before{content:"\ec0b"}.codicon-git-pull-request-new-changes:before{content:"\ec0c"}.codicon-search-fuzzy:before{content:"\ec0d"}.codicon-comment-draft:before{content:"\ec0e"} diff --git a/modules/backend/formwidgets/codeeditor/assets/fonts/codicon.ttf b/modules/backend/formwidgets/codeeditor/assets/fonts/codicon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6d9ce31e08f9fa5f1a974a865f72ba81a4e3c58f GIT binary patch literal 72860 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.hasOwnProperty("allowMultiline")||"boolean"==typeof e.allowMultiline)&&((!e.hasOwnProperty("label")||"string"==typeof e.label)&&(!e.hasOwnProperty("validate")||"function"==typeof e.validate)))))))})}}}};const o=function(e,t,i){return"The value for the "+t+" should be of type "+(Array.isArray(e)?e.join(" | "):e)+". "+(i||"")};var s=function(){const e=function(e,t){return"object"!=typeof e||null===e?this.freeze?Object.freeze(e):e:e instanceof Date?this.freeze?Object.freeze(new Date(e)):new Date(e):t.call(this,e)},t=function(t,i){const n=Object.keys(t),o=new Array(n.length);for(let s=0;s=this[i])&&(e-=this[i]),t}.bind(this),{})},t=Object.create(Object.defineProperties({},{withProto:{value:1},freeze:{value:2}}));for(let i=0;i<=3;i++)e.call(t,i);return t}(),o={withProto:i.bind(n[1]),andFreeze:i.bind(n[2]),withProtoAndFreeze:i.bind(n[3])},s=i.bind(n[0]);for(let e in o)Object.defineProperty(s,e,{enumerable:!1,writable:!1,configurable:!1,value:o[e]});return s}();var r={SINGLE_LINE_HIGHLIGHT_CLASS:"editableArea--single-line",MULTI_LINE_HIGHLIGHT_CLASS:"editableArea--multi-line"};var a=function(e,t,i){const n=i.Range,o=function(e,t){const i=e.range,n=t.range;if(i[0]n)throw new Error("Provided Start Line("+e+") is out of bounds. Max Lines in content is "+n);o[t]=e;break;case 1:{let n=e;const s=o[0],r=i[s-1].length;if(n<0){if(n=r-Math.abs(n),n<0)throw new Error("Provided Start Column("+e+") is out of bounds. Max Column in line "+s+" is "+r)}else if(n>r+1)throw new Error("Provided Start Column("+e+") is out of bounds. Max Column in line "+s+" is "+r);o[t]=n}break;case 2:{let i=e;if(i<0){if(i=n-Math.abs(e),i<0)throw new Error("Provided End Line("+e+") is out of bounds. Max Lines in content is "+n);in)throw new Error("Provided End Line("+e+") is out of bounds. Max Lines in content is "+n);o[t]=i}break;case 3:{let n=e;const s=o[2],r=i[s-1].length;if(n<0){if(n=r-Math.abs(n),n<0)throw new Error("Provided End Column("+e+") is out of bounds. Max Column in line "+s+" is "+r)}else if(n>r+1)throw new Error("Provided Start Column("+e+") is out of bounds. Max Column in line "+s+" is "+r);o[t]=n}}}),o}(e.range,i),s=o[0],r=o[1],a=o[2],l=o[3];e._originalRange=o.slice(),e.range=new n(s,r,a,l),e.index=t,e.allowMultiline||(e.allowMultiline=n.spansMultipleLines(e.range)),e.label||(e.label=`[${s},${r} -> ${a}${l}]`)})},h=function(){return a.reduce(function(e,t){return e[t.label]={allowMultiline:t.allowMultiline||!1,index:t.index,range:Object.assign({},t.range),originalRange:t._originalRange.slice()},e},{})},d=function(){return Promise.resolve().then(function(){e.editInRestrictedArea=!0,e.undo(),e.editInRestrictedArea=!1,e._hasHighlight&&e._oldDecorationsSource&&(e.deltaDecorations(e._oldDecorations,e._oldDecorationsSource),e._oldDecorationsSource.forEach(function(t){t.range=e.getDecorationRange(t.id)}))})},c=function(t,i,n,o,s,r){let l=i.endLineNumber,h=i.endColumn;t.prevRange=i,t.range=i.setEndPosition(n,o);const d=a.length;let c=s.length;const u=o-h,g=n-l,p=e._currentCursorPositions||[],m=p.length;if(c!==m&&(s=s.filter(function(e){const t=e.range;for(let e=0;el)break;i.startColumn+=u,i.endColumn+=u,t.range=i}for(let e=r+1;el){rangeMap[i.toString()]=o;break}i.startColumn+=u,i.endColumn+=u,t.range=i,rangeMap[i.toString()]=o}}},u=function(){console.debug("handler for unhandled promise rejection")},g=function(e){for(let t in e){const i=e[t];i.range=i.prevRange}},p=function(e,t){return!e.allowMultiline&&t.includes("\n")},m=function(e,t,i){return e.validate&&!e.validate(t,i,e.lastInfo)},f={_isRestrictedModel:!0,_isRestrictedValueValid:!0,_editableRangeChangeListener:[],_isCursorAtCheckPoint:function(t){t.some(function(t){const i=t.lineNumber,n=t.column,o=a.length;for(let t=0;t","ranges","Please refer constrained editor documentation for proper structure"))}throw new Error(o("ICodeEditor","editorInstance","This type interface can be found in monaco editor documentation"))},removeRestrictionsIn:function(e){if(r(e)){const t=e.uri.toString(),n=i[t];return n?n.disposeRestrictions():(console.warn("Current Model is not a restricted Model"),!1)}throw new Error(o("ICodeEditor","editorInstance","This type interface can be found in monaco editor documentation"))},disposeConstrainer:function(){if(h._editorInstance){const e=h._editorInstance.getDomNode();e&&e.removeEventListener("keydown",h._listener),h._onChangeModelDisposable&&h._onChangeModelDisposable.dispose(),delete h._listener,delete h._editorInstance._isInDevMode,delete h._editorInstance._devModeAction,delete h._editorInstance,delete h._onChangeModelDisposable;for(let e in i)delete i[e];return!0}return!1},toggleDevMode:function(){h._editorInstance._isInDevMode?(h._editorInstance._isInDevMode=!1,h._editorInstance._devModeAction.dispose(),delete h._editorInstance._devModeAction):(h._editorInstance._isInDevMode=!0,h._editorInstance._devModeAction=h._editorInstance.addAction({id:"showRange",label:"Show Range in console",contextMenuGroupId:"navigation",contextMenuOrder:1.5,run:function(e){const t=e.getSelections().reduce(function(e,{startLineNumber:t,endLineNumber:i,startColumn:n,endColumn:o}){return e.push("range : "+JSON.stringify([t,n,i,o])),e},[]).join("\n");console.log("Selected Ranges : \n"+JSON.stringify(t,null,2))}}))}};for(let e in c)Object.defineProperty(d,e,{enumerable:!1,writable:!1,configurable:!1,value:c[e]});return Object.freeze(d)},h=i(9416),d=i(9201),c=i(2742),u=i(6362);function g(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),i.push.apply(i,n)}return i}function p(e){for(var t=1;t{class t extends e.PluginBase{construct(e){this.element=e,this.elementObserver=null,this.config=this.snowboard.dataConfig(this,e),this.events=this.snowboard["backend.ui.eventHandler"](this,"backend.formwidget.codeeditor"),this.alias=this.config.get("alias"),this.monaco=d,this.model=null,this.resizeListener=!1,this.visibilityListener=!1,this.clickListener=!1,this.clickStartedInEditor=!1,this.editor=null,this.container=this.element.querySelector(".editor-container"),this.valueBag=this.element.querySelector("[data-value-bag]"),this.statusBar=this.element.querySelector("[data-status-bar]"),this.statusBar&&(this.language=this.statusBar.querySelector(".language"),this.position=this.statusBar.querySelector(".position")),this.fullscreen=!1,this.cachedThemes={},this.resizeThrottle=null,this.savedState=null,this.dropHandlers=null,this.callbacks={fullScreenChange:()=>this.onFullScreenChange(),resize:()=>{clearTimeout(this.resizeThrottle),this.resizeThrottle=setTimeout(()=>this.onResize(),80)},click:e=>this.checkEditorClick(e),visibilityChange:()=>this.onVisibilityChange()},this.keybindings=[],this.customLineNumbering=null,this.disposables=[],this.observeElement()}defaults(){return{alias:null,autoCloseTags:!0,bracketColors:!1,codeFolding:!0,displayIndentGuides:!0,fontSize:12,highlightActiveLine:!0,language:"html",margin:0,readOnly:!1,semanticHighlighting:!0,selectionHighlighting:!0,showColors:!0,showGutter:!0,showInvisibles:!1,showMinimap:!0,showOccurrences:!0,showPrintMargin:!1,showScrollbar:!0,showSelectionOccurrences:!0,showSuggestions:!0,tabSize:4,theme:"vs-dark",useSoftTabs:!0,wordWrap:!0}}destruct(){this.dispose(),this.savedState&&this.savedState.model&&(this.savedState.model.dispose(),this.savedState=null),this.elementObserver&&this.elementObserver.disconnect(),this.visibilityListener&&(document.removeEventListener("visibilitychange",this.callbacks.visibilityChange),this.visibilityListener=!1),this.clickListener&&(document.removeEventListener("click",this.callbacks.click,{capture:!0}),this.clickListener=!1)}dispose(){this.editor&&(this.savedState={view:this.editor.saveViewState(),model:this.model}),this.disposables.length>0&&(this.disposables.forEach(e=>{e.dispose()}),this.disposables=[]),this.resizeListener&&(window.removeEventListener("resize",this.callbacks.resize),this.resizeListener=!1),this.dropHandlers&&(this.dropHandlers.editorDom.removeEventListener("dragover",this.dropHandlers.onDragOver),this.dropHandlers.editorDom.removeEventListener("drop",this.dropHandlers.onDrop),this.dropHandlers=null),this.model=null,this.editor&&(this.editor.dispose(),this.editor=null),this.events.fire("dispose",this)}observeElement(){this.elementObserver=new IntersectionObserver(e=>this.onObserve(e)),this.elementObserver.observe(this.element)}onObserve(e){e[0].isIntersecting?this.createEditor():this.dispose()}createEditor(){if(this.editor)return;this.container.style.height=null,this.container.style.height=Math.round(Number(getComputedStyle(this.container).height.replace("px","")))+"px";const e=this.getConfigOptions();this.savedState&&this.savedState.model?e.model=this.savedState.model:e.model=d.editor.createModel(this.valueBag.value,this.config.get("language")),this.editor=d.editor.create(this.element.querySelector(".editor-container"),e),window.jQuery&&window.jQuery(this.element).data("oc.codeEditor",this),this.attachListeners(),this.attachDropHandler(),this.loadTheme(),this.updateLanguage(),this.enableStatusBarActions(),this.registerKeyBindings(),this.registerDefaultKeyBindings(),this.savedState&&(this.savedState.view&&this.editor.restoreViewState(this.savedState.view),this.savedState=null),this.events.fire("create",this,this.editor)}refresh(){this.dispose(),window.requestAnimationFrame(()=>this.createEditor())}getConfigOptions(){const e={automaticLayout:!0,"bracketPairColorization.enabled":this.config.get("bracketColors"),colorDecorators:this.config.get("showColors"),detectIndentation:!1,folding:this.config.get("codeFolding"),fontSize:this.config.get("fontSize"),guides:{bracketPairs:!!this.config.get("bracketColors")&&"active",bracketPairsHorizontal:!!this.config.get("bracketColors")&&"active",indentation:this.config.get("displayIndentGuides")},insertSpaces:this.config.get("useSoftTabs"),language:this.config.get("language"),lineNumbers:this.customLineNumbering?this.customLineNumbering:this.config.get("showGutter")?"on":"off",minimap:{enabled:this.config.get("showMinimap")},occurrencesHighlight:this.config.get("showOccurrences")?"singleFile":"off",quickSuggestions:this.config.get("showSuggestions"),renderLineHighlight:this.getLineHighlightOption(),renderWhitespace:this.config.get("showInvisibles")?"all":"selection",scrollbar:{horizontalHasArrows:this.config.get("showScrollbar"),horizontalScrollbarSize:this.config.get("showScrollbar")?10:0,horizontalSliderSize:this.config.get("showScrollbar")?10:6,verticalHasArrows:this.config.get("showScrollbar"),verticalScrollbarSize:this.config.get("showScrollbar")?10:0,verticalSliderSize:this.config.get("showScrollbar")?10:6,useShadows:this.config.get("showScrollbar")},scrollBeyondLastLine:!1,selectionHighlight:this.config.get("showSelectionOccurrences"),"semanticHighlighting.enabled":!!this.config.get("semanticHighlighting")&&"configuredByTheme",tabSize:this.config.get("tabSize"),theme:this.config.get("themeVs")};return"fluid"===this.config.get("wordWrap")?e.wordWrap="on":"number"==typeof this.config.get("wordWrap")?(e.wordWrap="bounded",e.wordWrapColumn=this.config.get("wordWrap")):e.wordWrap="off",this.config.get("showPrintMargin")&&(e.rulers=[80]),e}getLineHighlightOption(){return this.config.get("highlightActiveLine")?this.config.get("showGutter")?"all":"line":"none"}getEditor(){return this.editor}getModel(){return this.model}attachListeners(){this.model=this.editor.getModel(),this.disposables.push(this.model.onDidChangeContent(()=>{this.valueBag.value=this.model.getValue(),this.events.fire("input",this.valueBag.value,this,this.editor)})),this.disposables.push(this.editor.onDidChangeCursorPosition(e=>{this.updatePosition(e.position),this.events.fire("position",e)})),this.disposables.push(this.editor.onDidChangeCursorSelection(e=>{this.events.fire("selection",e)})),this.disposables.push(this.editor.onMouseDown(()=>{this.clickStartedInEditor=!0})),this.disposables.push(this.editor.onMouseUp(()=>{setTimeout(()=>{this.clickStartedInEditor=!1},20)})),this.clickListener||(document.addEventListener("click",this.callbacks.click,{capture:!0}),this.clickListener=!0),window.addEventListener("resize",this.callbacks.resize),this.resizeListener=!0,this.visibilityListener||(document.addEventListener("visibilitychange",this.callbacks.visibilityChange),this.visibilityListener=!0)}attachDropHandler(){const e=this.editor.getDomNode();if(!e)return;const t=e=>{if(e.dataTransfer&&e.dataTransfer.types.includes("text/plain")){e.preventDefault(),e.dataTransfer.dropEffect="copy";const t=this.editor.getTargetAtClientPoint(e.clientX,e.clientY);t&&t.position&&this.editor.setPosition(t.position)}},i=e=>{const t=e.dataTransfer?.getData("text/plain");if(!t)return;e.preventDefault(),e.stopPropagation();const i=this.editor.getTargetAtClientPoint(e.clientX,e.clientY);i&&i.position&&(this.editor.setPosition(i.position),this.editor.focus(),this.insert(t))};e.addEventListener("dragover",t),e.addEventListener("drop",i),this.dropHandlers={editorDom:e,onDragOver:t,onDrop:i}}setConfig(e,t){this.config.set(e,t),this.editor&&(["showPrintMargin"].includes(e)?this.refresh():this.editor.updateOptions(this.getConfigOptions()))}getValue(){return this.model.getValue()}setValue(e){this.model.setValue(e)}focus(){this.editor.focus()}setMarkers(e,t){d.editor.setModelMarkers(this.editor.getModel(),e,t)}setDecorations(e,t){this._decorationIds||(this._decorationIds={});const i=this._decorationIds[e]||[],n=this.editor.deltaDecorations(i,t);this._decorationIds[e]=n}getPosition(){return this.editor.getPosition()}getSelection(){return this.editor.getSelection()}getSafeSelection(){const e=this.editor.getSelection();return new d.Selection(e.startLineNumber,e.startColumn,e.endLineNumber,e.endColumn)}getSelections(){return this.editor.getSelections()}insert(e){return this.model.pushEditOperations(this.editor.getSelections(),[{forceMoveMarkers:!0,range:this.editor.getSelection(),text:e}])}wrap(e,t){return this.editor.getSelection().isEmpty()?this.insert(`${e}${t}`):this.model.pushEditOperations(this.editor.getSelections(),[{forceMoveMarkers:!0,range:this.editor.getSelection(),text:`${e}${this.editor.getModel().getValueInRange(this.editor.getSelection())}${t}`}],()=>[this.editor.getSelection()])}unwrap(e,t){if(this.editor.getSelection().isEmpty())return this.editor.getSelection();let i=this.editor.getModel().getValueInRange(this.editor.getSelection());return i.startsWith(e)&&(i=i.substring(e.length)),i.endsWith(t)&&(i=i.substring(0,i.length-t.length)),this.model.pushEditOperations(this.editor.getSelections(),[{forceMoveMarkers:!0,range:this.editor.getSelection(),text:i}],()=>[this.editor.getSelection()])}find(e,t){return this.findAll(e,t)[0]||null}findAll(e,t){const i=e instanceof RegExp?e.source:e;return this.model.findMatches(i,!0,e instanceof RegExp,t||!1,null,!0,1)}replace(e,t,i,n=!0){if("string"!=typeof e&&!(e instanceof RegExp))return this.model.pushEditOperations([d.Selection.fromRange(e)],[{forceMoveMarkers:!1,range:new d.Range(e.startLineNumber,e.startColumn,e.endLineNumber,e.endColumn),text:n?this.alignText(t,e.startColumn):t}]);const o=this.find(e,i);return o?this.model.pushEditOperations(this.editor.getSelections(),[{forceMoveMarkers:!1,range:new d.Range(o.range.startLineNumber,o.range.startColumn,o.range.endLineNumber,o.range.endColumn),text:n?this.alignText(t,e.startColumn):t}]):void 0}alignText(e,t){return e.split("\n").map((e,i)=>0===i?e:`${" ".repeat(t-1)}${e}`).join("\n")}setLanguage(e){d.editor.setModelLanguage(this.model,e),this.setConfig("language",e),this.updateLanguage()}updateLanguage(){this.language&&(this.language.innerText=this.getConfigOptions().language.toUpperCase())}loadTheme(e){const t=e||this.config.get("theme"),i=t.replace(/[^a-z0-9]+/g,"");return"vs"===t?(d.editor.setTheme("vs"),this.setConfig("theme","vs"),this.setConfig("themeVs","vs"),void this.updateStatusBarColor({colors:{"editor.foreground":"#000000","editor.background":"#ffffff"}})):"vs-dark"===t?(d.editor.setTheme("vs-dark"),this.setConfig("theme","vs-dark"),this.setConfig("themeVs","vs-dark"),void this.updateStatusBarColor({colors:{"editor.foreground":"#d4d4d4","editor.background":"#1E1E1E"}})):void(this.cachedThemes[t]?(d.editor.setTheme(i),this.setConfig("theme",t),this.setConfig("themeVs",i),this.updateStatusBarColor(this.cachedThemes[t])):this.fetchTheme(t).then(({format:e,data:n})=>{let o;o="json"===e?this.convertJsonTheme(n):this.convertTmTheme(n),this.cachedThemes[t]=o,d.editor.defineTheme(i,o),d.editor.setTheme(i),this.setConfig("theme",t),this.setConfig("themeVs",i),this.updateStatusBarColor(o)}).catch(()=>{}))}async fetchTheme(e){let t=e;e.includes(".")||(t=`${e}.tmTheme`);const i=t.endsWith(".json")?"json":"tmTheme",n=`${window.Snowboard.url().asset("/modules/backend/formwidgets/codeeditor/assets/themes/")}${t}`,o=await fetch(n);if(!o.ok)throw new Error(`Theme "${e}" not found`);return{format:i,data:await o.text()}}convertJsonTheme(e){const t=JSON.parse(e),i={base:"light"===t.type?"vs":"vs-dark",inherit:!0,rules:[],colors:{}};return t.tokenColors&&Array.isArray(t.tokenColors)&&t.tokenColors.forEach(e=>{if(!e.scope)return;(Array.isArray(e.scope)?e.scope:e.scope.split(",").map(e=>e.trim())).forEach(t=>{const n={token:t};e.settings&&(e.settings.foreground&&(n.foreground=e.settings.foreground.replace("#","")),e.settings.background&&(n.background=e.settings.background.replace("#","")),e.settings.fontStyle&&(n.fontStyle=e.settings.fontStyle)),i.rules.push(n)})}),t.colors&&Object.keys(t.colors).forEach(e=>{i.colors[e]=t.colors[e]}),i}convertTmTheme(e){const t=(0,h.qg)(e),i=this.mapGlobalColors(t.settings.shift().settings);t.gutterSettings&&(t.gutterSettings.background&&(i["editorGutter.background"]=this.parseColor(t.gutterSettings.background)),t.gutterSettings.foreground&&(i["editorLineNumber.foreground"]=this.parseColor(t.gutterSettings.foreground)));const n=[{token:"",foreground:i["editor.foreground"].replace(/^#/,""),background:i["editor.background"].replace(/^#/,"")}];return t.settings.forEach(e=>{if(!e.scope)return;const t={token:e.scope};e.settings.foreground&&(t.foreground=this.parseColor(e.settings.foreground).replace(/^#/,"")),e.settings.background&&(t.background=this.parseColor(e.settings.background).replace(/^#/,"")),e.settings.fontStyle&&(t.fontStyle=e.settings.fontStyle),n.push(t)}),{base:this.isDarkTheme(i["editor.background"])?"vs-dark":"vs",inherit:!1,rules:this.populateMissingScopes(n),colors:i}}mapGlobalColors(e){const t={};return[{tm:"foreground",mn:"editor.foreground"},{tm:"background",mn:"editor.background"},{tm:"selection",mn:"editor.selectionBackground"},{tm:"inactiveSelection",mn:"editor.inactiveSelectionBackground"},{tm:"selectionHighlightColor",mn:"editor.selectionHighlightBackground"},{tm:"findMatchHighlight",mn:"editor.findMatchHighlightBackground"},{tm:"currentFindMatchHighlight",mn:"editor.findMatchBackground"},{tm:"hoverHighlight",mn:"editor.hoverHighlightBackground"},{tm:"wordHighlight",mn:"editor.wordHighlightBackground"},{tm:"wordHighlightStrong",mn:"editor.wordHighlightStrongBackground"},{tm:"findRangeHighlight",mn:"editor.findRangeHighlightBackground"},{tm:"findMatchHighlight",mn:"peekViewResult.matchHighlightBackground"},{tm:"referenceHighlight",mn:"peekViewEditor.matchHighlightBackground"},{tm:"lineHighlight",mn:"editor.lineHighlightBackground"},{tm:"rangeHighlight",mn:"editor.rangeHighlightBackground"},{tm:"guide",mn:"editorIndentGuide.background"},{tm:"activeGuide",mn:"editorIndentGuide.activeBackground"},{tm:"selectionBorder",mn:"editor.selectionHighlightBorder"}].forEach(i=>{e[i.tm]&&(t[i.mn]=this.parseColor(e[i.tm]))}),t}parseColor(e){let t=e;if(!t.length)return null;if(4===t.length&&(t=e.replace(/[a-fA-F\d]/g,"$&$&")),7===t.length)return t;if(9===e.length)return e;if(!e.match(/^#(..)(..)(..)(..)$/))return e;const i=e.match(/^#(..)(..)(..)(..)$/).slice(1).map(e=>parseInt(e,16));return i[3]=(i[3]/255).toPrecision(2),`rgba(${i.join(", ")})`}rgbColor(e){return"object"==typeof e?e:"#"===e[0]?e.match(/^#(..)(..)(..)/).slice(1).map(e=>parseInt(e,16)):e.match(/\(([^,]+),([^,]+),([^,]+)/).slice(1).map(e=>parseInt(e,10))}isDarkTheme(e){const t=this.rgbColor(e);return(.21*t[0]+.72*t[1]+.07*t[2])/255<.5}populateMissingScopes(e){const t={};Object.entries({comment:["comment.block","comment.line"],number:["constant.numeric","constant.number","string.number"],regexp:["string.regexp"],tag:["meta.tag","entity.name.tag"],"tag.css":["keyword"],metatag:["meta.tag","declaration.tag","constant.language","entity.name.tag"],annotation:["meta.embedded","meta.annotation","string.annotation","comment.block","comment.line"],attribute:["entity.other.attribute-name","support.type.property-name"],identifier:["entity.name.function"],type:["support.type","support.function"],operator:["support.constant","constant.numeric","constant.number","string.number","support"],"attribute.name":["support.type","support.constant","entity.other.attribute-name","support.type.property-name"],"attribute.name.html":["entity.other.attribute-name.html","entity.other.attribute-name"],"attribute.value.html":["string.quoted.double.html","string.quoted.single.html","string.quoted.double","string.quoted.single","string"],"attribute.value.unit":["keyword.unit","support.unit","keyword","support","number","string.number","constant.numeric","constant.number"],"attribute.value.number":["number","string.number","constant.numeric","constant.number"]}).forEach(([e,i])=>{t[e]={scope:e,map:i,currentSettings:null,currentRank:null}}),e.forEach(e=>{if(!e.token)return;e.token.split(/, +/).forEach((i,n)=>{i.split(/ +/).forEach((i,o)=>{const s=Object.values(t).filter(e=>e.map.filter(e=>i.startsWith(e)).length>0);s.length&&s.forEach(s=>{const r=10-n-2*o-(s.map.includes(i)?s.map.indexOf(i):5);null!==s.currentRank&&s.currentRank>=r||(t[s.scope].currentSettings={},t[s.scope].currentRank=r,e.foreground&&(t[s.scope].currentSettings.foreground=e.foreground),e.background&&(t[s.scope].currentSettings.background=e.background),e.fontStyle&&(t[s.scope].currentSettings.fontStyle=e.fontStyle))})})})}),Object.values(t).forEach(t=>{if(!t.currentSettings)return;if(e.some(e=>e.token===t.scope))return;const i={token:t.scope};t.currentSettings.foreground&&(i.foreground=t.currentSettings.foreground),t.currentSettings.background&&(i.background=t.currentSettings.background),t.currentSettings.fontStyle&&(i.fontStyle=t.currentSettings.fontStyle),e.push(i)});const i=[];return e.forEach(e=>{if(-1===e.token.indexOf(","))return void i.push(e);e.token.split(/, +/).forEach(t=>{i.push({token:t,foreground:e.foreground,background:e.background,fontStyle:e.fontStyle})})}),i}updatePosition(e){this.position&&(this.position.innerText=`Line ${e.lineNumber}, Column ${e.column}`)}updateStatusBarColor(e){if(!this.statusBar)return;const t=e.colors["editor.foreground"],i=e.colors["editor.background"];this.isDarkTheme(i)?this.statusBar.classList.add("is-dark"):this.statusBar.classList.remove("is-dark"),this.statusBar.style.color=t,this.statusBar.style.backgroundColor=i,this.container.style.backgroundColor=i}enableStatusBarActions(){if(!this.statusBar)return;const e=this.statusBar.querySelector("[data-full-screen]");e.addEventListener("click",()=>{this.fullscreen?document.exitFullscreen():this.element.requestFullscreen({navigationUI:"hide"}).then(()=>{this.fullscreen=!0,e.classList.add("active"),this.element.addEventListener("fullscreenchange",this.callbacks.fullScreenChange),this.editor&&window.requestAnimationFrame(()=>{this.editor.layout()})})})}onFullScreenChange(){document.fullscreenElement||(this.fullscreen=!1,this.statusBar&&this.statusBar.querySelector("[data-full-screen]").classList.remove("active"),this.element.removeEventListener("fullscreenchange",this.callbacks.fullScreenChange),this.editor&&window.requestAnimationFrame(()=>{this.editor.layout()}))}onResize(){this.editor&&this.editor.layout()}onVisibilityChange(){document.hidden?this.dispose():this.createEditor()}fromLine(e){if(e<=1)return void(this.customLineNumbering=null);const t=this.getModel().getFullModelRange().endLineNumber,i=this.getModel().getFullModelRange().endColumn;if(e>t)throw this.customLineNumbering=null,new Error("The line number is greater than the number of lines in the editor.");const n=new d.Range(1,1,e-1,i),o=new d.Range(e,1,t,i),s=l(d);s.initializeIn(this.editor),s.addRestrictionsTo(this.getModel(),[{range:[o.startLineNumber,o.startColumn,o.endLineNumber,o.endColumn],allowMultiline:!0}]),this.editor.setHiddenAreas([n]),this.config.get("showGutter")&&(this.customLineNumbering=t=>t>=e?String(t-e+1):"",this.editor.updateOptions(this.getConfigOptions()))}addKeyBinding(e,t){const i=this.normalizeKeyBinding(e);if(this.keybindings.push({keybinding:i,callback:t}),this.editor){const e=d.KeyCode[`Key${i.key.toUpperCase()}`];let n=0;i.shift&&(n|=d.KeyMod.Shift),i.ctrl&&(n|=d.KeyMod.CtrlCmd),i.alt&&(n|=d.KeyMod.Alt),n|=e,this.editor.addCommand(n,t)}}removeKeyBinding(e){const t=this.normalizeKeyBinding(e),i=this.keybindings.findIndex(e=>e.keybinding===t);-1!==i&&(this.keybindings[i].callback=()=>{})}normalizeKeyBinding(e){let t={key:null,ctrl:!1,alt:!1,shift:!1};return"string"==typeof e?e.startsWith("Shift+Ctrl+")?(t.key=e.replace("Shift+Ctrl+",""),t.shift=!0,t.ctrl=!0):e.startsWith("Shift+Alt+")?(t.key=e.replace("Shift+Alt+",""),t.shift=!0,t.alt=!0):e.startsWith("Ctrl+")?(t.key=e.replace("Ctrl+",""),t.ctrl=!0):e.startsWith("Alt+")&&(t.key=e.replace("Alt+",""),t.alt=!0):t=p(p({},t),e),t}registerKeyBindings(){0!==this.keybindings.length&&this.keybindings.forEach(e=>{const t=d.KeyCode[`Key${e.keybinding.key.toUpperCase()}`];let i=0;e.keybinding.shift&&(i|=d.KeyMod.Shift),e.keybinding.ctrl&&(i|=d.KeyMod.CtrlCmd),e.keybinding.alt&&(i|=d.KeyMod.Alt),i|=t,this.editor.addCommand(i,e.callback)})}registerDefaultKeyBindings(){this.editor.addCommand(d.KeyMod.CtrlCmd|d.KeyMod.Shift|d.KeyCode.KeyD,()=>{const e=this.editor.getSelection(),t=this.editor.getModel(),i=e.startLineNumber,n=e.endLineNumber,o=t.getLineMaxColumn(n),s=t.getValueInRange(new d.Range(i,1,n,o)),r=n-i+1;t.pushEditOperations([e],[{range:new d.Range(n,o,n,o),text:"\n"+s}],()=>[new d.Selection(i+r,e.startColumn,n+r,e.endColumn)])}),this.editor.addCommand(d.KeyMod.CtrlCmd|d.KeyMod.Shift|d.KeyCode.KeyF,()=>{this.fullscreen?document.exitFullscreen():this.element.requestFullscreen({navigationUI:"hide"}).then(()=>{this.fullscreen=!0,this.statusBar&&this.statusBar.querySelector("[data-full-screen]").classList.add("active"),this.element.addEventListener("fullscreenchange",this.callbacks.fullScreenChange),this.editor&&window.requestAnimationFrame(()=>this.editor.layout())})})}checkEditorClick(e){this.clickStartedInEditor&&!this.element.contains(e.target)&&(e.stopImmediatePropagation(),e.preventDefault()),this.clickStartedInEditor=!1}addCodeLens(e,t,i=null){this.disposables.push(d.languages.registerCodeLensProvider(e,{provideCodeLenses:(e,i)=>t(e,i),resolveCodeLens:(e,t,n)=>i(e,t,n)??t}))}}e.addPlugin("backend.formwidgets.codeeditor",t),e["backend.ui.widgetHandler"]().register("codeeditor","backend.formwidgets.codeeditor")})(window.Snowboard)},8422:function(e,t){"use strict";t.byteLength=function(e){var t=a(e),i=t[0],n=t[1];return 3*(i+n)/4-n},t.toByteArray=function(e){var t,i,s=a(e),r=s[0],l=s[1],h=new o(function(e,t,i){return 3*(t+i)/4-i}(0,r,l)),d=0,c=l>0?r-4:r;for(i=0;i>16&255,h[d++]=t>>8&255,h[d++]=255&t;2===l&&(t=n[e.charCodeAt(i)]<<2|n[e.charCodeAt(i+1)]>>4,h[d++]=255&t);1===l&&(t=n[e.charCodeAt(i)]<<10|n[e.charCodeAt(i+1)]<<4|n[e.charCodeAt(i+2)]>>2,h[d++]=t>>8&255,h[d++]=255&t);return h},t.fromByteArray=function(e){for(var t,n=e.length,o=n%3,s=[],r=16383,a=0,l=n-o;al?l:a+r));1===o?(t=e[n-1],s.push(i[t>>2]+i[t<<4&63]+"==")):2===o&&(t=(e[n-2]<<8)+e[n-1],s.push(i[t>>10]+i[t>>4&63]+i[t<<2&63]+"="));return s.join("")};for(var i=[],n=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r=0;r<64;++r)i[r]=s[r],n[s.charCodeAt(r)]=r;function a(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var i=e.indexOf("=");return-1===i&&(i=t),[i,i===t?0:4-i%4]}function l(e){return i[e>>18&63]+i[e>>12&63]+i[e>>6&63]+i[63&e]}function h(e,t,i){for(var n,o=[],s=t;s + * @license MIT + */function r(){return l.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(e,t){if(r()=r())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+r().toString(16)+" bytes");return 0|e}function p(e,t){if(l.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var i=e.length;if(0===i)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return i;case"utf8":case"utf-8":case void 0:return z(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*i;case"hex":return i>>>1;case"base64":return H(e).length;default:if(n)return z(e).length;t=(""+t).toLowerCase(),n=!0}}function m(e,t,i){var n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===i||i>this.length)&&(i=this.length),i<=0)return"";if((i>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return I(this,t,i);case"utf8":case"utf-8":return x(this,t,i);case"ascii":return E(this,t,i);case"latin1":case"binary":return N(this,t,i);case"base64":return L(this,t,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return M(this,t,i);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function f(e,t,i){var n=e[t];e[t]=e[i],e[i]=n}function _(e,t,i,n,o){if(0===e.length)return-1;if("string"==typeof i?(n=i,i=0):i>2147483647?i=2147483647:i<-2147483648&&(i=-2147483648),i=+i,isNaN(i)&&(i=o?0:e.length-1),i<0&&(i=e.length+i),i>=e.length){if(o)return-1;i=e.length-1}else if(i<0){if(!o)return-1;i=0}if("string"==typeof t&&(t=l.from(t,n)),l.isBuffer(t))return 0===t.length?-1:v(e,t,i,n,o);if("number"==typeof t)return t&=255,l.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,i):Uint8Array.prototype.lastIndexOf.call(e,t,i):v(e,[t],i,n,o);throw new TypeError("val must be string, number or Buffer")}function v(e,t,i,n,o){var s,r=1,a=e.length,l=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;r=2,a/=2,l/=2,i/=2}function h(e,t){return 1===r?e[t]:e.readUInt16BE(t*r)}if(o){var d=-1;for(s=i;sa&&(i=a-l),s=i;s>=0;s--){for(var c=!0,u=0;uo&&(n=o):n=o;var s=t.length;if(s%2!=0)throw new TypeError("Invalid hex string");n>s/2&&(n=s/2);for(var r=0;r>8,o=i%256,s.push(o),s.push(n);return s}(t,e.length-i),e,i,n)}function L(e,t,i){return 0===t&&i===e.length?n.fromByteArray(e):n.fromByteArray(e.slice(t,i))}function x(e,t,i){i=Math.min(e.length,i);for(var n=[],o=t;o239?4:h>223?3:h>191?2:1;if(o+c<=i)switch(c){case 1:h<128&&(d=h);break;case 2:128==(192&(s=e[o+1]))&&(l=(31&h)<<6|63&s)>127&&(d=l);break;case 3:s=e[o+1],r=e[o+2],128==(192&s)&&128==(192&r)&&(l=(15&h)<<12|(63&s)<<6|63&r)>2047&&(l<55296||l>57343)&&(d=l);break;case 4:s=e[o+1],r=e[o+2],a=e[o+3],128==(192&s)&&128==(192&r)&&128==(192&a)&&(l=(15&h)<<18|(63&s)<<12|(63&r)<<6|63&a)>65535&&l<1114112&&(d=l)}null===d?(d=65533,c=1):d>65535&&(d-=65536,n.push(d>>>10&1023|55296),d=56320|1023&d),n.push(d),o+=c}return function(e){var t=e.length;if(t<=D)return String.fromCharCode.apply(String,e);var i="",n=0;for(;n0&&(e=this.toString("hex",0,i).match(/.{2}/g).join(" "),this.length>i&&(e+=" ... ")),""},l.prototype.compare=function(e,t,i,n,o){if(!l.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===i&&(i=e?e.length:0),void 0===n&&(n=0),void 0===o&&(o=this.length),t<0||i>e.length||n<0||o>this.length)throw new RangeError("out of range index");if(n>=o&&t>=i)return 0;if(n>=o)return-1;if(t>=i)return 1;if(this===e)return 0;for(var s=(o>>>=0)-(n>>>=0),r=(i>>>=0)-(t>>>=0),a=Math.min(s,r),h=this.slice(n,o),d=e.slice(t,i),c=0;co)&&(i=o),e.length>0&&(i<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var s=!1;;)switch(n){case"hex":return b(this,e,t,i);case"utf8":case"utf-8":return w(this,e,t,i);case"ascii":return C(this,e,t,i);case"latin1":case"binary":return y(this,e,t,i);case"base64":return S(this,e,t,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return k(this,e,t,i);default:if(s)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),s=!0}},l.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var D=4096;function E(e,t,i){var n="";i=Math.min(e.length,i);for(var o=t;on)&&(i=n);for(var o="",s=t;si)throw new RangeError("Trying to access beyond buffer length")}function A(e,t,i,n,o,s){if(!l.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||te.length)throw new RangeError("Index out of range")}function O(e,t,i,n){t<0&&(t=65535+t+1);for(var o=0,s=Math.min(e.length-i,2);o>>8*(n?o:1-o)}function R(e,t,i,n){t<0&&(t=4294967295+t+1);for(var o=0,s=Math.min(e.length-i,4);o>>8*(n?o:3-o)&255}function P(e,t,i,n,o,s){if(i+n>e.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("Index out of range")}function F(e,t,i,n,s){return s||P(e,0,i,4),o.write(e,t,i,n,23,4),i+4}function B(e,t,i,n,s){return s||P(e,0,i,8),o.write(e,t,i,n,52,8),i+8}l.prototype.slice=function(e,t){var i,n=this.length;if((e=~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),(t=void 0===t?n:~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),t0&&(o*=256);)n+=this[e+--t]*o;return n},l.prototype.readUInt8=function(e,t){return t||T(e,1,this.length),this[e]},l.prototype.readUInt16LE=function(e,t){return t||T(e,2,this.length),this[e]|this[e+1]<<8},l.prototype.readUInt16BE=function(e,t){return t||T(e,2,this.length),this[e]<<8|this[e+1]},l.prototype.readUInt32LE=function(e,t){return t||T(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},l.prototype.readUInt32BE=function(e,t){return t||T(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},l.prototype.readIntLE=function(e,t,i){e|=0,t|=0,i||T(e,t,this.length);for(var n=this[e],o=1,s=0;++s=(o*=128)&&(n-=Math.pow(2,8*t)),n},l.prototype.readIntBE=function(e,t,i){e|=0,t|=0,i||T(e,t,this.length);for(var n=t,o=1,s=this[e+--n];n>0&&(o*=256);)s+=this[e+--n]*o;return s>=(o*=128)&&(s-=Math.pow(2,8*t)),s},l.prototype.readInt8=function(e,t){return t||T(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},l.prototype.readInt16LE=function(e,t){t||T(e,2,this.length);var i=this[e]|this[e+1]<<8;return 32768&i?4294901760|i:i},l.prototype.readInt16BE=function(e,t){t||T(e,2,this.length);var i=this[e+1]|this[e]<<8;return 32768&i?4294901760|i:i},l.prototype.readInt32LE=function(e,t){return t||T(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},l.prototype.readInt32BE=function(e,t){return t||T(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},l.prototype.readFloatLE=function(e,t){return t||T(e,4,this.length),o.read(this,e,!0,23,4)},l.prototype.readFloatBE=function(e,t){return t||T(e,4,this.length),o.read(this,e,!1,23,4)},l.prototype.readDoubleLE=function(e,t){return t||T(e,8,this.length),o.read(this,e,!0,52,8)},l.prototype.readDoubleBE=function(e,t){return t||T(e,8,this.length),o.read(this,e,!1,52,8)},l.prototype.writeUIntLE=function(e,t,i,n){(e=+e,t|=0,i|=0,n)||A(this,e,t,i,Math.pow(2,8*i)-1,0);var o=1,s=0;for(this[t]=255&e;++s=0&&(s*=256);)this[t+o]=e/s&255;return t+i},l.prototype.writeUInt8=function(e,t,i){return e=+e,t|=0,i||A(this,e,t,1,255,0),l.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},l.prototype.writeUInt16LE=function(e,t,i){return e=+e,t|=0,i||A(this,e,t,2,65535,0),l.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):O(this,e,t,!0),t+2},l.prototype.writeUInt16BE=function(e,t,i){return e=+e,t|=0,i||A(this,e,t,2,65535,0),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):O(this,e,t,!1),t+2},l.prototype.writeUInt32LE=function(e,t,i){return e=+e,t|=0,i||A(this,e,t,4,4294967295,0),l.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):R(this,e,t,!0),t+4},l.prototype.writeUInt32BE=function(e,t,i){return e=+e,t|=0,i||A(this,e,t,4,4294967295,0),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},l.prototype.writeIntLE=function(e,t,i,n){if(e=+e,t|=0,!n){var o=Math.pow(2,8*i-1);A(this,e,t,i,o-1,-o)}var s=0,r=1,a=0;for(this[t]=255&e;++s=0&&(r*=256);)e<0&&0===a&&0!==this[t+s+1]&&(a=1),this[t+s]=(e/r|0)-a&255;return t+i},l.prototype.writeInt8=function(e,t,i){return e=+e,t|=0,i||A(this,e,t,1,127,-128),l.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},l.prototype.writeInt16LE=function(e,t,i){return e=+e,t|=0,i||A(this,e,t,2,32767,-32768),l.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):O(this,e,t,!0),t+2},l.prototype.writeInt16BE=function(e,t,i){return e=+e,t|=0,i||A(this,e,t,2,32767,-32768),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):O(this,e,t,!1),t+2},l.prototype.writeInt32LE=function(e,t,i){return e=+e,t|=0,i||A(this,e,t,4,2147483647,-2147483648),l.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):R(this,e,t,!0),t+4},l.prototype.writeInt32BE=function(e,t,i){return e=+e,t|=0,i||A(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},l.prototype.writeFloatLE=function(e,t,i){return F(this,e,t,!0,i)},l.prototype.writeFloatBE=function(e,t,i){return F(this,e,t,!1,i)},l.prototype.writeDoubleLE=function(e,t,i){return B(this,e,t,!0,i)},l.prototype.writeDoubleBE=function(e,t,i){return B(this,e,t,!1,i)},l.prototype.copy=function(e,t,i,n){if(i||(i=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t=0;--o)e[o+t]=this[o+i];else if(s<1e3||!l.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,i=void 0===i?this.length:i>>>0,e||(e=0),"number"==typeof e)for(s=t;s55295&&i<57344){if(!o){if(i>56319){(t-=3)>-1&&s.push(239,191,189);continue}if(r+1===n){(t-=3)>-1&&s.push(239,191,189);continue}o=i;continue}if(i<56320){(t-=3)>-1&&s.push(239,191,189),o=i;continue}i=65536+(o-55296<<10|i-56320)}else o&&(t-=3)>-1&&s.push(239,191,189);if(o=null,i<128){if((t-=1)<0)break;s.push(i)}else if(i<2048){if((t-=2)<0)break;s.push(i>>6|192,63&i|128)}else if(i<65536){if((t-=3)<0)break;s.push(i>>12|224,i>>6&63|128,63&i|128)}else{if(!(i<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;s.push(i>>18|240,i>>12&63|128,i>>6&63|128,63&i|128)}}return s}function H(e){return n.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(V,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function U(e,t,i,n){for(var o=0;o=t.length||o>=e.length);++o)t[o+i]=e[o];return o}},298:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-action-bar{height:100%;white-space:nowrap}.monaco-action-bar .actions-container{align-items:center;display:flex;height:100%;margin:0 auto;padding:0;width:100%}.monaco-action-bar.vertical .actions-container{display:inline-block}.monaco-action-bar .action-item{align-items:center;cursor:pointer;display:block;justify-content:center;position:relative}.monaco-action-bar .action-item.disabled{cursor:default}.monaco-action-bar .action-item .codicon,.monaco-action-bar .action-item .icon{display:block}.monaco-action-bar .action-item .codicon{align-items:center;display:flex;height:16px;width:16px}.monaco-action-bar .action-label{border-radius:5px;font-size:11px;padding:3px}.monaco-action-bar .action-item.disabled .action-label,.monaco-action-bar .action-item.disabled .action-label:before,.monaco-action-bar .action-item.disabled .action-label:hover{opacity:.6}.monaco-action-bar.vertical{text-align:left}.monaco-action-bar.vertical .action-item{display:block}.monaco-action-bar.vertical .action-label.separator{border-bottom:1px solid #bbb;display:block;margin-left:.8em;margin-right:.8em;padding-top:1px}.monaco-action-bar .action-item .action-label.separator{background-color:#bbb;cursor:default;height:16px;margin:5px 4px!important;min-width:1px;padding:0;width:1px}.secondary-actions .monaco-action-bar .action-label{margin-left:6px}.monaco-action-bar .action-item.select-container{align-items:center;display:flex;flex:1;justify-content:center;margin-right:10px;max-width:170px;min-width:60px;overflow:hidden}.monaco-action-bar .action-item.action-dropdown-item{display:flex}.monaco-action-bar .action-item.action-dropdown-item>.action-label{margin-right:1px}",""]),t.A=o},9362:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-aria-container{left:-999em;position:absolute}",""]),t.A=o},9188:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-text-button{align-items:center;box-sizing:border-box;cursor:pointer;display:flex;justify-content:center;padding:4px;text-align:center;width:100%}.monaco-text-button:focus{outline-offset:2px!important}.monaco-text-button:hover{text-decoration:none!important}.monaco-button.disabled,.monaco-button.disabled:focus{cursor:default;opacity:.4!important}.monaco-text-button>.codicon{color:inherit!important;margin:0 .2em}.monaco-button-dropdown{cursor:pointer;display:flex}.monaco-button-dropdown.disabled{cursor:default}.monaco-button-dropdown>.monaco-button:focus{outline-offset:-1px!important}.monaco-button-dropdown.disabled>.monaco-button-dropdown-separator,.monaco-button-dropdown.disabled>.monaco-button.disabled,.monaco-button-dropdown.disabled>.monaco-button.disabled:focus{opacity:.4!important}.monaco-button-dropdown>.monaco-button.monaco-text-button{border-right-width:0!important}.monaco-button-dropdown .monaco-button-dropdown-separator{cursor:default;padding:4px 0}.monaco-button-dropdown .monaco-button-dropdown-separator>div{height:100%;width:1px}.monaco-button-dropdown>.monaco-button.monaco-dropdown-button{border-left-width:0!important}.monaco-description-button{flex-direction:column}.monaco-description-button .monaco-button-label{font-weight:500}.monaco-description-button .monaco-button-description{font-style:italic}.monaco-description-button .monaco-button-description,.monaco-description-button .monaco-button-label{align-items:center;display:flex;justify-content:center}.monaco-description-button .monaco-button-description>.codicon,.monaco-description-button .monaco-button-label>.codicon{color:inherit!important;margin:0 .2em}",""]),t.A=o},1742:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".codicon-wrench-subaction{opacity:.5}@keyframes codicon-spin{to{transform:rotate(1turn)}}.codicon-gear.codicon-modifier-spin,.codicon-loading.codicon-modifier-spin,.codicon-notebook-state-executing.codicon-modifier-spin,.codicon-sync.codicon-modifier-spin{animation:codicon-spin 1.5s steps(30) infinite}.codicon-modifier-disabled{opacity:.4}.codicon-loading,.codicon-tree-item-loading:before{animation-duration:1s!important;animation-timing-function:cubic-bezier(.53,.21,.29,.67)!important}",""]),t.A=o},6831:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,'.codicon[class*=codicon-]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font:normal normal normal 16px/1 codicon;text-align:center;text-decoration:none;text-rendering:auto;text-transform:none;-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none}',""]),t.A=o},3758:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".context-view{position:absolute}.context-view.fixed{all:initial;color:inherit;font-family:inherit;font-size:13px;position:fixed}",""]),t.A=o},3800:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-count-badge{border-radius:11px;box-sizing:border-box;display:inline-block;font-size:11px;font-weight:400;line-height:11px;min-height:18px;min-width:18px;padding:3px 6px;text-align:center}.monaco-count-badge.long{border-radius:2px;line-height:normal;min-height:auto;padding:2px 3px}",""]),t.A=o},2474:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-dropdown{height:100%;padding:0}.monaco-dropdown>.dropdown-label{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center}.monaco-dropdown>.dropdown-label>.action-label.disabled{cursor:default}.monaco-dropdown-with-primary{border-radius:5px;display:flex!important;flex-direction:row}.monaco-dropdown-with-primary>.action-container>.action-label{margin-right:0}.monaco-dropdown-with-primary>.dropdown-action-container>.monaco-dropdown>.dropdown-label .codicon[class*=codicon-]{font-size:12px;line-height:16px;margin-left:-3px;padding-left:0;padding-right:0}.monaco-dropdown-with-primary>.dropdown-action-container>.monaco-dropdown>.dropdown-label>.action-label{background-position:50%;background-repeat:no-repeat;background-size:16px;display:block}",""]),t.A=o},4254:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-findInput{position:relative}.monaco-findInput .monaco-inputbox{font-size:13px;width:100%}.monaco-findInput>.controls{position:absolute;right:2px;top:3px}.vs .monaco-findInput.disabled{background-color:#e1e1e1}.vs-dark .monaco-findInput.disabled{background-color:#333}.hc-light .monaco-findInput.highlight-0 .controls,.monaco-findInput.highlight-0 .controls{animation:monaco-findInput-highlight-0 .1s linear 0s}.hc-light .monaco-findInput.highlight-1 .controls,.monaco-findInput.highlight-1 .controls{animation:monaco-findInput-highlight-1 .1s linear 0s}.hc-black .monaco-findInput.highlight-0 .controls,.vs-dark .monaco-findInput.highlight-0 .controls{animation:monaco-findInput-highlight-dark-0 .1s linear 0s}.hc-black .monaco-findInput.highlight-1 .controls,.vs-dark .monaco-findInput.highlight-1 .controls{animation:monaco-findInput-highlight-dark-1 .1s linear 0s}@keyframes monaco-findInput-highlight-0{0%{background:rgba(253,255,0,.8)}to{background:transparent}}@keyframes monaco-findInput-highlight-1{0%{background:rgba(253,255,0,.8)}99%{background:transparent}}@keyframes monaco-findInput-highlight-dark-0{0%{background:hsla(0,0%,100%,.44)}to{background:transparent}}@keyframes monaco-findInput-highlight-dark-1{0%{background:hsla(0,0%,100%,.44)}99%{background:transparent}}",""]),t.A=o},1098:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,'.monaco-hover{animation:fadein .1s linear;box-sizing:initial;cursor:default;line-height:1.5em;overflow:hidden;position:absolute;-moz-user-select:text;user-select:text;-webkit-user-select:text;-ms-user-select:text;z-index:50}.monaco-hover.hidden{display:none}.monaco-hover a:hover{cursor:pointer}.monaco-hover .hover-contents:not(.html-hover-contents){padding:4px 8px}.monaco-hover .markdown-hover>.hover-contents:not(.code-hover-contents){word-wrap:break-word;max-width:500px}.monaco-hover .markdown-hover>.hover-contents:not(.code-hover-contents) hr{min-width:100%}.monaco-hover .code,.monaco-hover p,.monaco-hover ul{margin:8px 0}.monaco-hover code{font-family:var(--monaco-monospace-font)}.monaco-hover hr{border-left:0;border-right:0;box-sizing:border-box;height:1px;margin:4px -8px -4px}.monaco-hover .code:first-child,.monaco-hover p:first-child,.monaco-hover ul:first-child{margin-top:0}.monaco-hover .code:last-child,.monaco-hover p:last-child,.monaco-hover ul:last-child{margin-bottom:0}.monaco-hover ol,.monaco-hover ul{padding-left:20px}.monaco-hover li>p{margin-bottom:0}.monaco-hover li>ul{margin-top:0}.monaco-hover code{border-radius:3px;padding:0 .4em}.monaco-hover .monaco-tokenized-source{white-space:pre-wrap}.monaco-hover .hover-row.status-bar{font-size:12px;line-height:22px}.monaco-hover .hover-row.status-bar .actions{display:flex;padding:0 8px}.monaco-hover .hover-row.status-bar .actions .action-container{cursor:pointer;margin-right:16px}.monaco-hover .hover-row.status-bar .actions .action-container .action .icon{padding-right:4px}.monaco-hover .markdown-hover .hover-contents .codicon{color:inherit;font-size:inherit;vertical-align:middle}.monaco-hover .hover-contents a.code-link,.monaco-hover .hover-contents a.code-link:hover{color:inherit}.monaco-hover .hover-contents a.code-link:before{content:"("}.monaco-hover .hover-contents a.code-link:after{content:")"}.monaco-hover .hover-contents a.code-link>span{border-bottom:1px solid transparent;text-decoration:underline;text-underline-position:under}.monaco-hover .markdown-hover .hover-contents:not(.code-hover-contents):not(.html-hover-contents) span{display:inline-block;margin-bottom:4px}.monaco-hover-content .action-container a{-webkit-user-select:none;-moz-user-select:none;user-select:none}.monaco-hover-content .action-container.disabled{cursor:default;opacity:.4;pointer-events:none}',""]),t.A=o},6714:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-icon-label{display:flex;overflow:hidden;text-overflow:ellipsis}.monaco-icon-label:before{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-position:0;background-repeat:no-repeat;background-size:16px;display:inline-block;flex-shrink:0;height:22px;line-height:inherit!important;padding-right:6px;vertical-align:top;width:16px}.monaco-icon-label>.monaco-icon-label-container{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-name-container>.label-name{color:inherit;white-space:pre}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-name-container>.label-name>.label-separator{margin:0 2px;opacity:.5}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{font-size:.9em;margin-left:.5em;opacity:.7;white-space:pre}.monaco-icon-label.nowrap>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{white-space:nowrap}.vs .monaco-icon-label>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{opacity:.95}.monaco-icon-label.italic>.monaco-icon-label-container>.monaco-icon-description-container>.label-description,.monaco-icon-label.italic>.monaco-icon-label-container>.monaco-icon-name-container>.label-name{font-style:italic}.monaco-icon-label.deprecated{opacity:.66;text-decoration:line-through}.monaco-icon-label.italic:after{font-style:italic}.monaco-icon-label.strikethrough>.monaco-icon-label-container>.monaco-icon-description-container>.label-description,.monaco-icon-label.strikethrough>.monaco-icon-label-container>.monaco-icon-name-container>.label-name{text-decoration:line-through}.monaco-icon-label:after{font-size:90%;font-weight:600;margin:auto 16px 0 5px;opacity:.75;text-align:center}.monaco-list:focus .selected .monaco-icon-label,.monaco-list:focus .selected .monaco-icon-label:after{color:inherit!important}.monaco-list-row.focused.selected .label-description,.monaco-list-row.selected .label-description{opacity:.8}",""]),t.A=o},6330:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-inputbox{box-sizing:border-box;display:block;font-size:inherit;padding:0;position:relative}.monaco-inputbox.idle{border:1px solid transparent}.monaco-inputbox>.ibwrapper>.input,.monaco-inputbox>.ibwrapper>.mirror{padding:4px}.monaco-inputbox>.ibwrapper{height:100%;position:relative;width:100%}.monaco-inputbox>.ibwrapper>.input{border:none;box-sizing:border-box;color:inherit;display:inline-block;font-family:inherit;font-size:inherit;height:100%;line-height:inherit;resize:none;width:100%}.monaco-inputbox>.ibwrapper>input{text-overflow:ellipsis}.monaco-inputbox>.ibwrapper>textarea.input{-ms-overflow-style:none;display:block;outline:none;scrollbar-width:none}.monaco-inputbox>.ibwrapper>textarea.input::-webkit-scrollbar{display:none}.monaco-inputbox>.ibwrapper>textarea.input.empty{white-space:nowrap}.monaco-inputbox>.ibwrapper>.mirror{word-wrap:break-word;box-sizing:border-box;display:inline-block;left:0;position:absolute;top:0;visibility:hidden;white-space:pre-wrap;width:100%}.monaco-inputbox-container{text-align:right}.monaco-inputbox-container .monaco-inputbox-message{word-wrap:break-word;box-sizing:border-box;display:inline-block;font-size:12px;line-height:17px;margin-top:-1px;overflow:hidden;padding:.4em;text-align:left;width:100%}.monaco-inputbox .monaco-action-bar{position:absolute;right:2px;top:4px}.monaco-inputbox .monaco-action-bar .action-item{margin-left:2px}.monaco-inputbox .monaco-action-bar .action-item .codicon{background-repeat:no-repeat;height:16px;width:16px}",""]),t.A=o},6242:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-keybinding{align-items:center;display:flex;line-height:10px}.monaco-keybinding>.monaco-keybinding-key{border-radius:3px;border-style:solid;border-width:1px;display:inline-block;font-size:11px;margin:0 2px;padding:3px 5px;vertical-align:middle}.monaco-keybinding>.monaco-keybinding-key:first-child{margin-left:0}.monaco-keybinding>.monaco-keybinding-key:last-child{margin-right:0}.monaco-keybinding>.monaco-keybinding-key-separator{display:inline-block}.monaco-keybinding>.monaco-keybinding-key-chord-separator{width:6px}",""]),t.A=o},1504:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-list{height:100%;position:relative;white-space:nowrap;width:100%}.monaco-list.mouse-support{-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none}.monaco-list>.monaco-scrollable-element{height:100%}.monaco-list-rows{height:100%;position:relative;width:100%}.monaco-list.horizontal-scrolling .monaco-list-rows{min-width:100%;width:auto}.monaco-list-row{box-sizing:border-box;overflow:hidden;position:absolute;width:100%}.monaco-list.mouse-support .monaco-list-row{cursor:pointer;touch-action:none}.monaco-list-row.scrolling{display:none!important}.monaco-list.element-focused,.monaco-list.selection-multiple,.monaco-list.selection-single{outline:0!important}.monaco-drag-image{border-radius:10px;display:inline-block;font-size:12px;padding:1px 7px;position:absolute;z-index:1000}.monaco-list-type-filter-message{box-sizing:border-box;height:100%;left:0;opacity:.7;padding:40px 1em 1em;pointer-events:none;position:absolute;text-align:center;top:0;white-space:normal;width:100%}.monaco-list-type-filter-message:empty{display:none}",""]),t.A=o},814:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-mouse-cursor-text{cursor:text}",""]),t.A=o},4486:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-progress-container{height:5px;overflow:hidden;width:100%}.monaco-progress-container .progress-bit{display:none;height:5px;left:0;position:absolute;width:2%}.monaco-progress-container.active .progress-bit{display:inherit}.monaco-progress-container.discrete .progress-bit{left:0;transition:width .1s linear}.monaco-progress-container.discrete.done .progress-bit{width:100%}.monaco-progress-container.infinite .progress-bit{animation-duration:4s;animation-iteration-count:infinite;animation-name:progress;animation-timing-function:linear;transform:translateZ(0)}.monaco-progress-container.infinite.infinite-long-running .progress-bit{animation-timing-function:steps(100)}@keyframes progress{0%{transform:translateX(0) scaleX(1)}50%{transform:translateX(2500%) scaleX(3)}to{transform:translateX(4900%) scaleX(1)}}",""]),t.A=o},2362:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,':root{--sash-size:4px}.monaco-sash{position:absolute;touch-action:none;z-index:35}.monaco-sash.disabled{pointer-events:none}.monaco-sash.mac.vertical{cursor:col-resize}.monaco-sash.vertical.minimum{cursor:e-resize}.monaco-sash.vertical.maximum{cursor:w-resize}.monaco-sash.mac.horizontal{cursor:row-resize}.monaco-sash.horizontal.minimum{cursor:s-resize}.monaco-sash.horizontal.maximum{cursor:n-resize}.monaco-sash.disabled{cursor:default!important;pointer-events:none!important}.monaco-sash.vertical{cursor:ew-resize;height:100%;top:0;width:var(--sash-size)}.monaco-sash.horizontal{cursor:ns-resize;height:var(--sash-size);left:0;width:100%}.monaco-sash:not(.disabled)>.orthogonal-drag-handle{content:" ";cursor:all-scroll;display:block;height:calc(var(--sash-size)*2);position:absolute;width:calc(var(--sash-size)*2);z-index:100}.monaco-sash.horizontal.orthogonal-edge-north:not(.disabled)>.orthogonal-drag-handle.start,.monaco-sash.horizontal.orthogonal-edge-south:not(.disabled)>.orthogonal-drag-handle.end{cursor:nwse-resize}.monaco-sash.horizontal.orthogonal-edge-north:not(.disabled)>.orthogonal-drag-handle.end,.monaco-sash.horizontal.orthogonal-edge-south:not(.disabled)>.orthogonal-drag-handle.start{cursor:nesw-resize}.monaco-sash.vertical>.orthogonal-drag-handle.start{left:calc(var(--sash-size)*-.5);top:calc(var(--sash-size)*-1)}.monaco-sash.vertical>.orthogonal-drag-handle.end{bottom:calc(var(--sash-size)*-1);left:calc(var(--sash-size)*-.5)}.monaco-sash.horizontal>.orthogonal-drag-handle.start{left:calc(var(--sash-size)*-1);top:calc(var(--sash-size)*-.5)}.monaco-sash.horizontal>.orthogonal-drag-handle.end{right:calc(var(--sash-size)*-1);top:calc(var(--sash-size)*-.5)}.monaco-sash:before{background:transparent;content:"";height:100%;pointer-events:none;position:absolute;transition:background-color .1s ease-out;width:100%}.monaco-sash.vertical:before{left:calc(50% - var(--sash-hover-size)/2);width:var(--sash-hover-size)}.monaco-sash.horizontal:before{height:var(--sash-hover-size);top:calc(50% - var(--sash-hover-size)/2)}.pointer-events-disabled{pointer-events:none!important}.monaco-sash.debug{background:cyan}.monaco-sash.debug.disabled{background:rgba(0,255,255,.2)}.monaco-sash.debug:not(.disabled)>.orthogonal-drag-handle{background:red}',""]),t.A=o},9160:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.monaco-scrollable-element>.visible{background:transparent;opacity:1;transition:opacity .1s linear}.monaco-scrollable-element>.invisible{opacity:0;pointer-events:none}.monaco-scrollable-element>.invisible.fade{transition:opacity .8s linear}.monaco-scrollable-element>.shadow{display:none;position:absolute}.monaco-scrollable-element>.shadow.top{display:block;height:3px;left:3px;top:0;width:100%}.monaco-scrollable-element>.shadow.left{display:block;height:100%;left:0;top:3px;width:3px}.monaco-scrollable-element>.shadow.top-left-corner{display:block;height:3px;left:0;top:0;width:3px}",""]),t.A=o},710:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,'.monaco-split-view2{height:100%;position:relative;width:100%}.monaco-split-view2>.sash-container{height:100%;pointer-events:none;position:absolute;width:100%}.monaco-split-view2>.sash-container>.monaco-sash{pointer-events:auto}.monaco-split-view2>.monaco-scrollable-element{height:100%;width:100%}.monaco-split-view2>.monaco-scrollable-element>.split-view-container{height:100%;position:relative;white-space:nowrap;width:100%}.monaco-split-view2>.monaco-scrollable-element>.split-view-container>.split-view-view{position:absolute;white-space:normal}.monaco-split-view2>.monaco-scrollable-element>.split-view-container>.split-view-view:not(.visible){display:none}.monaco-split-view2.vertical>.monaco-scrollable-element>.split-view-container>.split-view-view{width:100%}.monaco-split-view2.horizontal>.monaco-scrollable-element>.split-view-container>.split-view-view{height:100%}.monaco-split-view2.separator-border>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{background-color:var(--separator-border);content:" ";left:0;pointer-events:none;position:absolute;top:0;z-index:5}.monaco-split-view2.separator-border.horizontal>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{height:100%;width:1px}.monaco-split-view2.separator-border.vertical>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{height:1px;width:100%}',""]),t.A=o},8110:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,'.monaco-table{display:flex;flex-direction:column;height:100%;position:relative;white-space:nowrap;width:100%}.monaco-table>.monaco-split-view2{border-bottom:1px solid transparent}.monaco-table>.monaco-list{flex:1}.monaco-table-tr{display:flex;height:100%}.monaco-table-th{font-weight:700;height:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.monaco-table-td,.monaco-table-th{box-sizing:border-box;flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.monaco-table>.monaco-split-view2 .monaco-sash.vertical:before{border-left:1px solid transparent;content:"";left:calc(var(--sash-size)/2);position:absolute;width:0}.monaco-table>.monaco-split-view2,.monaco-table>.monaco-split-view2 .monaco-sash.vertical:before{transition:border-color .2s ease-out}',""]),t.A=o},1368:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-custom-toggle{border:1px solid transparent;border-radius:3px;box-sizing:border-box;cursor:pointer;float:left;height:20px;margin-left:2px;overflow:hidden;padding:1px;-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none;width:20px}.monaco-custom-toggle:hover{background-color:var(--vscode-inputOption-hoverBackground)}.hc-black .monaco-custom-toggle:hover,.hc-light .monaco-custom-toggle:hover{border:1px dashed var(--vscode-focusBorder)}.hc-black .monaco-custom-toggle,.hc-black .monaco-custom-toggle:hover,.hc-light .monaco-custom-toggle,.hc-light .monaco-custom-toggle:hover{background:none}.monaco-custom-toggle.monaco-checkbox{background-size:16px!important;border:1px solid transparent;border-radius:3px;height:18px;margin-left:0;margin-right:9px;opacity:1;padding:0;width:18px}.monaco-custom-toggle.monaco-checkbox:not(.checked):before{visibility:hidden}",""]),t.A=o},8479:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-tl-row{align-items:center;display:flex;height:100%;position:relative}.monaco-tl-indent{height:100%;left:16px;pointer-events:none;position:absolute;top:0}.hide-arrows .monaco-tl-indent{left:12px}.monaco-tl-indent>.indent-guide{border-left:1px solid transparent;box-sizing:border-box;display:inline-block;height:100%;transition:border-color .1s linear}.monaco-tl-contents,.monaco-tl-twistie{height:100%}.monaco-tl-twistie{align-items:center;display:flex!important;flex-shrink:0;font-size:10px;justify-content:center;padding-right:6px;text-align:right;transform:translateX(3px);width:16px}.monaco-tl-contents{flex:1;overflow:hidden}.monaco-tl-twistie:before{border-radius:20px}.monaco-tl-twistie.collapsed:before{transform:rotate(-90deg)}.monaco-tl-twistie.codicon-tree-item-loading:before{animation:codicon-spin 1.25s steps(30) infinite}.monaco-tree-type-filter{display:flex;margin:0 6px;max-width:200px;padding:3px;position:absolute;top:0;transition:top .3s;z-index:100}.monaco-tree-type-filter.disabled{top:-40px}.monaco-tree-type-filter-grab{align-items:center;cursor:grab;display:flex!important;justify-content:center;margin-right:2px}.monaco-tree-type-filter-grab.grabbing{cursor:grabbing}.monaco-tree-type-filter-input{flex:1}.monaco-tree-type-filter-input .monaco-inputbox{height:23px}.monaco-tree-type-filter-input .monaco-inputbox>.ibwrapper>.input,.monaco-tree-type-filter-input .monaco-inputbox>.ibwrapper>.mirror{padding:2px 4px}.monaco-tree-type-filter-input .monaco-findInput>.controls{top:2px}.monaco-tree-type-filter-actionbar{margin-left:4px}.monaco-tree-type-filter-actionbar .monaco-action-bar .action-label{padding:2px}",""]),t.A=o},4697:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,'.quick-input-widget{-webkit-app-region:no-drag;left:50%;margin-left:-300px;position:absolute;width:600px;z-index:2550}.quick-input-titlebar{align-items:center;display:flex}.quick-input-left-action-bar{display:flex;flex:1;margin-left:4px}.quick-input-title{overflow:hidden;padding:3px 0;text-align:center;text-overflow:ellipsis}.quick-input-right-action-bar{display:flex;flex:1;margin-right:4px}.quick-input-right-action-bar>.actions-container{justify-content:flex-end}.quick-input-titlebar .monaco-action-bar .action-label.codicon{background-position:50%;background-repeat:no-repeat;padding:2px}.quick-input-description{margin:6px}.quick-input-header .quick-input-description{margin:4px 2px}.quick-input-header{display:flex;margin-bottom:-2px;padding:6px 6px 0}.quick-input-widget.hidden-input .quick-input-header{margin-bottom:0;padding:0}.quick-input-and-message{display:flex;flex-direction:column;flex-grow:1;min-width:0;position:relative}.quick-input-check-all{align-self:center;margin:0}.quick-input-filter{display:flex;flex-grow:1;position:relative}.quick-input-box{flex-grow:1}.quick-input-widget.show-checkboxes .quick-input-box,.quick-input-widget.show-checkboxes .quick-input-message{margin-left:5px}.quick-input-visible-count{left:-10000px;position:absolute}.quick-input-count{align-items:center;align-self:center;display:flex;position:absolute;right:4px}.quick-input-count .monaco-count-badge{border-radius:2px;line-height:normal;min-height:auto;padding:2px 4px;vertical-align:middle}.quick-input-action{margin-left:6px}.quick-input-action .monaco-text-button{align-items:center;display:flex;font-size:11px;height:27.5px;padding:0 6px}.quick-input-message{margin-top:-1px;overflow-wrap:break-word;padding:5px}.quick-input-message>.codicon{margin:0 .2em;vertical-align:text-bottom}.quick-input-progress.monaco-progress-container{position:relative}.quick-input-progress.monaco-progress-container,.quick-input-progress.monaco-progress-container .progress-bit{height:2px}.quick-input-list{line-height:22px;margin-top:6px;padding:0 1px 1px}.quick-input-widget.hidden-input .quick-input-list{margin-top:0}.quick-input-list .monaco-list{max-height:440px;overflow:hidden}.quick-input-list .quick-input-list-entry{box-sizing:border-box;display:flex;height:100%;overflow:hidden;padding:0 6px}.quick-input-list .quick-input-list-entry.quick-input-list-separator-border{border-top-style:solid;border-top-width:1px}.quick-input-list .monaco-list-row[data-index="0"] .quick-input-list-entry.quick-input-list-separator-border{border-top-style:none}.quick-input-list .quick-input-list-label{display:flex;flex:1;height:100%;overflow:hidden}.quick-input-list .quick-input-list-checkbox{align-self:center;margin:0}.quick-input-list .quick-input-list-rows{display:flex;flex:1;flex-direction:column;height:100%;margin-left:5px;overflow:hidden;text-overflow:ellipsis}.quick-input-widget.show-checkboxes .quick-input-list .quick-input-list-rows{margin-left:10px}.quick-input-widget .quick-input-list .quick-input-list-checkbox{display:none}.quick-input-widget.show-checkboxes .quick-input-list .quick-input-list-checkbox{display:inline}.quick-input-list .quick-input-list-rows>.quick-input-list-row{align-items:center;display:flex}.quick-input-list .quick-input-list-rows>.quick-input-list-row .monaco-icon-label,.quick-input-list .quick-input-list-rows>.quick-input-list-row .monaco-icon-label .monaco-icon-label-container>.monaco-icon-name-container{flex:1}.quick-input-list .quick-input-list-rows>.quick-input-list-row .codicon[class*=codicon-]{vertical-align:text-bottom}.quick-input-list .quick-input-list-rows .monaco-highlighted-label span{opacity:1}.quick-input-list .quick-input-list-entry .quick-input-list-entry-keybinding{margin-right:8px}.quick-input-list .quick-input-list-label-meta{line-height:normal;opacity:.7;overflow:hidden;text-overflow:ellipsis}.quick-input-list .monaco-highlighted-label .highlight{font-weight:700}.quick-input-list .quick-input-list-entry .quick-input-list-separator{margin-right:8px}.quick-input-list .quick-input-list-entry-action-bar{display:flex;flex:0;overflow:visible}.quick-input-list .quick-input-list-entry-action-bar .action-label{display:none}.quick-input-list .quick-input-list-entry-action-bar .action-label.codicon{margin-right:4px;padding:0 2px 2px}.quick-input-list .quick-input-list-entry-action-bar{margin-right:4px;margin-top:1px}.quick-input-list .monaco-list-row.focused .quick-input-list-entry-action-bar .action-label,.quick-input-list .quick-input-list-entry .quick-input-list-entry-action-bar .action-label.always-visible,.quick-input-list .quick-input-list-entry:hover .quick-input-list-entry-action-bar .action-label{display:flex}.quick-input-list .monaco-list-row.focused .monaco-keybinding-key,.quick-input-list .monaco-list-row.focused .quick-input-list-entry .quick-input-list-separator{color:inherit}.quick-input-list .monaco-list-row.focused .monaco-keybinding-key{background:none}',""]),t.A=o},8551:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .inputarea{background-color:transparent;border:none;color:transparent;margin:0;min-height:0;min-width:0;outline:none!important;overflow:hidden;padding:0;position:absolute;resize:none}.monaco-editor .inputarea.ime-input{z-index:10}",""]),t.A=o},2335:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .blockDecorations-container{position:absolute;top:0}.monaco-editor .blockDecorations-block{box-sizing:border-box;position:absolute}",""]),t.A=o},8001:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .margin-view-overlays .current-line,.monaco-editor .view-overlays .current-line{box-sizing:border-box;display:block;left:0;position:absolute;top:0}.monaco-editor .margin-view-overlays .current-line.current-line-margin.current-line-margin-both{border-right:0}",""]),t.A=o},2577:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .lines-content .cdr{position:absolute}",""]),t.A=o},6477:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .glyph-margin{position:absolute;top:0}.monaco-editor .margin-view-overlays .cgmr{align-items:center;display:flex;justify-content:center;position:absolute}",""]),t.A=o},7021:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .lines-content .core-guide{box-sizing:border-box;position:absolute}",""]),t.A=o},8101:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .margin-view-overlays .line-numbers{box-sizing:border-box;cursor:default;display:inline-block;font-variant-numeric:tabular-nums;height:100%;position:absolute;text-align:right;vertical-align:middle}.monaco-editor .relative-current-line-number{display:inline-block;text-align:left;width:100%}.monaco-editor .margin-view-overlays .line-numbers.lh-odd{margin-top:1px}",""]),t.A=o},6888:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".mtkcontrol{background:#960000!important;color:#fff!important}.monaco-editor.no-user-select .lines-content,.monaco-editor.no-user-select .view-line,.monaco-editor.no-user-select .view-lines{-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none}.monaco-editor.enable-user-select{-moz-user-select:initial;user-select:auto;-webkit-user-select:initial;-ms-user-select:initial}.monaco-editor .view-lines{white-space:nowrap}.monaco-editor .view-line{position:absolute;width:100%}.monaco-editor .mtkz{display:inline-block}",""]),t.A=o},6651:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .lines-decorations{background:#fff;position:absolute;top:0}.monaco-editor .margin-view-overlays .cldr{height:100%;position:absolute}",""]),t.A=o},77:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .margin-view-overlays .cmdr{height:100%;left:0;position:absolute;width:100%}",""]),t.A=o},8633:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .minimap.slider-mouseover .minimap-slider{opacity:0;transition:opacity .1s linear}.monaco-editor .minimap.slider-mouseover .minimap-slider.active,.monaco-editor .minimap.slider-mouseover:hover .minimap-slider{opacity:1}.monaco-editor .minimap-shadow-hidden{position:absolute;width:0}.monaco-editor .minimap-shadow-visible{left:-6px;position:absolute;width:6px}.monaco-editor.no-minimap-shadow .minimap-shadow-visible{left:-1px;position:absolute;width:1px}.minimap.autohide{opacity:0;transition:opacity .5s}.minimap.autohide:hover{opacity:1}",""]),t.A=o},2433:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .overlayWidgets{left:0;position:absolute;top:0}",""]),t.A=o},3985:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .view-ruler{position:absolute;top:0}",""]),t.A=o},4713:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .scroll-decoration{height:6px;left:0;position:absolute;top:0}",""]),t.A=o},9865:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .lines-content .cslr{position:absolute}.monaco-editor\t\t\t.top-left-radius{border-top-left-radius:3px}.monaco-editor\t\t\t.bottom-left-radius{border-bottom-left-radius:3px}.monaco-editor\t\t\t.top-right-radius{border-top-right-radius:3px}.monaco-editor\t\t\t.bottom-right-radius{border-bottom-right-radius:3px}.monaco-editor.hc-black .top-left-radius{border-top-left-radius:0}.monaco-editor.hc-black .bottom-left-radius{border-bottom-left-radius:0}.monaco-editor.hc-black .top-right-radius{border-top-right-radius:0}.monaco-editor.hc-black .bottom-right-radius{border-bottom-right-radius:0}.monaco-editor.hc-light .top-left-radius{border-top-left-radius:0}.monaco-editor.hc-light .bottom-left-radius{border-bottom-left-radius:0}.monaco-editor.hc-light .top-right-radius{border-top-right-radius:0}.monaco-editor.hc-light .bottom-right-radius{border-bottom-right-radius:0}",""]),t.A=o},2269:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .cursors-layer{position:absolute;top:0}.monaco-editor .cursors-layer>.cursor{overflow:hidden;position:absolute}.monaco-editor .cursors-layer.cursor-smooth-caret-animation>.cursor{transition:all 80ms}.monaco-editor .cursors-layer.cursor-block-outline-style>.cursor{background:transparent!important;border-style:solid;border-width:1px;box-sizing:border-box}.monaco-editor .cursors-layer.cursor-underline-style>.cursor{background:transparent!important;border-bottom-style:solid;border-bottom-width:2px;box-sizing:border-box}.monaco-editor .cursors-layer.cursor-underline-thin-style>.cursor{background:transparent!important;border-bottom-style:solid;border-bottom-width:1px;box-sizing:border-box}@keyframes monaco-cursor-smooth{0%,20%{opacity:1}60%,to{opacity:0}}@keyframes monaco-cursor-phase{0%,20%{opacity:1}90%,to{opacity:0}}@keyframes monaco-cursor-expand{0%,20%{transform:scaleY(1)}80%,to{transform:scaleY(0)}}.cursor-smooth{animation:monaco-cursor-smooth .5s ease-in-out 0s 20 alternate}.cursor-phase{animation:monaco-cursor-phase .5s ease-in-out 0s 20 alternate}.cursor-expand>.cursor{animation:monaco-cursor-expand .5s ease-in-out 0s 20 alternate}",""]),t.A=o},208:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-diff-editor .diffOverview{z-index:9}.monaco-diff-editor .diffOverview .diffViewport{z-index:10}.monaco-diff-editor.vs\t\t\t.diffOverview{background:rgba(0,0,0,.03)}.monaco-diff-editor.vs-dark\t\t.diffOverview{background:hsla(0,0%,100%,.01)}.monaco-scrollable-element.modified-in-monaco-diff-editor.vs\t\t.scrollbar,.monaco-scrollable-element.modified-in-monaco-diff-editor.vs-dark\t.scrollbar{background:transparent}.monaco-scrollable-element.modified-in-monaco-diff-editor.hc-black\t.scrollbar,.monaco-scrollable-element.modified-in-monaco-diff-editor.hc-light\t.scrollbar{background:none}.monaco-scrollable-element.modified-in-monaco-diff-editor .slider{z-index:10}.modified-in-monaco-diff-editor\t\t\t\t.slider.active{background:hsla(0,0%,67%,.4)}.modified-in-monaco-diff-editor.hc-black\t.slider.active,.modified-in-monaco-diff-editor.hc-light\t.slider.active{background:none}.monaco-diff-editor .delete-sign,.monaco-diff-editor .insert-sign,.monaco-editor .delete-sign,.monaco-editor .insert-sign{align-items:center;display:flex!important;font-size:11px!important;opacity:.7!important}.monaco-diff-editor.hc-black .delete-sign,.monaco-diff-editor.hc-black .insert-sign,.monaco-diff-editor.hc-light .delete-sign,.monaco-diff-editor.hc-light .insert-sign,.monaco-editor.hc-black .delete-sign,.monaco-editor.hc-black .insert-sign,.monaco-editor.hc-light .delete-sign,.monaco-editor.hc-light .insert-sign{opacity:1}.monaco-editor .inline-added-margin-view-zone,.monaco-editor .inline-deleted-margin-view-zone{text-align:right}.monaco-editor .arrow-revert-change{position:absolute;z-index:10}.monaco-editor .arrow-revert-change:hover{cursor:pointer}.monaco-editor .view-zones .view-lines .view-line span{display:inline-block}.monaco-editor .margin-view-zones .lightbulb-glyph:hover{cursor:pointer}",""]),t.A=o},8407:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-diff-editor .diff-review-line-number{display:inline-block;text-align:right}.monaco-diff-editor .diff-review{position:absolute;-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none}.monaco-diff-editor .diff-review-summary{padding-left:10px}.monaco-diff-editor .diff-review-shadow{position:absolute}.monaco-diff-editor .diff-review-row{white-space:pre}.monaco-diff-editor .diff-review-table{display:table;min-width:100%}.monaco-diff-editor .diff-review-row{display:table-row;width:100%}.monaco-diff-editor .diff-review-spacer{display:inline-block;vertical-align:middle;width:10px}.monaco-diff-editor .diff-review-spacer>.codicon{font-size:9px!important}.monaco-diff-editor .diff-review-actions{display:inline-block;position:absolute;right:10px;top:2px}.monaco-diff-editor .diff-review-actions .action-label{height:16px;margin:2px 0;width:16px}",""]),t.A=o},4029:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,"::-ms-clear{display:none}.monaco-editor .editor-widget input{color:inherit}.monaco-editor{-webkit-text-size-adjust:100%;overflow:visible;position:relative}.monaco-editor .overflow-guard{overflow:hidden;position:relative}.monaco-editor .view-overlays{position:absolute;top:0}",""]),t.A=o},5031:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .selection-anchor{background-color:#007acc;width:2px!important}",""]),t.A=o},1713:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .bracket-match{box-sizing:border-box}",""]),t.A=o},4629:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .contentWidgets .codicon-light-bulb,.monaco-editor .contentWidgets .codicon-lightbulb-autofix{align-items:center;display:flex;justify-content:center}.monaco-editor .contentWidgets .codicon-light-bulb:hover,.monaco-editor .contentWidgets .codicon-lightbulb-autofix:hover{cursor:pointer}",""]),t.A=o},511:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,'.codeActionMenuWidget{background-color:var(--vscode-menu-background);border-color:none;border-radius:5px;border-width:0;box-shadow:0 2px 8px rgb(0,0,0,16%);color:var(--vscode-menu-foreground);display:block;font-size:13px;min-width:160px;overflow:auto;padding:8px 0;width:100%;z-index:40}.codeActionMenuWidget .monaco-list:not(.element-focused):focus:before{content:"";height:100%;left:0;outline:0 solid!important;outline-offset:0!important;outline-style:none!important;outline-width:0!important;pointer-events:none;position:absolute;top:0;width:100%;z-index:5}.codeActionMenuWidget .monaco-list{border:0!important;-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none}.codeActionMenuWidget .monaco-list .monaco-scrollable-element .monaco-list-rows{height:100%!important}.codeActionMenuWidget .monaco-list .monaco-scrollable-element{overflow:visible}.codeActionMenuWidget .monaco-list .monaco-list-row:not(.separator){background-position:2px 2px;background-repeat:no-repeat;-mox-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:flex;padding:0 26px;touch-action:none;white-space:nowrap;width:100%}.codeActionMenuWidget .monaco-list .monaco-list-row:hover:not(.option-disabled),.codeActionMenuWidget .monaco-list .moncao-list-row.focused:not(.option-disabled){background-color:var(--vscode-menu-selectionBackground)!important;color:var(--vscode-menu-selectionForeground)!important}.codeActionMenuWidget .monaco-list .option-disabled,.codeActionMenuWidget .monaco-list .option-disabled .focused{-webkit-touch-callout:none;color:var(--vscode-disabledForeground)!important;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.codeActionMenuWidget .monaco-list .separator{background-position:2px 2px;background-repeat:no-repeat;border-bottom:1px solid var(--vscode-menu-separatorBackground);border-radius:0;-mox-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:flex;font-size:inherit;height:0!important;margin:5px 0!important;opacity:1;padding-top:0!important;touch-action:none;white-space:nowrap;width:100%}',""]),t.A=o},8907:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .codelens-decoration{color:var(--vscode-editorCodeLens-foreground);display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.monaco-editor .codelens-decoration>a,.monaco-editor .codelens-decoration>span{-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none;vertical-align:sub;white-space:nowrap}.monaco-editor .codelens-decoration>a{text-decoration:none}.monaco-editor .codelens-decoration>a:hover{cursor:pointer}.monaco-editor .codelens-decoration>a:hover,.monaco-editor .codelens-decoration>a:hover .codicon{color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .codelens-decoration .codicon{color:currentColor!important;color:var(--vscode-editorCodeLens-foreground);vertical-align:middle}.monaco-editor .codelens-decoration>a:hover .codicon:before{cursor:pointer}@keyframes fadein{0%{opacity:0;visibility:visible}to{opacity:1}}.monaco-editor .codelens-decoration.fadein{animation:fadein .1s linear}",""]),t.A=o},3365:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,'.colorpicker-widget{height:190px;-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none}.colorpicker-color-decoration,.hc-light .colorpicker-color-decoration{border:.1em solid #000;box-sizing:border-box;cursor:pointer;display:inline-block;height:.8em;line-height:.8em;margin:.1em .2em 0;width:.8em}.hc-black .colorpicker-color-decoration,.vs-dark .colorpicker-color-decoration{border:.1em solid #eee}.colorpicker-header{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAHUlEQVQYV2PYvXu3JAi7uLiAMaYAjAGTQBPYLQkAa/0Zef3qRswAAAAASUVORK5CYII=");background-size:9px 9px;display:flex;height:24px;image-rendering:pixelated;position:relative}.colorpicker-header .picked-color{align-items:center;color:#fff;cursor:pointer;display:flex;flex:1;justify-content:center;line-height:24px;width:216px}.colorpicker-header .picked-color .codicon{color:inherit;font-size:14px;left:8px;position:absolute}.colorpicker-header .picked-color.light{color:#000}.colorpicker-header .original-color{cursor:pointer;width:74px;z-index:inherit}.colorpicker-body{display:flex;padding:8px;position:relative}.colorpicker-body .saturation-wrap{flex:1;height:150px;min-width:220px;overflow:hidden;position:relative}.colorpicker-body .saturation-box{height:150px;position:absolute}.colorpicker-body .saturation-selection{border:1px solid #fff;border-radius:100%;box-shadow:0 0 2px rgba(0,0,0,.8);height:9px;margin:-5px 0 0 -5px;position:absolute;width:9px}.colorpicker-body .strip{height:150px;width:25px}.colorpicker-body .hue-strip{background:linear-gradient(180deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red);cursor:grab;margin-left:8px;position:relative}.colorpicker-body .opacity-strip{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAHUlEQVQYV2PYvXu3JAi7uLiAMaYAjAGTQBPYLQkAa/0Zef3qRswAAAAASUVORK5CYII=");background-size:9px 9px;cursor:grab;image-rendering:pixelated;margin-left:8px;position:relative}.colorpicker-body .strip.grabbing{cursor:grabbing}.colorpicker-body .slider{border:1px solid hsla(0,0%,100%,.71);box-shadow:0 0 1px rgba(0,0,0,.85);box-sizing:border-box;height:4px;left:-2px;position:absolute;top:0;width:calc(100% + 4px)}.colorpicker-body .strip .overlay{height:150px;pointer-events:none}',""]),t.A=o},2239:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .find-widget{box-sizing:border-box;height:33px;line-height:19px;overflow:hidden;padding:0 4px;position:absolute;transform:translateY(calc(-100% - 10px));transition:transform .2s linear;z-index:35}.monaco-workbench.reduce-motion .monaco-editor .find-widget{transition:transform 0ms linear}.monaco-editor .find-widget textarea{margin:0}.monaco-editor .find-widget.hiddenEditor{display:none}.monaco-editor .find-widget.replaceToggled>.replace-part{display:flex}.monaco-editor .find-widget.visible{transform:translateY(0)}.monaco-editor .find-widget .monaco-inputbox.synthetic-focus{outline:1px solid -webkit-focus-ring-color;outline-offset:-1px}.monaco-editor .find-widget .monaco-inputbox .input{background-color:transparent;min-height:0}.monaco-editor .find-widget .monaco-findInput .input{font-size:13px}.monaco-editor .find-widget>.find-part,.monaco-editor .find-widget>.replace-part{display:flex;font-size:12px;margin:4px 0 0 17px}.monaco-editor .find-widget>.find-part .monaco-inputbox,.monaco-editor .find-widget>.replace-part .monaco-inputbox{min-height:25px}.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.mirror{padding-right:22px}.monaco-editor .find-widget>.find-part .monaco-inputbox>.ibwrapper>.input,.monaco-editor .find-widget>.find-part .monaco-inputbox>.ibwrapper>.mirror,.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.input,.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.mirror{padding-bottom:2px;padding-top:2px}.monaco-editor .find-widget>.find-part .find-actions,.monaco-editor .find-widget>.replace-part .replace-actions{align-items:center;display:flex;height:25px}.monaco-editor .find-widget .monaco-findInput{display:flex;flex:1;vertical-align:middle}.monaco-editor .find-widget .monaco-findInput .monaco-scrollable-element{width:100%}.monaco-editor .find-widget .monaco-findInput .monaco-scrollable-element .scrollbar.vertical{opacity:0}.monaco-editor .find-widget .matchesCount{box-sizing:border-box;display:flex;flex:initial;height:25px;line-height:23px;margin:0 0 0 3px;padding:2px 0 0 2px;text-align:center;vertical-align:middle}.monaco-editor .find-widget .button{align-items:center;background-position:50%;background-repeat:no-repeat;border-radius:5px;cursor:pointer;display:flex;flex:initial;height:16px;justify-content:center;margin-left:3px;padding:3px;width:16px}.monaco-editor .find-widget .codicon-find-selection{border-radius:5px;height:22px;padding:3px;width:22px}.monaco-editor .find-widget .button.left{margin-left:0;margin-right:3px}.monaco-editor .find-widget .button.wide{padding:1px 6px;top:-1px;width:auto}.monaco-editor .find-widget .button.toggle{border-radius:0;box-sizing:border-box;height:100%;left:3px;position:absolute;top:0;width:18px}.monaco-editor .find-widget .button.toggle.disabled{display:none}.monaco-editor .find-widget .disabled{color:var(--vscode-disabledForeground);cursor:default}.monaco-editor .find-widget>.replace-part{display:none}.monaco-editor .find-widget>.replace-part>.monaco-findInput{display:flex;flex:auto;flex-grow:0;flex-shrink:0;position:relative;vertical-align:middle}.monaco-editor .find-widget>.replace-part>.monaco-findInput>.controls{position:absolute;right:2px;top:3px}.monaco-editor .find-widget.reduced-find-widget .matchesCount{display:none}.monaco-editor .find-widget.narrow-find-widget{max-width:257px!important}.monaco-editor .find-widget.collapsed-find-widget{max-width:170px!important}.monaco-editor .find-widget.collapsed-find-widget .button.next,.monaco-editor .find-widget.collapsed-find-widget .button.previous,.monaco-editor .find-widget.collapsed-find-widget .button.replace,.monaco-editor .find-widget.collapsed-find-widget .button.replace-all,.monaco-editor .find-widget.collapsed-find-widget>.find-part .monaco-findInput .controls{display:none}.monaco-editor .findMatch{animation-duration:0;animation-name:inherit!important}.monaco-editor .find-widget .monaco-sash{left:0!important}.monaco-editor.hc-black .find-widget .button:before{left:2px;position:relative;top:1px}",""]),t.A=o},7121:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,'.monaco-editor .margin-view-overlays .codicon-folding-collapsed,.monaco-editor .margin-view-overlays .codicon-folding-expanded,.monaco-editor .margin-view-overlays .codicon-folding-manual-collapsed,.monaco-editor .margin-view-overlays .codicon-folding-manual-expanded{align-items:center;cursor:pointer;display:flex;font-size:140%;justify-content:center;margin-left:2px;opacity:0;transition:opacity .5s}.monaco-editor .margin-view-overlays .codicon.alwaysShowFoldIcons,.monaco-editor .margin-view-overlays .codicon.codicon-folding-collapsed,.monaco-editor .margin-view-overlays .codicon.codicon-folding-manual-collapsed,.monaco-editor .margin-view-overlays:hover .codicon{opacity:1}.monaco-editor .inline-folded:after{color:grey;content:"⋯";cursor:pointer;display:inline;line-height:1em;margin:.1em .2em 0}',""]),t.A=o},8120:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,'.monaco-editor .peekview-widget .head .peekview-title .severity-icon{display:inline-block;margin-right:4px;vertical-align:text-top}.monaco-editor .marker-widget{text-overflow:ellipsis;white-space:nowrap}.monaco-editor .marker-widget>.stale{font-style:italic;opacity:.6}.monaco-editor .marker-widget .title{display:inline-block;padding-right:5px}.monaco-editor .marker-widget .descriptioncontainer{padding:8px 12px 0 20px;position:absolute;-moz-user-select:text;user-select:text;-webkit-user-select:text;-ms-user-select:text;white-space:pre}.monaco-editor .marker-widget .descriptioncontainer .message{display:flex;flex-direction:column}.monaco-editor .marker-widget .descriptioncontainer .message .details{padding-left:6px}.monaco-editor .marker-widget .descriptioncontainer .message .source,.monaco-editor .marker-widget .descriptioncontainer .message span.code{opacity:.6}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link{color:inherit;opacity:.6}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link:before{content:"("}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link:after{content:")"}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link>span{border-bottom:1px solid transparent;color:var(--vscode-textLink-foreground);color:var(--vscode-textLink-activeForeground);text-decoration:underline;text-underline-position:under}.monaco-editor .marker-widget .descriptioncontainer .filename{cursor:pointer}',""]),t.A=o},2939:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .goto-definition-link{cursor:pointer;text-decoration:underline}",""]),t.A=o},6494:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .zone-widget .zone-widget-container.reference-zone-widget{border-bottom-width:1px;border-top-width:1px}.monaco-editor .reference-zone-widget .inline{display:inline-block;vertical-align:top}.monaco-editor .reference-zone-widget .messages{height:100%;padding:3em 0;text-align:center;width:100%}.monaco-editor .reference-zone-widget .ref-tree{background-color:var(--vscode-peekViewResult-background);color:var(--vscode-peekViewResult-lineForeground);line-height:23px}.monaco-editor .reference-zone-widget .ref-tree .reference{overflow:hidden;text-overflow:ellipsis}.monaco-editor .reference-zone-widget .ref-tree .reference-file{color:var(--vscode-peekViewResult-fileForeground);display:inline-flex;height:100%;width:100%}.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .selected .reference-file{color:inherit!important}.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .monaco-list-rows>.monaco-list-row.selected:not(.highlighted){background-color:var(--vscode-peekViewResult-selectionBackground);color:var(--vscode-peekViewResult-selectionForeground)!important}.monaco-editor .reference-zone-widget .ref-tree .reference-file .count{margin-left:auto;margin-right:12px}.monaco-editor .reference-zone-widget .ref-tree .referenceMatch .highlight{background-color:var(--vscode-peekViewResult-matchHighlightBackground)}.monaco-editor .reference-zone-widget .preview .reference-decoration{background-color:var(--vscode-peekViewEditor-matchHighlightBackground);border:2px solid var(--vscode-peekViewEditor-matchHighlightBorder);box-sizing:border-box}.monaco-editor .reference-zone-widget .preview .monaco-editor .inputarea.ime-input,.monaco-editor .reference-zone-widget .preview .monaco-editor .monaco-editor-background{background-color:var(--vscode-peekViewEditor-background)}.monaco-editor .reference-zone-widget .preview .monaco-editor .margin{background-color:var(--vscode-peekViewEditorGutter-background)}.monaco-editor.hc-black .reference-zone-widget .ref-tree .reference-file,.monaco-editor.hc-light .reference-zone-widget .ref-tree .reference-file{font-weight:700}.monaco-editor.hc-black .reference-zone-widget .ref-tree .referenceMatch .highlight,.monaco-editor.hc-light .reference-zone-widget .ref-tree .referenceMatch .highlight{border:1px dotted var(--vscode-contrastActiveBorder,transparent);box-sizing:border-box}",""]),t.A=o},8317:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .detected-link,.monaco-editor .detected-link-active{text-decoration:underline;text-underline-position:under}.monaco-editor .detected-link-active{cursor:pointer}",""]),t.A=o},2541:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .monaco-editor-overlaymessage{padding-bottom:8px;z-index:10000}.monaco-editor .monaco-editor-overlaymessage.below{padding-bottom:0;padding-top:8px;z-index:10000}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.monaco-editor .monaco-editor-overlaymessage.fadeIn{animation:fadeIn .15s ease-out}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.monaco-editor .monaco-editor-overlaymessage.fadeOut{animation:fadeOut .1s ease-out}.monaco-editor .monaco-editor-overlaymessage .message{background-color:var(--vscode-inputValidation-infoBackground);border:1px solid var(--vscode-inputValidation-infoBorder);color:var(--vscode-inputValidation-infoForeground);padding:1px 4px}.monaco-editor.hc-black .monaco-editor-overlaymessage .message,.monaco-editor.hc-light .monaco-editor-overlaymessage .message{border-width:2px}.monaco-editor .monaco-editor-overlaymessage .anchor{border:8px solid transparent;height:0!important;position:absolute;width:0!important;z-index:1000}.monaco-editor .monaco-editor-overlaymessage .anchor.top{border-bottom-color:var(--vscode-inputValidation-infoBorder)}.monaco-editor .monaco-editor-overlaymessage .anchor.below{border-top-color:var(--vscode-inputValidation-infoBorder)}.monaco-editor .monaco-editor-overlaymessage.below .anchor.below,.monaco-editor .monaco-editor-overlaymessage:not(.below) .anchor.top{display:none}.monaco-editor .monaco-editor-overlaymessage.below .anchor.top{display:inherit;top:-8px}",""]),t.A=o},163:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .parameter-hints-widget{cursor:default;display:flex;flex-direction:column;line-height:1.5em;z-index:39}.monaco-editor .parameter-hints-widget>.phwrapper{display:flex;flex-direction:row;max-width:440px}.monaco-editor .parameter-hints-widget.multiple{min-height:3.3em;padding:0}.monaco-editor .parameter-hints-widget.visible{transition:left .05s ease-in-out}.monaco-editor .parameter-hints-widget p,.monaco-editor .parameter-hints-widget ul{margin:8px 0}.monaco-editor .parameter-hints-widget .body,.monaco-editor .parameter-hints-widget .monaco-scrollable-element{display:flex;flex:1;flex-direction:column;min-height:100%}.monaco-editor .parameter-hints-widget .signature{padding:4px 5px}.monaco-editor .parameter-hints-widget .docs{padding:0 10px 0 5px;white-space:pre-wrap}.monaco-editor .parameter-hints-widget .docs.empty{display:none}.monaco-editor .parameter-hints-widget .docs .markdown-docs{white-space:normal}.monaco-editor .parameter-hints-widget .docs .markdown-docs a:hover{cursor:pointer}.monaco-editor .parameter-hints-widget .docs .markdown-docs code{font-family:var(--monaco-monospace-font)}.monaco-editor .parameter-hints-widget .docs .code,.monaco-editor .parameter-hints-widget .docs .monaco-tokenized-source{white-space:pre-wrap}.monaco-editor .parameter-hints-widget .docs code{border-radius:3px;padding:0 .4em}.monaco-editor .parameter-hints-widget .controls{align-items:center;display:none;flex-direction:column;justify-content:flex-end;min-width:22px}.monaco-editor .parameter-hints-widget.multiple .controls{display:flex;padding:0 2px}.monaco-editor .parameter-hints-widget.multiple .button{background-repeat:no-repeat;cursor:pointer;height:16px;width:16px}.monaco-editor .parameter-hints-widget .button.previous{bottom:24px}.monaco-editor .parameter-hints-widget .overloads{font-family:var(--monaco-monospace-font);height:12px;line-height:12px;text-align:center}.monaco-editor .parameter-hints-widget .signature .parameter.active{font-weight:700}.monaco-editor .parameter-hints-widget .documentation-parameter>.parameter{font-weight:700;margin-right:.5em}",""]),t.A=o},226:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,'.monaco-editor .peekview-widget .head{box-sizing:border-box;display:flex;flex-wrap:nowrap;justify-content:space-between}.monaco-editor .peekview-widget .head .peekview-title{align-items:center;display:flex;font-size:13px;margin-left:20px;min-width:0;overflow:hidden;text-overflow:ellipsis}.monaco-editor .peekview-widget .head .peekview-title.clickable{cursor:pointer}.monaco-editor .peekview-widget .head .peekview-title .dirname:not(:empty){font-size:.9em;margin-left:.5em;overflow:hidden;text-overflow:ellipsis}.monaco-editor .peekview-widget .head .peekview-title .meta{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.monaco-editor .peekview-widget .head .peekview-title .dirname{white-space:nowrap}.monaco-editor .peekview-widget .head .peekview-title .filename{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.monaco-editor .peekview-widget .head .peekview-title .meta:not(:empty):before{content:"-";padding:0 .3em}.monaco-editor .peekview-widget .head .peekview-actions{flex:1;padding-right:2px;text-align:right}.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar{display:inline-block}.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar,.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar>.actions-container{height:100%}.monaco-editor .peekview-widget>.body{border-top:1px solid;position:relative}.monaco-editor .peekview-widget .head .peekview-title .codicon{margin-right:4px}.monaco-editor .peekview-widget .monaco-list .monaco-list-row.focused .codicon{color:inherit!important}',""]),t.A=o},4958:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .rename-box{color:inherit;z-index:100}.monaco-editor .rename-box.preview{padding:3px 3px 0}.monaco-editor .rename-box .rename-input{padding:3px;width:calc(100% - 6px)}.monaco-editor .rename-box .rename-label{display:none;opacity:.8}.monaco-editor .rename-box.preview .rename-label{display:inherit}",""]),t.A=o},8585:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .snippet-placeholder{background-color:var(--vscode-editor-snippetTabstopHighlightBackground,transparent);min-width:2px;outline-color:var(--vscode-editor-snippetTabstopHighlightBorder,transparent);outline-style:solid;outline-width:1px}.monaco-editor .finish-snippet-placeholder{background-color:var(--vscode-editor-snippetFinalTabstopHighlightBackground,transparent);outline-color:var(--vscode-editor-snippetFinalTabstopHighlightBorder,transparent);outline-style:solid;outline-width:1px}",""]),t.A=o},7484:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,'.monaco-editor .suggest-widget{display:flex;flex-direction:column;width:430px;z-index:40}.monaco-editor .suggest-widget.message{align-items:center;flex-direction:row}.monaco-editor .suggest-details,.monaco-editor .suggest-widget{background-color:var(--vscode-editorSuggestWidget-background);border-color:var(--vscode-editorSuggestWidget-border);border-style:solid;border-width:1px;flex:0 1 auto;width:100%}.monaco-editor.hc-black .suggest-details,.monaco-editor.hc-black .suggest-widget,.monaco-editor.hc-light .suggest-details,.monaco-editor.hc-light .suggest-widget{border-width:2px}.monaco-editor .suggest-widget .suggest-status-bar{border-top:1px solid var(--vscode-editorSuggestWidget-border);box-sizing:border-box;display:none;flex-flow:row nowrap;font-size:80%;justify-content:space-between;overflow:hidden;padding:0 4px;width:100%}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar{display:flex}.monaco-editor .suggest-widget .suggest-status-bar .left{padding-right:8px}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-label{color:var(--vscode-editorSuggestWidgetStatus-foreground)}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-item:not(:last-of-type) .action-label{margin-right:0}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-item:not(:last-of-type) .action-label:after{content:", ";margin-right:.3em}.monaco-editor .suggest-widget.with-status-bar .monaco-list .monaco-list-row.focused.string-label>.contents>.main>.right>.readMore,.monaco-editor .suggest-widget.with-status-bar .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:none}.monaco-editor .suggest-widget.with-status-bar:not(.docs-side) .monaco-list .monaco-list-row:hover>.contents>.main>.right.can-expand-details>.details-label{width:100%}.monaco-editor .suggest-widget>.message{padding-left:22px}.monaco-editor .suggest-widget>.tree{height:100%;width:100%}.monaco-editor .suggest-widget .monaco-list{-moz-user-select:none;user-select:none;-webkit-user-select:none;-ms-user-select:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row{background-position:2px 2px;background-repeat:no-repeat;-mox-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:flex;padding-right:10px;touch-action:none;white-space:nowrap}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused{color:var(--vscode-editorSuggestWidget-selectedForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused .codicon{color:var(--vscode-editorSuggestWidget-selectedIconForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents{flex:1;height:100%;overflow:hidden;padding-left:2px}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main{display:flex;justify-content:space-between;overflow:hidden;text-overflow:ellipsis;white-space:pre}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right{display:flex}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.focused)>.contents>.main .monaco-icon-label{color:var(--vscode-editorSuggestWidget-foreground)}.monaco-editor .suggest-widget:not(.frozen) .monaco-highlighted-label .highlight{font-weight:700}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main .monaco-highlighted-label .highlight{color:var(--vscode-editorSuggestWidget-highlightForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused>.contents>.main .monaco-highlighted-label .highlight{color:var(--vscode-editorSuggestWidget-focusHighlightForeground)}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore:before{color:inherit;cursor:pointer;font-size:14px;opacity:1}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close{position:absolute;right:2px;top:6px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close:hover,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore:hover{opacity:1}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{opacity:.7}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.signature-label{opacity:.6;overflow:hidden;text-overflow:ellipsis}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.qualifier-label{align-self:center;font-size:85%;line-height:normal;margin-left:12px;opacity:.4;overflow:hidden;text-overflow:ellipsis}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{font-size:85%;margin-left:1.1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label>.monaco-tokenized-source{display:inline}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.string-label)>.contents>.main>.right>.details-label,.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row.focused:not(.string-label)>.contents>.main>.right>.details-label,.monaco-editor .suggest-widget:not(.shows-details) .monaco-list .monaco-list-row.focused>.contents>.main>.right>.details-label{display:inline}.monaco-editor .suggest-widget:not(.docs-side) .monaco-list .monaco-list-row.focused:hover>.contents>.main>.right.can-expand-details>.details-label{width:calc(100% - 26px)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left{flex-grow:1;flex-shrink:1;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.monaco-icon-label{flex-shrink:0}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.string-label)>.contents>.main>.left>.monaco-icon-label{max-width:100%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.string-label>.contents>.main>.left>.monaco-icon-label{flex-shrink:1}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right{flex-shrink:4;max-width:70%;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:inline-block;height:18px;position:absolute;right:10px;visibility:hidden;width:18px}.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:none!important}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.string-label>.contents>.main>.right>.readMore{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused.string-label>.contents>.main>.right>.readMore{display:inline-block}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused:hover>.contents>.main>.right>.readMore{visibility:visible}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label.deprecated{opacity:.66;text-decoration:unset}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label.deprecated>.monaco-icon-label-container>.monaco-icon-name-container{text-decoration:line-through}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label:before{height:100%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon{background-position:50%;background-repeat:no-repeat;background-size:80%;display:block;height:16px;margin-left:2px;width:16px}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.hide{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon{align-items:center;display:flex;margin-right:4px}.monaco-editor .suggest-widget.no-icons .monaco-list .monaco-list-row .icon,.monaco-editor .suggest-widget.no-icons .monaco-list .monaco-list-row .suggest-icon:before{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.customcolor .colorspan{border:.1em solid #000;display:inline-block;height:.7em;margin:0 0 0 .3em;width:.7em}.monaco-editor .suggest-details-container{z-index:41}.monaco-editor .suggest-details{color:var(--vscode-editorSuggestWidget-foreground);cursor:default;display:flex;flex-direction:column}.monaco-editor .suggest-details.focused{border-color:var(--vscode-focusBorder)}.monaco-editor .suggest-details a{color:var(--vscode-textLink-foreground)}.monaco-editor .suggest-details a:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor .suggest-details code{background-color:var(--vscode-textCodeBlock-background)}.monaco-editor .suggest-details.no-docs{display:none}.monaco-editor .suggest-details>.monaco-scrollable-element{flex:1}.monaco-editor .suggest-details>.monaco-scrollable-element>.body{box-sizing:border-box;height:100%;width:100%}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.type{flex:2;margin:0 24px 0 0;opacity:.7;overflow:hidden;padding:4px 0 12px 5px;text-overflow:ellipsis;white-space:pre}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.type.auto-wrap{white-space:normal;word-break:break-all}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs{margin:0;padding:4px 5px;white-space:pre-wrap}.monaco-editor .suggest-details.no-type>.monaco-scrollable-element>.body>.docs{margin-right:24px;overflow:hidden}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs{min-height:calc(1rem + 8px);padding:0;white-space:normal}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div,.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>span:not(:empty){padding:4px 5px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div>p:first-child{margin-top:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div>p:last-child{margin-bottom:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs .monaco-tokenized-source{white-space:pre}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs .code{word-wrap:break-word;white-space:pre-wrap}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs .codicon{vertical-align:sub}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>p:empty{display:none}.monaco-editor .suggest-details code{border-radius:3px;padding:0 .4em}.monaco-editor .suggest-details ol,.monaco-editor .suggest-details ul{padding-left:20px}.monaco-editor .suggest-details p code{font-family:var(--monaco-monospace-font)}',""]),t.A=o},3389:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-editor .zone-widget{position:absolute;z-index:10}.monaco-editor .zone-widget .zone-widget-container{border-bottom-style:solid;border-bottom-width:0;border-top-style:solid;border-top-width:0;position:relative}",""]),t.A=o},170:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".quick-input-widget{font-size:13px}.quick-input-widget .monaco-highlighted-label .highlight{color:#0066bf}.vs .quick-input-widget .monaco-list-row.focused .monaco-highlighted-label .highlight{color:#9dddff}.vs-dark .quick-input-widget .monaco-highlighted-label .highlight{color:#0097fb}.hc-black .quick-input-widget .monaco-highlighted-label .highlight{color:#f38518}.hc-light .quick-input-widget .monaco-highlighted-label .highlight{color:#0f4a85}.monaco-keybinding>.monaco-keybinding-key{background-color:hsla(0,0%,87%,.4);border:1px solid hsla(0,0%,80%,.4);border-bottom-color:hsla(0,0%,73%,.4);box-shadow:inset 0 -1px 0 hsla(0,0%,73%,.4);color:#555}.hc-black .monaco-keybinding>.monaco-keybinding-key{background-color:transparent;border:1px solid #6fc3df;box-shadow:none;color:#fff}.hc-light .monaco-keybinding>.monaco-keybinding-key{background-color:transparent;border:1px solid #0f4a85;box-shadow:none;color:#292929}.vs-dark .monaco-keybinding>.monaco-keybinding-key{background-color:hsla(0,0%,50%,.17);border:1px solid rgba(51,51,51,.6);border-bottom-color:rgba(68,68,68,.6);box-shadow:inset 0 -1px 0 rgba(68,68,68,.6);color:#ccc}",""]),t.A=o},6514:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,'.monaco-editor{--monaco-monospace-font:"SF Mono",Monaco,Menlo,Consolas,"Ubuntu Mono","Liberation Mono","DejaVu Sans Mono","Courier New",monospace;font-family:-apple-system,BlinkMacSystemFont,Segoe WPC,Segoe UI,HelveticaNeue-Light,system-ui,Ubuntu,Droid Sans,sans-serif}.monaco-editor.hc-black .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.hc-light .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.vs-dark .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-menu .monaco-action-bar.vertical .action-item .action-menu-item:focus .action-label{stroke-width:1.2px}.monaco-hover p{margin:0}.monaco-aria-container{clip:rect(1px,1px,1px,1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute!important;top:0;width:1px}.monaco-editor.hc-black,.monaco-editor.hc-light{-ms-high-contrast-adjust:none}@media screen and (-ms-high-contrast:active){.monaco-editor.vs .view-overlays .current-line,.monaco-editor.vs-dark .view-overlays .current-line{border-color:windowtext!important;border-left:0;border-right:0}.monaco-editor.vs .cursor,.monaco-editor.vs-dark .cursor{background-color:windowtext!important}.monaco-editor.vs .dnd-target,.monaco-editor.vs-dark .dnd-target{border-color:windowtext!important}.monaco-editor.vs .selected-text,.monaco-editor.vs-dark .selected-text{background-color:highlight!important}.monaco-editor.vs .view-line,.monaco-editor.vs-dark .view-line{-ms-high-contrast-adjust:none}.monaco-editor.vs .view-line span,.monaco-editor.vs-dark .view-line span{color:windowtext!important}.monaco-editor.vs .view-line span.inline-selected-text,.monaco-editor.vs-dark .view-line span.inline-selected-text{color:highlighttext!important}.monaco-editor.vs .view-overlays,.monaco-editor.vs-dark .view-overlays{-ms-high-contrast-adjust:none}.monaco-editor.vs .reference-decoration,.monaco-editor.vs .selectionHighlight,.monaco-editor.vs .wordHighlight,.monaco-editor.vs .wordHighlightStrong,.monaco-editor.vs-dark .reference-decoration,.monaco-editor.vs-dark .selectionHighlight,.monaco-editor.vs-dark .wordHighlight,.monaco-editor.vs-dark .wordHighlightStrong{background:transparent!important;border:2px dotted highlight!important;box-sizing:border-box}.monaco-editor.vs .rangeHighlight,.monaco-editor.vs-dark .rangeHighlight{background:transparent!important;border:1px dotted activeborder!important;box-sizing:border-box}.monaco-editor.vs .bracket-match,.monaco-editor.vs-dark .bracket-match{background:transparent!important;border-color:windowtext!important}.monaco-editor.vs .currentFindMatch,.monaco-editor.vs .findMatch,.monaco-editor.vs-dark .currentFindMatch,.monaco-editor.vs-dark .findMatch{background:transparent!important;border:2px dotted activeborder!important;box-sizing:border-box}.monaco-editor.vs .find-widget,.monaco-editor.vs-dark .find-widget{border:1px solid windowtext}.monaco-editor.vs .monaco-list .monaco-list-row,.monaco-editor.vs-dark .monaco-list .monaco-list-row{-ms-high-contrast-adjust:none;color:windowtext!important}.monaco-editor.vs .monaco-list .monaco-list-row.focused,.monaco-editor.vs-dark .monaco-list .monaco-list-row.focused{background-color:highlight!important;color:highlighttext!important}.monaco-editor.vs .monaco-list .monaco-list-row:hover,.monaco-editor.vs-dark .monaco-list .monaco-list-row:hover{background:transparent!important;border:1px solid highlight;box-sizing:border-box}.monaco-editor.vs .monaco-scrollable-element>.scrollbar,.monaco-editor.vs-dark .monaco-scrollable-element>.scrollbar{-ms-high-contrast-adjust:none;background:background!important;border:1px solid windowtext;box-sizing:border-box}.monaco-editor.vs .monaco-scrollable-element>.scrollbar>.slider,.monaco-editor.vs-dark .monaco-scrollable-element>.scrollbar>.slider{background:windowtext!important}.monaco-editor.vs .monaco-scrollable-element>.scrollbar>.slider.active,.monaco-editor.vs .monaco-scrollable-element>.scrollbar>.slider:hover,.monaco-editor.vs-dark .monaco-scrollable-element>.scrollbar>.slider.active,.monaco-editor.vs-dark .monaco-scrollable-element>.scrollbar>.slider:hover{background:highlight!important}.monaco-editor.vs .decorationsOverviewRuler,.monaco-editor.vs-dark .decorationsOverviewRuler{opacity:0}.monaco-editor.vs .minimap,.monaco-editor.vs-dark .minimap{display:none}.monaco-editor.vs .squiggly-d-error,.monaco-editor.vs-dark .squiggly-d-error{background:transparent!important;border-bottom:4px double #e47777}.monaco-editor.vs .squiggly-b-info,.monaco-editor.vs .squiggly-c-warning,.monaco-editor.vs-dark .squiggly-b-info,.monaco-editor.vs-dark .squiggly-c-warning{border-bottom:4px double #71b771}.monaco-editor.vs .squiggly-a-hint,.monaco-editor.vs-dark .squiggly-a-hint{border-bottom:4px double #6c6c6c}.monaco-editor.vs .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.vs-dark .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label{-ms-high-contrast-adjust:none;background-color:highlight!important;color:highlighttext!important}.monaco-editor.vs .monaco-menu .monaco-action-bar.vertical .action-menu-item:hover .action-label,.monaco-editor.vs-dark .monaco-menu .monaco-action-bar.vertical .action-menu-item:hover .action-label{-ms-high-contrast-adjust:none;background:transparent!important;border:1px solid highlight;box-sizing:border-box}.monaco-diff-editor.vs .diffOverviewRuler,.monaco-diff-editor.vs-dark .diffOverviewRuler{display:none}.monaco-editor.vs .line-delete,.monaco-editor.vs .line-insert,.monaco-editor.vs-dark .line-delete,.monaco-editor.vs-dark .line-insert{background:transparent!important;border:1px solid highlight!important;box-sizing:border-box}.monaco-editor.vs .char-delete,.monaco-editor.vs .char-insert,.monaco-editor.vs-dark .char-delete,.monaco-editor.vs-dark .char-insert{background:transparent!important}}',""]),t.A=o},7619:function(e,t,i){"use strict";var n=i(186),o=i.n(n)()(function(e){return e[1]});o.push([e.id,".monaco-action-bar .action-item.menu-entry .action-label.icon{background-position:50%;background-repeat:no-repeat;background-size:16px;height:16px;width:16px}.monaco-dropdown-with-default{border-radius:5px;display:flex!important;flex-direction:row}.monaco-dropdown-with-default>.action-container>.action-label{margin-right:0}.monaco-dropdown-with-default>.action-container.menu-entry>.action-label.icon{background-position:50%;background-repeat:no-repeat;background-size:16px;height:16px;width:16px}.monaco-dropdown-with-default>.dropdown-action-container>.monaco-dropdown>.dropdown-label .codicon[class*=codicon-]{font-size:12px;line-height:16px;margin-left:-3px;padding-left:0;padding-right:0}.monaco-dropdown-with-default>.dropdown-action-container>.monaco-dropdown>.dropdown-label>.action-label{background-position:50%;background-repeat:no-repeat;background-size:16px;display:block}",""]),t.A=o},186:function(e){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var i=e(t);return t[2]?"@media ".concat(t[2]," {").concat(i,"}"):i}).join("")},t.i=function(e,i,n){"string"==typeof e&&(e=[[null,e,""]]);var o={};if(n)for(var s=0;s0;){10===e.charCodeAt(o)?(o++,s++,r=0):(o++,r++),t--}}function l(e){null===i?o=e:a(e-o)}function h(){for(;o0&&65279===e.charCodeAt(0)&&(o=1);var g=0,p=null,m=[],f=[],_=null;function v(e,t){m.push(g),f.push(p),g=e,p=t}function b(){if(0===m.length)return w("illegal state stack");g=m.pop(),p=f.pop()}function w(t){throw new Error("Near offset "+o+": "+t+" ~~~"+e.substr(o,50)+"~~~")}var C=function(){if(null===_)return w("missing ");var e={};null!==i&&(e[i]={filename:t,line:s,char:r}),p[_]=e,_=null,v(1,e)},y=function(){if(null===_)return w("missing ");var e=[];p[_]=e,_=null,v(2,e)},S=function(){var e={};null!==i&&(e[i]={filename:t,line:s,char:r}),p.push(e),v(1,e)},k=function(){var e=[];p.push(e),v(2,e)};function L(){1===g?C():2===g?S():(p={},null!==i&&(p[i]={filename:t,line:s,char:r}),v(1,p))}function x(){if(1!==g)return w("unexpected ");b()}function D(){1===g?y():2===g?k():v(2,p=[])}function E(){return 1===g||2!==g?w("unexpected "):void b()}function N(e){return 1!==g?w("unexpected "):null!==_?w("too many "):void(_=e)}function I(e){if(1===g){if(null===_)return w("missing ");p[_]=e,_=null}else 2===g?p.push(e):p=e}function M(e){if(isNaN(e))return w("cannot parse float");if(1===g){if(null===_)return w("missing ");p[_]=e,_=null}else 2===g?p.push(e):p=e}function T(e){if(isNaN(e))return w("cannot parse integer");if(1===g){if(null===_)return w("missing ");p[_]=e,_=null}else 2===g?p.push(e):p=e}function A(e){if(1===g){if(null===_)return w("missing ");p[_]=e,_=null}else 2===g?p.push(e):p=e}function O(e){if(1===g){if(null===_)return w("missing ");p[_]=e,_=null}else 2===g?p.push(e):p=e}function R(e){if(1===g){if(null===_)return w("missing ");p[_]=e,_=null}else 2===g?p.push(e):p=e}function P(){var e=u(">"),t=!1;return 47===e.charCodeAt(e.length-1)&&(t=!0,e=e.substring(0,e.length-1)),{name:e.trim(),isClosed:t}}function F(e){if(e.isClosed)return"";var t=u(""),t.replace(/&#([0-9]+);/g,function(e,t){return String.fromCodePoint(parseInt(t,10))}).replace(/&#x([0-9a-f]+);/g,function(e,t){return String.fromCodePoint(parseInt(t,16))}).replace(/&|<|>|"|'/g,function(e){switch(e){case"&":return"&";case"<":return"<";case">":return">";case""":return'"';case"'":return"'"}return e})}for(;o=n));){var B=e.charCodeAt(o);if(a(1),60!==B)return w("expected <");if(o>=n)return w("unexpected end of input");var V=e.charCodeAt(o);if(63!==V)if(33!==V){if(47===V){if(a(1),h(),d("plist")){c(">");continue}if(d("dict")){c(">"),x();continue}if(d("array")){c(">"),E();continue}return w("unexpected closed tag")}var W=P();switch(W.name){case"dict":L(),W.isClosed&&x();continue;case"array":D(),W.isClosed&&E();continue;case"key":N(F(W));continue;case"string":I(F(W));continue;case"real":M(parseFloat(F(W)));continue;case"integer":T(parseInt(F(W),10));continue;case"date":A(new Date(F(W)));continue;case"data":O(F(W));continue;case"true":F(W),R(!0);continue;case"false":F(W),R(!1);continue}if(!/^plist/.test(W.name))return w("unexpected opened tag "+W.name)}else{if(a(1),d("--")){c("--\x3e");continue}c(">")}else a(1),c("?>")}return p}t.qg=void 0,t.qg=function(e){return i(e,null,null)}},4331:function(e,t){ +/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ +t.read=function(e,t,i,n,o){var s,r,a=8*o-n-1,l=(1<>1,d=-7,c=i?o-1:0,u=i?-1:1,g=e[t+c];for(c+=u,s=g&(1<<-d)-1,g>>=-d,d+=a;d>0;s=256*s+e[t+c],c+=u,d-=8);for(r=s&(1<<-d)-1,s>>=-d,d+=n;d>0;r=256*r+e[t+c],c+=u,d-=8);if(0===s)s=1-h;else{if(s===l)return r?NaN:1/0*(g?-1:1);r+=Math.pow(2,n),s-=h}return(g?-1:1)*r*Math.pow(2,s-n)},t.write=function(e,t,i,n,o,s){var r,a,l,h=8*s-o-1,d=(1<>1,u=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,g=n?0:s-1,p=n?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,r=d):(r=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-r))<1&&(r--,l*=2),(t+=r+c>=1?u/l:u*Math.pow(2,1-c))*l>=2&&(r++,l/=2),r+c>=d?(a=0,r=d):r+c>=1?(a=(t*l-1)*Math.pow(2,o),r+=c):(a=t*Math.pow(2,c-1)*Math.pow(2,o),r=0));o>=8;e[i+g]=255&a,g+=p,a/=256,o-=8);for(r=r<0;e[i+g]=255&r,g+=p,r/=256,h-=8);e[i+g-p]|=128*m}},8346:function(e){var t={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==t.call(e)}},2584:function(){},9201:function(e,t,i){"use strict";i.r(t),i.d(t,{CancellationTokenSource:function(){return Z5},Emitter:function(){return Y5},KeyCode:function(){return Q5},KeyMod:function(){return X5},MarkerSeverity:function(){return n3},MarkerTag:function(){return o3},Position:function(){return J5},Range:function(){return e3},Selection:function(){return t3},SelectionDirection:function(){return i3},Token:function(){return r3},Uri:function(){return s3},default:function(){return H3},editor:function(){return a3},languages:function(){return l3}});var n={};i.r(n),i.d(n,{PixelRatio:function(){return je},addMatchMediaChangeListener:function(){return Ue},getZoomFactor:function(){return Ke},isAndroid:function(){return Je},isChrome:function(){return Ze},isElectron:function(){return Xe},isFirefox:function(){return qe},isSafari:function(){return Ye},isStandalone:function(){return tt},isWebKit:function(){return Ge},isWebkitWebView:function(){return Qe}});var o={};i.r(o),i.d(o,{CancellationTokenSource:function(){return Z5},Emitter:function(){return Y5},KeyCode:function(){return Q5},KeyMod:function(){return X5},MarkerSeverity:function(){return n3},MarkerTag:function(){return o3},Position:function(){return J5},Range:function(){return e3},Selection:function(){return t3},SelectionDirection:function(){return i3},Token:function(){return r3},Uri:function(){return s3},editor:function(){return a3},languages:function(){return l3}});var s={};i.r(s),i.d(s,{CancellationTokenSource:function(){return Z5},Emitter:function(){return Y5},KeyCode:function(){return Q5},KeyMod:function(){return X5},MarkerSeverity:function(){return n3},MarkerTag:function(){return o3},Position:function(){return J5},Range:function(){return e3},Selection:function(){return t3},SelectionDirection:function(){return i3},Token:function(){return r3},Uri:function(){return s3},default:function(){return H3},editor:function(){return a3},languages:function(){return l3}});const r=new class{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout(()=>{if(e.stack){if(f.isErrorNoTelemetry(e))throw new f(e.message+"\n\n"+e.stack);throw new Error(e.message+"\n\n"+e.stack)}throw e},0)}}emit(e){this.listeners.forEach(t=>{t(e)})}onUnexpectedError(e){this.unexpectedErrorHandler(e),this.emit(e)}onUnexpectedExternalError(e){this.unexpectedErrorHandler(e)}};function a(e){c(e)||r.onUnexpectedError(e)}function l(e){c(e)||r.onUnexpectedExternalError(e)}function h(e){if(e instanceof Error){const{name:t,message:i}=e;return{$isError:!0,name:t,message:i,stack:e.stacktrace||e.stack,noTelemetry:f.isErrorNoTelemetry(e)}}return e}const d="Canceled";function c(e){return e instanceof u||e instanceof Error&&e.name===d&&e.message===d}class u extends Error{constructor(){super(d),this.name=this.message}}function g(){const e=new Error(d);return e.name=e.message,e}function p(e){return e?new Error(`Illegal argument: ${e}`):new Error("Illegal argument")}class m extends Error{constructor(e){super("NotSupported"),e&&(this.message=e)}}class f extends Error{constructor(e){super(e),this.name="ErrorNoTelemetry"}static fromError(e){if(e instanceof f)return e;const t=new f;return t.message=e.message,t.stack=e.stack,t}static isErrorNoTelemetry(e){return"ErrorNoTelemetry"===e.name}}class _ extends Error{constructor(e){super(e||"An unexpected bug occurred."),Object.setPrototypeOf(this,_.prototype)}}function v(e){const t=this;let i,n=!1;return function(){return n||(n=!0,i=e.apply(t,arguments)),i}}var b;!function(e){e.is=function(e){return e&&"object"==typeof e&&"function"==typeof e[Symbol.iterator]};const t=Object.freeze([]);function i(t,i=Number.POSITIVE_INFINITY){const n=[];if(0===i)return[n,t];const o=t[Symbol.iterator]();for(let t=0;te.length&&(i=e.length);te===t){const n=e[Symbol.iterator](),o=t[Symbol.iterator]();for(;;){const e=n.next(),t=o.next();if(e.done!==t.done)return!1;if(e.done)return!0;if(!i(e.value,t.value))return!1}}}(b||(b={}));let w=null;function C(e){return null==w||w.trackDisposable(e),e}function y(e){null==w||w.markAsDisposed(e)}function S(e,t){null==w||w.setParent(e,t)}function k(e){return null==w||w.markAsSingleton(e),e}class L extends Error{constructor(e){super(`Encountered errors while disposing of store. Errors: [${e.join(", ")}]`),this.errors=e}}function x(e){return"function"==typeof e.dispose&&0===e.dispose.length}function D(e){if(b.is(e)){const t=[];for(const i of e)if(i)try{i.dispose()}catch(e){t.push(e)}if(1===t.length)throw t[0];if(t.length>1)throw new L(t);return Array.isArray(e)?[]:e}if(e)return e.dispose(),e}function E(...e){const t=N(()=>D(e));return function(e,t){if(w)for(const i of e)w.setParent(i,t)}(e,t),t}function N(e){const t=C({dispose:v(()=>{y(t),e()})});return t}class I{constructor(){this._toDispose=new Set,this._isDisposed=!1,C(this)}dispose(){this._isDisposed||(y(this),this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){try{D(this._toDispose.values())}finally{this._toDispose.clear()}}add(e){if(!e)return e;if(e===this)throw new Error("Cannot register a disposable on itself!");return S(e,this),this._isDisposed?I.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(e),e}}I.DISABLE_DISPOSED_WARNING=!1;class M{constructor(){this._store=new I,C(this),S(this._store,this)}dispose(){y(this),this._store.dispose()}_register(e){if(e===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(e)}}M.None=Object.freeze({dispose(){}});class T{constructor(){this._isDisposed=!1,C(this)}get value(){return this._isDisposed?void 0:this._value}set value(e){var t;this._isDisposed||e===this._value||(null===(t=this._value)||void 0===t||t.dispose(),e&&S(e,this),this._value=e)}clear(){this.value=void 0}dispose(){var e;this._isDisposed=!0,y(this),null===(e=this._value)||void 0===e||e.dispose(),this._value=void 0}clearAndLeak(){const e=this._value;return this._value=void 0,e&&S(e,null),e}}class A{constructor(e){this._disposable=e,this._counter=1}acquire(){return this._counter++,this}release(){return 0===--this._counter&&this._disposable.dispose(),this}}class O{constructor(){this.dispose=()=>{},this.unset=()=>{},this.isset=()=>!1,C(this)}set(e){let t=e;return this.unset=()=>t=void 0,this.isset=()=>void 0!==t,this.dispose=()=>{t&&(t(),t=void 0,y(this))},this}}class R{constructor(e){this.object=e}dispose(){}}class P{constructor(e){this.element=e,this.next=P.Undefined,this.prev=P.Undefined}}P.Undefined=new P(void 0);class F{constructor(){this._first=P.Undefined,this._last=P.Undefined,this._size=0}get size(){return this._size}isEmpty(){return this._first===P.Undefined}clear(){let e=this._first;for(;e!==P.Undefined;){const t=e.next;e.prev=P.Undefined,e.next=P.Undefined,e=t}this._first=P.Undefined,this._last=P.Undefined,this._size=0}unshift(e){return this._insert(e,!1)}push(e){return this._insert(e,!0)}_insert(e,t){const i=new P(e);if(this._first===P.Undefined)this._first=i,this._last=i;else if(t){const e=this._last;this._last=i,i.prev=e,e.next=i}else{const e=this._first;this._first=i,i.next=e,e.prev=i}this._size+=1;let n=!1;return()=>{n||(n=!0,this._remove(i))}}shift(){if(this._first!==P.Undefined){const e=this._first.element;return this._remove(this._first),e}}pop(){if(this._last!==P.Undefined){const e=this._last.element;return this._remove(this._last),e}}_remove(e){if(e.prev!==P.Undefined&&e.next!==P.Undefined){const t=e.prev;t.next=e.next,e.next.prev=t}else e.prev===P.Undefined&&e.next===P.Undefined?(this._first=P.Undefined,this._last=P.Undefined):e.next===P.Undefined?(this._last=this._last.prev,this._last.next=P.Undefined):e.prev===P.Undefined&&(this._first=this._first.next,this._first.prev=P.Undefined);this._size-=1}*[Symbol.iterator](){let e=this._first;for(;e!==P.Undefined;)yield e.element,e=e.next}}let B="undefined"!=typeof document&&document.location&&document.location.hash.indexOf("pseudo=true")>=0;function V(e,t){let i;return i=0===t.length?e:e.replace(/\{(\d+)\}/g,(e,i)=>{const n=i[0],o=t[n];let s=e;return"string"==typeof o?s=o:"number"!=typeof o&&"boolean"!=typeof o&&null!=o||(s=String(o)),s}),B&&(i="["+i.replace(/[aouei]/g,"$&$&")+"]"),i}function W(e,t,...i){return V(t,i)}var z,H=i(4806);const U="en";let j,K,$=!1,q=!1,G=!1,Z=!1,Y=!1,Q=!1,X=!1,J=!1,ee=!1,te=null,ie=null;const ne="object"==typeof self?self:"object"==typeof i.g?i.g:{};let oe;void 0!==ne.vscode&&void 0!==ne.vscode.process?oe=ne.vscode.process:void 0!==H&&(oe=H);const se="string"==typeof(null===(z=null==oe?void 0:oe.versions)||void 0===z?void 0:z.electron),re=se&&"renderer"===(null==oe?void 0:oe.type);if("object"!=typeof navigator||re)if("object"==typeof oe){$="win32"===oe.platform,q="darwin"===oe.platform,G="linux"===oe.platform,Z=G&&!!oe.env.SNAP&&!!oe.env.SNAP_REVISION,X=se,ee=!!oe.env.CI||!!oe.env.BUILD_ARTIFACTSTAGINGDIRECTORY,j=U,te=U;const e=oe.env.VSCODE_NLS_CONFIG;if(e)try{const t=JSON.parse(e),i=t.availableLanguages["*"];j=t.locale,te=i||U,ie=t._translationsConfigFile}catch(e){}Y=!0}else console.error("Unable to resolve platform.");else{K=navigator.userAgent,$=K.indexOf("Windows")>=0,q=K.indexOf("Macintosh")>=0,J=(K.indexOf("Macintosh")>=0||K.indexOf("iPad")>=0||K.indexOf("iPhone")>=0)&&!!navigator.maxTouchPoints&&navigator.maxTouchPoints>0,G=K.indexOf("Linux")>=0,Q=!0;j=void W(0,"_")||U,te=j}let ae=0;q?ae=1:$?ae=3:G&&(ae=2);const le=$,he=q,de=G,ce=Y,ue=Q,ge=Q&&"function"==typeof ne.importScripts,pe=J,me=K,fe="function"==typeof ne.postMessage&&!ne.importScripts,_e=(()=>{if(fe){const e=[];ne.addEventListener("message",t=>{if(t.data&&t.data.vscodeScheduleAsyncWork)for(let i=0,n=e.length;i{const n=++t;e.push({id:n,callback:i}),ne.postMessage({vscodeScheduleAsyncWork:n},"*")}}return e=>setTimeout(e)})(),ve=q||J?2:$?1:3;let be=!0,we=!1;function Ce(){if(!we){we=!0;const e=new Uint8Array(2);e[0]=1,e[1]=2;const t=new Uint16Array(e.buffer);be=513===t[0]}return be}const ye=!!(me&&me.indexOf("Chrome")>=0),Se=!!(me&&me.indexOf("Firefox")>=0),ke=!!(!ye&&me&&me.indexOf("Safari")>=0),Le=!!(me&&me.indexOf("Edg/")>=0),xe=(me&&me.indexOf("Android"),ne.performance&&"function"==typeof ne.performance.now);class De{constructor(e){this._highResolution=xe&&e,this._startTime=this._now(),this._stopTime=-1}static create(e=!0){return new De(e)}stop(){this._stopTime=this._now()}elapsed(){return-1!==this._stopTime?this._stopTime-this._startTime:this._now()-this._startTime}_now(){return this._highResolution?ne.performance.now():Date.now()}}var Ee;!function(e){function t(e){false}function i(e){return(t,i=null,n)=>{let o,s=!1;return o=e(e=>{if(!s)return o?o.dispose():s=!0,t.call(i,e)},null,n),s&&o.dispose(),o}}function n(e,t,i){return a((i,n=null,o)=>e(e=>i.call(n,t(e)),null,o),i)}function o(e,t,i){return a((i,n=null,o)=>e(e=>{t(e),i.call(n,e)},null,o),i)}function s(e,t,i){return a((i,n=null,o)=>e(e=>t(e)&&i.call(n,e),null,o),i)}function r(e,t,i,o){let s=i;return n(e,e=>(s=t(s,e),s),o)}function a(e,i){let n;const o={onFirstListenerAdd(){n=e(s.fire,s)},onLastListenerRemove(){null==n||n.dispose()}};i||t();const s=new Te(o);return null==i||i.add(s),s.event}function l(e,i,n=100,o=!1,s,r){let a,l,h,d=0;const c={leakWarningThreshold:s,onFirstListenerAdd(){a=e(e=>{d++,l=i(l,e),o&&!h&&(u.fire(l),l=void 0),clearTimeout(h),h=setTimeout(()=>{const e=l;l=void 0,h=void 0,(!o||d>1)&&u.fire(e),d=0},n)})},onLastListenerRemove(){a.dispose()}};r||t();const u=new Te(c);return null==r||r.add(u),u.event}function h(e,t=(e,t)=>e===t,i){let n,o=!0;return s(e,e=>{const i=o||!t(e,n);return o=!1,n=e,i},i)}e.None=()=>M.None,e.once=i,e.map=n,e.forEach=o,e.filter=s,e.signal=function(e){return e},e.any=function(...e){return(t,i=null,n)=>E(...e.map(e=>e(e=>t.call(i,e),null,n)))},e.reduce=r,e.debounce=l,e.latch=h,e.split=function(t,i,n){return[e.filter(t,i,n),e.filter(t,e=>!i(e),n)]},e.buffer=function(e,t=!1,i=[]){let n=i.slice(),o=e(e=>{n?n.push(e):r.fire(e)});const s=()=>{null==n||n.forEach(e=>r.fire(e)),n=null},r=new Te({onFirstListenerAdd(){o||(o=e(e=>r.fire(e)))},onFirstListenerDidAdd(){n&&(t?setTimeout(s):s())},onLastListenerRemove(){o&&o.dispose(),o=null}});return r.event};class d{constructor(e){this.event=e,this.disposables=new I}map(e){return new d(n(this.event,e,this.disposables))}forEach(e){return new d(o(this.event,e,this.disposables))}filter(e){return new d(s(this.event,e,this.disposables))}reduce(e,t){return new d(r(this.event,e,t,this.disposables))}latch(){return new d(h(this.event,void 0,this.disposables))}debounce(e,t=100,i=!1,n){return new d(l(this.event,e,t,i,n,this.disposables))}on(e,t,i){return this.event(e,t,i)}once(e,t,n){return i(this.event)(e,t,n)}dispose(){this.disposables.dispose()}}e.chain=function(e){return new d(e)},e.fromNodeEventEmitter=function(e,t,i=e=>e){const n=(...e)=>o.fire(i(...e)),o=new Te({onFirstListenerAdd:()=>e.on(t,n),onLastListenerRemove:()=>e.removeListener(t,n)});return o.event},e.fromDOMEventEmitter=function(e,t,i=e=>e){const n=(...e)=>o.fire(i(...e)),o=new Te({onFirstListenerAdd:()=>e.addEventListener(t,n),onLastListenerRemove:()=>e.removeEventListener(t,n)});return o.event},e.toPromise=function(e){return new Promise(t=>i(e)(t))},e.runAndSubscribe=function(e,t){return t(void 0),e(e=>t(e))},e.runAndSubscribeWithStore=function(e,t){let i=null;function n(e){null==i||i.dispose(),i=new I,t(e,i)}n(void 0);const o=e(e=>n(e));return N(()=>{o.dispose(),null==i||i.dispose()})};class c{constructor(e,i){this.obs=e,this._counter=0,this._hasChanged=!1;const n={onFirstListenerAdd:()=>{e.addObserver(this)},onLastListenerRemove:()=>{e.removeObserver(this)}};i||t(),this.emitter=new Te(n),i&&i.add(this.emitter)}beginUpdate(e){this._counter++}handleChange(e,t){this._hasChanged=!0}endUpdate(e){0===--this._counter&&this._hasChanged&&(this._hasChanged=!1,this.emitter.fire(this.obs.get()))}}e.fromObservable=function(e,t){return new c(e,t).emitter.event}}(Ee||(Ee={}));class Ne{constructor(e){this._listenerCount=0,this._invocationCount=0,this._elapsedOverall=0,this._name=`${e}_${Ne._idPool++}`}start(e){this._stopWatch=new De(!0),this._listenerCount=e}stop(){if(this._stopWatch){const e=this._stopWatch.elapsed();this._elapsedOverall+=e,this._invocationCount+=1,console.info(`did FIRE ${this._name}: elapsed_ms: ${e.toFixed(5)}, listener: ${this._listenerCount} (elapsed_overall: ${this._elapsedOverall.toFixed(2)}, invocations: ${this._invocationCount})`),this._stopWatch=void 0}}}Ne._idPool=0;class Ie{constructor(e){this.value=e}static create(){var e;return new Ie(null!==(e=(new Error).stack)&&void 0!==e?e:"")}print(){console.warn(this.value.split("\n").slice(2).join("\n"))}}class Me{constructor(e,t,i){this.callback=e,this.callbackThis=t,this.stack=i,this.subscription=new O}invoke(e){this.callback.call(this.callbackThis,e)}}class Te{constructor(e){var t,i;this._disposed=!1,this._options=e,this._leakageMon=void 0,this._perfMon=(null===(t=this._options)||void 0===t?void 0:t._profName)?new Ne(this._options._profName):void 0,this._deliveryQueue=null===(i=this._options)||void 0===i?void 0:i.deliveryQueue}dispose(){var e,t,i,n;this._disposed||(this._disposed=!0,this._listeners&&this._listeners.clear(),null===(e=this._deliveryQueue)||void 0===e||e.clear(this),null===(i=null===(t=this._options)||void 0===t?void 0:t.onLastListenerRemove)||void 0===i||i.call(t),null===(n=this._leakageMon)||void 0===n||n.dispose())}get event(){return this._event||(this._event=(e,t,i)=>{var n,o,s;this._listeners||(this._listeners=new F);const r=this._listeners.isEmpty();let a,l;r&&(null===(n=this._options)||void 0===n?void 0:n.onFirstListenerAdd)&&this._options.onFirstListenerAdd(this),this._leakageMon&&this._listeners.size>=30&&(l=Ie.create(),a=this._leakageMon.check(l,this._listeners.size+1));const h=new Me(e,t,l),d=this._listeners.push(h);r&&(null===(o=this._options)||void 0===o?void 0:o.onFirstListenerDidAdd)&&this._options.onFirstListenerDidAdd(this),(null===(s=this._options)||void 0===s?void 0:s.onListenerDidAdd)&&this._options.onListenerDidAdd(this,e,t);const c=h.subscription.set(()=>{if(null==a||a(),!this._disposed&&(d(),this._options&&this._options.onLastListenerRemove)){this._listeners&&!this._listeners.isEmpty()||this._options.onLastListenerRemove(this)}});return i instanceof I?i.add(c):Array.isArray(i)&&i.push(c),c}),this._event}fire(e){var t,i;if(this._listeners){this._deliveryQueue||(this._deliveryQueue=new Oe);for(const t of this._listeners)this._deliveryQueue.push(this,t,e);null===(t=this._perfMon)||void 0===t||t.start(this._deliveryQueue.size),this._deliveryQueue.deliver(),null===(i=this._perfMon)||void 0===i||i.stop()}}}class Ae{constructor(){this._queue=new F}get size(){return this._queue.size}push(e,t,i){this._queue.push(new Re(e,t,i))}clear(e){const t=new F;for(const i of this._queue)i.emitter!==e&&t.push(i);this._queue=t}deliver(){for(;this._queue.size>0;){const e=this._queue.shift();try{e.listener.invoke(e.event)}catch(e){a(e)}}}}class Oe extends Ae{clear(e){this._queue.clear()}}class Re{constructor(e,t,i){this.emitter=e,this.listener=t,this.event=i}}class Pe extends Te{constructor(e){super(e),this._isPaused=0,this._eventQueue=new F,this._mergeFn=null==e?void 0:e.merge}pause(){this._isPaused++}resume(){if(0!==this._isPaused&&0===--this._isPaused)if(this._mergeFn){const e=Array.from(this._eventQueue);this._eventQueue.clear(),super.fire(this._mergeFn(e))}else for(;!this._isPaused&&0!==this._eventQueue.size;)super.fire(this._eventQueue.shift())}fire(e){this._listeners&&(0!==this._isPaused?this._eventQueue.push(e):super.fire(e))}}class Fe extends Pe{constructor(e){var t;super(e),this._delay=null!==(t=e.delay)&&void 0!==t?t:100}fire(e){this._handle||(this.pause(),this._handle=setTimeout(()=>{this._handle=void 0,this.resume()},this._delay)),super.fire(e)}}class Be{constructor(){this.buffers=[]}wrapEvent(e){return(t,i,n)=>e(e=>{const n=this.buffers[this.buffers.length-1];n?n.push(()=>t.call(i,e)):t.call(i,e)},void 0,n)}bufferEvents(e){const t=[];this.buffers.push(t);const i=e();return this.buffers.pop(),t.forEach(e=>e()),i}}class Ve{constructor(){this.listening=!1,this.inputEvent=Ee.None,this.inputEventListener=M.None,this.emitter=new Te({onFirstListenerDidAdd:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onLastListenerRemove:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(e){this.inputEvent=e,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=e(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}}class We{constructor(){this._zoomFactor=1}getZoomFactor(){return this._zoomFactor}}We.INSTANCE=new We;class ze extends M{constructor(){super(),this._onDidChange=this._register(new Te),this.onDidChange=this._onDidChange.event,this._listener=()=>this._handleChange(!0),this._mediaQueryList=null,this._handleChange(!1)}_handleChange(e){var t;null===(t=this._mediaQueryList)||void 0===t||t.removeEventListener("change",this._listener),this._mediaQueryList=matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`),this._mediaQueryList.addEventListener("change",this._listener),e&&this._onDidChange.fire()}}class He extends M{constructor(){super(),this._onDidChange=this._register(new Te),this.onDidChange=this._onDidChange.event,this._value=this._getPixelRatio();const e=this._register(new ze);this._register(e.onDidChange(()=>{this._value=this._getPixelRatio(),this._onDidChange.fire(this._value)}))}get value(){return this._value}_getPixelRatio(){const e=document.createElement("canvas").getContext("2d");return(window.devicePixelRatio||1)/(e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1)}}function Ue(e,t){"string"==typeof e&&(e=window.matchMedia(e)),e.addEventListener("change",t)}const je=new class{constructor(){this._pixelRatioMonitor=null}_getOrCreatePixelRatioMonitor(){return this._pixelRatioMonitor||(this._pixelRatioMonitor=k(new He)),this._pixelRatioMonitor}get value(){return this._getOrCreatePixelRatioMonitor().value}get onDidChange(){return this._getOrCreatePixelRatioMonitor().onDidChange}};function Ke(){return We.INSTANCE.getZoomFactor()}const $e=navigator.userAgent,qe=$e.indexOf("Firefox")>=0,Ge=$e.indexOf("AppleWebKit")>=0,Ze=$e.indexOf("Chrome")>=0,Ye=!Ze&&$e.indexOf("Safari")>=0,Qe=!Ze&&!Ye&&Ge,Xe=$e.indexOf("Electron/")>=0,Je=$e.indexOf("Android")>=0;let et=!1;if(window.matchMedia){const e=window.matchMedia("(display-mode: standalone)");et=e.matches,Ue(e,({matches:e})=>{et=e})}function tt(){return et}ce||document.queryCommandSupported&&document.queryCommandSupported("copy")||navigator&&navigator.clipboard&&navigator.clipboard.writeText,ce||navigator&&navigator.clipboard&&navigator.clipboard.readText,ce||tt()||navigator.keyboard,"ontouchstart"in window||navigator.maxTouchPoints;const it=window.PointerEvent&&("ontouchstart"in window||window.navigator.maxTouchPoints>0||navigator.maxTouchPoints>0);class nt{constructor(){this._keyCodeToStr=[],this._strToKeyCode=Object.create(null)}define(e,t){this._keyCodeToStr[e]=t,this._strToKeyCode[t.toLowerCase()]=e}keyCodeToStr(e){return this._keyCodeToStr[e]}strToKeyCode(e){return this._strToKeyCode[e.toLowerCase()]||0}}const ot=new nt,st=new nt,rt=new nt,at=new Array(230),lt={},ht=[],dt=Object.create(null),ct=Object.create(null),ut=[],gt=[];for(let e=0;e<=193;e++)ut[e]=-1;for(let e=0;e<=127;e++)gt[e]=-1;var pt;function mt(e,t){return(e|(65535&t)<<16>>>0)>>>0}function ft(e,t){if(0===e)return null;const i=(65535&e)>>>0,n=(4294901760&e)>>>16;return new bt(0!==n?[_t(i,t),_t(n,t)]:[_t(i,t)])}function _t(e,t){const i=!!(2048&e),n=!!(256&e);return new vt(2===t?n:i,!!(1024&e),!!(512&e),2===t?i:n,255&e)}!function(){const e="",t=[[0,1,0,"None",0,"unknown",0,"VK_UNKNOWN",e,e],[0,1,1,"Hyper",0,e,0,e,e,e],[0,1,2,"Super",0,e,0,e,e,e],[0,1,3,"Fn",0,e,0,e,e,e],[0,1,4,"FnLock",0,e,0,e,e,e],[0,1,5,"Suspend",0,e,0,e,e,e],[0,1,6,"Resume",0,e,0,e,e,e],[0,1,7,"Turbo",0,e,0,e,e,e],[0,1,8,"Sleep",0,e,0,"VK_SLEEP",e,e],[0,1,9,"WakeUp",0,e,0,e,e,e],[31,0,10,"KeyA",31,"A",65,"VK_A",e,e],[32,0,11,"KeyB",32,"B",66,"VK_B",e,e],[33,0,12,"KeyC",33,"C",67,"VK_C",e,e],[34,0,13,"KeyD",34,"D",68,"VK_D",e,e],[35,0,14,"KeyE",35,"E",69,"VK_E",e,e],[36,0,15,"KeyF",36,"F",70,"VK_F",e,e],[37,0,16,"KeyG",37,"G",71,"VK_G",e,e],[38,0,17,"KeyH",38,"H",72,"VK_H",e,e],[39,0,18,"KeyI",39,"I",73,"VK_I",e,e],[40,0,19,"KeyJ",40,"J",74,"VK_J",e,e],[41,0,20,"KeyK",41,"K",75,"VK_K",e,e],[42,0,21,"KeyL",42,"L",76,"VK_L",e,e],[43,0,22,"KeyM",43,"M",77,"VK_M",e,e],[44,0,23,"KeyN",44,"N",78,"VK_N",e,e],[45,0,24,"KeyO",45,"O",79,"VK_O",e,e],[46,0,25,"KeyP",46,"P",80,"VK_P",e,e],[47,0,26,"KeyQ",47,"Q",81,"VK_Q",e,e],[48,0,27,"KeyR",48,"R",82,"VK_R",e,e],[49,0,28,"KeyS",49,"S",83,"VK_S",e,e],[50,0,29,"KeyT",50,"T",84,"VK_T",e,e],[51,0,30,"KeyU",51,"U",85,"VK_U",e,e],[52,0,31,"KeyV",52,"V",86,"VK_V",e,e],[53,0,32,"KeyW",53,"W",87,"VK_W",e,e],[54,0,33,"KeyX",54,"X",88,"VK_X",e,e],[55,0,34,"KeyY",55,"Y",89,"VK_Y",e,e],[56,0,35,"KeyZ",56,"Z",90,"VK_Z",e,e],[22,0,36,"Digit1",22,"1",49,"VK_1",e,e],[23,0,37,"Digit2",23,"2",50,"VK_2",e,e],[24,0,38,"Digit3",24,"3",51,"VK_3",e,e],[25,0,39,"Digit4",25,"4",52,"VK_4",e,e],[26,0,40,"Digit5",26,"5",53,"VK_5",e,e],[27,0,41,"Digit6",27,"6",54,"VK_6",e,e],[28,0,42,"Digit7",28,"7",55,"VK_7",e,e],[29,0,43,"Digit8",29,"8",56,"VK_8",e,e],[30,0,44,"Digit9",30,"9",57,"VK_9",e,e],[21,0,45,"Digit0",21,"0",48,"VK_0",e,e],[3,1,46,"Enter",3,"Enter",13,"VK_RETURN",e,e],[9,1,47,"Escape",9,"Escape",27,"VK_ESCAPE",e,e],[1,1,48,"Backspace",1,"Backspace",8,"VK_BACK",e,e],[2,1,49,"Tab",2,"Tab",9,"VK_TAB",e,e],[10,1,50,"Space",10,"Space",32,"VK_SPACE",e,e],[83,0,51,"Minus",83,"-",189,"VK_OEM_MINUS","-","OEM_MINUS"],[81,0,52,"Equal",81,"=",187,"VK_OEM_PLUS","=","OEM_PLUS"],[87,0,53,"BracketLeft",87,"[",219,"VK_OEM_4","[","OEM_4"],[89,0,54,"BracketRight",89,"]",221,"VK_OEM_6","]","OEM_6"],[88,0,55,"Backslash",88,"\\",220,"VK_OEM_5","\\","OEM_5"],[0,0,56,"IntlHash",0,e,0,e,e,e],[80,0,57,"Semicolon",80,";",186,"VK_OEM_1",";","OEM_1"],[90,0,58,"Quote",90,"'",222,"VK_OEM_7","'","OEM_7"],[86,0,59,"Backquote",86,"`",192,"VK_OEM_3","`","OEM_3"],[82,0,60,"Comma",82,",",188,"VK_OEM_COMMA",",","OEM_COMMA"],[84,0,61,"Period",84,".",190,"VK_OEM_PERIOD",".","OEM_PERIOD"],[85,0,62,"Slash",85,"/",191,"VK_OEM_2","/","OEM_2"],[8,1,63,"CapsLock",8,"CapsLock",20,"VK_CAPITAL",e,e],[59,1,64,"F1",59,"F1",112,"VK_F1",e,e],[60,1,65,"F2",60,"F2",113,"VK_F2",e,e],[61,1,66,"F3",61,"F3",114,"VK_F3",e,e],[62,1,67,"F4",62,"F4",115,"VK_F4",e,e],[63,1,68,"F5",63,"F5",116,"VK_F5",e,e],[64,1,69,"F6",64,"F6",117,"VK_F6",e,e],[65,1,70,"F7",65,"F7",118,"VK_F7",e,e],[66,1,71,"F8",66,"F8",119,"VK_F8",e,e],[67,1,72,"F9",67,"F9",120,"VK_F9",e,e],[68,1,73,"F10",68,"F10",121,"VK_F10",e,e],[69,1,74,"F11",69,"F11",122,"VK_F11",e,e],[70,1,75,"F12",70,"F12",123,"VK_F12",e,e],[0,1,76,"PrintScreen",0,e,0,e,e,e],[79,1,77,"ScrollLock",79,"ScrollLock",145,"VK_SCROLL",e,e],[7,1,78,"Pause",7,"PauseBreak",19,"VK_PAUSE",e,e],[19,1,79,"Insert",19,"Insert",45,"VK_INSERT",e,e],[14,1,80,"Home",14,"Home",36,"VK_HOME",e,e],[11,1,81,"PageUp",11,"PageUp",33,"VK_PRIOR",e,e],[20,1,82,"Delete",20,"Delete",46,"VK_DELETE",e,e],[13,1,83,"End",13,"End",35,"VK_END",e,e],[12,1,84,"PageDown",12,"PageDown",34,"VK_NEXT",e,e],[17,1,85,"ArrowRight",17,"RightArrow",39,"VK_RIGHT","Right",e],[15,1,86,"ArrowLeft",15,"LeftArrow",37,"VK_LEFT","Left",e],[18,1,87,"ArrowDown",18,"DownArrow",40,"VK_DOWN","Down",e],[16,1,88,"ArrowUp",16,"UpArrow",38,"VK_UP","Up",e],[78,1,89,"NumLock",78,"NumLock",144,"VK_NUMLOCK",e,e],[108,1,90,"NumpadDivide",108,"NumPad_Divide",111,"VK_DIVIDE",e,e],[103,1,91,"NumpadMultiply",103,"NumPad_Multiply",106,"VK_MULTIPLY",e,e],[106,1,92,"NumpadSubtract",106,"NumPad_Subtract",109,"VK_SUBTRACT",e,e],[104,1,93,"NumpadAdd",104,"NumPad_Add",107,"VK_ADD",e,e],[3,1,94,"NumpadEnter",3,e,0,e,e,e],[94,1,95,"Numpad1",94,"NumPad1",97,"VK_NUMPAD1",e,e],[95,1,96,"Numpad2",95,"NumPad2",98,"VK_NUMPAD2",e,e],[96,1,97,"Numpad3",96,"NumPad3",99,"VK_NUMPAD3",e,e],[97,1,98,"Numpad4",97,"NumPad4",100,"VK_NUMPAD4",e,e],[98,1,99,"Numpad5",98,"NumPad5",101,"VK_NUMPAD5",e,e],[99,1,100,"Numpad6",99,"NumPad6",102,"VK_NUMPAD6",e,e],[100,1,101,"Numpad7",100,"NumPad7",103,"VK_NUMPAD7",e,e],[101,1,102,"Numpad8",101,"NumPad8",104,"VK_NUMPAD8",e,e],[102,1,103,"Numpad9",102,"NumPad9",105,"VK_NUMPAD9",e,e],[93,1,104,"Numpad0",93,"NumPad0",96,"VK_NUMPAD0",e,e],[107,1,105,"NumpadDecimal",107,"NumPad_Decimal",110,"VK_DECIMAL",e,e],[92,0,106,"IntlBackslash",92,"OEM_102",226,"VK_OEM_102",e,e],[58,1,107,"ContextMenu",58,"ContextMenu",93,e,e,e],[0,1,108,"Power",0,e,0,e,e,e],[0,1,109,"NumpadEqual",0,e,0,e,e,e],[71,1,110,"F13",71,"F13",124,"VK_F13",e,e],[72,1,111,"F14",72,"F14",125,"VK_F14",e,e],[73,1,112,"F15",73,"F15",126,"VK_F15",e,e],[74,1,113,"F16",74,"F16",127,"VK_F16",e,e],[75,1,114,"F17",75,"F17",128,"VK_F17",e,e],[76,1,115,"F18",76,"F18",129,"VK_F18",e,e],[77,1,116,"F19",77,"F19",130,"VK_F19",e,e],[0,1,117,"F20",0,e,0,"VK_F20",e,e],[0,1,118,"F21",0,e,0,"VK_F21",e,e],[0,1,119,"F22",0,e,0,"VK_F22",e,e],[0,1,120,"F23",0,e,0,"VK_F23",e,e],[0,1,121,"F24",0,e,0,"VK_F24",e,e],[0,1,122,"Open",0,e,0,e,e,e],[0,1,123,"Help",0,e,0,e,e,e],[0,1,124,"Select",0,e,0,e,e,e],[0,1,125,"Again",0,e,0,e,e,e],[0,1,126,"Undo",0,e,0,e,e,e],[0,1,127,"Cut",0,e,0,e,e,e],[0,1,128,"Copy",0,e,0,e,e,e],[0,1,129,"Paste",0,e,0,e,e,e],[0,1,130,"Find",0,e,0,e,e,e],[0,1,131,"AudioVolumeMute",112,"AudioVolumeMute",173,"VK_VOLUME_MUTE",e,e],[0,1,132,"AudioVolumeUp",113,"AudioVolumeUp",175,"VK_VOLUME_UP",e,e],[0,1,133,"AudioVolumeDown",114,"AudioVolumeDown",174,"VK_VOLUME_DOWN",e,e],[105,1,134,"NumpadComma",105,"NumPad_Separator",108,"VK_SEPARATOR",e,e],[110,0,135,"IntlRo",110,"ABNT_C1",193,"VK_ABNT_C1",e,e],[0,1,136,"KanaMode",0,e,0,e,e,e],[0,0,137,"IntlYen",0,e,0,e,e,e],[0,1,138,"Convert",0,e,0,e,e,e],[0,1,139,"NonConvert",0,e,0,e,e,e],[0,1,140,"Lang1",0,e,0,e,e,e],[0,1,141,"Lang2",0,e,0,e,e,e],[0,1,142,"Lang3",0,e,0,e,e,e],[0,1,143,"Lang4",0,e,0,e,e,e],[0,1,144,"Lang5",0,e,0,e,e,e],[0,1,145,"Abort",0,e,0,e,e,e],[0,1,146,"Props",0,e,0,e,e,e],[0,1,147,"NumpadParenLeft",0,e,0,e,e,e],[0,1,148,"NumpadParenRight",0,e,0,e,e,e],[0,1,149,"NumpadBackspace",0,e,0,e,e,e],[0,1,150,"NumpadMemoryStore",0,e,0,e,e,e],[0,1,151,"NumpadMemoryRecall",0,e,0,e,e,e],[0,1,152,"NumpadMemoryClear",0,e,0,e,e,e],[0,1,153,"NumpadMemoryAdd",0,e,0,e,e,e],[0,1,154,"NumpadMemorySubtract",0,e,0,e,e,e],[0,1,155,"NumpadClear",126,"Clear",12,"VK_CLEAR",e,e],[0,1,156,"NumpadClearEntry",0,e,0,e,e,e],[5,1,0,e,5,"Ctrl",17,"VK_CONTROL",e,e],[4,1,0,e,4,"Shift",16,"VK_SHIFT",e,e],[6,1,0,e,6,"Alt",18,"VK_MENU",e,e],[57,1,0,e,57,"Meta",0,"VK_COMMAND",e,e],[5,1,157,"ControlLeft",5,e,0,"VK_LCONTROL",e,e],[4,1,158,"ShiftLeft",4,e,0,"VK_LSHIFT",e,e],[6,1,159,"AltLeft",6,e,0,"VK_LMENU",e,e],[57,1,160,"MetaLeft",57,e,0,"VK_LWIN",e,e],[5,1,161,"ControlRight",5,e,0,"VK_RCONTROL",e,e],[4,1,162,"ShiftRight",4,e,0,"VK_RSHIFT",e,e],[6,1,163,"AltRight",6,e,0,"VK_RMENU",e,e],[57,1,164,"MetaRight",57,e,0,"VK_RWIN",e,e],[0,1,165,"BrightnessUp",0,e,0,e,e,e],[0,1,166,"BrightnessDown",0,e,0,e,e,e],[0,1,167,"MediaPlay",0,e,0,e,e,e],[0,1,168,"MediaRecord",0,e,0,e,e,e],[0,1,169,"MediaFastForward",0,e,0,e,e,e],[0,1,170,"MediaRewind",0,e,0,e,e,e],[114,1,171,"MediaTrackNext",119,"MediaTrackNext",176,"VK_MEDIA_NEXT_TRACK",e,e],[115,1,172,"MediaTrackPrevious",120,"MediaTrackPrevious",177,"VK_MEDIA_PREV_TRACK",e,e],[116,1,173,"MediaStop",121,"MediaStop",178,"VK_MEDIA_STOP",e,e],[0,1,174,"Eject",0,e,0,e,e,e],[117,1,175,"MediaPlayPause",122,"MediaPlayPause",179,"VK_MEDIA_PLAY_PAUSE",e,e],[0,1,176,"MediaSelect",123,"LaunchMediaPlayer",181,"VK_MEDIA_LAUNCH_MEDIA_SELECT",e,e],[0,1,177,"LaunchMail",124,"LaunchMail",180,"VK_MEDIA_LAUNCH_MAIL",e,e],[0,1,178,"LaunchApp2",125,"LaunchApp2",183,"VK_MEDIA_LAUNCH_APP2",e,e],[0,1,179,"LaunchApp1",0,e,0,"VK_MEDIA_LAUNCH_APP1",e,e],[0,1,180,"SelectTask",0,e,0,e,e,e],[0,1,181,"LaunchScreenSaver",0,e,0,e,e,e],[0,1,182,"BrowserSearch",115,"BrowserSearch",170,"VK_BROWSER_SEARCH",e,e],[0,1,183,"BrowserHome",116,"BrowserHome",172,"VK_BROWSER_HOME",e,e],[112,1,184,"BrowserBack",117,"BrowserBack",166,"VK_BROWSER_BACK",e,e],[113,1,185,"BrowserForward",118,"BrowserForward",167,"VK_BROWSER_FORWARD",e,e],[0,1,186,"BrowserStop",0,e,0,"VK_BROWSER_STOP",e,e],[0,1,187,"BrowserRefresh",0,e,0,"VK_BROWSER_REFRESH",e,e],[0,1,188,"BrowserFavorites",0,e,0,"VK_BROWSER_FAVORITES",e,e],[0,1,189,"ZoomToggle",0,e,0,e,e,e],[0,1,190,"MailReply",0,e,0,e,e,e],[0,1,191,"MailForward",0,e,0,e,e,e],[0,1,192,"MailSend",0,e,0,e,e,e],[109,1,0,e,109,"KeyInComposition",229,e,e,e],[111,1,0,e,111,"ABNT_C2",194,"VK_ABNT_C2",e,e],[91,1,0,e,91,"OEM_8",223,"VK_OEM_8",e,e],[0,1,0,e,0,e,0,"VK_KANA",e,e],[0,1,0,e,0,e,0,"VK_HANGUL",e,e],[0,1,0,e,0,e,0,"VK_JUNJA",e,e],[0,1,0,e,0,e,0,"VK_FINAL",e,e],[0,1,0,e,0,e,0,"VK_HANJA",e,e],[0,1,0,e,0,e,0,"VK_KANJI",e,e],[0,1,0,e,0,e,0,"VK_CONVERT",e,e],[0,1,0,e,0,e,0,"VK_NONCONVERT",e,e],[0,1,0,e,0,e,0,"VK_ACCEPT",e,e],[0,1,0,e,0,e,0,"VK_MODECHANGE",e,e],[0,1,0,e,0,e,0,"VK_SELECT",e,e],[0,1,0,e,0,e,0,"VK_PRINT",e,e],[0,1,0,e,0,e,0,"VK_EXECUTE",e,e],[0,1,0,e,0,e,0,"VK_SNAPSHOT",e,e],[0,1,0,e,0,e,0,"VK_HELP",e,e],[0,1,0,e,0,e,0,"VK_APPS",e,e],[0,1,0,e,0,e,0,"VK_PROCESSKEY",e,e],[0,1,0,e,0,e,0,"VK_PACKET",e,e],[0,1,0,e,0,e,0,"VK_DBE_SBCSCHAR",e,e],[0,1,0,e,0,e,0,"VK_DBE_DBCSCHAR",e,e],[0,1,0,e,0,e,0,"VK_ATTN",e,e],[0,1,0,e,0,e,0,"VK_CRSEL",e,e],[0,1,0,e,0,e,0,"VK_EXSEL",e,e],[0,1,0,e,0,e,0,"VK_EREOF",e,e],[0,1,0,e,0,e,0,"VK_PLAY",e,e],[0,1,0,e,0,e,0,"VK_ZOOM",e,e],[0,1,0,e,0,e,0,"VK_NONAME",e,e],[0,1,0,e,0,e,0,"VK_PA1",e,e],[0,1,0,e,0,e,0,"VK_OEM_CLEAR",e,e]],i=[],n=[];for(const e of t){const[t,o,s,r,a,l,h,d,c,u]=e;if(n[s]||(n[s]=!0,ht[s]=r,dt[r]=s,ct[r.toLowerCase()]=s,o&&(ut[s]=a,0!==a&&3!==a&&5!==a&&4!==a&&6!==a&&57!==a&&(gt[a]=s))),!i[a]){if(i[a]=!0,!l)throw new Error(`String representation missing for key code ${a} around scan code ${r}`);ot.define(a,l),st.define(a,c||l),rt.define(a,u||c||l)}h&&(at[h]=a),d&&(lt[d]=a)}gt[3]=46}(),function(e){e.toString=function(e){return ot.keyCodeToStr(e)},e.fromString=function(e){return ot.strToKeyCode(e)},e.toUserSettingsUS=function(e){return st.keyCodeToStr(e)},e.toUserSettingsGeneral=function(e){return rt.keyCodeToStr(e)},e.fromUserSettings=function(e){return st.strToKeyCode(e)||rt.strToKeyCode(e)},e.toElectronAccelerator=function(e){if(e>=93&&e<=108)return null;switch(e){case 16:return"Up";case 18:return"Down";case 15:return"Left";case 17:return"Right"}return ot.keyCodeToStr(e)}}(pt||(pt={}));class vt{constructor(e,t,i,n,o){this.ctrlKey=e,this.shiftKey=t,this.altKey=i,this.metaKey=n,this.keyCode=o}equals(e){return this.ctrlKey===e.ctrlKey&&this.shiftKey===e.shiftKey&&this.altKey===e.altKey&&this.metaKey===e.metaKey&&this.keyCode===e.keyCode}isModifierKey(){return 0===this.keyCode||5===this.keyCode||57===this.keyCode||6===this.keyCode||4===this.keyCode}toChord(){return new bt([this])}isDuplicateModifierCase(){return this.ctrlKey&&5===this.keyCode||this.shiftKey&&4===this.keyCode||this.altKey&&6===this.keyCode||this.metaKey&&57===this.keyCode}}class bt{constructor(e){if(0===e.length)throw p("parts");this.parts=e}}class wt{constructor(e,t,i,n,o,s){this.ctrlKey=e,this.shiftKey=t,this.altKey=i,this.metaKey=n,this.keyLabel=o,this.keyAriaLabel=s}}class Ct{}const yt=he?256:2048,St=he?2048:256;class kt{constructor(e){this._standardKeyboardEventBrand=!0;const t=e;this.browserEvent=t,this.target=t.target,this.ctrlKey=t.ctrlKey,this.shiftKey=t.shiftKey,this.altKey=t.altKey,this.metaKey=t.metaKey,this.keyCode=function(e){if(e.charCode){const t=String.fromCharCode(e.charCode).toUpperCase();return pt.fromString(t)}const t=e.keyCode;if(3===t)return 7;if(qe){if(59===t)return 80;if(107===t)return 81;if(109===t)return 83;if(he&&224===t)return 57}else if(Ge){if(91===t)return 57;if(he&&93===t)return 57;if(!he&&92===t)return 57}return at[t]||0}(t),this.code=t.code,this.ctrlKey=this.ctrlKey||5===this.keyCode,this.altKey=this.altKey||6===this.keyCode,this.shiftKey=this.shiftKey||4===this.keyCode,this.metaKey=this.metaKey||57===this.keyCode,this._asKeybinding=this._computeKeybinding(),this._asRuntimeKeybinding=this._computeRuntimeKeybinding()}preventDefault(){this.browserEvent&&this.browserEvent.preventDefault&&this.browserEvent.preventDefault()}stopPropagation(){this.browserEvent&&this.browserEvent.stopPropagation&&this.browserEvent.stopPropagation()}toKeybinding(){return this._asRuntimeKeybinding}equals(e){return this._asKeybinding===e}_computeKeybinding(){let e=0;5!==this.keyCode&&4!==this.keyCode&&6!==this.keyCode&&57!==this.keyCode&&(e=this.keyCode);let t=0;return this.ctrlKey&&(t|=yt),this.altKey&&(t|=512),this.shiftKey&&(t|=1024),this.metaKey&&(t|=St),t|=e,t}_computeRuntimeKeybinding(){let e=0;return 5!==this.keyCode&&4!==this.keyCode&&6!==this.keyCode&&57!==this.keyCode&&(e=this.keyCode),new vt(this.ctrlKey,this.shiftKey,this.altKey,this.metaKey,e)}}let Lt=!1,xt=null;function Dt(e){if(!e.parent||e.parent===e)return null;try{const t=e.location,i=e.parent.location;if("null"!==t.origin&&"null"!==i.origin&&t.origin!==i.origin)return Lt=!0,null}catch(e){return Lt=!0,null}return e.parent}class Et{static getSameOriginWindowChain(){if(!xt){xt=[];let e,t=window;do{e=Dt(t),e?xt.push({window:t,iframeElement:t.frameElement||null}):xt.push({window:t,iframeElement:null}),t=e}while(t)}return xt.slice(0)}static getPositionOfChildWindowRelativeToAncestorWindow(e,t){if(!t||e===t)return{top:0,left:0};let i=0,n=0;const o=this.getSameOriginWindowChain();for(const e of o){if(i+=e.window.scrollY,n+=e.window.scrollX,e.window===t)break;if(!e.iframeElement)break;const o=e.iframeElement.getBoundingClientRect();i+=o.top,n+=o.left}return{top:i,left:n}}}class Nt{constructor(e){this.timestamp=Date.now(),this.browserEvent=e,this.leftButton=0===e.button,this.middleButton=1===e.button,this.rightButton=2===e.button,this.buttons=e.buttons,this.target=e.target,this.detail=e.detail||1,"dblclick"===e.type&&(this.detail=2),this.ctrlKey=e.ctrlKey,this.shiftKey=e.shiftKey,this.altKey=e.altKey,this.metaKey=e.metaKey,"number"==typeof e.pageX?(this.posx=e.pageX,this.posy=e.pageY):(this.posx=e.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,this.posy=e.clientY+document.body.scrollTop+document.documentElement.scrollTop);const t=Et.getPositionOfChildWindowRelativeToAncestorWindow(self,e.view);this.posx-=t.left,this.posy-=t.top}preventDefault(){this.browserEvent.preventDefault()}stopPropagation(){this.browserEvent.stopPropagation()}}class It{constructor(e,t=0,i=0){if(this.browserEvent=e||null,this.target=e?e.target||e.targetNode||e.srcElement:null,this.deltaY=i,this.deltaX=t,e){const t=e,i=e;if(void 0!==t.wheelDeltaY)this.deltaY=t.wheelDeltaY/120;else if(void 0!==i.VERTICAL_AXIS&&i.axis===i.VERTICAL_AXIS)this.deltaY=-i.detail/3;else if("wheel"===e.type){const t=e;t.deltaMode===t.DOM_DELTA_LINE?this.deltaY=qe&&!he?-e.deltaY/3:-e.deltaY:this.deltaY=-e.deltaY/40}if(void 0!==t.wheelDeltaX)this.deltaX=Ye&&le?-t.wheelDeltaX/120:t.wheelDeltaX/120;else if(void 0!==i.HORIZONTAL_AXIS&&i.axis===i.HORIZONTAL_AXIS)this.deltaX=-e.detail/3;else if("wheel"===e.type){const t=e;t.deltaMode===t.DOM_DELTA_LINE?this.deltaX=qe&&!he?-e.deltaX/3:-e.deltaX:this.deltaX=-e.deltaX/40}0===this.deltaY&&0===this.deltaX&&e.wheelDelta&&(this.deltaY=e.wheelDelta/120)}}preventDefault(){this.browserEvent&&this.browserEvent.preventDefault()}stopPropagation(){this.browserEvent&&this.browserEvent.stopPropagation()}}var Mt=Object.hasOwnProperty,Tt=Object.setPrototypeOf,At=Object.isFrozen,Ot=Object.getPrototypeOf,Rt=Object.getOwnPropertyDescriptor,Pt=Object.freeze,Ft=Object.seal,Bt=Object.create,Vt="undefined"!=typeof Reflect&&Reflect,Wt=Vt.apply,zt=Vt.construct;Wt||(Wt=function(e,t,i){return e.apply(t,i)}),Pt||(Pt=function(e){return e}),Ft||(Ft=function(e){return e}),zt||(zt=function(e,t){return new(Function.prototype.bind.apply(e,[null].concat( +/*! @license DOMPurify 2.3.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.3.1/LICENSE */ +function(e){if(Array.isArray(e)){for(var t=0,i=Array(e.length);t1?i-1:0),o=1;o/gm),fi=Ft(/^data-[\-\w.\u00B7-\uFFFF]/),_i=Ft(/^aria-[\-\w]+$/),vi=Ft(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),bi=Ft(/^(?:\w+script|data):/i),wi=Ft(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Ci="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function yi(e){if(Array.isArray(e)){for(var t=0,i=Array(e.length);t0&&void 0!==arguments[0]?arguments[0]:Si(),i=function(t){return e(t)};if(i.version="2.3.1",i.removed=[],!t||!t.document||9!==t.document.nodeType)return i.isSupported=!1,i;var n=t.document,o=t.document,s=t.DocumentFragment,r=t.HTMLTemplateElement,a=t.Node,l=t.Element,h=t.NodeFilter,d=t.NamedNodeMap,c=void 0===d?t.NamedNodeMap||t.MozNamedAttrMap:d,u=t.Text,g=t.Comment,p=t.DOMParser,m=t.trustedTypes,f=l.prototype,_=ii(f,"cloneNode"),v=ii(f,"nextSibling"),b=ii(f,"childNodes"),w=ii(f,"parentNode");if("function"==typeof r){var C=o.createElement("template");C.content&&C.content.ownerDocument&&(o=C.content.ownerDocument)}var y=function(e,t){if("object"!==(void 0===e?"undefined":Ci(e))||"function"!=typeof e.createPolicy)return null;var i=null,n="data-tt-policy-suffix";t.currentScript&&t.currentScript.hasAttribute(n)&&(i=t.currentScript.getAttribute(n));var o="dompurify"+(i?"#"+i:"");try{return e.createPolicy(o,{createHTML:function(e){return e}})}catch(e){return console.warn("TrustedTypes policy "+o+" could not be created."),null}}(m,n),S=y&&te?y.createHTML(""):"",k=o,L=k.implementation,x=k.createNodeIterator,D=k.createDocumentFragment,E=k.getElementsByTagName,N=n.importNode,I={};try{I=ti(o).documentMode?o.documentMode:{}}catch(e){}var M={};i.isSupported="function"==typeof w&&L&&void 0!==L.createHTMLDocument&&9!==I;var T=pi,A=mi,O=fi,R=_i,P=bi,F=wi,B=vi,V=null,W=ei({},[].concat(yi(ni),yi(oi),yi(si),yi(ai),yi(hi))),z=null,H=ei({},[].concat(yi(di),yi(ci),yi(ui),yi(gi))),U=null,j=null,K=!0,$=!0,q=!1,G=!1,Z=!1,Y=!1,Q=!1,X=!1,J=!1,ee=!0,te=!1,ie=!0,ne=!0,oe=!1,se={},re=null,ae=ei({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),le=null,he=ei({},["audio","video","img","source","image","track"]),de=null,ce=ei({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ue="http://www.w3.org/1998/Math/MathML",ge="http://www.w3.org/2000/svg",pe="http://www.w3.org/1999/xhtml",me=pe,fe=!1,_e=null,ve=o.createElement("form"),be=function(e){_e&&_e===e||(e&&"object"===(void 0===e?"undefined":Ci(e))||(e={}),e=ti(e),V="ALLOWED_TAGS"in e?ei({},e.ALLOWED_TAGS):W,z="ALLOWED_ATTR"in e?ei({},e.ALLOWED_ATTR):H,de="ADD_URI_SAFE_ATTR"in e?ei(ti(ce),e.ADD_URI_SAFE_ATTR):ce,le="ADD_DATA_URI_TAGS"in e?ei(ti(he),e.ADD_DATA_URI_TAGS):he,re="FORBID_CONTENTS"in e?ei({},e.FORBID_CONTENTS):ae,U="FORBID_TAGS"in e?ei({},e.FORBID_TAGS):{},j="FORBID_ATTR"in e?ei({},e.FORBID_ATTR):{},se="USE_PROFILES"in e&&e.USE_PROFILES,K=!1!==e.ALLOW_ARIA_ATTR,$=!1!==e.ALLOW_DATA_ATTR,q=e.ALLOW_UNKNOWN_PROTOCOLS||!1,G=e.SAFE_FOR_TEMPLATES||!1,Z=e.WHOLE_DOCUMENT||!1,X=e.RETURN_DOM||!1,J=e.RETURN_DOM_FRAGMENT||!1,ee=!1!==e.RETURN_DOM_IMPORT,te=e.RETURN_TRUSTED_TYPE||!1,Q=e.FORCE_BODY||!1,ie=!1!==e.SANITIZE_DOM,ne=!1!==e.KEEP_CONTENT,oe=e.IN_PLACE||!1,B=e.ALLOWED_URI_REGEXP||B,me=e.NAMESPACE||pe,G&&($=!1),J&&(X=!0),se&&(V=ei({},[].concat(yi(hi))),z=[],!0===se.html&&(ei(V,ni),ei(z,di)),!0===se.svg&&(ei(V,oi),ei(z,ci),ei(z,gi)),!0===se.svgFilters&&(ei(V,si),ei(z,ci),ei(z,gi)),!0===se.mathMl&&(ei(V,ai),ei(z,ui),ei(z,gi))),e.ADD_TAGS&&(V===W&&(V=ti(V)),ei(V,e.ADD_TAGS)),e.ADD_ATTR&&(z===H&&(z=ti(z)),ei(z,e.ADD_ATTR)),e.ADD_URI_SAFE_ATTR&&ei(de,e.ADD_URI_SAFE_ATTR),e.FORBID_CONTENTS&&(re===ae&&(re=ti(re)),ei(re,e.FORBID_CONTENTS)),ne&&(V["#text"]=!0),Z&&ei(V,["html","head","body"]),V.table&&(ei(V,["tbody"]),delete U.tbody),Pt&&Pt(e),_e=e)},we=ei({},["mi","mo","mn","ms","mtext"]),Ce=ei({},["foreignobject","desc","title","annotation-xml"]),ye=ei({},oi);ei(ye,si),ei(ye,ri);var Se=ei({},ai);ei(Se,li);var ke=function(e){Kt(i.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){try{e.outerHTML=S}catch(t){e.remove()}}},Le=function(e,t){try{Kt(i.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){Kt(i.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!z[e])if(X||J)try{ke(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},xe=function(e){var t=void 0,i=void 0;if(Q)e=""+e;else{var n=qt(e,/^[\r\n\t ]+/);i=n&&n[0]}var s=y?y.createHTML(e):e;if(me===pe)try{t=(new p).parseFromString(s,"text/html")}catch(e){}if(!t||!t.documentElement){t=L.createDocument(me,"template",null);try{t.documentElement.innerHTML=fe?"":s}catch(e){}}var r=t.body||t.documentElement;return e&&i&&r.insertBefore(o.createTextNode(i),r.childNodes[0]||null),me===pe?E.call(t,Z?"html":"body")[0]:Z?t.documentElement:r},De=function(e){return x.call(e.ownerDocument||e,e,h.SHOW_ELEMENT|h.SHOW_COMMENT|h.SHOW_TEXT,null,!1)},Ee=function(e){return"object"===(void 0===a?"undefined":Ci(a))?e instanceof a:e&&"object"===(void 0===e?"undefined":Ci(e))&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},Ne=function(e,t,n){M[e]&&Ut(M[e],function(e){e.call(i,t,n,_e)})},Ie=function(e){var t,n=void 0;if(Ne("beforeSanitizeElements",e,null),!((t=e)instanceof u||t instanceof g||"string"==typeof t.nodeName&&"string"==typeof t.textContent&&"function"==typeof t.removeChild&&t.attributes instanceof c&&"function"==typeof t.removeAttribute&&"function"==typeof t.setAttribute&&"string"==typeof t.namespaceURI&&"function"==typeof t.insertBefore))return ke(e),!0;if(qt(e.nodeName,/[\u0080-\uFFFF]/))return ke(e),!0;var o=$t(e.nodeName);if(Ne("uponSanitizeElement",e,{tagName:o,allowedTags:V}),!Ee(e.firstElementChild)&&(!Ee(e.content)||!Ee(e.content.firstElementChild))&&Qt(/<[/\w]/g,e.innerHTML)&&Qt(/<[/\w]/g,e.textContent))return ke(e),!0;if("select"===o&&Qt(/

    H)py#zp#@^P6e8Gbt%M{%4I{(! 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�L$*DLlmBMFt`d8F3<@e*bg=(Y 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%0AGIykzU{iGV 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�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