From de10e4457f66c26e9ef2ae0c4bea951f49cc1290 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sun, 29 Mar 2015 22:13:26 +1030 Subject: [PATCH] Big front-end asset/filestructure refactor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Extract shared Ember components into a “flarum-common” ember-cli addon. This can be used by both the forum + admin Ember apps, keeping things DRY - Move LESS styles into their own top-level directory and do a similar thing (extract common styles) - Add LESS/JS compilation and versioning to PHP (AssetManager) - Set up admin entry point (Theoretical) upgrade instructions: - Delete everything in [app_root]/public - Set up tooling in forum/admin Ember apps (npm install/update, bower install/update) and then build them (ember build) - php artisan vendor:publish - Upgrade flarum/flarum repo (slight change in a config file) - If you need to trigger a LESS/JS recompile, delete the .css/.js files in [app_root]/public/flarum. I set up LiveReload to do this for me when I change files in less/ or ember/ Todo: - Start writing admin app! - Remove bootstrap/font-awesome from repo and instead depend on their composer packages? Maybe? (Bower is not an option here) --- framework/core/composer.json | 3 +- framework/core/composer.lock | 108 ++- framework/core/ember/admin/.bowerrc | 4 + framework/core/ember/admin/.editorconfig | 33 + framework/core/ember/admin/.gitignore | 17 + framework/core/ember/admin/.jshintrc | 33 + framework/core/ember/admin/.travis.yml | 20 + framework/core/ember/admin/Brocfile.js | 20 + framework/core/ember/admin/app/app.js | 18 + .../app/controllers}/.gitkeep | 0 framework/core/ember/admin/app/index.html | 25 + framework/core/ember/admin/app/router.js | 12 + .../app/models => admin/app/routes}/.gitkeep | 0 .../{forum => admin}/app/styles/.gitkeep | 0 .../login.less => admin/app/styles/app.less} | 0 .../utils => admin/app/templates}/.gitkeep | 0 .../core/ember/admin/app/templates/alerts.hbs | 7 + .../ember/admin/app/templates/application.hbs | 1 + .../core/ember/admin/app/templates/error.hbs | 13 + .../ember/admin/app/templates/loading.hbs | 1 + framework/core/ember/admin/app/views/.gitkeep | 0 framework/core/ember/admin/bower.json | 28 + .../core/ember/admin/config/environment.js | 53 ++ framework/core/ember/admin/package.json | 41 + framework/core/ember/admin/testem.json | 11 + framework/core/ember/admin/tests/.jshintrc | 74 ++ .../ember/admin/tests/helpers/resolver.js | 11 + .../ember/admin/tests/helpers/start-app.js | 19 + framework/core/ember/admin/tests/index.html | 33 + .../admin/tests/integration/index-test.js | 48 + .../core/ember/admin/tests/test-helper.js | 6 + .../core/ember/admin/tests/unit/.gitkeep | 0 framework/core/ember/common/.bowerrc | 4 + framework/core/ember/common/.editorconfig | 33 + framework/core/ember/common/.gitignore | 17 + framework/core/ember/common/.jshintrc | 32 + framework/core/ember/common/.npmignore | 12 + framework/core/ember/common/.travis.yml | 20 + framework/core/ember/common/Brocfile.js | 21 + framework/core/ember/common/addon/.gitkeep | 0 framework/core/ember/common/app/.gitkeep | 0 .../app/adapters/application.js | 4 +- .../app/authenticators/flarum.js | 0 .../app/authorizers/flarum.js | 0 .../app/components/ui/action-button.js | 0 .../app/components/ui/alert-message.js | 4 +- .../app/components/ui/badge-button.js | 2 +- .../app/components/ui/dropdown-button.js | 0 .../app/components/ui/dropdown-select.js | 0 .../app/components/ui/dropdown-split.js | 2 +- .../app/components/ui/field-set.js | 0 .../app/components/ui/item-list.js | 0 .../app/components/ui/loading-indicator.js | 0 .../app/components/ui/nav-item.js | 0 .../app/components/ui/search-input.js | 0 .../app/components/ui/select-input.js | 0 .../app/components/ui/separator-item.js | 0 .../app/components/ui/switch-input.js | 0 .../app/components/ui/text-editor.js | 4 +- .../app/components/ui/text-input.js | 0 .../app/components/ui/yesno-input.js | 0 .../core/ember/common/app/helpers/.gitkeep | 0 .../app/helpers/abbreviate-number.js | 0 .../{forum => common}/app/helpers/fa-icon.js | 0 .../app/helpers/full-time.js | 0 .../app/helpers/highlight-words.js | 0 .../app/helpers/human-time.js | 0 .../app/helpers/user-avatar.js | 0 .../app/helpers/user-name.js | 0 .../app/initializers/authentication.js | 4 +- .../app/initializers/find-query-one.js | 0 .../app/initializers/human-time-updater.js | 147 +++ .../app/initializers/inject-components.js | 0 .../app/initializers/preload-data.js | 0 .../app/mixins/add-css-class-to-body.js | 0 .../{forum => common}/app/mixins/fade-in.js | 0 .../app/mixins/has-item-lists.js | 6 +- .../app/mixins/modal-controller.js | 0 .../app/mixins/modal-view.js | 0 .../core/ember/common/app/models/.gitkeep | 0 .../{forum => common}/app/models/activity.js | 0 .../app/models/discussion-result.js | 0 .../app/models/discussion.js | 2 +- .../{forum => common}/app/models/group.js | 0 .../app/models/notification.js | 0 .../app/models/post-result.js | 0 .../app/models/post-stream.js | 0 .../{forum => common}/app/models/post.js | 0 .../{forum => common}/app/models/subject.js | 0 .../{forum => common}/app/models/user.js | 4 +- .../app/serializers/application.js | 0 .../{forum => common}/app/serializers/post.js | 2 +- .../templates/components/ui/alert-message.hbs | 0 .../components/ui/dropdown-button.hbs | 0 .../components/ui/dropdown-select.hbs | 0 .../components/ui/dropdown-split.hbs | 0 .../app/templates/components/ui/field-set.hbs | 0 .../app/templates/components/ui/item-list.hbs | 0 .../templates/components/ui/search-input.hbs | 0 .../templates/components/ui/switch-input.hbs | 0 .../templates/components/ui/text-editor.hbs | 0 .../templates/components/ui/yesno-input.hbs | 0 .../core/ember/common/app/utils/.gitkeep | 0 .../{forum => common}/app/utils/human-time.js | 0 .../app/utils/string-to-color.js | 0 .../app/utils/tagged-array.js | 0 framework/core/ember/common/bower.json | 16 + .../core/ember/common/config/environment.js | 5 + framework/core/ember/common/index.js | 6 + framework/core/ember/common/package.json | 43 + framework/core/ember/common/testem.json | 11 + framework/core/ember/common/tests/.jshintrc | 51 ++ .../core/ember/common/tests/dummy/app/app.js | 16 + .../tests/dummy/app/components/.gitkeep | 0 .../tests/dummy/app/controllers/.gitkeep | 0 .../common/tests/dummy/app/helpers/.gitkeep | 0 .../ember/common/tests/dummy/app/index.html | 25 + .../common/tests/dummy/app/models/.gitkeep | 0 .../ember/common/tests/dummy/app/router.js | 11 + .../common/tests/dummy/app/routes/.gitkeep | 0 .../common/tests/dummy/app/styles/app.css | 0 .../tests/dummy/app/templates/application.hbs | 3 + .../dummy/app/templates/components/.gitkeep | 0 .../common/tests/dummy/app/views/.gitkeep | 0 .../common/tests/dummy/config/environment.js | 47 + .../tests/dummy}/public/crossdomain.xml | 0 .../tests/dummy}/public/robots.txt | 0 .../ember/common/tests/helpers/resolver.js | 11 + .../ember/common/tests/helpers/start-app.js | 19 + framework/core/ember/common/tests/index.html | 33 + .../core/ember/common/tests/test-helper.js | 6 + .../core/ember/common/tests/unit/.gitkeep | 0 .../application/notification-item.js | 2 +- .../components/application/user-dropdown.js | 6 +- .../application/user-notifications.js | 2 +- .../app/components/composer/composer-body.js | 2 +- .../composer/composer-discussion.js | 2 +- .../app/components/composer/composer-edit.js | 2 +- .../app/components/composer/composer-reply.js | 2 +- .../app/components/discussion/post-comment.js | 16 +- .../discussion/post-discussion-renamed.js | 4 +- .../discussion/post-header/edited.js | 2 +- .../components/index/discussion-listing.js | 6 +- .../app/components/user/activity-item.js | 2 +- .../app/components/user/avatar-editor.js | 2 +- .../forum/app/components/user/user-card.js | 4 +- .../ember/forum/app/controllers/discussion.js | 8 +- .../core/ember/forum/app/controllers/index.js | 12 +- .../forum/app/controllers/index/index.js | 4 +- .../core/ember/forum/app/controllers/login.js | 2 +- .../ember/forum/app/controllers/signup.js | 2 +- .../app/initializers/human-time-updater.js | 147 --- .../ember/forum/app/routes/application.js | 2 +- .../core/ember/forum/app/routes/discussion.js | 4 +- .../ember/forum/app/routes/index/index.js | 4 +- framework/core/ember/forum/app/routes/user.js | 2 +- .../core/ember/forum/app/styles/app.less | 40 - .../forum/app/styles/bootstrap/bootstrap.less | 50 - .../core/ember/forum/app/views/application.js | 12 +- .../core/ember/forum/app/views/composer.js | 4 +- .../core/ember/forum/app/views/discussion.js | 6 +- framework/core/ember/forum/app/views/index.js | 12 +- framework/core/ember/forum/app/views/login.js | 2 +- .../core/ember/forum/app/views/signup.js | 2 +- framework/core/ember/forum/app/views/user.js | 6 +- .../ember/forum/app/views/user/settings.js | 10 +- framework/core/ember/forum/bower.json | 2 +- .../core/ember/forum/config/environment.js | 2 +- framework/core/ember/forum/package.json | 5 +- framework/core/less/.gitkeep | 0 framework/core/less/admin/app.less | 23 + .../styles/flarum => less/common}/alerts.less | 0 .../flarum => less/common}/avatars.less | 0 .../styles/flarum => less/common}/badges.less | 0 framework/core/less/common/bootstrap.less | 50 + .../core/less/common/bootstrap/alerts.less | 73 ++ .../core/less/common/bootstrap/badges.less | 66 ++ .../core/less/common/bootstrap/bootstrap.less | 50 + .../less/common/bootstrap/breadcrumbs.less | 26 + .../less/common/bootstrap/button-groups.less | 243 +++++ .../core/less/common/bootstrap/buttons.less | 166 ++++ .../core/less/common/bootstrap/carousel.less | 269 ++++++ .../core/less/common/bootstrap/close.less | 34 + .../core/less/common/bootstrap/code.less | 69 ++ .../bootstrap/component-animations.less | 33 + .../core/less/common/bootstrap/dropdowns.less | 214 +++++ .../core/less/common/bootstrap/forms.less | 600 ++++++++++++ .../less/common/bootstrap/glyphicons.less | 305 +++++++ .../core/less/common/bootstrap/grid.less | 84 ++ .../less/common/bootstrap/input-groups.less | 166 ++++ .../core/less/common/bootstrap/jumbotron.less | 50 + .../core/less/common/bootstrap/labels.less | 64 ++ .../less/common/bootstrap/list-group.less | 124 +++ .../core/less/common/bootstrap/media.less | 61 ++ .../core/less/common/bootstrap/mixins.less | 39 + .../less/common/bootstrap/mixins/alerts.less | 14 + .../bootstrap/mixins/background-variant.less | 9 + .../bootstrap/mixins/border-radius.less | 18 + .../less/common/bootstrap/mixins/buttons.less | 68 ++ .../common/bootstrap/mixins/center-block.less | 7 + .../common/bootstrap/mixins/clearfix.less | 22 + .../less/common/bootstrap/mixins/forms.less | 85 ++ .../common/bootstrap/mixins/gradients.less | 59 ++ .../bootstrap/mixins/grid-framework.less | 91 ++ .../less/common/bootstrap/mixins/grid.less | 122 +++ .../common/bootstrap/mixins/hide-text.less | 21 + .../less/common/bootstrap/mixins/image.less | 33 + .../less/common/bootstrap/mixins/labels.less | 12 + .../common/bootstrap/mixins/list-group.less | 29 + .../common/bootstrap/mixins/nav-divider.less | 10 + .../bootstrap/mixins/nav-vertical-align.less | 9 + .../less/common/bootstrap/mixins/opacity.less | 8 + .../common/bootstrap/mixins/pagination.less | 23 + .../less/common/bootstrap/mixins/panels.less | 24 + .../common/bootstrap/mixins/progress-bar.less | 10 + .../common/bootstrap/mixins/reset-filter.less | 8 + .../less/common/bootstrap/mixins/resize.less | 6 + .../mixins/responsive-visibility.less | 15 + .../less/common/bootstrap/mixins/size.less | 10 + .../common/bootstrap/mixins/tab-focus.less | 9 + .../common/bootstrap/mixins/table-row.less | 28 + .../bootstrap/mixins/text-emphasis.less | 9 + .../bootstrap/mixins/text-overflow.less | 8 + .../bootstrap/mixins/vendor-prefixes.less | 227 +++++ .../core/less/common/bootstrap/modals.less | 150 +++ .../core/less/common/bootstrap/navbar.less | 660 ++++++++++++++ .../core/less/common/bootstrap/navs.less | 242 +++++ .../core/less/common/bootstrap/normalize.less | 427 +++++++++ .../core/less/common/bootstrap/pager.less | 54 ++ .../less/common/bootstrap/pagination.less | 88 ++ .../core/less/common/bootstrap/panels.less | 265 ++++++ .../core/less/common/bootstrap/popovers.less | 135 +++ .../core/less/common/bootstrap/print.less | 107 +++ .../less/common/bootstrap/progress-bars.less | 87 ++ .../common/bootstrap/responsive-embed.less | 35 + .../bootstrap/responsive-utilities.less | 194 ++++ .../less/common/bootstrap/scaffolding.less | 162 ++++ .../core/less/common/bootstrap/tables.less | 234 +++++ .../core/less/common/bootstrap/theme.less | 273 ++++++ .../less/common/bootstrap/thumbnails.less | 36 + .../core/less/common/bootstrap/tooltip.less | 102 +++ .../core/less/common/bootstrap/type.less | 302 ++++++ .../core/less/common/bootstrap/utilities.less | 55 ++ .../core/less/common/bootstrap/variables.less | 862 ++++++++++++++++++ .../core/less/common/bootstrap/wells.less | 29 + .../flarum => less/common}/buttons.less | 0 .../flarum => less/common}/components.less | 2 +- .../app/styles => less/common}/config.less | 0 .../flarum => less/common}/dropdowns.less | 0 .../less/common/font-awesome/animated.less | 34 + .../common/font-awesome/bordered-pulled.less | 16 + .../core/less/common/font-awesome/core.less | 13 + .../less/common/font-awesome/fixed-width.less | 6 + .../common/font-awesome/font-awesome.less | 17 + .../core/less/common/font-awesome/icons.less | 596 ++++++++++++ .../core/less/common/font-awesome/larger.less | 13 + .../core/less/common/font-awesome/list.less | 19 + .../core/less/common/font-awesome/mixins.less | 27 + .../core/less/common/font-awesome/path.less | 15 + .../common/font-awesome/rotated-flipped.less | 20 + .../less/common/font-awesome/stacked.less | 20 + .../less/common/font-awesome/variables.less | 606 ++++++++++++ .../styles/flarum => less/common}/forms.less | 0 .../styles/flarum => less/common}/layout.less | 0 .../styles/flarum => less/common}/modals.less | 0 .../bootstrap => less/common}/variables.less | 0 framework/core/less/forum/app.less | 34 + .../flarum => less/forum}/composer.less | 0 .../flarum => less/forum}/discussion.less | 0 .../styles/flarum => less/forum}/hero.less | 0 .../styles/flarum => less/forum}/index.less | 0 framework/core/less/forum/login.less | 0 .../flarum => less/forum}/notifications.less | 0 .../flarum => less/forum}/settings.less | 0 .../styles/flarum => less/forum}/signup.less | 0 .../styles/flarum => less/forum}/user.less | 0 .../core/src/Admin/Actions/IndexAction.php | 54 ++ .../core/src/Admin/AdminServiceProvider.php | 45 + .../LoginWithCookieAndCheckAdmin.php | 29 + framework/core/src/Admin/routes.php | 19 + .../core/src/Core/CoreServiceProvider.php | 2 +- framework/core/src/Core/Models/User.php | 2 +- .../core/src/Web/Actions/IndexAction.php | 9 +- framework/core/src/Web/AssetManager.php | 212 +++-- framework/core/src/Web/WebServiceProvider.php | 26 +- .../{ember.blade.php => index.blade.php} | 10 +- 286 files changed, 11344 insertions(+), 460 deletions(-) create mode 100644 framework/core/ember/admin/.bowerrc create mode 100644 framework/core/ember/admin/.editorconfig create mode 100644 framework/core/ember/admin/.gitignore create mode 100644 framework/core/ember/admin/.jshintrc create mode 100644 framework/core/ember/admin/.travis.yml create mode 100644 framework/core/ember/admin/Brocfile.js create mode 100644 framework/core/ember/admin/app/app.js rename framework/core/ember/{forum/app/helpers => admin/app/controllers}/.gitkeep (100%) create mode 100644 framework/core/ember/admin/app/index.html create mode 100644 framework/core/ember/admin/app/router.js rename framework/core/ember/{forum/app/models => admin/app/routes}/.gitkeep (100%) rename framework/core/ember/{forum => admin}/app/styles/.gitkeep (100%) rename framework/core/ember/{forum/app/styles/flarum/login.less => admin/app/styles/app.less} (100%) rename framework/core/ember/{forum/app/utils => admin/app/templates}/.gitkeep (100%) create mode 100644 framework/core/ember/admin/app/templates/alerts.hbs create mode 100644 framework/core/ember/admin/app/templates/application.hbs create mode 100644 framework/core/ember/admin/app/templates/error.hbs create mode 100644 framework/core/ember/admin/app/templates/loading.hbs create mode 100644 framework/core/ember/admin/app/views/.gitkeep create mode 100644 framework/core/ember/admin/bower.json create mode 100644 framework/core/ember/admin/config/environment.js create mode 100644 framework/core/ember/admin/package.json create mode 100644 framework/core/ember/admin/testem.json create mode 100644 framework/core/ember/admin/tests/.jshintrc create mode 100644 framework/core/ember/admin/tests/helpers/resolver.js create mode 100644 framework/core/ember/admin/tests/helpers/start-app.js create mode 100644 framework/core/ember/admin/tests/index.html create mode 100644 framework/core/ember/admin/tests/integration/index-test.js create mode 100644 framework/core/ember/admin/tests/test-helper.js create mode 100644 framework/core/ember/admin/tests/unit/.gitkeep create mode 100644 framework/core/ember/common/.bowerrc create mode 100644 framework/core/ember/common/.editorconfig create mode 100644 framework/core/ember/common/.gitignore create mode 100644 framework/core/ember/common/.jshintrc create mode 100644 framework/core/ember/common/.npmignore create mode 100644 framework/core/ember/common/.travis.yml create mode 100644 framework/core/ember/common/Brocfile.js create mode 100644 framework/core/ember/common/addon/.gitkeep create mode 100644 framework/core/ember/common/app/.gitkeep rename framework/core/ember/{forum => common}/app/adapters/application.js (92%) rename framework/core/ember/{forum => common}/app/authenticators/flarum.js (100%) rename framework/core/ember/{forum => common}/app/authorizers/flarum.js (100%) rename framework/core/ember/{forum => common}/app/components/ui/action-button.js (100%) rename framework/core/ember/{forum => common}/app/components/ui/alert-message.js (90%) rename framework/core/ember/{forum => common}/app/components/ui/badge-button.js (74%) rename framework/core/ember/{forum => common}/app/components/ui/dropdown-button.js (100%) rename framework/core/ember/{forum => common}/app/components/ui/dropdown-select.js (100%) rename framework/core/ember/{forum => common}/app/components/ui/dropdown-split.js (90%) rename framework/core/ember/{forum => common}/app/components/ui/field-set.js (100%) rename framework/core/ember/{forum => common}/app/components/ui/item-list.js (100%) rename framework/core/ember/{forum => common}/app/components/ui/loading-indicator.js (100%) rename framework/core/ember/{forum => common}/app/components/ui/nav-item.js (100%) rename framework/core/ember/{forum => common}/app/components/ui/search-input.js (100%) rename framework/core/ember/{forum => common}/app/components/ui/select-input.js (100%) rename framework/core/ember/{forum => common}/app/components/ui/separator-item.js (100%) rename framework/core/ember/{forum => common}/app/components/ui/switch-input.js (100%) rename framework/core/ember/{forum => common}/app/components/ui/text-editor.js (86%) rename framework/core/ember/{forum => common}/app/components/ui/text-input.js (100%) rename framework/core/ember/{forum => common}/app/components/ui/yesno-input.js (100%) create mode 100644 framework/core/ember/common/app/helpers/.gitkeep rename framework/core/ember/{forum => common}/app/helpers/abbreviate-number.js (100%) rename framework/core/ember/{forum => common}/app/helpers/fa-icon.js (100%) rename framework/core/ember/{forum => common}/app/helpers/full-time.js (100%) rename framework/core/ember/{forum => common}/app/helpers/highlight-words.js (100%) rename framework/core/ember/{forum => common}/app/helpers/human-time.js (100%) rename framework/core/ember/{forum => common}/app/helpers/user-avatar.js (100%) rename framework/core/ember/{forum => common}/app/helpers/user-name.js (100%) rename framework/core/ember/{forum => common}/app/initializers/authentication.js (69%) rename framework/core/ember/{forum => common}/app/initializers/find-query-one.js (100%) create mode 100644 framework/core/ember/common/app/initializers/human-time-updater.js rename framework/core/ember/{forum => common}/app/initializers/inject-components.js (100%) rename framework/core/ember/{forum => common}/app/initializers/preload-data.js (100%) rename framework/core/ember/{forum => common}/app/mixins/add-css-class-to-body.js (100%) rename framework/core/ember/{forum => common}/app/mixins/fade-in.js (100%) rename framework/core/ember/{forum => common}/app/mixins/has-item-lists.js (88%) rename framework/core/ember/{forum => common}/app/mixins/modal-controller.js (100%) rename framework/core/ember/{forum => common}/app/mixins/modal-view.js (100%) create mode 100644 framework/core/ember/common/app/models/.gitkeep rename framework/core/ember/{forum => common}/app/models/activity.js (100%) rename framework/core/ember/{forum => common}/app/models/discussion-result.js (100%) rename framework/core/ember/{forum => common}/app/models/discussion.js (97%) rename framework/core/ember/{forum => common}/app/models/group.js (100%) rename framework/core/ember/{forum => common}/app/models/notification.js (100%) rename framework/core/ember/{forum => common}/app/models/post-result.js (100%) rename framework/core/ember/{forum => common}/app/models/post-stream.js (100%) rename framework/core/ember/{forum => common}/app/models/post.js (100%) rename framework/core/ember/{forum => common}/app/models/subject.js (100%) rename framework/core/ember/{forum => common}/app/models/user.js (88%) rename framework/core/ember/{forum => common}/app/serializers/application.js (100%) rename framework/core/ember/{forum => common}/app/serializers/post.js (85%) rename framework/core/ember/{forum => common}/app/templates/components/ui/alert-message.hbs (100%) rename framework/core/ember/{forum => common}/app/templates/components/ui/dropdown-button.hbs (100%) rename framework/core/ember/{forum => common}/app/templates/components/ui/dropdown-select.hbs (100%) rename framework/core/ember/{forum => common}/app/templates/components/ui/dropdown-split.hbs (100%) rename framework/core/ember/{forum => common}/app/templates/components/ui/field-set.hbs (100%) rename framework/core/ember/{forum => common}/app/templates/components/ui/item-list.hbs (100%) rename framework/core/ember/{forum => common}/app/templates/components/ui/search-input.hbs (100%) rename framework/core/ember/{forum => common}/app/templates/components/ui/switch-input.hbs (100%) rename framework/core/ember/{forum => common}/app/templates/components/ui/text-editor.hbs (100%) rename framework/core/ember/{forum => common}/app/templates/components/ui/yesno-input.hbs (100%) create mode 100644 framework/core/ember/common/app/utils/.gitkeep rename framework/core/ember/{forum => common}/app/utils/human-time.js (100%) rename framework/core/ember/{forum => common}/app/utils/string-to-color.js (100%) rename framework/core/ember/{forum => common}/app/utils/tagged-array.js (100%) create mode 100644 framework/core/ember/common/bower.json create mode 100644 framework/core/ember/common/config/environment.js create mode 100644 framework/core/ember/common/index.js create mode 100644 framework/core/ember/common/package.json create mode 100644 framework/core/ember/common/testem.json create mode 100644 framework/core/ember/common/tests/.jshintrc create mode 100644 framework/core/ember/common/tests/dummy/app/app.js create mode 100644 framework/core/ember/common/tests/dummy/app/components/.gitkeep create mode 100644 framework/core/ember/common/tests/dummy/app/controllers/.gitkeep create mode 100644 framework/core/ember/common/tests/dummy/app/helpers/.gitkeep create mode 100644 framework/core/ember/common/tests/dummy/app/index.html create mode 100644 framework/core/ember/common/tests/dummy/app/models/.gitkeep create mode 100644 framework/core/ember/common/tests/dummy/app/router.js create mode 100644 framework/core/ember/common/tests/dummy/app/routes/.gitkeep create mode 100644 framework/core/ember/common/tests/dummy/app/styles/app.css create mode 100644 framework/core/ember/common/tests/dummy/app/templates/application.hbs create mode 100644 framework/core/ember/common/tests/dummy/app/templates/components/.gitkeep create mode 100644 framework/core/ember/common/tests/dummy/app/views/.gitkeep create mode 100644 framework/core/ember/common/tests/dummy/config/environment.js rename framework/core/ember/{forum => common/tests/dummy}/public/crossdomain.xml (100%) rename framework/core/ember/{forum => common/tests/dummy}/public/robots.txt (100%) create mode 100644 framework/core/ember/common/tests/helpers/resolver.js create mode 100644 framework/core/ember/common/tests/helpers/start-app.js create mode 100644 framework/core/ember/common/tests/index.html create mode 100644 framework/core/ember/common/tests/test-helper.js create mode 100644 framework/core/ember/common/tests/unit/.gitkeep delete mode 100644 framework/core/ember/forum/app/initializers/human-time-updater.js delete mode 100644 framework/core/ember/forum/app/styles/bootstrap/bootstrap.less create mode 100644 framework/core/less/.gitkeep create mode 100644 framework/core/less/admin/app.less rename framework/core/{ember/forum/app/styles/flarum => less/common}/alerts.less (100%) rename framework/core/{ember/forum/app/styles/flarum => less/common}/avatars.less (100%) rename framework/core/{ember/forum/app/styles/flarum => less/common}/badges.less (100%) create mode 100644 framework/core/less/common/bootstrap.less create mode 100755 framework/core/less/common/bootstrap/alerts.less create mode 100755 framework/core/less/common/bootstrap/badges.less create mode 100755 framework/core/less/common/bootstrap/bootstrap.less create mode 100755 framework/core/less/common/bootstrap/breadcrumbs.less create mode 100755 framework/core/less/common/bootstrap/button-groups.less create mode 100755 framework/core/less/common/bootstrap/buttons.less create mode 100755 framework/core/less/common/bootstrap/carousel.less create mode 100755 framework/core/less/common/bootstrap/close.less create mode 100755 framework/core/less/common/bootstrap/code.less create mode 100755 framework/core/less/common/bootstrap/component-animations.less create mode 100755 framework/core/less/common/bootstrap/dropdowns.less create mode 100755 framework/core/less/common/bootstrap/forms.less create mode 100755 framework/core/less/common/bootstrap/glyphicons.less create mode 100755 framework/core/less/common/bootstrap/grid.less create mode 100755 framework/core/less/common/bootstrap/input-groups.less create mode 100755 framework/core/less/common/bootstrap/jumbotron.less create mode 100755 framework/core/less/common/bootstrap/labels.less create mode 100755 framework/core/less/common/bootstrap/list-group.less create mode 100755 framework/core/less/common/bootstrap/media.less create mode 100755 framework/core/less/common/bootstrap/mixins.less create mode 100755 framework/core/less/common/bootstrap/mixins/alerts.less create mode 100755 framework/core/less/common/bootstrap/mixins/background-variant.less create mode 100755 framework/core/less/common/bootstrap/mixins/border-radius.less create mode 100755 framework/core/less/common/bootstrap/mixins/buttons.less create mode 100755 framework/core/less/common/bootstrap/mixins/center-block.less create mode 100755 framework/core/less/common/bootstrap/mixins/clearfix.less create mode 100755 framework/core/less/common/bootstrap/mixins/forms.less create mode 100755 framework/core/less/common/bootstrap/mixins/gradients.less create mode 100755 framework/core/less/common/bootstrap/mixins/grid-framework.less create mode 100755 framework/core/less/common/bootstrap/mixins/grid.less create mode 100755 framework/core/less/common/bootstrap/mixins/hide-text.less create mode 100755 framework/core/less/common/bootstrap/mixins/image.less create mode 100755 framework/core/less/common/bootstrap/mixins/labels.less create mode 100755 framework/core/less/common/bootstrap/mixins/list-group.less create mode 100755 framework/core/less/common/bootstrap/mixins/nav-divider.less create mode 100755 framework/core/less/common/bootstrap/mixins/nav-vertical-align.less create mode 100755 framework/core/less/common/bootstrap/mixins/opacity.less create mode 100755 framework/core/less/common/bootstrap/mixins/pagination.less create mode 100755 framework/core/less/common/bootstrap/mixins/panels.less create mode 100755 framework/core/less/common/bootstrap/mixins/progress-bar.less create mode 100755 framework/core/less/common/bootstrap/mixins/reset-filter.less create mode 100755 framework/core/less/common/bootstrap/mixins/resize.less create mode 100755 framework/core/less/common/bootstrap/mixins/responsive-visibility.less create mode 100755 framework/core/less/common/bootstrap/mixins/size.less create mode 100755 framework/core/less/common/bootstrap/mixins/tab-focus.less create mode 100755 framework/core/less/common/bootstrap/mixins/table-row.less create mode 100755 framework/core/less/common/bootstrap/mixins/text-emphasis.less create mode 100755 framework/core/less/common/bootstrap/mixins/text-overflow.less create mode 100755 framework/core/less/common/bootstrap/mixins/vendor-prefixes.less create mode 100755 framework/core/less/common/bootstrap/modals.less create mode 100755 framework/core/less/common/bootstrap/navbar.less create mode 100755 framework/core/less/common/bootstrap/navs.less create mode 100755 framework/core/less/common/bootstrap/normalize.less create mode 100755 framework/core/less/common/bootstrap/pager.less create mode 100755 framework/core/less/common/bootstrap/pagination.less create mode 100755 framework/core/less/common/bootstrap/panels.less create mode 100755 framework/core/less/common/bootstrap/popovers.less create mode 100755 framework/core/less/common/bootstrap/print.less create mode 100755 framework/core/less/common/bootstrap/progress-bars.less create mode 100755 framework/core/less/common/bootstrap/responsive-embed.less create mode 100755 framework/core/less/common/bootstrap/responsive-utilities.less create mode 100755 framework/core/less/common/bootstrap/scaffolding.less create mode 100755 framework/core/less/common/bootstrap/tables.less create mode 100755 framework/core/less/common/bootstrap/theme.less create mode 100755 framework/core/less/common/bootstrap/thumbnails.less create mode 100755 framework/core/less/common/bootstrap/tooltip.less create mode 100755 framework/core/less/common/bootstrap/type.less create mode 100755 framework/core/less/common/bootstrap/utilities.less create mode 100755 framework/core/less/common/bootstrap/variables.less create mode 100755 framework/core/less/common/bootstrap/wells.less rename framework/core/{ember/forum/app/styles/flarum => less/common}/buttons.less (100%) rename framework/core/{ember/forum/app/styles/flarum => less/common}/components.less (92%) rename framework/core/{ember/forum/app/styles => less/common}/config.less (100%) rename framework/core/{ember/forum/app/styles/flarum => less/common}/dropdowns.less (100%) create mode 100644 framework/core/less/common/font-awesome/animated.less create mode 100644 framework/core/less/common/font-awesome/bordered-pulled.less create mode 100644 framework/core/less/common/font-awesome/core.less create mode 100644 framework/core/less/common/font-awesome/fixed-width.less create mode 100644 framework/core/less/common/font-awesome/font-awesome.less create mode 100644 framework/core/less/common/font-awesome/icons.less create mode 100644 framework/core/less/common/font-awesome/larger.less create mode 100644 framework/core/less/common/font-awesome/list.less create mode 100644 framework/core/less/common/font-awesome/mixins.less create mode 100644 framework/core/less/common/font-awesome/path.less create mode 100644 framework/core/less/common/font-awesome/rotated-flipped.less create mode 100644 framework/core/less/common/font-awesome/stacked.less create mode 100644 framework/core/less/common/font-awesome/variables.less rename framework/core/{ember/forum/app/styles/flarum => less/common}/forms.less (100%) rename framework/core/{ember/forum/app/styles/flarum => less/common}/layout.less (100%) rename framework/core/{ember/forum/app/styles/flarum => less/common}/modals.less (100%) rename framework/core/{ember/forum/app/styles/bootstrap => less/common}/variables.less (100%) create mode 100644 framework/core/less/forum/app.less rename framework/core/{ember/forum/app/styles/flarum => less/forum}/composer.less (100%) rename framework/core/{ember/forum/app/styles/flarum => less/forum}/discussion.less (100%) rename framework/core/{ember/forum/app/styles/flarum => less/forum}/hero.less (100%) rename framework/core/{ember/forum/app/styles/flarum => less/forum}/index.less (100%) create mode 100644 framework/core/less/forum/login.less rename framework/core/{ember/forum/app/styles/flarum => less/forum}/notifications.less (100%) rename framework/core/{ember/forum/app/styles/flarum => less/forum}/settings.less (100%) rename framework/core/{ember/forum/app/styles/flarum => less/forum}/signup.less (100%) rename framework/core/{ember/forum/app/styles/flarum => less/forum}/user.less (100%) create mode 100644 framework/core/src/Admin/Actions/IndexAction.php create mode 100644 framework/core/src/Admin/AdminServiceProvider.php create mode 100644 framework/core/src/Admin/Middleware/LoginWithCookieAndCheckAdmin.php create mode 100755 framework/core/src/Admin/routes.php rename framework/core/views/{ember.blade.php => index.blade.php} (69%) diff --git a/framework/core/composer.json b/framework/core/composer.json index 7b2f04d80..48084de4e 100644 --- a/framework/core/composer.json +++ b/framework/core/composer.json @@ -12,7 +12,8 @@ "illuminate/support": "5.0.*", "tobscure/json-api": "dev-master", "tobscure/permissible": "dev-master", - "misd/linkify": "1.1.*" + "misd/linkify": "1.1.*", + "oyejorge/less.php": "dev-master" }, "require-dev": { "fzaninotto/faker": "1.4.0", diff --git a/framework/core/composer.lock b/framework/core/composer.lock index 17e21d01d..e53e19234 100644 --- a/framework/core/composer.lock +++ b/framework/core/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "5b2f1014382942985a0fdf481770b8ce", + "hash": "f65be24ef3ec3cd5dd97390a0a76cd07", "packages": [ { "name": "danielstjules/stringy", @@ -135,12 +135,12 @@ "source": { "type": "git", "url": "https://github.com/illuminate/container.git", - "reference": "17cfa85970c5729cb504a7dfa0d142a5d1bb3547" + "reference": "a11c01c1d8b6941bd7ef2f104749ada5e34f146e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/container/zipball/17cfa85970c5729cb504a7dfa0d142a5d1bb3547", - "reference": "17cfa85970c5729cb504a7dfa0d142a5d1bb3547", + "url": "https://api.github.com/repos/illuminate/container/zipball/a11c01c1d8b6941bd7ef2f104749ada5e34f146e", + "reference": "a11c01c1d8b6941bd7ef2f104749ada5e34f146e", "shasum": "" }, "require": { @@ -170,7 +170,7 @@ ], "description": "The Illuminate Container package.", "homepage": "http://laravel.com", - "time": "2015-03-07 15:07:05" + "time": "2015-03-25 17:06:14" }, { "name": "illuminate/contracts", @@ -278,12 +278,12 @@ "source": { "type": "git", "url": "https://github.com/illuminate/support.git", - "reference": "c29ac982d9710dc1b841f91be230b5eff57e5698" + "reference": "29e8618a45d090572e092abf193a257bf28c48d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/c29ac982d9710dc1b841f91be230b5eff57e5698", - "reference": "c29ac982d9710dc1b841f91be230b5eff57e5698", + "url": "https://api.github.com/repos/illuminate/support/zipball/29e8618a45d090572e092abf193a257bf28c48d9", + "reference": "29e8618a45d090572e092abf193a257bf28c48d9", "shasum": "" }, "require": { @@ -322,7 +322,7 @@ ], "description": "The Illuminate Support package.", "homepage": "http://laravel.com", - "time": "2015-03-25 16:42:17" + "time": "2015-03-27 14:49:11" }, { "name": "misd/linkify", @@ -422,6 +422,65 @@ ], "time": "2015-03-26 03:05:57" }, + { + "name": "oyejorge/less.php", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/oyejorge/less.php.git", + "reference": "c42eeffc7becaa92770730c34de6887a2063bd1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/oyejorge/less.php/zipball/c42eeffc7becaa92770730c34de6887a2063bd1c", + "reference": "c42eeffc7becaa92770730c34de6887a2063bd1c", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "bin": [ + "bin/lessc" + ], + "type": "library", + "autoload": { + "psr-0": { + "Less": "lib/" + }, + "classmap": [ + "lessc.inc.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Matt Agar", + "homepage": "https://github.com/agar" + }, + { + "name": "Martin Jantošovič", + "homepage": "https://github.com/Mordred" + }, + { + "name": "Josh Schmidt", + "homepage": "https://github.com/oyejorge" + } + ], + "description": "PHP port of the Javascript version of LESS http://lesscss.org", + "homepage": "http://lessphp.gpeasy.com", + "keywords": [ + "css", + "less", + "less.js", + "lesscss", + "php", + "stylesheet" + ], + "time": "2015-03-23 16:12:13" + }, { "name": "symfony/translation", "version": "2.6.x-dev", @@ -562,12 +621,12 @@ "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "7202e73252980bf881c3ba4f26b5bf9d70c02470" + "reference": "d3910b30105b9a0f8b2877c079c1fda8f3f6905c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/7202e73252980bf881c3ba4f26b5bf9d70c02470", - "reference": "7202e73252980bf881c3ba4f26b5bf9d70c02470", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/d3910b30105b9a0f8b2877c079c1fda8f3f6905c", + "reference": "d3910b30105b9a0f8b2877c079c1fda8f3f6905c", "shasum": "" }, "require": { @@ -634,7 +693,7 @@ "functional testing", "unit testing" ], - "time": "2015-03-26 10:33:44" + "time": "2015-03-28 23:22:32" }, { "name": "codeception/mockery-module", @@ -1189,12 +1248,12 @@ "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "07606749da971eda75434814a313ed0ce6790f6a" + "reference": "8724cd239f8ef4c046f55a3b18b4d91cc7f3e4c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/07606749da971eda75434814a313ed0ce6790f6a", - "reference": "07606749da971eda75434814a313ed0ce6790f6a", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/8724cd239f8ef4c046f55a3b18b4d91cc7f3e4c5", + "reference": "8724cd239f8ef4c046f55a3b18b4d91cc7f3e4c5", "shasum": "" }, "require": { @@ -1208,7 +1267,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "1.4.x-dev" } }, "autoload": { @@ -1241,7 +1300,7 @@ "spy", "stub" ], - "time": "2015-03-20 17:41:29" + "time": "2015-03-27 19:31:25" }, { "name": "phpunit/php-code-coverage", @@ -1493,12 +1552,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "10f6685ca2cf5d8662b43a225ab853699821690b" + "reference": "14e06a4223608d1b9f434df3503b68945990bec6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/10f6685ca2cf5d8662b43a225ab853699821690b", - "reference": "10f6685ca2cf5d8662b43a225ab853699821690b", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/14e06a4223608d1b9f434df3503b68945990bec6", + "reference": "14e06a4223608d1b9f434df3503b68945990bec6", "shasum": "" }, "require": { @@ -1508,7 +1567,7 @@ "ext-reflection": "*", "ext-spl": "*", "php": ">=5.3.3", - "phpspec/prophecy": "~1.3.1", + "phpspec/prophecy": "~1.3,>=1.3.1", "phpunit/php-code-coverage": "~2.0,>=2.0.11", "phpunit/php-file-iterator": "~1.3.2", "phpunit/php-text-template": "~1.2", @@ -1557,7 +1616,7 @@ "testing", "xunit" ], - "time": "2015-03-02 06:58:30" + "time": "2015-03-28 20:45:33" }, { "name": "phpunit/phpunit-mock-objects", @@ -2415,7 +2474,8 @@ "minimum-stability": "dev", "stability-flags": { "tobscure/json-api": 20, - "tobscure/permissible": 20 + "tobscure/permissible": 20, + "oyejorge/less.php": 20 }, "prefer-stable": false, "prefer-lowest": false, diff --git a/framework/core/ember/admin/.bowerrc b/framework/core/ember/admin/.bowerrc new file mode 100644 index 000000000..959e1696e --- /dev/null +++ b/framework/core/ember/admin/.bowerrc @@ -0,0 +1,4 @@ +{ + "directory": "bower_components", + "analytics": false +} diff --git a/framework/core/ember/admin/.editorconfig b/framework/core/ember/admin/.editorconfig new file mode 100644 index 000000000..2fe4874a0 --- /dev/null +++ b/framework/core/ember/admin/.editorconfig @@ -0,0 +1,33 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 2 + +[*.js] +indent_style = space +indent_size = 2 + +[*.hbs] +indent_style = space +indent_size = 2 + +[*.css] +indent_style = space +indent_size = 2 + +[*.html] +indent_style = space +indent_size = 2 + +[*.{diff,md}] +trim_trailing_whitespace = false diff --git a/framework/core/ember/admin/.gitignore b/framework/core/ember/admin/.gitignore new file mode 100644 index 000000000..86fceae7a --- /dev/null +++ b/framework/core/ember/admin/.gitignore @@ -0,0 +1,17 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp + +# dependencies +/node_modules +/bower_components + +# misc +/.sass-cache +/connect.lock +/coverage/* +/libpeerconnection.log +npm-debug.log +testem.log diff --git a/framework/core/ember/admin/.jshintrc b/framework/core/ember/admin/.jshintrc new file mode 100644 index 000000000..e75f71963 --- /dev/null +++ b/framework/core/ember/admin/.jshintrc @@ -0,0 +1,33 @@ +{ + "predef": [ + "document", + "window", + "-Promise", + "moment" + ], + "browser": true, + "boss": true, + "curly": true, + "debug": false, + "devel": true, + "eqeqeq": true, + "evil": true, + "forin": false, + "immed": false, + "laxbreak": false, + "newcap": true, + "noarg": true, + "noempty": false, + "nonew": false, + "nomen": false, + "onevar": false, + "plusplus": false, + "regexp": false, + "undef": true, + "sub": true, + "strict": false, + "white": false, + "eqnull": true, + "esnext": true, + "unused": true +} diff --git a/framework/core/ember/admin/.travis.yml b/framework/core/ember/admin/.travis.yml new file mode 100644 index 000000000..cf23938b7 --- /dev/null +++ b/framework/core/ember/admin/.travis.yml @@ -0,0 +1,20 @@ +--- +language: node_js + +sudo: false + +cache: + directories: + - node_modules + +before_install: + - "npm config set spin false" + - "npm install -g npm@^2" + +install: + - npm install -g bower + - npm install + - bower install + +script: + - npm test diff --git a/framework/core/ember/admin/Brocfile.js b/framework/core/ember/admin/Brocfile.js new file mode 100644 index 000000000..0e4a4a415 --- /dev/null +++ b/framework/core/ember/admin/Brocfile.js @@ -0,0 +1,20 @@ +/* global require, module */ + +var EmberApp = require('ember-cli/lib/broccoli/ember-app'); + +var app = new EmberApp(); + +app.import('bower_components/bootstrap/dist/js/bootstrap.js'); +app.import('bower_components/spin.js/spin.js'); +app.import('bower_components/spin.js/jquery.spin.js'); +app.import('bower_components/moment/moment.js'); +app.import('bower_components/jquery.hotkeys/jquery.hotkeys.js'); +app.import('bower_components/blurjs/dist/jquery.blur.js'); + +app.import('bower_components/font-awesome/fonts/fontawesome-webfont.eot'); +app.import('bower_components/font-awesome/fonts/fontawesome-webfont.svg'); +app.import('bower_components/font-awesome/fonts/fontawesome-webfont.ttf'); +app.import('bower_components/font-awesome/fonts/fontawesome-webfont.woff'); +app.import('bower_components/font-awesome/fonts/FontAwesome.otf'); + +module.exports = app.toTree(); diff --git a/framework/core/ember/admin/app/app.js b/framework/core/ember/admin/app/app.js new file mode 100644 index 000000000..a4a0917c5 --- /dev/null +++ b/framework/core/ember/admin/app/app.js @@ -0,0 +1,18 @@ +import Ember from 'ember'; +import Resolver from 'ember/resolver'; +import loadInitializers from 'ember/load-initializers'; +import config from './config/environment'; + +Ember.MODEL_FACTORY_INJECTIONS = true; + +var App = Ember.Application.extend({ + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix, + Resolver: Resolver +}); + +loadInitializers(App, config.modulePrefix); + +Ember.$('#assets-loading').remove(); + +export default App; diff --git a/framework/core/ember/forum/app/helpers/.gitkeep b/framework/core/ember/admin/app/controllers/.gitkeep similarity index 100% rename from framework/core/ember/forum/app/helpers/.gitkeep rename to framework/core/ember/admin/app/controllers/.gitkeep diff --git a/framework/core/ember/admin/app/index.html b/framework/core/ember/admin/app/index.html new file mode 100644 index 000000000..5bfcca9ec --- /dev/null +++ b/framework/core/ember/admin/app/index.html @@ -0,0 +1,25 @@ + + + + + + Flarum + + + + {{content-for 'head'}} + + + + + {{content-for 'head-footer'}} + + + {{content-for 'body'}} + + + + + {{content-for 'body-footer'}} + + diff --git a/framework/core/ember/admin/app/router.js b/framework/core/ember/admin/app/router.js new file mode 100644 index 000000000..b00da59c6 --- /dev/null +++ b/framework/core/ember/admin/app/router.js @@ -0,0 +1,12 @@ +import Ember from 'ember'; +import config from './config/environment'; + +var Router = Ember.Router.extend({ + location: config.locationType +}); + +Router.map(function() { + // this.resource('index', {path: '/'} +}); + +export default Router; diff --git a/framework/core/ember/forum/app/models/.gitkeep b/framework/core/ember/admin/app/routes/.gitkeep similarity index 100% rename from framework/core/ember/forum/app/models/.gitkeep rename to framework/core/ember/admin/app/routes/.gitkeep diff --git a/framework/core/ember/forum/app/styles/.gitkeep b/framework/core/ember/admin/app/styles/.gitkeep similarity index 100% rename from framework/core/ember/forum/app/styles/.gitkeep rename to framework/core/ember/admin/app/styles/.gitkeep diff --git a/framework/core/ember/forum/app/styles/flarum/login.less b/framework/core/ember/admin/app/styles/app.less similarity index 100% rename from framework/core/ember/forum/app/styles/flarum/login.less rename to framework/core/ember/admin/app/styles/app.less diff --git a/framework/core/ember/forum/app/utils/.gitkeep b/framework/core/ember/admin/app/templates/.gitkeep similarity index 100% rename from framework/core/ember/forum/app/utils/.gitkeep rename to framework/core/ember/admin/app/templates/.gitkeep diff --git a/framework/core/ember/admin/app/templates/alerts.hbs b/framework/core/ember/admin/app/templates/alerts.hbs new file mode 100644 index 000000000..1821af7cd --- /dev/null +++ b/framework/core/ember/admin/app/templates/alerts.hbs @@ -0,0 +1,7 @@ +
+ {{#each alert in alerts}} +
+ {{view alert dismiss="dismissAlert"}} +
+ {{/each}} +
diff --git a/framework/core/ember/admin/app/templates/application.hbs b/framework/core/ember/admin/app/templates/application.hbs new file mode 100644 index 000000000..a8233120f --- /dev/null +++ b/framework/core/ember/admin/app/templates/application.hbs @@ -0,0 +1 @@ +hey there diff --git a/framework/core/ember/admin/app/templates/error.hbs b/framework/core/ember/admin/app/templates/error.hbs new file mode 100644 index 000000000..b17a9157d --- /dev/null +++ b/framework/core/ember/admin/app/templates/error.hbs @@ -0,0 +1,13 @@ +
+
+

Error

+
+
+ +
+
+

{{model.message}}

+ +
{{model.stack}}
+
+
diff --git a/framework/core/ember/admin/app/templates/loading.hbs b/framework/core/ember/admin/app/templates/loading.hbs new file mode 100644 index 000000000..ce3ce25fe --- /dev/null +++ b/framework/core/ember/admin/app/templates/loading.hbs @@ -0,0 +1 @@ +{{ui/loading-indicator class="loading-indicator-block"}} diff --git a/framework/core/ember/admin/app/views/.gitkeep b/framework/core/ember/admin/app/views/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/admin/bower.json b/framework/core/ember/admin/bower.json new file mode 100644 index 000000000..da9977507 --- /dev/null +++ b/framework/core/ember/admin/bower.json @@ -0,0 +1,28 @@ +{ + "name": "flarum-admin", + "dependencies": { + "jquery": "2.1.3", + "ember": "1.11.0-beta.3", + "ember-data": "1.0.0-beta.16.1", + "ember-resolver": "~0.1.11", + "loader.js": "ember-cli/loader.js#1.0.1", + "ember-cli-shims": "ember-cli/ember-cli-shims#0.0.3", + "ember-cli-test-loader": "0.1.3", + "ember-load-initializers": "ember-cli/ember-load-initializers#0.0.2", + "ember-qunit": "0.2.8", + "ember-qunit-notifications": "0.0.7", + "qunit": "~1.17.1", + "bootstrap": "~3.3.2", + "font-awesome": "~4", + "spin.js": "~2.0.1", + "moment": "~2.8.4", + "ember-simple-auth": "0.7.2", + "jquery.hotkeys": "jeresig/jquery.hotkeys#0.2.0", + "blurjs": "" + }, + "resolutions": { + "ember-cli-test-loader": "0.1.3", + "ember-qunit": "0.2.8", + "ember-qunit-notifications": "0.0.7" + } +} diff --git a/framework/core/ember/admin/config/environment.js b/framework/core/ember/admin/config/environment.js new file mode 100644 index 000000000..c33eccada --- /dev/null +++ b/framework/core/ember/admin/config/environment.js @@ -0,0 +1,53 @@ +/* jshint node: true */ + +module.exports = function(environment) { + var ENV = { + modulePrefix: 'flarum-admin', + environment: environment, + baseURL: '/', + apiURL: '/api', + locationType: 'hash', + EmberENV: { + FEATURES: { + // Here you can enable experimental features on an ember canary build + // e.g. 'with-controller': true + } + }, + + APP: { + // Here you can pass flags/options to your application instance + // when it is created + } + }; + + ENV['simple-auth'] = { + authorizer: 'authorizer:flarum' + }; + + if (environment === 'development') { + // ENV.APP.LOG_RESOLVER = true; + // ENV.APP.LOG_ACTIVE_GENERATION = true; + // ENV.APP.LOG_TRANSITIONS = true; + // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; + // ENV.APP.LOG_VIEW_LOOKUPS = true; + } + + if (environment === 'test') { + // Testem prefers this... + ENV.baseURL = '/'; + ENV.locationType = 'none'; + ENV.apiURL = 'http://flarum.dev/api', + + // keep test console output quieter + ENV.APP.LOG_ACTIVE_GENERATION = false; + ENV.APP.LOG_VIEW_LOOKUPS = false; + + ENV.APP.rootElement = '#ember-testing'; + } + + if (environment === 'production') { + + } + + return ENV; +}; diff --git a/framework/core/ember/admin/package.json b/framework/core/ember/admin/package.json new file mode 100644 index 000000000..ab902b052 --- /dev/null +++ b/framework/core/ember/admin/package.json @@ -0,0 +1,41 @@ +{ + "name": "flarum-admin", + "version": "0.0.0", + "private": true, + "directories": { + "doc": "doc", + "test": "tests" + }, + "scripts": { + "start": "ember server", + "build": "ember build", + "test": "ember test" + }, + "repository": "", + "engines": { + "node": ">= 0.10.0" + }, + "author": "", + "license": "MIT", + "devDependencies": { + "ember-cli": "^0.2.0-beta.1", + "ember-cli-app-version": "0.3.1", + "ember-cli-babel": "^4.1.0", + "ember-cli-content-security-policy": "0.3.0", + "ember-cli-dependency-checker": "0.0.7", + "ember-cli-htmlbars": "^0.7.4", + "ember-cli-ic-ajax": "0.1.1", + "ember-cli-inject-live-reload": "^1.3.0", + "ember-cli-less": "^1.0.5", + "ember-cli-qunit": "^0.3.8", + "ember-cli-simple-auth": "^0.7.2", + "ember-cli-uglify": "1.0.1", + "ember-data": "1.0.0-beta.16.1", + "ember-export-application-global": "^1.0.2", + "ember-json-api": "eneuhauser/ember-json-api", + "broccoli-ember-inline-template-compiler": "tobscure/broccoli-ember-inline-template-compiler#f884d11", + "express": "^4.8.5", + "glob": "^4.0.5", + "flarum-common": "file:../common" + } +} diff --git a/framework/core/ember/admin/testem.json b/framework/core/ember/admin/testem.json new file mode 100644 index 000000000..42a4ddb22 --- /dev/null +++ b/framework/core/ember/admin/testem.json @@ -0,0 +1,11 @@ +{ + "framework": "qunit", + "test_page": "tests/index.html?hidepassed", + "launch_in_ci": [ + "PhantomJS" + ], + "launch_in_dev": [ + "PhantomJS", + "Chrome" + ] +} diff --git a/framework/core/ember/admin/tests/.jshintrc b/framework/core/ember/admin/tests/.jshintrc new file mode 100644 index 000000000..6ebf71a02 --- /dev/null +++ b/framework/core/ember/admin/tests/.jshintrc @@ -0,0 +1,74 @@ +{ + "predef": [ + "document", + "window", + "location", + "setTimeout", + "$", + "-Promise", + "QUnit", + "define", + "console", + "equal", + "notEqual", + "notStrictEqual", + "test", + "asyncTest", + "testBoth", + "testWithDefault", + "raises", + "throws", + "deepEqual", + "start", + "stop", + "ok", + "strictEqual", + "module", + "moduleFor", + "moduleForComponent", + "moduleForModel", + "process", + "expect", + "visit", + "exists", + "fillIn", + "click", + "keyEvent", + "triggerEvent", + "find", + "findWithAssert", + "wait", + "DS", + "isolatedContainer", + "startApp", + "andThen", + "currentURL", + "currentPath", + "currentRouteName" + ], + "node": false, + "browser": false, + "boss": true, + "curly": false, + "debug": false, + "devel": false, + "eqeqeq": true, + "evil": true, + "forin": false, + "immed": false, + "laxbreak": false, + "newcap": true, + "noarg": true, + "noempty": false, + "nonew": false, + "nomen": false, + "onevar": false, + "plusplus": false, + "regexp": false, + "undef": true, + "sub": true, + "strict": false, + "white": false, + "eqnull": true, + "esnext": true +} diff --git a/framework/core/ember/admin/tests/helpers/resolver.js b/framework/core/ember/admin/tests/helpers/resolver.js new file mode 100644 index 000000000..28f4ece46 --- /dev/null +++ b/framework/core/ember/admin/tests/helpers/resolver.js @@ -0,0 +1,11 @@ +import Resolver from 'ember/resolver'; +import config from '../../config/environment'; + +var resolver = Resolver.create(); + +resolver.namespace = { + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix +}; + +export default resolver; diff --git a/framework/core/ember/admin/tests/helpers/start-app.js b/framework/core/ember/admin/tests/helpers/start-app.js new file mode 100644 index 000000000..16cc7c398 --- /dev/null +++ b/framework/core/ember/admin/tests/helpers/start-app.js @@ -0,0 +1,19 @@ +import Ember from 'ember'; +import Application from '../../app'; +import Router from '../../router'; +import config from '../../config/environment'; + +export default function startApp(attrs) { + var application; + + var attributes = Ember.merge({}, config.APP); + attributes = Ember.merge(attributes, attrs); // use defaults, but you can override; + + Ember.run(function() { + application = Application.create(attributes); + application.setupForTesting(); + application.injectTestHelpers(); + }); + + return application; +} diff --git a/framework/core/ember/admin/tests/index.html b/framework/core/ember/admin/tests/index.html new file mode 100644 index 000000000..7c43e2372 --- /dev/null +++ b/framework/core/ember/admin/tests/index.html @@ -0,0 +1,33 @@ + + + + + + Flarum Tests + + + + {{content-for 'head'}} + {{content-for 'test-head'}} + + + + + + {{content-for 'head-footer'}} + {{content-for 'test-head-footer'}} + + + + {{content-for 'body'}} + {{content-for 'test-body'}} + + + + + + + {{content-for 'body-footer'}} + {{content-for 'test-body-footer'}} + + diff --git a/framework/core/ember/admin/tests/integration/index-test.js b/framework/core/ember/admin/tests/integration/index-test.js new file mode 100644 index 000000000..859e5657d --- /dev/null +++ b/framework/core/ember/admin/tests/integration/index-test.js @@ -0,0 +1,48 @@ +import Ember from "ember"; +import { test } from 'ember-qunit'; +import startApp from '../helpers/start-app'; +var App; + +module('Index', { + setup: function() { + App = startApp(); + }, + teardown: function() { + Ember.run(App, App.destroy); + } +}); + +test('Discussion list loading', function() { + expect(3); + visit('/').then(function() { + equal(find('.discussions-list').length, 1, 'Page contains list of discussions'); + equal(find('.discussions-list li').length, 20, 'There are 20 discussions in the list'); + + click('.control-loadMore').then(function() { + equal(find('.discussions-list li').length, 40, 'There are 40 discussions in the list'); + }); + }); +}); + +test('Discussion list sorting', function() { + expect(1); + visit('/').then(function() { + fillIn('.control-sort select', 'replies').then(function() { + var discussions = find('.discussions-list li'); + var good = true; + var getCount = function(item) { + return parseInt(item.find('.count strong').text()); + }; + var previousCount = getCount(discussions.eq(0)); + for (var i = 1; i < discussions.length; i++) { + var count = getCount(discussions.eq(i)); + if (count > previousCount) { + good = false; + break; + } + previousCount = count; + } + ok(good, 'Discussions are listed in order of reply count'); + }); + }); +}); \ No newline at end of file diff --git a/framework/core/ember/admin/tests/test-helper.js b/framework/core/ember/admin/tests/test-helper.js new file mode 100644 index 000000000..e6cfb70fe --- /dev/null +++ b/framework/core/ember/admin/tests/test-helper.js @@ -0,0 +1,6 @@ +import resolver from './helpers/resolver'; +import { + setResolver +} from 'ember-qunit'; + +setResolver(resolver); diff --git a/framework/core/ember/admin/tests/unit/.gitkeep b/framework/core/ember/admin/tests/unit/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/common/.bowerrc b/framework/core/ember/common/.bowerrc new file mode 100644 index 000000000..959e1696e --- /dev/null +++ b/framework/core/ember/common/.bowerrc @@ -0,0 +1,4 @@ +{ + "directory": "bower_components", + "analytics": false +} diff --git a/framework/core/ember/common/.editorconfig b/framework/core/ember/common/.editorconfig new file mode 100644 index 000000000..2fe4874a0 --- /dev/null +++ b/framework/core/ember/common/.editorconfig @@ -0,0 +1,33 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 2 + +[*.js] +indent_style = space +indent_size = 2 + +[*.hbs] +indent_style = space +indent_size = 2 + +[*.css] +indent_style = space +indent_size = 2 + +[*.html] +indent_style = space +indent_size = 2 + +[*.{diff,md}] +trim_trailing_whitespace = false diff --git a/framework/core/ember/common/.gitignore b/framework/core/ember/common/.gitignore new file mode 100644 index 000000000..86fceae7a --- /dev/null +++ b/framework/core/ember/common/.gitignore @@ -0,0 +1,17 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp + +# dependencies +/node_modules +/bower_components + +# misc +/.sass-cache +/connect.lock +/coverage/* +/libpeerconnection.log +npm-debug.log +testem.log diff --git a/framework/core/ember/common/.jshintrc b/framework/core/ember/common/.jshintrc new file mode 100644 index 000000000..08096effa --- /dev/null +++ b/framework/core/ember/common/.jshintrc @@ -0,0 +1,32 @@ +{ + "predef": [ + "document", + "window", + "-Promise" + ], + "browser": true, + "boss": true, + "curly": true, + "debug": false, + "devel": true, + "eqeqeq": true, + "evil": true, + "forin": false, + "immed": false, + "laxbreak": false, + "newcap": true, + "noarg": true, + "noempty": false, + "nonew": false, + "nomen": false, + "onevar": false, + "plusplus": false, + "regexp": false, + "undef": true, + "sub": true, + "strict": false, + "white": false, + "eqnull": true, + "esnext": true, + "unused": true +} diff --git a/framework/core/ember/common/.npmignore b/framework/core/ember/common/.npmignore new file mode 100644 index 000000000..0533b9183 --- /dev/null +++ b/framework/core/ember/common/.npmignore @@ -0,0 +1,12 @@ +bower_components/ +tests/ + +.bowerrc +.editorconfig +.ember-cli +.travis.yml +.npmignore +**/.gitkeep +bower.json +Brocfile.js +testem.json diff --git a/framework/core/ember/common/.travis.yml b/framework/core/ember/common/.travis.yml new file mode 100644 index 000000000..cf23938b7 --- /dev/null +++ b/framework/core/ember/common/.travis.yml @@ -0,0 +1,20 @@ +--- +language: node_js + +sudo: false + +cache: + directories: + - node_modules + +before_install: + - "npm config set spin false" + - "npm install -g npm@^2" + +install: + - npm install -g bower + - npm install + - bower install + +script: + - npm test diff --git a/framework/core/ember/common/Brocfile.js b/framework/core/ember/common/Brocfile.js new file mode 100644 index 000000000..042a64dd6 --- /dev/null +++ b/framework/core/ember/common/Brocfile.js @@ -0,0 +1,21 @@ +/* jshint node: true */ +/* global require, module */ + +var EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); + +var app = new EmberAddon(); + +// Use `app.import` to add additional libraries to the generated +// output files. +// +// If you need to use different assets in different +// environments, specify an object as the first parameter. That +// object's keys should be the environment name and the values +// should be the asset to use in that environment. +// +// If the library that you are including contains AMD or ES6 +// modules that you would like to import into your application +// please specify an object with the list of modules as keys +// along with the exports of each module as its value. + +module.exports = app.toTree(); diff --git a/framework/core/ember/common/addon/.gitkeep b/framework/core/ember/common/addon/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/common/app/.gitkeep b/framework/core/ember/common/app/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/forum/app/adapters/application.js b/framework/core/ember/common/app/adapters/application.js similarity index 92% rename from framework/core/ember/forum/app/adapters/application.js rename to framework/core/ember/common/app/adapters/application.js index 351aac8d8..589a91e46 100644 --- a/framework/core/ember/forum/app/adapters/application.js +++ b/framework/core/ember/common/app/adapters/application.js @@ -1,8 +1,8 @@ import DS from 'ember-data'; import JsonApiAdapter from 'ember-json-api/json-api-adapter'; -import config from 'flarum/config/environment'; -import AlertMessage from 'flarum/components/ui/alert-message'; +import config from '../config/environment'; +import AlertMessage from '../components/ui/alert-message'; export default JsonApiAdapter.extend({ host: config.apiURL, diff --git a/framework/core/ember/forum/app/authenticators/flarum.js b/framework/core/ember/common/app/authenticators/flarum.js similarity index 100% rename from framework/core/ember/forum/app/authenticators/flarum.js rename to framework/core/ember/common/app/authenticators/flarum.js diff --git a/framework/core/ember/forum/app/authorizers/flarum.js b/framework/core/ember/common/app/authorizers/flarum.js similarity index 100% rename from framework/core/ember/forum/app/authorizers/flarum.js rename to framework/core/ember/common/app/authorizers/flarum.js diff --git a/framework/core/ember/forum/app/components/ui/action-button.js b/framework/core/ember/common/app/components/ui/action-button.js similarity index 100% rename from framework/core/ember/forum/app/components/ui/action-button.js rename to framework/core/ember/common/app/components/ui/action-button.js diff --git a/framework/core/ember/forum/app/components/ui/alert-message.js b/framework/core/ember/common/app/components/ui/alert-message.js similarity index 90% rename from framework/core/ember/forum/app/components/ui/alert-message.js rename to framework/core/ember/common/app/components/ui/alert-message.js index 24872757c..40a268243 100755 --- a/framework/core/ember/forum/app/components/ui/alert-message.js +++ b/framework/core/ember/common/app/components/ui/alert-message.js @@ -1,7 +1,7 @@ import Ember from 'ember'; -import HasItemLists from 'flarum/mixins/has-item-lists'; -import ActionButton from 'flarum/components/ui/action-button'; +import HasItemLists from '../../mixins/has-item-lists'; +import ActionButton from './action-button'; /** An alert message. Has a message, a `controls` item list, and a dismiss diff --git a/framework/core/ember/forum/app/components/ui/badge-button.js b/framework/core/ember/common/app/components/ui/badge-button.js similarity index 74% rename from framework/core/ember/forum/app/components/ui/badge-button.js rename to framework/core/ember/common/app/components/ui/badge-button.js index 1d709244c..b70920cc4 100644 --- a/framework/core/ember/forum/app/components/ui/badge-button.js +++ b/framework/core/ember/common/app/components/ui/badge-button.js @@ -1,4 +1,4 @@ -import ActionButton from 'flarum/components/ui/action-button'; +import ActionButton from './action-button'; export default ActionButton.extend({ tagName: 'span', diff --git a/framework/core/ember/forum/app/components/ui/dropdown-button.js b/framework/core/ember/common/app/components/ui/dropdown-button.js similarity index 100% rename from framework/core/ember/forum/app/components/ui/dropdown-button.js rename to framework/core/ember/common/app/components/ui/dropdown-button.js diff --git a/framework/core/ember/forum/app/components/ui/dropdown-select.js b/framework/core/ember/common/app/components/ui/dropdown-select.js similarity index 100% rename from framework/core/ember/forum/app/components/ui/dropdown-select.js rename to framework/core/ember/common/app/components/ui/dropdown-select.js diff --git a/framework/core/ember/forum/app/components/ui/dropdown-split.js b/framework/core/ember/common/app/components/ui/dropdown-split.js similarity index 90% rename from framework/core/ember/forum/app/components/ui/dropdown-split.js rename to framework/core/ember/common/app/components/ui/dropdown-split.js index 435718500..5fcc43690 100644 --- a/framework/core/ember/forum/app/components/ui/dropdown-split.js +++ b/framework/core/ember/common/app/components/ui/dropdown-split.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -import DropdownButton from 'flarum/components/ui/dropdown-button'; +import DropdownButton from './dropdown-button'; /** Given a list of items, this component displays a split button: the left side diff --git a/framework/core/ember/forum/app/components/ui/field-set.js b/framework/core/ember/common/app/components/ui/field-set.js similarity index 100% rename from framework/core/ember/forum/app/components/ui/field-set.js rename to framework/core/ember/common/app/components/ui/field-set.js diff --git a/framework/core/ember/forum/app/components/ui/item-list.js b/framework/core/ember/common/app/components/ui/item-list.js similarity index 100% rename from framework/core/ember/forum/app/components/ui/item-list.js rename to framework/core/ember/common/app/components/ui/item-list.js diff --git a/framework/core/ember/forum/app/components/ui/loading-indicator.js b/framework/core/ember/common/app/components/ui/loading-indicator.js similarity index 100% rename from framework/core/ember/forum/app/components/ui/loading-indicator.js rename to framework/core/ember/common/app/components/ui/loading-indicator.js diff --git a/framework/core/ember/forum/app/components/ui/nav-item.js b/framework/core/ember/common/app/components/ui/nav-item.js similarity index 100% rename from framework/core/ember/forum/app/components/ui/nav-item.js rename to framework/core/ember/common/app/components/ui/nav-item.js diff --git a/framework/core/ember/forum/app/components/ui/search-input.js b/framework/core/ember/common/app/components/ui/search-input.js similarity index 100% rename from framework/core/ember/forum/app/components/ui/search-input.js rename to framework/core/ember/common/app/components/ui/search-input.js diff --git a/framework/core/ember/forum/app/components/ui/select-input.js b/framework/core/ember/common/app/components/ui/select-input.js similarity index 100% rename from framework/core/ember/forum/app/components/ui/select-input.js rename to framework/core/ember/common/app/components/ui/select-input.js diff --git a/framework/core/ember/forum/app/components/ui/separator-item.js b/framework/core/ember/common/app/components/ui/separator-item.js similarity index 100% rename from framework/core/ember/forum/app/components/ui/separator-item.js rename to framework/core/ember/common/app/components/ui/separator-item.js diff --git a/framework/core/ember/forum/app/components/ui/switch-input.js b/framework/core/ember/common/app/components/ui/switch-input.js similarity index 100% rename from framework/core/ember/forum/app/components/ui/switch-input.js rename to framework/core/ember/common/app/components/ui/switch-input.js diff --git a/framework/core/ember/forum/app/components/ui/text-editor.js b/framework/core/ember/common/app/components/ui/text-editor.js similarity index 86% rename from framework/core/ember/forum/app/components/ui/text-editor.js rename to framework/core/ember/common/app/components/ui/text-editor.js index e3371f268..e61e737f1 100644 --- a/framework/core/ember/forum/app/components/ui/text-editor.js +++ b/framework/core/ember/common/app/components/ui/text-editor.js @@ -1,7 +1,7 @@ import Ember from 'ember'; -import HasItemLists from 'flarum/mixins/has-item-lists'; -import ActionButton from 'flarum/components/ui/action-button'; +import HasItemLists from '../../mixins/has-item-lists'; +import ActionButton from './action-button'; /** A text editor. Contains a textarea and an item list of `controls`, including diff --git a/framework/core/ember/forum/app/components/ui/text-input.js b/framework/core/ember/common/app/components/ui/text-input.js similarity index 100% rename from framework/core/ember/forum/app/components/ui/text-input.js rename to framework/core/ember/common/app/components/ui/text-input.js diff --git a/framework/core/ember/forum/app/components/ui/yesno-input.js b/framework/core/ember/common/app/components/ui/yesno-input.js similarity index 100% rename from framework/core/ember/forum/app/components/ui/yesno-input.js rename to framework/core/ember/common/app/components/ui/yesno-input.js diff --git a/framework/core/ember/common/app/helpers/.gitkeep b/framework/core/ember/common/app/helpers/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/forum/app/helpers/abbreviate-number.js b/framework/core/ember/common/app/helpers/abbreviate-number.js similarity index 100% rename from framework/core/ember/forum/app/helpers/abbreviate-number.js rename to framework/core/ember/common/app/helpers/abbreviate-number.js diff --git a/framework/core/ember/forum/app/helpers/fa-icon.js b/framework/core/ember/common/app/helpers/fa-icon.js similarity index 100% rename from framework/core/ember/forum/app/helpers/fa-icon.js rename to framework/core/ember/common/app/helpers/fa-icon.js diff --git a/framework/core/ember/forum/app/helpers/full-time.js b/framework/core/ember/common/app/helpers/full-time.js similarity index 100% rename from framework/core/ember/forum/app/helpers/full-time.js rename to framework/core/ember/common/app/helpers/full-time.js diff --git a/framework/core/ember/forum/app/helpers/highlight-words.js b/framework/core/ember/common/app/helpers/highlight-words.js similarity index 100% rename from framework/core/ember/forum/app/helpers/highlight-words.js rename to framework/core/ember/common/app/helpers/highlight-words.js diff --git a/framework/core/ember/forum/app/helpers/human-time.js b/framework/core/ember/common/app/helpers/human-time.js similarity index 100% rename from framework/core/ember/forum/app/helpers/human-time.js rename to framework/core/ember/common/app/helpers/human-time.js diff --git a/framework/core/ember/forum/app/helpers/user-avatar.js b/framework/core/ember/common/app/helpers/user-avatar.js similarity index 100% rename from framework/core/ember/forum/app/helpers/user-avatar.js rename to framework/core/ember/common/app/helpers/user-avatar.js diff --git a/framework/core/ember/forum/app/helpers/user-name.js b/framework/core/ember/common/app/helpers/user-name.js similarity index 100% rename from framework/core/ember/forum/app/helpers/user-name.js rename to framework/core/ember/common/app/helpers/user-name.js diff --git a/framework/core/ember/forum/app/initializers/authentication.js b/framework/core/ember/common/app/initializers/authentication.js similarity index 69% rename from framework/core/ember/forum/app/initializers/authentication.js rename to framework/core/ember/common/app/initializers/authentication.js index 8c431f6fa..fc257a003 100644 --- a/framework/core/ember/forum/app/initializers/authentication.js +++ b/framework/core/ember/common/app/initializers/authentication.js @@ -1,5 +1,5 @@ -import FlarumAuthorizer from 'flarum/authorizers/flarum'; -import Config from 'flarum/config/environment'; +import FlarumAuthorizer from '../authorizers/flarum'; +import Config from '../config/environment'; export default { name: 'authentication', diff --git a/framework/core/ember/forum/app/initializers/find-query-one.js b/framework/core/ember/common/app/initializers/find-query-one.js similarity index 100% rename from framework/core/ember/forum/app/initializers/find-query-one.js rename to framework/core/ember/common/app/initializers/find-query-one.js diff --git a/framework/core/ember/common/app/initializers/human-time-updater.js b/framework/core/ember/common/app/initializers/human-time-updater.js new file mode 100644 index 000000000..3b32e0371 --- /dev/null +++ b/framework/core/ember/common/app/initializers/human-time-updater.js @@ -0,0 +1,147 @@ +import Ember from 'ember'; + +import humanTime from '../utils/human-time'; + +var $ = Ember.$; + +export default { + name: 'human-time-updater', + initialize: function(container) { + + // Livestamp.js / v1.1.2 / (c) 2012 Matt Bradley / MIT License + // @todo rewrite this to be simpler and cleaner + (function($, moment) { + var updateInterval = 1e3, + paused = false, + $livestamps = $([]), + + init = function() { + livestampGlobal.resume(); + }, + + prep = function($el, timestamp) { + var oldData = $el.data('livestampdata'); + if (typeof timestamp == 'number') + timestamp *= 1e3; + + $el.removeAttr('data-livestamp') + .removeData('livestamp'); + + timestamp = moment(timestamp); + if (timestamp.diff(moment(new Date())) < 60 * 60) { + return; + } + if (moment.isMoment(timestamp) && !isNaN(+timestamp)) { + var newData = $.extend({ }, { 'original': $el.contents() }, oldData); + newData.moment = moment(timestamp); + + $el.data('livestampdata', newData).empty(); + $livestamps.push($el[0]); + } + }, + + run = function() { + if (paused) return; + livestampGlobal.update(); + setTimeout(run, updateInterval); + }, + + livestampGlobal = { + update: function() { + $('[data-humantime]').each(function() { + var $this = $(this); + prep($this, $this.attr('datetime')); + }); + + var toRemove = []; + $livestamps.each(function() { + var $this = $(this), + data = $this.data('livestampdata'); + + if (data === undefined) + toRemove.push(this); + else if (moment.isMoment(data.moment)) { + var from = $this.html(), + to = humanTime(data.moment); + // to = data.moment.fromNow(); + + if (from != to) { + var e = $.Event('change.livestamp'); + $this.trigger(e, [from, to]); + if (!e.isDefaultPrevented()) + $this.html(to); + } + } + }); + + $livestamps = $livestamps.not(toRemove); + }, + + pause: function() { + paused = true; + }, + + resume: function() { + paused = false; + run(); + }, + + interval: function(interval) { + if (interval === undefined) + return updateInterval; + updateInterval = interval; + } + }, + + livestampLocal = { + add: function($el, timestamp) { + if (typeof timestamp == 'number') + timestamp *= 1e3; + timestamp = moment(timestamp); + + if (moment.isMoment(timestamp) && !isNaN(+timestamp)) { + $el.each(function() { + prep($(this), timestamp); + }); + livestampGlobal.update(); + } + + return $el; + }, + + destroy: function($el) { + $livestamps = $livestamps.not($el); + $el.each(function() { + var $this = $(this), + data = $this.data('livestampdata'); + + if (data === undefined) + return $el; + + $this + .html(data.original ? data.original : '') + .removeData('livestampdata'); + }); + + return $el; + }, + + isLivestamp: function($el) { + return $el.data('livestampdata') !== undefined; + } + }; + + $.livestamp = livestampGlobal; + $(init); + $.fn.livestamp = function(method, options) { + if (!livestampLocal[method]) { + options = method; + method = 'add'; + } + + return livestampLocal[method](this, options); + }; + })(jQuery, moment); + + } +}; diff --git a/framework/core/ember/forum/app/initializers/inject-components.js b/framework/core/ember/common/app/initializers/inject-components.js similarity index 100% rename from framework/core/ember/forum/app/initializers/inject-components.js rename to framework/core/ember/common/app/initializers/inject-components.js diff --git a/framework/core/ember/forum/app/initializers/preload-data.js b/framework/core/ember/common/app/initializers/preload-data.js similarity index 100% rename from framework/core/ember/forum/app/initializers/preload-data.js rename to framework/core/ember/common/app/initializers/preload-data.js diff --git a/framework/core/ember/forum/app/mixins/add-css-class-to-body.js b/framework/core/ember/common/app/mixins/add-css-class-to-body.js similarity index 100% rename from framework/core/ember/forum/app/mixins/add-css-class-to-body.js rename to framework/core/ember/common/app/mixins/add-css-class-to-body.js diff --git a/framework/core/ember/forum/app/mixins/fade-in.js b/framework/core/ember/common/app/mixins/fade-in.js similarity index 100% rename from framework/core/ember/forum/app/mixins/fade-in.js rename to framework/core/ember/common/app/mixins/fade-in.js diff --git a/framework/core/ember/forum/app/mixins/has-item-lists.js b/framework/core/ember/common/app/mixins/has-item-lists.js similarity index 88% rename from framework/core/ember/forum/app/mixins/has-item-lists.js rename to framework/core/ember/common/app/mixins/has-item-lists.js index 682a7cfcf..e45b23a2e 100644 --- a/framework/core/ember/forum/app/mixins/has-item-lists.js +++ b/framework/core/ember/common/app/mixins/has-item-lists.js @@ -1,8 +1,8 @@ import Ember from 'ember'; -import TaggedArray from 'flarum/utils/tagged-array'; -import ActionButton from 'flarum/components/ui/action-button'; -import SeparatorItem from 'flarum/components/ui/separator-item'; +import TaggedArray from '../utils/tagged-array'; +import ActionButton from '../components/ui/action-button'; +import SeparatorItem from '../components/ui/separator-item'; export default Ember.Mixin.create({ itemLists: [], diff --git a/framework/core/ember/forum/app/mixins/modal-controller.js b/framework/core/ember/common/app/mixins/modal-controller.js similarity index 100% rename from framework/core/ember/forum/app/mixins/modal-controller.js rename to framework/core/ember/common/app/mixins/modal-controller.js diff --git a/framework/core/ember/forum/app/mixins/modal-view.js b/framework/core/ember/common/app/mixins/modal-view.js similarity index 100% rename from framework/core/ember/forum/app/mixins/modal-view.js rename to framework/core/ember/common/app/mixins/modal-view.js diff --git a/framework/core/ember/common/app/models/.gitkeep b/framework/core/ember/common/app/models/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/forum/app/models/activity.js b/framework/core/ember/common/app/models/activity.js similarity index 100% rename from framework/core/ember/forum/app/models/activity.js rename to framework/core/ember/common/app/models/activity.js diff --git a/framework/core/ember/forum/app/models/discussion-result.js b/framework/core/ember/common/app/models/discussion-result.js similarity index 100% rename from framework/core/ember/forum/app/models/discussion-result.js rename to framework/core/ember/common/app/models/discussion-result.js diff --git a/framework/core/ember/forum/app/models/discussion.js b/framework/core/ember/common/app/models/discussion.js similarity index 97% rename from framework/core/ember/forum/app/models/discussion.js rename to framework/core/ember/common/app/models/discussion.js index 4ab86148d..c1f292320 100644 --- a/framework/core/ember/forum/app/models/discussion.js +++ b/framework/core/ember/common/app/models/discussion.js @@ -1,7 +1,7 @@ import Ember from 'ember'; import DS from 'ember-data'; -import HasItemLists from 'flarum/mixins/has-item-lists'; +import HasItemLists from '../mixins/has-item-lists'; import Subject from './subject'; export default Subject.extend(HasItemLists, { diff --git a/framework/core/ember/forum/app/models/group.js b/framework/core/ember/common/app/models/group.js similarity index 100% rename from framework/core/ember/forum/app/models/group.js rename to framework/core/ember/common/app/models/group.js diff --git a/framework/core/ember/forum/app/models/notification.js b/framework/core/ember/common/app/models/notification.js similarity index 100% rename from framework/core/ember/forum/app/models/notification.js rename to framework/core/ember/common/app/models/notification.js diff --git a/framework/core/ember/forum/app/models/post-result.js b/framework/core/ember/common/app/models/post-result.js similarity index 100% rename from framework/core/ember/forum/app/models/post-result.js rename to framework/core/ember/common/app/models/post-result.js diff --git a/framework/core/ember/forum/app/models/post-stream.js b/framework/core/ember/common/app/models/post-stream.js similarity index 100% rename from framework/core/ember/forum/app/models/post-stream.js rename to framework/core/ember/common/app/models/post-stream.js diff --git a/framework/core/ember/forum/app/models/post.js b/framework/core/ember/common/app/models/post.js similarity index 100% rename from framework/core/ember/forum/app/models/post.js rename to framework/core/ember/common/app/models/post.js diff --git a/framework/core/ember/forum/app/models/subject.js b/framework/core/ember/common/app/models/subject.js similarity index 100% rename from framework/core/ember/forum/app/models/subject.js rename to framework/core/ember/common/app/models/subject.js diff --git a/framework/core/ember/forum/app/models/user.js b/framework/core/ember/common/app/models/user.js similarity index 88% rename from framework/core/ember/forum/app/models/user.js rename to framework/core/ember/common/app/models/user.js index 1f3b6f562..3885f9551 100644 --- a/framework/core/ember/forum/app/models/user.js +++ b/framework/core/ember/common/app/models/user.js @@ -1,7 +1,7 @@ import DS from 'ember-data'; -import HasItemLists from 'flarum/mixins/has-item-lists'; -import stringToColor from 'flarum/utils/string-to-color'; +import HasItemLists from '../mixins/has-item-lists'; +import stringToColor from '../utils/string-to-color'; export default DS.Model.extend(HasItemLists, { itemLists: ['badges'], diff --git a/framework/core/ember/forum/app/serializers/application.js b/framework/core/ember/common/app/serializers/application.js similarity index 100% rename from framework/core/ember/forum/app/serializers/application.js rename to framework/core/ember/common/app/serializers/application.js diff --git a/framework/core/ember/forum/app/serializers/post.js b/framework/core/ember/common/app/serializers/post.js similarity index 85% rename from framework/core/ember/forum/app/serializers/post.js rename to framework/core/ember/common/app/serializers/post.js index 020038ff9..661069c42 100644 --- a/framework/core/ember/forum/app/serializers/post.js +++ b/framework/core/ember/common/app/serializers/post.js @@ -1,4 +1,4 @@ -import ApplicationSerializer from 'flarum/serializers/application'; +import ApplicationSerializer from '../serializers/application'; export default ApplicationSerializer.extend({ attrs: { diff --git a/framework/core/ember/forum/app/templates/components/ui/alert-message.hbs b/framework/core/ember/common/app/templates/components/ui/alert-message.hbs similarity index 100% rename from framework/core/ember/forum/app/templates/components/ui/alert-message.hbs rename to framework/core/ember/common/app/templates/components/ui/alert-message.hbs diff --git a/framework/core/ember/forum/app/templates/components/ui/dropdown-button.hbs b/framework/core/ember/common/app/templates/components/ui/dropdown-button.hbs similarity index 100% rename from framework/core/ember/forum/app/templates/components/ui/dropdown-button.hbs rename to framework/core/ember/common/app/templates/components/ui/dropdown-button.hbs diff --git a/framework/core/ember/forum/app/templates/components/ui/dropdown-select.hbs b/framework/core/ember/common/app/templates/components/ui/dropdown-select.hbs similarity index 100% rename from framework/core/ember/forum/app/templates/components/ui/dropdown-select.hbs rename to framework/core/ember/common/app/templates/components/ui/dropdown-select.hbs diff --git a/framework/core/ember/forum/app/templates/components/ui/dropdown-split.hbs b/framework/core/ember/common/app/templates/components/ui/dropdown-split.hbs similarity index 100% rename from framework/core/ember/forum/app/templates/components/ui/dropdown-split.hbs rename to framework/core/ember/common/app/templates/components/ui/dropdown-split.hbs diff --git a/framework/core/ember/forum/app/templates/components/ui/field-set.hbs b/framework/core/ember/common/app/templates/components/ui/field-set.hbs similarity index 100% rename from framework/core/ember/forum/app/templates/components/ui/field-set.hbs rename to framework/core/ember/common/app/templates/components/ui/field-set.hbs diff --git a/framework/core/ember/forum/app/templates/components/ui/item-list.hbs b/framework/core/ember/common/app/templates/components/ui/item-list.hbs similarity index 100% rename from framework/core/ember/forum/app/templates/components/ui/item-list.hbs rename to framework/core/ember/common/app/templates/components/ui/item-list.hbs diff --git a/framework/core/ember/forum/app/templates/components/ui/search-input.hbs b/framework/core/ember/common/app/templates/components/ui/search-input.hbs similarity index 100% rename from framework/core/ember/forum/app/templates/components/ui/search-input.hbs rename to framework/core/ember/common/app/templates/components/ui/search-input.hbs diff --git a/framework/core/ember/forum/app/templates/components/ui/switch-input.hbs b/framework/core/ember/common/app/templates/components/ui/switch-input.hbs similarity index 100% rename from framework/core/ember/forum/app/templates/components/ui/switch-input.hbs rename to framework/core/ember/common/app/templates/components/ui/switch-input.hbs diff --git a/framework/core/ember/forum/app/templates/components/ui/text-editor.hbs b/framework/core/ember/common/app/templates/components/ui/text-editor.hbs similarity index 100% rename from framework/core/ember/forum/app/templates/components/ui/text-editor.hbs rename to framework/core/ember/common/app/templates/components/ui/text-editor.hbs diff --git a/framework/core/ember/forum/app/templates/components/ui/yesno-input.hbs b/framework/core/ember/common/app/templates/components/ui/yesno-input.hbs similarity index 100% rename from framework/core/ember/forum/app/templates/components/ui/yesno-input.hbs rename to framework/core/ember/common/app/templates/components/ui/yesno-input.hbs diff --git a/framework/core/ember/common/app/utils/.gitkeep b/framework/core/ember/common/app/utils/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/forum/app/utils/human-time.js b/framework/core/ember/common/app/utils/human-time.js similarity index 100% rename from framework/core/ember/forum/app/utils/human-time.js rename to framework/core/ember/common/app/utils/human-time.js diff --git a/framework/core/ember/forum/app/utils/string-to-color.js b/framework/core/ember/common/app/utils/string-to-color.js similarity index 100% rename from framework/core/ember/forum/app/utils/string-to-color.js rename to framework/core/ember/common/app/utils/string-to-color.js diff --git a/framework/core/ember/forum/app/utils/tagged-array.js b/framework/core/ember/common/app/utils/tagged-array.js similarity index 100% rename from framework/core/ember/forum/app/utils/tagged-array.js rename to framework/core/ember/common/app/utils/tagged-array.js diff --git a/framework/core/ember/common/bower.json b/framework/core/ember/common/bower.json new file mode 100644 index 000000000..71ce0e012 --- /dev/null +++ b/framework/core/ember/common/bower.json @@ -0,0 +1,16 @@ +{ + "name": "flarum-common", + "dependencies": { + "jquery": "^1.11.1", + "ember": "1.10.0", + "ember-data": "1.0.0-beta.15", + "ember-resolver": "~0.1.11", + "loader.js": "ember-cli/loader.js#1.0.1", + "ember-cli-shims": "ember-cli/ember-cli-shims#0.0.3", + "ember-cli-test-loader": "ember-cli-test-loader#0.1.3", + "ember-load-initializers": "ember-cli/ember-load-initializers#0.0.2", + "ember-qunit": "0.2.8", + "ember-qunit-notifications": "0.0.7", + "qunit": "~1.17.1" + } +} diff --git a/framework/core/ember/common/config/environment.js b/framework/core/ember/common/config/environment.js new file mode 100644 index 000000000..0dfaed472 --- /dev/null +++ b/framework/core/ember/common/config/environment.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = function(/* environment, appConfig */) { + return { }; +}; diff --git a/framework/core/ember/common/index.js b/framework/core/ember/common/index.js new file mode 100644 index 000000000..da3cda672 --- /dev/null +++ b/framework/core/ember/common/index.js @@ -0,0 +1,6 @@ +/* jshint node: true */ +'use strict'; + +module.exports = { + name: 'flarum-common' +}; diff --git a/framework/core/ember/common/package.json b/framework/core/ember/common/package.json new file mode 100644 index 000000000..b8ef14247 --- /dev/null +++ b/framework/core/ember/common/package.json @@ -0,0 +1,43 @@ +{ + "name": "flarum-common", + "version": "0.0.0", + "description": "The default blueprint for ember-cli addons.", + "directories": { + "doc": "doc", + "test": "tests" + }, + "scripts": { + "start": "ember server", + "build": "ember build", + "test": "ember test" + }, + "repository": "", + "engines": { + "node": ">= 0.10.0" + }, + "author": "", + "license": "MIT", + "devDependencies": { + "broccoli-asset-rev": "^2.0.0", + "ember-cli": "0.2.0-beta.1", + "ember-cli-babel": "^4.0.0", + "ember-cli-app-version": "0.3.1", + "ember-cli-content-security-policy": "0.3.0", + "ember-cli-dependency-checker": "0.0.7", + "ember-cli-htmlbars": "0.7.4", + "ember-cli-ic-ajax": "0.1.1", + "ember-cli-inject-live-reload": "^1.3.0", + "ember-cli-qunit": "0.3.8", + "ember-cli-uglify": "1.0.1", + "ember-data": "1.0.0-beta.15", + "ember-export-application-global": "^1.0.2", + "express": "^4.8.5", + "glob": "^4.0.5" + }, + "keywords": [ + "ember-addon" + ], + "ember-addon": { + "configPath": "tests/dummy/config" + } +} diff --git a/framework/core/ember/common/testem.json b/framework/core/ember/common/testem.json new file mode 100644 index 000000000..42a4ddb22 --- /dev/null +++ b/framework/core/ember/common/testem.json @@ -0,0 +1,11 @@ +{ + "framework": "qunit", + "test_page": "tests/index.html?hidepassed", + "launch_in_ci": [ + "PhantomJS" + ], + "launch_in_dev": [ + "PhantomJS", + "Chrome" + ] +} diff --git a/framework/core/ember/common/tests/.jshintrc b/framework/core/ember/common/tests/.jshintrc new file mode 100644 index 000000000..ea8b88f62 --- /dev/null +++ b/framework/core/ember/common/tests/.jshintrc @@ -0,0 +1,51 @@ +{ + "predef": [ + "document", + "window", + "location", + "setTimeout", + "$", + "-Promise", + "define", + "console", + "visit", + "exists", + "fillIn", + "click", + "keyEvent", + "triggerEvent", + "find", + "findWithAssert", + "wait", + "DS", + "andThen", + "currentURL", + "currentPath", + "currentRouteName" + ], + "node": false, + "browser": false, + "boss": true, + "curly": false, + "debug": false, + "devel": false, + "eqeqeq": true, + "evil": true, + "forin": false, + "immed": false, + "laxbreak": false, + "newcap": true, + "noarg": true, + "noempty": false, + "nonew": false, + "nomen": false, + "onevar": false, + "plusplus": false, + "regexp": false, + "undef": true, + "sub": true, + "strict": false, + "white": false, + "eqnull": true, + "esnext": true +} diff --git a/framework/core/ember/common/tests/dummy/app/app.js b/framework/core/ember/common/tests/dummy/app/app.js new file mode 100644 index 000000000..757df3899 --- /dev/null +++ b/framework/core/ember/common/tests/dummy/app/app.js @@ -0,0 +1,16 @@ +import Ember from 'ember'; +import Resolver from 'ember/resolver'; +import loadInitializers from 'ember/load-initializers'; +import config from './config/environment'; + +Ember.MODEL_FACTORY_INJECTIONS = true; + +var App = Ember.Application.extend({ + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix, + Resolver: Resolver +}); + +loadInitializers(App, config.modulePrefix); + +export default App; diff --git a/framework/core/ember/common/tests/dummy/app/components/.gitkeep b/framework/core/ember/common/tests/dummy/app/components/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/common/tests/dummy/app/controllers/.gitkeep b/framework/core/ember/common/tests/dummy/app/controllers/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/common/tests/dummy/app/helpers/.gitkeep b/framework/core/ember/common/tests/dummy/app/helpers/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/common/tests/dummy/app/index.html b/framework/core/ember/common/tests/dummy/app/index.html new file mode 100644 index 000000000..1c49d36d0 --- /dev/null +++ b/framework/core/ember/common/tests/dummy/app/index.html @@ -0,0 +1,25 @@ + + + + + + Dummy + + + + {{content-for 'head'}} + + + + + {{content-for 'head-footer'}} + + + {{content-for 'body'}} + + + + + {{content-for 'body-footer'}} + + diff --git a/framework/core/ember/common/tests/dummy/app/models/.gitkeep b/framework/core/ember/common/tests/dummy/app/models/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/common/tests/dummy/app/router.js b/framework/core/ember/common/tests/dummy/app/router.js new file mode 100644 index 000000000..cef554b3d --- /dev/null +++ b/framework/core/ember/common/tests/dummy/app/router.js @@ -0,0 +1,11 @@ +import Ember from 'ember'; +import config from './config/environment'; + +var Router = Ember.Router.extend({ + location: config.locationType +}); + +Router.map(function() { +}); + +export default Router; diff --git a/framework/core/ember/common/tests/dummy/app/routes/.gitkeep b/framework/core/ember/common/tests/dummy/app/routes/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/common/tests/dummy/app/styles/app.css b/framework/core/ember/common/tests/dummy/app/styles/app.css new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/common/tests/dummy/app/templates/application.hbs b/framework/core/ember/common/tests/dummy/app/templates/application.hbs new file mode 100644 index 000000000..05eb936cf --- /dev/null +++ b/framework/core/ember/common/tests/dummy/app/templates/application.hbs @@ -0,0 +1,3 @@ +

Welcome to Ember.js

+ +{{outlet}} diff --git a/framework/core/ember/common/tests/dummy/app/templates/components/.gitkeep b/framework/core/ember/common/tests/dummy/app/templates/components/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/common/tests/dummy/app/views/.gitkeep b/framework/core/ember/common/tests/dummy/app/views/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/common/tests/dummy/config/environment.js b/framework/core/ember/common/tests/dummy/config/environment.js new file mode 100644 index 000000000..c59bcd538 --- /dev/null +++ b/framework/core/ember/common/tests/dummy/config/environment.js @@ -0,0 +1,47 @@ +/* jshint node: true */ + +module.exports = function(environment) { + var ENV = { + modulePrefix: 'dummy', + environment: environment, + baseURL: '/', + locationType: 'auto', + EmberENV: { + FEATURES: { + // Here you can enable experimental features on an ember canary build + // e.g. 'with-controller': true + } + }, + + APP: { + // Here you can pass flags/options to your application instance + // when it is created + } + }; + + if (environment === 'development') { + // ENV.APP.LOG_RESOLVER = true; + // ENV.APP.LOG_ACTIVE_GENERATION = true; + // ENV.APP.LOG_TRANSITIONS = true; + // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; + // ENV.APP.LOG_VIEW_LOOKUPS = true; + } + + if (environment === 'test') { + // Testem prefers this... + ENV.baseURL = '/'; + ENV.locationType = 'none'; + + // keep test console output quieter + ENV.APP.LOG_ACTIVE_GENERATION = false; + ENV.APP.LOG_VIEW_LOOKUPS = false; + + ENV.APP.rootElement = '#ember-testing'; + } + + if (environment === 'production') { + + } + + return ENV; +}; diff --git a/framework/core/ember/forum/public/crossdomain.xml b/framework/core/ember/common/tests/dummy/public/crossdomain.xml similarity index 100% rename from framework/core/ember/forum/public/crossdomain.xml rename to framework/core/ember/common/tests/dummy/public/crossdomain.xml diff --git a/framework/core/ember/forum/public/robots.txt b/framework/core/ember/common/tests/dummy/public/robots.txt similarity index 100% rename from framework/core/ember/forum/public/robots.txt rename to framework/core/ember/common/tests/dummy/public/robots.txt diff --git a/framework/core/ember/common/tests/helpers/resolver.js b/framework/core/ember/common/tests/helpers/resolver.js new file mode 100644 index 000000000..28f4ece46 --- /dev/null +++ b/framework/core/ember/common/tests/helpers/resolver.js @@ -0,0 +1,11 @@ +import Resolver from 'ember/resolver'; +import config from '../../config/environment'; + +var resolver = Resolver.create(); + +resolver.namespace = { + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix +}; + +export default resolver; diff --git a/framework/core/ember/common/tests/helpers/start-app.js b/framework/core/ember/common/tests/helpers/start-app.js new file mode 100644 index 000000000..16cc7c398 --- /dev/null +++ b/framework/core/ember/common/tests/helpers/start-app.js @@ -0,0 +1,19 @@ +import Ember from 'ember'; +import Application from '../../app'; +import Router from '../../router'; +import config from '../../config/environment'; + +export default function startApp(attrs) { + var application; + + var attributes = Ember.merge({}, config.APP); + attributes = Ember.merge(attributes, attrs); // use defaults, but you can override; + + Ember.run(function() { + application = Application.create(attributes); + application.setupForTesting(); + application.injectTestHelpers(); + }); + + return application; +} diff --git a/framework/core/ember/common/tests/index.html b/framework/core/ember/common/tests/index.html new file mode 100644 index 000000000..8fea6fe70 --- /dev/null +++ b/framework/core/ember/common/tests/index.html @@ -0,0 +1,33 @@ + + + + + + Dummy Tests + + + + {{content-for 'head'}} + {{content-for 'test-head'}} + + + + + + {{content-for 'head-footer'}} + {{content-for 'test-head-footer'}} + + + + {{content-for 'body'}} + {{content-for 'test-body'}} + + + + + + + {{content-for 'body-footer'}} + {{content-for 'test-body-footer'}} + + diff --git a/framework/core/ember/common/tests/test-helper.js b/framework/core/ember/common/tests/test-helper.js new file mode 100644 index 000000000..e6cfb70fe --- /dev/null +++ b/framework/core/ember/common/tests/test-helper.js @@ -0,0 +1,6 @@ +import resolver from './helpers/resolver'; +import { + setResolver +} from 'ember-qunit'; + +setResolver(resolver); diff --git a/framework/core/ember/common/tests/unit/.gitkeep b/framework/core/ember/common/tests/unit/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/ember/forum/app/components/application/notification-item.js b/framework/core/ember/forum/app/components/application/notification-item.js index c91f13ac0..7c6954d56 100644 --- a/framework/core/ember/forum/app/components/application/notification-item.js +++ b/framework/core/ember/forum/app/components/application/notification-item.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -import FadeIn from 'flarum/mixins/fade-in'; +import FadeIn from 'flarum-forum/mixins/fade-in'; export default Ember.Component.extend(FadeIn, { layoutName: 'components/application/notification-item', diff --git a/framework/core/ember/forum/app/components/application/user-dropdown.js b/framework/core/ember/forum/app/components/application/user-dropdown.js index a35b49b7b..c9379d421 100644 --- a/framework/core/ember/forum/app/components/application/user-dropdown.js +++ b/framework/core/ember/forum/app/components/application/user-dropdown.js @@ -1,8 +1,8 @@ import Ember from 'ember'; -import HasItemLists from 'flarum/mixins/has-item-lists'; -import DropdownButton from 'flarum/components/ui/dropdown-button'; -import config from 'flarum/config/environment'; +import HasItemLists from 'flarum-forum/mixins/has-item-lists'; +import DropdownButton from 'flarum-forum/components/ui/dropdown-button'; +import config from 'flarum-forum/config/environment'; var precompileTemplate = Ember.Handlebars.compile; diff --git a/framework/core/ember/forum/app/components/application/user-notifications.js b/framework/core/ember/forum/app/components/application/user-notifications.js index cfb00ddc1..e89dd3205 100644 --- a/framework/core/ember/forum/app/components/application/user-notifications.js +++ b/framework/core/ember/forum/app/components/application/user-notifications.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -import DropdownButton from 'flarum/components/ui/dropdown-button'; +import DropdownButton from 'flarum-forum/components/ui/dropdown-button'; var precompileTemplate = Ember.Handlebars.compile; diff --git a/framework/core/ember/forum/app/components/composer/composer-body.js b/framework/core/ember/forum/app/components/composer/composer-body.js index 9dc246a17..900c97412 100644 --- a/framework/core/ember/forum/app/components/composer/composer-body.js +++ b/framework/core/ember/forum/app/components/composer/composer-body.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -import HasItemLists from 'flarum/mixins/has-item-lists'; +import HasItemLists from 'flarum-forum/mixins/has-item-lists'; /** This component is a base class for a composer body. It provides a template diff --git a/framework/core/ember/forum/app/components/composer/composer-discussion.js b/framework/core/ember/forum/app/components/composer/composer-discussion.js index 7dee13621..766168d41 100644 --- a/framework/core/ember/forum/app/components/composer/composer-discussion.js +++ b/framework/core/ember/forum/app/components/composer/composer-discussion.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -import ComposerBody from 'flarum/components/composer/composer-body'; +import ComposerBody from 'flarum-forum/components/composer/composer-body'; var precompileTemplate = Ember.Handlebars.compile; diff --git a/framework/core/ember/forum/app/components/composer/composer-edit.js b/framework/core/ember/forum/app/components/composer/composer-edit.js index 03896d1d2..4c7e902f0 100644 --- a/framework/core/ember/forum/app/components/composer/composer-edit.js +++ b/framework/core/ember/forum/app/components/composer/composer-edit.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -import ComposerBody from 'flarum/components/composer/composer-body'; +import ComposerBody from 'flarum-forum/components/composer/composer-body'; var precompileTemplate = Ember.Handlebars.compile; diff --git a/framework/core/ember/forum/app/components/composer/composer-reply.js b/framework/core/ember/forum/app/components/composer/composer-reply.js index 7778310d0..646568468 100644 --- a/framework/core/ember/forum/app/components/composer/composer-reply.js +++ b/framework/core/ember/forum/app/components/composer/composer-reply.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -import ComposerBody from 'flarum/components/composer/composer-body'; +import ComposerBody from 'flarum-forum/components/composer/composer-body'; var precompileTemplate = Ember.Handlebars.compile; diff --git a/framework/core/ember/forum/app/components/discussion/post-comment.js b/framework/core/ember/forum/app/components/discussion/post-comment.js index a8dbd604b..ae1b94c2d 100644 --- a/framework/core/ember/forum/app/components/discussion/post-comment.js +++ b/framework/core/ember/forum/app/components/discussion/post-comment.js @@ -1,13 +1,13 @@ import Ember from 'ember'; -import UseComposer from 'flarum/mixins/use-composer'; -import FadeIn from 'flarum/mixins/fade-in'; -import HasItemLists from 'flarum/mixins/has-item-lists'; -import ComposerEdit from 'flarum/components/composer/composer-edit'; -import PostHeaderUser from 'flarum/components/discussion/post-header/user'; -import PostHeaderMeta from 'flarum/components/discussion/post-header/meta'; -import PostHeaderEdited from 'flarum/components/discussion/post-header/edited'; -import PostHeaderToggle from 'flarum/components/discussion/post-header/toggle'; +import UseComposer from 'flarum-forum/mixins/use-composer'; +import FadeIn from 'flarum-forum/mixins/fade-in'; +import HasItemLists from 'flarum-forum/mixins/has-item-lists'; +import ComposerEdit from 'flarum-forum/components/composer/composer-edit'; +import PostHeaderUser from 'flarum-forum/components/discussion/post-header/user'; +import PostHeaderMeta from 'flarum-forum/components/discussion/post-header/meta'; +import PostHeaderEdited from 'flarum-forum/components/discussion/post-header/edited'; +import PostHeaderToggle from 'flarum-forum/components/discussion/post-header/toggle'; /** Component for a `comment`-typed post. Displays a number of item lists diff --git a/framework/core/ember/forum/app/components/discussion/post-discussion-renamed.js b/framework/core/ember/forum/app/components/discussion/post-discussion-renamed.js index bd5f3c203..5eaa7c171 100644 --- a/framework/core/ember/forum/app/components/discussion/post-discussion-renamed.js +++ b/framework/core/ember/forum/app/components/discussion/post-discussion-renamed.js @@ -1,7 +1,7 @@ import Ember from 'ember'; -import FadeIn from 'flarum/mixins/fade-in'; -import HasItemLists from 'flarum/mixins/has-item-lists'; +import FadeIn from 'flarum-forum/mixins/fade-in'; +import HasItemLists from 'flarum-forum/mixins/has-item-lists'; var precompileTemplate = Ember.Handlebars.compile; diff --git a/framework/core/ember/forum/app/components/discussion/post-header/edited.js b/framework/core/ember/forum/app/components/discussion/post-header/edited.js index c81731a60..5cbbe3eb5 100644 --- a/framework/core/ember/forum/app/components/discussion/post-header/edited.js +++ b/framework/core/ember/forum/app/components/discussion/post-header/edited.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -import humanTime from 'flarum/utils/human-time'; +import humanTime from 'flarum-forum/utils/human-time'; var precompileTemplate = Ember.Handlebars.compile; diff --git a/framework/core/ember/forum/app/components/index/discussion-listing.js b/framework/core/ember/forum/app/components/index/discussion-listing.js index cead2aa49..1c31d3903 100755 --- a/framework/core/ember/forum/app/components/index/discussion-listing.js +++ b/framework/core/ember/forum/app/components/index/discussion-listing.js @@ -1,8 +1,8 @@ import Ember from 'ember'; -import HasItemLists from 'flarum/mixins/has-item-lists'; -import FadeIn from 'flarum/mixins/fade-in'; -import humanTime from 'flarum/utils/human-time'; +import HasItemLists from 'flarum-forum/mixins/has-item-lists'; +import FadeIn from 'flarum-forum/mixins/fade-in'; +import humanTime from 'flarum-forum/utils/human-time'; /** Component for a discussion listing on the discussions index. It has `info` diff --git a/framework/core/ember/forum/app/components/user/activity-item.js b/framework/core/ember/forum/app/components/user/activity-item.js index 3433c2769..c7f01060d 100644 --- a/framework/core/ember/forum/app/components/user/activity-item.js +++ b/framework/core/ember/forum/app/components/user/activity-item.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -import FadeIn from 'flarum/mixins/fade-in'; +import FadeIn from 'flarum-forum/mixins/fade-in'; export default Ember.Component.extend(FadeIn, { layoutName: 'components/user/activity-item', diff --git a/framework/core/ember/forum/app/components/user/avatar-editor.js b/framework/core/ember/forum/app/components/user/avatar-editor.js index ccaae2b57..8c7526d68 100644 --- a/framework/core/ember/forum/app/components/user/avatar-editor.js +++ b/framework/core/ember/forum/app/components/user/avatar-editor.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -import config from 'flarum/config/environment'; +import config from 'flarum-forum/config/environment'; var $ = Ember.$; diff --git a/framework/core/ember/forum/app/components/user/user-card.js b/framework/core/ember/forum/app/components/user/user-card.js index e69b31dac..a2cf972b9 100644 --- a/framework/core/ember/forum/app/components/user/user-card.js +++ b/framework/core/ember/forum/app/components/user/user-card.js @@ -1,7 +1,7 @@ import Ember from 'ember'; -import HasItemLists from 'flarum/mixins/has-item-lists'; -import UserBio from 'flarum/components/user/user-bio'; +import HasItemLists from 'flarum-forum/mixins/has-item-lists'; +import UserBio from 'flarum-forum/components/user/user-bio'; var precompileTemplate = Ember.Handlebars.compile; diff --git a/framework/core/ember/forum/app/controllers/discussion.js b/framework/core/ember/forum/app/controllers/discussion.js index ae7d88dce..df6d0c9d5 100644 --- a/framework/core/ember/forum/app/controllers/discussion.js +++ b/framework/core/ember/forum/app/controllers/discussion.js @@ -1,9 +1,9 @@ import Ember from 'ember'; -import ComposerReply from 'flarum/components/composer/composer-reply'; -import ActionButton from 'flarum/components/ui/action-button'; -import AlertMessage from 'flarum/components/ui/alert-message'; -import UseComposerMixin from 'flarum/mixins/use-composer'; +import ComposerReply from 'flarum-forum/components/composer/composer-reply'; +import ActionButton from 'flarum-forum/components/ui/action-button'; +import AlertMessage from 'flarum-forum/components/ui/alert-message'; +import UseComposerMixin from 'flarum-forum/mixins/use-composer'; export default Ember.Controller.extend(Ember.Evented, UseComposerMixin, { needs: ['application', 'index'], diff --git a/framework/core/ember/forum/app/controllers/index.js b/framework/core/ember/forum/app/controllers/index.js index 21421ef98..d2b9aefbd 100644 --- a/framework/core/ember/forum/app/controllers/index.js +++ b/framework/core/ember/forum/app/controllers/index.js @@ -1,11 +1,11 @@ import Ember from 'ember'; -import DiscussionResult from 'flarum/models/discussion-result'; -import PostResult from 'flarum/models/post-result'; -import Paneable from 'flarum/mixins/paneable'; -import ComposerDiscussion from 'flarum/components/composer/composer-discussion'; -import AlertMessage from 'flarum/components/ui/alert-message'; -import UseComposer from 'flarum/mixins/use-composer'; +import DiscussionResult from 'flarum-forum/models/discussion-result'; +import PostResult from 'flarum-forum/models/post-result'; +import Paneable from 'flarum-forum/mixins/paneable'; +import ComposerDiscussion from 'flarum-forum/components/composer/composer-discussion'; +import AlertMessage from 'flarum-forum/components/ui/alert-message'; +import UseComposer from 'flarum-forum/mixins/use-composer'; export default Ember.Controller.extend(UseComposer, Paneable, { needs: ['application', 'index/index', 'discussion'], diff --git a/framework/core/ember/forum/app/controllers/index/index.js b/framework/core/ember/forum/app/controllers/index/index.js index ac19e3942..897e87b72 100644 --- a/framework/core/ember/forum/app/controllers/index/index.js +++ b/framework/core/ember/forum/app/controllers/index/index.js @@ -1,7 +1,7 @@ import Ember from 'ember'; -import DiscussionResult from 'flarum/models/discussion-result'; -import PostResult from 'flarum/models/post-result'; +import DiscussionResult from 'flarum-forum/models/discussion-result'; +import PostResult from 'flarum-forum/models/post-result'; export default Ember.Controller.extend({ needs: ['application'], diff --git a/framework/core/ember/forum/app/controllers/login.js b/framework/core/ember/forum/app/controllers/login.js index c63616c21..d0b4183fc 100644 --- a/framework/core/ember/forum/app/controllers/login.js +++ b/framework/core/ember/forum/app/controllers/login.js @@ -1,7 +1,7 @@ import Ember from 'ember'; import AuthenticationControllerMixin from 'simple-auth/mixins/authentication-controller-mixin'; -import ModalController from 'flarum/mixins/modal-controller'; +import ModalController from 'flarum-forum/mixins/modal-controller'; export default Ember.Controller.extend(ModalController, AuthenticationControllerMixin, { authenticator: 'authenticator:flarum', diff --git a/framework/core/ember/forum/app/controllers/signup.js b/framework/core/ember/forum/app/controllers/signup.js index d3326a313..3f3763409 100644 --- a/framework/core/ember/forum/app/controllers/signup.js +++ b/framework/core/ember/forum/app/controllers/signup.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -import ModalController from 'flarum/mixins/modal-controller'; +import ModalController from 'flarum-forum/mixins/modal-controller'; export default Ember.Controller.extend(ModalController, { emailProviderName: Ember.computed('welcomeUser.email', function() { diff --git a/framework/core/ember/forum/app/initializers/human-time-updater.js b/framework/core/ember/forum/app/initializers/human-time-updater.js deleted file mode 100644 index a29dbcceb..000000000 --- a/framework/core/ember/forum/app/initializers/human-time-updater.js +++ /dev/null @@ -1,147 +0,0 @@ -import Ember from 'ember'; - -import humanTime from 'flarum/utils/human-time'; - -var $ = Ember.$; - -export default { - name: 'human-time-updater', - initialize: function(container) { - - // Livestamp.js / v1.1.2 / (c) 2012 Matt Bradley / MIT License - // @todo rewrite this to be simpler and cleaner - (function($, moment) { - var updateInterval = 1e3, - paused = false, - $livestamps = $([]), - - init = function() { - livestampGlobal.resume(); - }, - - prep = function($el, timestamp) { - var oldData = $el.data('livestampdata'); - if (typeof timestamp == 'number') - timestamp *= 1e3; - - $el.removeAttr('data-livestamp') - .removeData('livestamp'); - - timestamp = moment(timestamp); - if (timestamp.diff(moment(new Date())) < 60 * 60) { - return; - } - if (moment.isMoment(timestamp) && !isNaN(+timestamp)) { - var newData = $.extend({ }, { 'original': $el.contents() }, oldData); - newData.moment = moment(timestamp); - - $el.data('livestampdata', newData).empty(); - $livestamps.push($el[0]); - } - }, - - run = function() { - if (paused) return; - livestampGlobal.update(); - setTimeout(run, updateInterval); - }, - - livestampGlobal = { - update: function() { - $('[data-humantime]').each(function() { - var $this = $(this); - prep($this, $this.attr('datetime')); - }); - - var toRemove = []; - $livestamps.each(function() { - var $this = $(this), - data = $this.data('livestampdata'); - - if (data === undefined) - toRemove.push(this); - else if (moment.isMoment(data.moment)) { - var from = $this.html(), - to = humanTime(data.moment); - // to = data.moment.fromNow(); - - if (from != to) { - var e = $.Event('change.livestamp'); - $this.trigger(e, [from, to]); - if (!e.isDefaultPrevented()) - $this.html(to); - } - } - }); - - $livestamps = $livestamps.not(toRemove); - }, - - pause: function() { - paused = true; - }, - - resume: function() { - paused = false; - run(); - }, - - interval: function(interval) { - if (interval === undefined) - return updateInterval; - updateInterval = interval; - } - }, - - livestampLocal = { - add: function($el, timestamp) { - if (typeof timestamp == 'number') - timestamp *= 1e3; - timestamp = moment(timestamp); - - if (moment.isMoment(timestamp) && !isNaN(+timestamp)) { - $el.each(function() { - prep($(this), timestamp); - }); - livestampGlobal.update(); - } - - return $el; - }, - - destroy: function($el) { - $livestamps = $livestamps.not($el); - $el.each(function() { - var $this = $(this), - data = $this.data('livestampdata'); - - if (data === undefined) - return $el; - - $this - .html(data.original ? data.original : '') - .removeData('livestampdata'); - }); - - return $el; - }, - - isLivestamp: function($el) { - return $el.data('livestampdata') !== undefined; - } - }; - - $.livestamp = livestampGlobal; - $(init); - $.fn.livestamp = function(method, options) { - if (!livestampLocal[method]) { - options = method; - method = 'add'; - } - - return livestampLocal[method](this, options); - }; - })(jQuery, moment); - - } -}; diff --git a/framework/core/ember/forum/app/routes/application.js b/framework/core/ember/forum/app/routes/application.js index 47a3aa973..d6b207da3 100644 --- a/framework/core/ember/forum/app/routes/application.js +++ b/framework/core/ember/forum/app/routes/application.js @@ -1,7 +1,7 @@ import Ember from 'ember'; import ApplicationRouteMixin from 'simple-auth/mixins/application-route-mixin'; -import AlertMessage from 'flarum/components/ui/alert-message'; +import AlertMessage from 'flarum-forum/components/ui/alert-message'; export default Ember.Route.extend(ApplicationRouteMixin, { activate: function() { diff --git a/framework/core/ember/forum/app/routes/discussion.js b/framework/core/ember/forum/app/routes/discussion.js index 802f0ef79..e1b57306e 100644 --- a/framework/core/ember/forum/app/routes/discussion.js +++ b/framework/core/ember/forum/app/routes/discussion.js @@ -1,7 +1,7 @@ import Ember from 'ember'; -import PostStream from 'flarum/models/post-stream'; -import PushesHistory from 'flarum/mixins/pushes-history'; +import PostStream from 'flarum-forum/models/post-stream'; +import PushesHistory from 'flarum-forum/mixins/pushes-history'; export default Ember.Route.extend(PushesHistory, { historyKey: 'discussion', diff --git a/framework/core/ember/forum/app/routes/index/index.js b/framework/core/ember/forum/app/routes/index/index.js index c0d543717..97c9cf675 100644 --- a/framework/core/ember/forum/app/routes/index/index.js +++ b/framework/core/ember/forum/app/routes/index/index.js @@ -1,7 +1,7 @@ import Ember from 'ember'; -import AddCssClassToBody from 'flarum/mixins/add-css-class-to-body'; -import PushesHistory from 'flarum/mixins/pushes-history'; +import AddCssClassToBody from 'flarum-forum/mixins/add-css-class-to-body'; +import PushesHistory from 'flarum-forum/mixins/pushes-history'; export default Ember.Route.extend(AddCssClassToBody, PushesHistory, { historyKey: 'index', diff --git a/framework/core/ember/forum/app/routes/user.js b/framework/core/ember/forum/app/routes/user.js index 863324357..4fa670d8a 100644 --- a/framework/core/ember/forum/app/routes/user.js +++ b/framework/core/ember/forum/app/routes/user.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -import PushesHistory from 'flarum/mixins/pushes-history'; +import PushesHistory from 'flarum-forum/mixins/pushes-history'; export default Ember.Route.extend(PushesHistory, { historyKey: 'user', diff --git a/framework/core/ember/forum/app/styles/app.less b/framework/core/ember/forum/app/styles/app.less index c8cf10e30..e69de29bb 100644 --- a/framework/core/ember/forum/app/styles/app.less +++ b/framework/core/ember/forum/app/styles/app.less @@ -1,40 +0,0 @@ -// This files is where our LESS journey begins. - -// We begin by importing our own configuration variables, which are used all -// throughout the stylesheets. These pertain to -// @import "config-default.less"; -@import "config.less"; - -@flarum-base: "flarum/"; -@bootstrap-base: "../../bower_components/bootstrap/less/"; -@font-awesome-base: "../../bower_components/font-awesome/less/"; - -@import "bootstrap/bootstrap.less"; - -// We want to specify the @fa-font-path variable AFTER we import font awesome -// so that it overrides the default definition. -@import "@{font-awesome-base}font-awesome.less"; -@fa-font-path: "../font-awesome/fonts"; - -@import url(http://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700,300); - -// Finally, with our vendor CSS loaded, we can import Flarum-specific stuff. -@import "@{flarum-base}components.less"; -@import "@{flarum-base}buttons.less"; -@import "@{flarum-base}badges.less"; -@import "@{flarum-base}dropdowns.less"; -@import "@{flarum-base}avatars.less"; -@import "@{flarum-base}forms.less"; -@import "@{flarum-base}hero.less"; -@import "@{flarum-base}alerts.less"; -@import "@{flarum-base}modals.less"; -@import "@{flarum-base}layout.less"; -@import "@{flarum-base}composer.less"; -@import "@{flarum-base}notifications.less"; - -@import "@{flarum-base}index.less"; -@import "@{flarum-base}discussion.less"; -@import "@{flarum-base}user.less"; -@import "@{flarum-base}settings.less"; -@import "@{flarum-base}login.less"; -@import "@{flarum-base}signup.less"; diff --git a/framework/core/ember/forum/app/styles/bootstrap/bootstrap.less b/framework/core/ember/forum/app/styles/bootstrap/bootstrap.less deleted file mode 100644 index 92d7620ba..000000000 --- a/framework/core/ember/forum/app/styles/bootstrap/bootstrap.less +++ /dev/null @@ -1,50 +0,0 @@ -// Core variables and mixins -@import "@{bootstrap-base}variables.less"; -@import "variables.less"; -@import "@{bootstrap-base}mixins.less"; - -// Reset -@import "@{bootstrap-base}normalize.less"; -@import "@{bootstrap-base}print.less"; - -// Core CSS -@import "@{bootstrap-base}scaffolding.less"; -@import "@{bootstrap-base}type.less"; -@import "@{bootstrap-base}code.less"; -@import "@{bootstrap-base}grid.less"; -// @import "@{bootstrap-base}tables.less"; -@import "@{bootstrap-base}forms.less"; -@import "@{bootstrap-base}buttons.less"; - -// Components -@import "@{bootstrap-base}component-animations.less"; -// @import "@{bootstrap-base}glyphicons.less"; -@import "@{bootstrap-base}dropdowns.less"; -@import "@{bootstrap-base}button-groups.less"; -@import "@{bootstrap-base}input-groups.less"; -// @import "@{bootstrap-base}navs.less"; -// @import "@{bootstrap-base}navbar.less"; -// @import "@{bootstrap-base}breadcrumbs.less"; -// @import "@{bootstrap-base}pagination.less"; -// @import "@{bootstrap-base}pager.less"; -// @import "@{bootstrap-base}labels.less"; -// @import "@{bootstrap-base}badges.less"; -// @import "@{bootstrap-base}jumbotron.less"; -// @import "@{bootstrap-base}thumbnails.less"; -// @import "@{bootstrap-base}alerts.less"; -// @import "@{bootstrap-base}progress-bars.less"; -// @import "@{bootstrap-base}media.less"; -// @import "@{bootstrap-base}list-group.less"; -// @import "@{bootstrap-base}panels.less"; -// @import "@{bootstrap-base}wells.less"; -// @import "@{bootstrap-base}close.less"; - -// Components w/ JavaScript -@import "@{bootstrap-base}modals.less"; -@import "@{bootstrap-base}tooltip.less"; -// @import "@{bootstrap-base}popovers.less"; -// @import "@{bootstrap-base}carousel.less"; - -// Utility classes -@import "@{bootstrap-base}utilities.less"; -@import "@{bootstrap-base}responsive-utilities.less"; diff --git a/framework/core/ember/forum/app/views/application.js b/framework/core/ember/forum/app/views/application.js index 573c59934..458f1435b 100644 --- a/framework/core/ember/forum/app/views/application.js +++ b/framework/core/ember/forum/app/views/application.js @@ -1,11 +1,11 @@ import Ember from 'ember'; -import HasItemLists from 'flarum/mixins/has-item-lists'; -import SearchInput from 'flarum/components/ui/search-input'; -import UserNotifications from 'flarum/components/application/user-notifications'; -import UserDropdown from 'flarum/components/application/user-dropdown'; -import ForumStatistic from 'flarum/components/application/forum-statistic'; -import PoweredBy from 'flarum/components/application/powered-by'; +import HasItemLists from 'flarum-forum/mixins/has-item-lists'; +import SearchInput from 'flarum-forum/components/ui/search-input'; +import UserNotifications from 'flarum-forum/components/application/user-notifications'; +import UserDropdown from 'flarum-forum/components/application/user-dropdown'; +import ForumStatistic from 'flarum-forum/components/application/forum-statistic'; +import PoweredBy from 'flarum-forum/components/application/powered-by'; var $ = Ember.$; diff --git a/framework/core/ember/forum/app/views/composer.js b/framework/core/ember/forum/app/views/composer.js index d1e64515e..649b3c75d 100644 --- a/framework/core/ember/forum/app/views/composer.js +++ b/framework/core/ember/forum/app/views/composer.js @@ -1,7 +1,7 @@ import Ember from 'ember'; -import { PositionEnum } from 'flarum/controllers/composer'; -import HasItemLists from 'flarum/mixins/has-item-lists'; +import { PositionEnum } from 'flarum-forum/controllers/composer'; +import HasItemLists from 'flarum-forum/mixins/has-item-lists'; var $ = Ember.$; diff --git a/framework/core/ember/forum/app/views/discussion.js b/framework/core/ember/forum/app/views/discussion.js index 60fe043b6..0bde7e4f6 100644 --- a/framework/core/ember/forum/app/views/discussion.js +++ b/framework/core/ember/forum/app/views/discussion.js @@ -1,8 +1,8 @@ import Ember from 'ember'; -import HasItemLists from 'flarum/mixins/has-item-lists'; -import DropdownSplit from 'flarum/components/ui/dropdown-split'; -import StreamScrubber from 'flarum/components/discussion/stream-scrubber'; +import HasItemLists from 'flarum-forum/mixins/has-item-lists'; +import DropdownSplit from 'flarum-forum/components/ui/dropdown-split'; +import StreamScrubber from 'flarum-forum/components/discussion/stream-scrubber'; var $ = Ember.$; diff --git a/framework/core/ember/forum/app/views/index.js b/framework/core/ember/forum/app/views/index.js index 24724f31b..532567e00 100644 --- a/framework/core/ember/forum/app/views/index.js +++ b/framework/core/ember/forum/app/views/index.js @@ -1,11 +1,11 @@ import Ember from 'ember'; -import DropdownSelect from 'flarum/components/ui/dropdown-select'; -import ActionButton from 'flarum/components/ui/action-button'; -import NavItem from 'flarum/components/ui/nav-item'; -import WelcomeHero from 'flarum/components/index/welcome-hero'; -import HasItemLists from 'flarum/mixins/has-item-lists'; -import config from 'flarum/config/environment'; +import DropdownSelect from 'flarum-forum/components/ui/dropdown-select'; +import ActionButton from 'flarum-forum/components/ui/action-button'; +import NavItem from 'flarum-forum/components/ui/nav-item'; +import WelcomeHero from 'flarum-forum/components/index/welcome-hero'; +import HasItemLists from 'flarum-forum/mixins/has-item-lists'; +import config from 'flarum-forum/config/environment'; var precompileTemplate = Ember.Handlebars.compile; var $ = Ember.$; diff --git a/framework/core/ember/forum/app/views/login.js b/framework/core/ember/forum/app/views/login.js index 5d9d9511a..7368adc19 100644 --- a/framework/core/ember/forum/app/views/login.js +++ b/framework/core/ember/forum/app/views/login.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -import ModalView from 'flarum/mixins/modal-view'; +import ModalView from 'flarum-forum/mixins/modal-view'; export default Ember.View.extend(ModalView, { classNames: ['modal-dialog', 'modal-sm', 'modal-login'], diff --git a/framework/core/ember/forum/app/views/signup.js b/framework/core/ember/forum/app/views/signup.js index 0f3388973..3c64ec566 100644 --- a/framework/core/ember/forum/app/views/signup.js +++ b/framework/core/ember/forum/app/views/signup.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -import ModalView from 'flarum/mixins/modal-view'; +import ModalView from 'flarum-forum/mixins/modal-view'; export default Ember.View.extend(ModalView, { classNames: ['modal-dialog', 'modal-sm', 'modal-signup'], diff --git a/framework/core/ember/forum/app/views/user.js b/framework/core/ember/forum/app/views/user.js index 61f8e45f9..fd7d1afd5 100644 --- a/framework/core/ember/forum/app/views/user.js +++ b/framework/core/ember/forum/app/views/user.js @@ -1,8 +1,8 @@ import Ember from 'ember'; -import HasItemLists from 'flarum/mixins/has-item-lists'; -import NavItem from 'flarum/components/ui/nav-item'; -import DropdownSelect from 'flarum/components/ui/dropdown-select'; +import HasItemLists from 'flarum-forum/mixins/has-item-lists'; +import NavItem from 'flarum-forum/components/ui/nav-item'; +import DropdownSelect from 'flarum-forum/components/ui/dropdown-select'; var precompileTemplate = Ember.Handlebars.compile; diff --git a/framework/core/ember/forum/app/views/user/settings.js b/framework/core/ember/forum/app/views/user/settings.js index e5df0759b..3612065f5 100644 --- a/framework/core/ember/forum/app/views/user/settings.js +++ b/framework/core/ember/forum/app/views/user/settings.js @@ -1,10 +1,10 @@ import Ember from 'ember'; -import HasItemLists from 'flarum/mixins/has-item-lists'; -import NotificationGrid from 'flarum/components/user/notification-grid'; -import FieldSet from 'flarum/components/ui/field-set'; -import ActionButton from 'flarum/components/ui/action-button'; -import SwitchInput from 'flarum/components/ui/switch-input'; +import HasItemLists from 'flarum-forum/mixins/has-item-lists'; +import NotificationGrid from 'flarum-forum/components/user/notification-grid'; +import FieldSet from 'flarum-forum/components/ui/field-set'; +import ActionButton from 'flarum-forum/components/ui/action-button'; +import SwitchInput from 'flarum-forum/components/ui/switch-input'; export default Ember.View.extend(HasItemLists, { itemLists: ['settings'], diff --git a/framework/core/ember/forum/bower.json b/framework/core/ember/forum/bower.json index 3f9526370..a7070a909 100644 --- a/framework/core/ember/forum/bower.json +++ b/framework/core/ember/forum/bower.json @@ -1,5 +1,5 @@ { - "name": "flarum", + "name": "flarum-forum", "dependencies": { "jquery": "2.1.3", "ember": "1.11.0-beta.3", diff --git a/framework/core/ember/forum/config/environment.js b/framework/core/ember/forum/config/environment.js index 869547473..ce7dffa17 100644 --- a/framework/core/ember/forum/config/environment.js +++ b/framework/core/ember/forum/config/environment.js @@ -2,7 +2,7 @@ module.exports = function(environment) { var ENV = { - modulePrefix: 'flarum', + modulePrefix: 'flarum-forum', environment: environment, baseURL: '/', apiURL: '/api', diff --git a/framework/core/ember/forum/package.json b/framework/core/ember/forum/package.json index 908097f83..6ea8a80b3 100644 --- a/framework/core/ember/forum/package.json +++ b/framework/core/ember/forum/package.json @@ -1,5 +1,5 @@ { - "name": "flarum", + "name": "flarum-forum", "version": "0.0.0", "private": true, "directories": { @@ -35,6 +35,7 @@ "ember-json-api": "eneuhauser/ember-json-api", "broccoli-ember-inline-template-compiler": "tobscure/broccoli-ember-inline-template-compiler#f884d11", "express": "^4.8.5", - "glob": "^4.0.5" + "glob": "^4.0.5", + "flarum-common": "file:../common" } } diff --git a/framework/core/less/.gitkeep b/framework/core/less/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/less/admin/app.less b/framework/core/less/admin/app.less new file mode 100644 index 000000000..42ce2265c --- /dev/null +++ b/framework/core/less/admin/app.less @@ -0,0 +1,23 @@ +@import "@{common-path}/config.less"; + +@common-path: "../common"; + +@import "@{common-path}/bootstrap.less"; + +// We want to specify the @fa-font-path variable AFTER we import font awesome +// so that it overrides the default definition. +@import "@{common-path}/font-awesome/font-awesome.less"; +@fa-font-path: "/flarum/fonts"; + +@import url(http://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700,300); + +// Finally, with our vendor CSS loaded, we can import Flarum-specific stuff. +@import "@{common-path}/components.less"; +@import "@{common-path}/buttons.less"; +@import "@{common-path}/badges.less"; +@import "@{common-path}/dropdowns.less"; +@import "@{common-path}/avatars.less"; +@import "@{common-path}/forms.less"; +@import "@{common-path}/alerts.less"; +@import "@{common-path}/modals.less"; +@import "@{common-path}/layout.less"; diff --git a/framework/core/ember/forum/app/styles/flarum/alerts.less b/framework/core/less/common/alerts.less similarity index 100% rename from framework/core/ember/forum/app/styles/flarum/alerts.less rename to framework/core/less/common/alerts.less diff --git a/framework/core/ember/forum/app/styles/flarum/avatars.less b/framework/core/less/common/avatars.less similarity index 100% rename from framework/core/ember/forum/app/styles/flarum/avatars.less rename to framework/core/less/common/avatars.less diff --git a/framework/core/ember/forum/app/styles/flarum/badges.less b/framework/core/less/common/badges.less similarity index 100% rename from framework/core/ember/forum/app/styles/flarum/badges.less rename to framework/core/less/common/badges.less diff --git a/framework/core/less/common/bootstrap.less b/framework/core/less/common/bootstrap.less new file mode 100644 index 000000000..3ef6c365d --- /dev/null +++ b/framework/core/less/common/bootstrap.less @@ -0,0 +1,50 @@ +// Core variables and mixins +@import "bootstrap/variables.less"; +@import "variables.less"; +@import "bootstrap/mixins.less"; + +// Reset +@import "bootstrap/normalize.less"; +@import "bootstrap/print.less"; + +// Core CSS +@import "bootstrap/scaffolding.less"; +@import "bootstrap/type.less"; +@import "bootstrap/code.less"; +@import "bootstrap/grid.less"; +// @import "bootstrap/tables.less"; +@import "bootstrap/forms.less"; +@import "bootstrap/buttons.less"; + +// Components +@import "bootstrap/component-animations.less"; +// @import "bootstrap/glyphicons.less"; +@import "bootstrap/dropdowns.less"; +@import "bootstrap/button-groups.less"; +@import "bootstrap/input-groups.less"; +// @import "bootstrap/navs.less"; +// @import "bootstrap/navbar.less"; +// @import "bootstrap/breadcrumbs.less"; +// @import "bootstrap/pagination.less"; +// @import "bootstrap/pager.less"; +// @import "bootstrap/labels.less"; +// @import "bootstrap/badges.less"; +// @import "bootstrap/jumbotron.less"; +// @import "bootstrap/thumbnails.less"; +// @import "bootstrap/alerts.less"; +// @import "bootstrap/progress-bars.less"; +// @import "bootstrap/media.less"; +// @import "bootstrap/list-group.less"; +// @import "bootstrap/panels.less"; +// @import "bootstrap/wells.less"; +// @import "bootstrap/close.less"; + +// Components w/ JavaScript +@import "bootstrap/modals.less"; +@import "bootstrap/tooltip.less"; +// @import "bootstrap/popovers.less"; +// @import "bootstrap/carousel.less"; + +// Utility classes +@import "bootstrap/utilities.less"; +@import "bootstrap/responsive-utilities.less"; diff --git a/framework/core/less/common/bootstrap/alerts.less b/framework/core/less/common/bootstrap/alerts.less new file mode 100755 index 000000000..c4199db92 --- /dev/null +++ b/framework/core/less/common/bootstrap/alerts.less @@ -0,0 +1,73 @@ +// +// Alerts +// -------------------------------------------------- + + +// Base styles +// ------------------------- + +.alert { + padding: @alert-padding; + margin-bottom: @line-height-computed; + border: 1px solid transparent; + border-radius: @alert-border-radius; + + // Headings for larger alerts + h4 { + margin-top: 0; + // Specified for the h4 to prevent conflicts of changing @headings-color + color: inherit; + } + + // Provide class for links that match alerts + .alert-link { + font-weight: @alert-link-font-weight; + } + + // Improve alignment and spacing of inner content + > p, + > ul { + margin-bottom: 0; + } + + > p + p { + margin-top: 5px; + } +} + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0. +.alert-dismissible { + padding-right: (@alert-padding + 20); + + // Adjust close link position + .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; + } +} + +// Alternate styles +// +// Generate contextual modifier classes for colorizing the alert. + +.alert-success { + .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); +} + +.alert-info { + .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); +} + +.alert-warning { + .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); +} + +.alert-danger { + .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); +} diff --git a/framework/core/less/common/bootstrap/badges.less b/framework/core/less/common/bootstrap/badges.less new file mode 100755 index 000000000..c70bb939e --- /dev/null +++ b/framework/core/less/common/bootstrap/badges.less @@ -0,0 +1,66 @@ +// +// Badges +// -------------------------------------------------- + + +// Base class +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: @font-size-small; + font-weight: @badge-font-weight; + color: @badge-color; + line-height: @badge-line-height; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: @badge-bg; + border-radius: @badge-border-radius; + + // Empty badges collapse automatically (not available in IE8) + &:empty { + display: none; + } + + // Quick fix for badges in buttons + .btn & { + position: relative; + top: -1px; + } + + .btn-xs &, + .btn-group-xs > .btn & { + top: 0; + padding: 1px 5px; + } + + // Hover state, but only for links + a& { + &:hover, + &:focus { + color: @badge-link-hover-color; + text-decoration: none; + cursor: pointer; + } + } + + // Account for badges in navs + .list-group-item.active > &, + .nav-pills > .active > a > & { + color: @badge-active-color; + background-color: @badge-active-bg; + } + + .list-group-item > & { + float: right; + } + + .list-group-item > & + & { + margin-right: 5px; + } + + .nav-pills > li > a > & { + margin-left: 3px; + } +} diff --git a/framework/core/less/common/bootstrap/bootstrap.less b/framework/core/less/common/bootstrap/bootstrap.less new file mode 100755 index 000000000..61b77474f --- /dev/null +++ b/framework/core/less/common/bootstrap/bootstrap.less @@ -0,0 +1,50 @@ +// Core variables and mixins +@import "variables.less"; +@import "mixins.less"; + +// Reset and dependencies +@import "normalize.less"; +@import "print.less"; +@import "glyphicons.less"; + +// Core CSS +@import "scaffolding.less"; +@import "type.less"; +@import "code.less"; +@import "grid.less"; +@import "tables.less"; +@import "forms.less"; +@import "buttons.less"; + +// Components +@import "component-animations.less"; +@import "dropdowns.less"; +@import "button-groups.less"; +@import "input-groups.less"; +@import "navs.less"; +@import "navbar.less"; +@import "breadcrumbs.less"; +@import "pagination.less"; +@import "pager.less"; +@import "labels.less"; +@import "badges.less"; +@import "jumbotron.less"; +@import "thumbnails.less"; +@import "alerts.less"; +@import "progress-bars.less"; +@import "media.less"; +@import "list-group.less"; +@import "panels.less"; +@import "responsive-embed.less"; +@import "wells.less"; +@import "close.less"; + +// Components w/ JavaScript +@import "modals.less"; +@import "tooltip.less"; +@import "popovers.less"; +@import "carousel.less"; + +// Utility classes +@import "utilities.less"; +@import "responsive-utilities.less"; diff --git a/framework/core/less/common/bootstrap/breadcrumbs.less b/framework/core/less/common/bootstrap/breadcrumbs.less new file mode 100755 index 000000000..cb01d503f --- /dev/null +++ b/framework/core/less/common/bootstrap/breadcrumbs.less @@ -0,0 +1,26 @@ +// +// Breadcrumbs +// -------------------------------------------------- + + +.breadcrumb { + padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal; + margin-bottom: @line-height-computed; + list-style: none; + background-color: @breadcrumb-bg; + border-radius: @border-radius-base; + + > li { + display: inline-block; + + + li:before { + content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space + padding: 0 5px; + color: @breadcrumb-color; + } + } + + > .active { + color: @breadcrumb-active-color; + } +} diff --git a/framework/core/less/common/bootstrap/button-groups.less b/framework/core/less/common/bootstrap/button-groups.less new file mode 100755 index 000000000..13c1800de --- /dev/null +++ b/framework/core/less/common/bootstrap/button-groups.less @@ -0,0 +1,243 @@ +// +// Button groups +// -------------------------------------------------- + +// Make the div behave like a button +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; // match .btn alignment given font-size hack above + > .btn { + position: relative; + float: left; + // Bring the "active" button to the front + &:hover, + &:focus, + &:active, + &.active { + z-index: 2; + } + } +} + +// Prevent double borders when buttons are next to each other +.btn-group { + .btn + .btn, + .btn + .btn-group, + .btn-group + .btn, + .btn-group + .btn-group { + margin-left: -1px; + } +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + margin-left: -5px; // Offset the first child's margin + &:extend(.clearfix all); + + .btn-group, + .input-group { + float: left; + } + > .btn, + > .btn-group, + > .input-group { + margin-left: 5px; + } +} + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} + +// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match +.btn-group > .btn:first-child { + margin-left: 0; + &:not(:last-child):not(.dropdown-toggle) { + .border-right-radius(0); + } +} +// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + .border-left-radius(0); +} + +// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group) +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) { + > .btn:last-child, + > .dropdown-toggle { + .border-right-radius(0); + } +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + .border-left-radius(0); +} + +// On active and open, don't show outline +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + + +// Sizing +// +// Remix the default button sizing classes into new ones for easier manipulation. + +.btn-group-xs > .btn { &:extend(.btn-xs); } +.btn-group-sm > .btn { &:extend(.btn-sm); } +.btn-group-lg > .btn { &:extend(.btn-lg); } + + +// Split button dropdowns +// ---------------------- + +// Give the line between buttons some depth +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} + +// The clickable button for toggling the menu +// Remove the gradient and set the same inset shadow as the :active state +.btn-group.open .dropdown-toggle { + .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + + // Show no shadow for `.btn-link` since it has no other button styles. + &.btn-link { + .box-shadow(none); + } +} + + +// Reposition the caret +.btn .caret { + margin-left: 0; +} +// Carets in other button sizes +.btn-lg .caret { + border-width: @caret-width-large @caret-width-large 0; + border-bottom-width: 0; +} +// Upside down carets for .dropup +.dropup .btn-lg .caret { + border-width: 0 @caret-width-large @caret-width-large; +} + + +// Vertical button groups +// ---------------------- + +.btn-group-vertical { + > .btn, + > .btn-group, + > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; + } + + // Clear floats so dropdown menus can be properly placed + > .btn-group { + &:extend(.clearfix all); + > .btn { + float: none; + } + } + + > .btn + .btn, + > .btn + .btn-group, + > .btn-group + .btn, + > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; + } +} + +.btn-group-vertical > .btn { + &:not(:first-child):not(:last-child) { + border-radius: 0; + } + &:first-child:not(:last-child) { + border-top-right-radius: @border-radius-base; + .border-bottom-radius(0); + } + &:last-child:not(:first-child) { + border-bottom-left-radius: @border-radius-base; + .border-top-radius(0); + } +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) { + > .btn:last-child, + > .dropdown-toggle { + .border-bottom-radius(0); + } +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + .border-top-radius(0); +} + + +// Justified button groups +// ---------------------- + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; + > .btn, + > .btn-group { + float: none; + display: table-cell; + width: 1%; + } + > .btn-group .btn { + width: 100%; + } + + > .btn-group .dropdown-menu { + left: auto; + } +} + + +// Checkbox and radio options +// +// In order to support the browser's form validation feedback, powered by the +// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use +// `display: none;` or `visibility: hidden;` as that also hides the popover. +// Simply visually hiding the inputs via `opacity` would leave them clickable in +// certain cases which is prevented by using `clip` and `pointer-events`. +// This way, we ensure a DOM element is visible to position the popover from. +// +// See https://github.com/twbs/bootstrap/pull/12794 and +// https://github.com/twbs/bootstrap/pull/14559 for more information. + +[data-toggle="buttons"] { + > .btn, + > .btn-group > .btn { + input[type="radio"], + input[type="checkbox"] { + position: absolute; + clip: rect(0,0,0,0); + pointer-events: none; + } + } +} diff --git a/framework/core/less/common/bootstrap/buttons.less b/framework/core/less/common/bootstrap/buttons.less new file mode 100755 index 000000000..740905f52 --- /dev/null +++ b/framework/core/less/common/bootstrap/buttons.less @@ -0,0 +1,166 @@ +// +// Buttons +// -------------------------------------------------- + + +// Base styles +// -------------------------------------------------- + +.btn { + display: inline-block; + margin-bottom: 0; // For input.btn + font-weight: @btn-font-weight; + text-align: center; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid transparent; + white-space: nowrap; + .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base); + .user-select(none); + + &, + &:active, + &.active { + &:focus, + &.focus { + .tab-focus(); + } + } + + &:hover, + &:focus, + &.focus { + color: @btn-default-color; + text-decoration: none; + } + + &:active, + &.active { + outline: 0; + background-image: none; + .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + } + + &.disabled, + &[disabled], + fieldset[disabled] & { + cursor: @cursor-disabled; + .opacity(.65); + .box-shadow(none); + } + + a& { + &.disabled, + fieldset[disabled] & { + pointer-events: none; // Future-proof disabling of clicks on `` elements + } + } +} + + +// Alternate buttons +// -------------------------------------------------- + +.btn-default { + .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border); +} +.btn-primary { + .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border); +} +// Success appears as green +.btn-success { + .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border); +} +// Info appears as blue-green +.btn-info { + .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border); +} +// Warning appears as orange +.btn-warning { + .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border); +} +// Danger and error appear as red +.btn-danger { + .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border); +} + + +// Link buttons +// ------------------------- + +// Make a button look and behave like a link +.btn-link { + color: @link-color; + font-weight: normal; + border-radius: 0; + + &, + &:active, + &.active, + &[disabled], + fieldset[disabled] & { + background-color: transparent; + .box-shadow(none); + } + &, + &:hover, + &:focus, + &:active { + border-color: transparent; + } + &:hover, + &:focus { + color: @link-hover-color; + text-decoration: @link-hover-decoration; + background-color: transparent; + } + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus { + color: @btn-link-disabled-color; + text-decoration: none; + } + } +} + + +// Button Sizes +// -------------------------------------------------- + +.btn-lg { + // line-height: ensure even-numbered height of button next to large input + .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large); +} +.btn-sm { + // line-height: ensure proper height of button next to small input + .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small); +} +.btn-xs { + .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small); +} + + +// Block button +// -------------------------------------------------- + +.btn-block { + display: block; + width: 100%; +} + +// Vertically space out multiple block buttons +.btn-block + .btn-block { + margin-top: 5px; +} + +// Specificity overrides +input[type="submit"], +input[type="reset"], +input[type="button"] { + &.btn-block { + width: 100%; + } +} diff --git a/framework/core/less/common/bootstrap/carousel.less b/framework/core/less/common/bootstrap/carousel.less new file mode 100755 index 000000000..4bbe946d3 --- /dev/null +++ b/framework/core/less/common/bootstrap/carousel.less @@ -0,0 +1,269 @@ +// +// Carousel +// -------------------------------------------------- + + +// Wrapper for the slide container and indicators +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; + + > .item { + display: none; + position: relative; + .transition(.6s ease-in-out left); + + // Account for jankitude on images + > img, + > a > img { + &:extend(.img-responsive); + line-height: 1; + } + + // WebKit CSS3 transforms for supported devices + @media all and (transform-3d), (-webkit-transform-3d) { + .transition-transform(~'0.6s ease-in-out'); + .backface-visibility(~'hidden'); + .perspective(1000); + + &.next, + &.active.right { + .translate3d(100%, 0, 0); + left: 0; + } + &.prev, + &.active.left { + .translate3d(-100%, 0, 0); + left: 0; + } + &.next.left, + &.prev.right, + &.active { + .translate3d(0, 0, 0); + left: 0; + } + } + } + + > .active, + > .next, + > .prev { + display: block; + } + + > .active { + left: 0; + } + + > .next, + > .prev { + position: absolute; + top: 0; + width: 100%; + } + + > .next { + left: 100%; + } + > .prev { + left: -100%; + } + > .next.left, + > .prev.right { + left: 0; + } + + > .active.left { + left: -100%; + } + > .active.right { + left: 100%; + } + +} + +// Left/right controls for nav +// --------------------------- + +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: @carousel-control-width; + .opacity(@carousel-control-opacity); + font-size: @carousel-control-font-size; + color: @carousel-control-color; + text-align: center; + text-shadow: @carousel-text-shadow; + // We can't have this transition here because WebKit cancels the carousel + // animation if you trip this while in the middle of another animation. + + // Set gradients for backgrounds + &.left { + #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001)); + } + &.right { + left: auto; + right: 0; + #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5)); + } + + // Hover/focus state + &:hover, + &:focus { + outline: 0; + color: @carousel-control-color; + text-decoration: none; + .opacity(.9); + } + + // Toggles + .icon-prev, + .icon-next, + .glyphicon-chevron-left, + .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + } + .icon-prev, + .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; + } + .icon-next, + .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; + } + .icon-prev, + .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + line-height: 1; + font-family: serif; + } + + + .icon-prev { + &:before { + content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) + } + } + .icon-next { + &:before { + content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A) + } + } +} + +// Optional indicator pips +// +// Add an unordered list with the following class and add a list item for each +// slide your carousel holds. + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; + + li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid @carousel-indicator-border-color; + border-radius: 10px; + cursor: pointer; + + // IE8-9 hack for event handling + // + // Internet Explorer 8-9 does not support clicks on elements without a set + // `background-color`. We cannot use `filter` since that's not viewed as a + // background color by the browser. Thus, a hack is needed. + // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer + // + // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we + // set alpha transparency for the best results possible. + background-color: #000 \9; // IE8 + background-color: rgba(0,0,0,0); // IE9 + } + .active { + margin: 0; + width: 12px; + height: 12px; + background-color: @carousel-indicator-active-bg; + } +} + +// Optional captions +// ----------------------------- +// Hidden by default for smaller viewports +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: @carousel-caption-color; + text-align: center; + text-shadow: @carousel-text-shadow; + & .btn { + text-shadow: none; // No shadow for button elements in carousel-caption + } +} + + +// Scale up controls for tablets and up +@media screen and (min-width: @screen-sm-min) { + + // Scale up the controls a smidge + .carousel-control { + .glyphicon-chevron-left, + .glyphicon-chevron-right, + .icon-prev, + .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .glyphicon-chevron-left, + .icon-prev { + margin-left: -15px; + } + .glyphicon-chevron-right, + .icon-next { + margin-right: -15px; + } + } + + // Show and left align the captions + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + + // Move up the indicators + .carousel-indicators { + bottom: 20px; + } +} diff --git a/framework/core/less/common/bootstrap/close.less b/framework/core/less/common/bootstrap/close.less new file mode 100755 index 000000000..6d5bfe087 --- /dev/null +++ b/framework/core/less/common/bootstrap/close.less @@ -0,0 +1,34 @@ +// +// Close icons +// -------------------------------------------------- + + +.close { + float: right; + font-size: (@font-size-base * 1.5); + font-weight: @close-font-weight; + line-height: 1; + color: @close-color; + text-shadow: @close-text-shadow; + .opacity(.2); + + &:hover, + &:focus { + color: @close-color; + text-decoration: none; + cursor: pointer; + .opacity(.5); + } + + // Additional properties for button version + // iOS requires the button element instead of an anchor tag. + // If you want the anchor version, it requires `href="#"`. + // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile + button& { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + } +} diff --git a/framework/core/less/common/bootstrap/code.less b/framework/core/less/common/bootstrap/code.less new file mode 100755 index 000000000..a08b4d48c --- /dev/null +++ b/framework/core/less/common/bootstrap/code.less @@ -0,0 +1,69 @@ +// +// Code (inline and block) +// -------------------------------------------------- + + +// Inline and block code styles +code, +kbd, +pre, +samp { + font-family: @font-family-monospace; +} + +// Inline code +code { + padding: 2px 4px; + font-size: 90%; + color: @code-color; + background-color: @code-bg; + border-radius: @border-radius-base; +} + +// User input typically entered via keyboard +kbd { + padding: 2px 4px; + font-size: 90%; + color: @kbd-color; + background-color: @kbd-bg; + border-radius: @border-radius-small; + box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); + + kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + box-shadow: none; + } +} + +// Blocks of code +pre { + display: block; + padding: ((@line-height-computed - 1) / 2); + margin: 0 0 (@line-height-computed / 2); + font-size: (@font-size-base - 1); // 14px to 13px + line-height: @line-height-base; + word-break: break-all; + word-wrap: break-word; + color: @pre-color; + background-color: @pre-bg; + border: 1px solid @pre-border-color; + border-radius: @border-radius-base; + + // Account for some code outputs that place code tags in pre tags + code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; + } +} + +// Enable scrollable blocks of code +.pre-scrollable { + max-height: @pre-scrollable-max-height; + overflow-y: scroll; +} diff --git a/framework/core/less/common/bootstrap/component-animations.less b/framework/core/less/common/bootstrap/component-animations.less new file mode 100755 index 000000000..0bcee910a --- /dev/null +++ b/framework/core/less/common/bootstrap/component-animations.less @@ -0,0 +1,33 @@ +// +// Component animations +// -------------------------------------------------- + +// Heads up! +// +// We don't use the `.opacity()` mixin here since it causes a bug with text +// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. + +.fade { + opacity: 0; + .transition(opacity .15s linear); + &.in { + opacity: 1; + } +} + +.collapse { + display: none; + + &.in { display: block; } + tr&.in { display: table-row; } + tbody&.in { display: table-row-group; } +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + .transition-property(~"height, visibility"); + .transition-duration(.35s); + .transition-timing-function(ease); +} diff --git a/framework/core/less/common/bootstrap/dropdowns.less b/framework/core/less/common/bootstrap/dropdowns.less new file mode 100755 index 000000000..af344607b --- /dev/null +++ b/framework/core/less/common/bootstrap/dropdowns.less @@ -0,0 +1,214 @@ +// +// Dropdown menus +// -------------------------------------------------- + + +// Dropdown arrow/caret +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: @caret-width-base dashed; + border-right: @caret-width-base solid transparent; + border-left: @caret-width-base solid transparent; +} + +// The dropdown wrapper (div) +.dropup, +.dropdown { + position: relative; +} + +// Prevent the focus on the dropdown toggle when closing dropdowns +.dropdown-toggle:focus { + outline: 0; +} + +// The dropdown menu (ul) +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: @zindex-dropdown; + display: none; // none by default, but block on "open" of the menu + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; // override default ul + list-style: none; + font-size: @font-size-base; + text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) + background-color: @dropdown-bg; + border: 1px solid @dropdown-fallback-border; // IE8 fallback + border: 1px solid @dropdown-border; + border-radius: @border-radius-base; + .box-shadow(0 6px 12px rgba(0,0,0,.175)); + background-clip: padding-box; + + // Aligns the dropdown menu to right + // + // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]` + &.pull-right { + right: 0; + left: auto; + } + + // Dividers (basically an hr) within the dropdown + .divider { + .nav-divider(@dropdown-divider-bg); + } + + // Links within the dropdown menu + > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: @line-height-base; + color: @dropdown-link-color; + white-space: nowrap; // prevent links from randomly breaking onto new lines + } +} + +// Hover/Focus state +.dropdown-menu > li > a { + &:hover, + &:focus { + text-decoration: none; + color: @dropdown-link-hover-color; + background-color: @dropdown-link-hover-bg; + } +} + +// Active state +.dropdown-menu > .active > a { + &, + &:hover, + &:focus { + color: @dropdown-link-active-color; + text-decoration: none; + outline: 0; + background-color: @dropdown-link-active-bg; + } +} + +// Disabled state +// +// Gray out text and ensure the hover/focus state remains gray + +.dropdown-menu > .disabled > a { + &, + &:hover, + &:focus { + color: @dropdown-link-disabled-color; + } + + // Nuke hover/focus effects + &:hover, + &:focus { + text-decoration: none; + background-color: transparent; + background-image: none; // Remove CSS gradient + .reset-filter(); + cursor: @cursor-disabled; + } +} + +// Open state for the dropdown +.open { + // Show the menu + > .dropdown-menu { + display: block; + } + + // Remove the outline when :focus is triggered + > a { + outline: 0; + } +} + +// Menu positioning +// +// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown +// menu with the parent. +.dropdown-menu-right { + left: auto; // Reset the default from `.dropdown-menu` + right: 0; +} +// With v3, we enabled auto-flipping if you have a dropdown within a right +// aligned nav component. To enable the undoing of that, we provide an override +// to restore the default dropdown menu alignment. +// +// This is only for left-aligning a dropdown menu within a `.navbar-right` or +// `.pull-right` nav component. +.dropdown-menu-left { + left: 0; + right: auto; +} + +// Dropdown section headers +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: @font-size-small; + line-height: @line-height-base; + color: @dropdown-header-color; + white-space: nowrap; // as with > li > a +} + +// Backdrop to catch body clicks on mobile, etc. +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: (@zindex-dropdown - 10); +} + +// Right aligned dropdowns +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +// Allow for dropdowns to go bottom up (aka, dropup-menu) +// +// Just add .dropup after the standard .dropdown class and you're set, bro. +// TODO: abstract this so that the navbar fixed styles are not placed here? + +.dropup, +.navbar-fixed-bottom .dropdown { + // Reverse the caret + .caret { + border-top: 0; + border-bottom: @caret-width-base solid; + content: ""; + } + // Different positioning for bottom up menu + .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; + } +} + + +// Component alignment +// +// Reiterate per navbar.less and the modified component alignment there. + +@media (min-width: @grid-float-breakpoint) { + .navbar-right { + .dropdown-menu { + .dropdown-menu-right(); + } + // Necessary for overrides of the default right aligned menu. + // Will remove come v4 in all likelihood. + .dropdown-menu-left { + .dropdown-menu-left(); + } + } +} diff --git a/framework/core/less/common/bootstrap/forms.less b/framework/core/less/common/bootstrap/forms.less new file mode 100755 index 000000000..94c0e7fce --- /dev/null +++ b/framework/core/less/common/bootstrap/forms.less @@ -0,0 +1,600 @@ +// +// Forms +// -------------------------------------------------- + + +// Normalize non-controls +// +// Restyle and baseline non-control form elements. + +fieldset { + padding: 0; + margin: 0; + border: 0; + // Chrome and Firefox set a `min-width: min-content;` on fieldsets, + // so we reset that to ensure it behaves more like a standard block element. + // See https://github.com/twbs/bootstrap/issues/12359. + min-width: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: @line-height-computed; + font-size: (@font-size-base * 1.5); + line-height: inherit; + color: @legend-color; + border: 0; + border-bottom: 1px solid @legend-border-color; +} + +label { + display: inline-block; + max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141) + margin-bottom: 5px; + font-weight: bold; +} + + +// Normalize form controls +// +// While most of our form styles require extra classes, some basic normalization +// is required to ensure optimum display with or without those classes to better +// address browser inconsistencies. + +// Override content-box in Normalize (* isn't specific enough) +input[type="search"] { + .box-sizing(border-box); +} + +// Position radios and checkboxes better +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; // IE8-9 + line-height: normal; +} + +// Set the height of file controls to match text inputs +input[type="file"] { + display: block; +} + +// Make range inputs behave like textual form controls +input[type="range"] { + display: block; + width: 100%; +} + +// Make multiple select elements height not fixed +select[multiple], +select[size] { + height: auto; +} + +// Focus for file, radio, and checkbox +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + .tab-focus(); +} + +// Adjust output element +output { + display: block; + padding-top: (@padding-base-vertical + 1); + font-size: @font-size-base; + line-height: @line-height-base; + color: @input-color; +} + + +// Common form controls +// +// Shared size and type resets for form controls. Apply `.form-control` to any +// of the following form controls: +// +// select +// textarea +// input[type="text"] +// input[type="password"] +// input[type="datetime"] +// input[type="datetime-local"] +// input[type="date"] +// input[type="month"] +// input[type="time"] +// input[type="week"] +// input[type="number"] +// input[type="email"] +// input[type="url"] +// input[type="search"] +// input[type="tel"] +// input[type="color"] + +.form-control { + display: block; + width: 100%; + height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border) + padding: @padding-base-vertical @padding-base-horizontal; + font-size: @font-size-base; + line-height: @line-height-base; + color: @input-color; + background-color: @input-bg; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid @input-border; + border-radius: @input-border-radius; // Note: This has no effect on s in CSS. + .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); + .transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s"); + + // Customize the `:focus` state to imitate native WebKit styles. + .form-control-focus(); + + // Placeholder + .placeholder(); + + // Disabled and read-only inputs + // + // HTML5 says that controls under a fieldset > legend:first-child won't be + // disabled if the fieldset is disabled. Due to implementation difficulty, we + // don't honor that edge case; we style them as disabled anyway. + &[disabled], + &[readonly], + fieldset[disabled] & { + background-color: @input-bg-disabled; + opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655 + } + + &[disabled], + fieldset[disabled] & { + cursor: @cursor-disabled; + } + + // Reset height for `textarea`s + textarea& { + height: auto; + } +} + + +// Search inputs in iOS +// +// This overrides the extra rounded corners on search inputs in iOS so that our +// `.form-control` class can properly style them. Note that this cannot simply +// be added to `.form-control` as it's not specific enough. For details, see +// https://github.com/twbs/bootstrap/issues/11586. + +input[type="search"] { + -webkit-appearance: none; +} + + +// Special styles for iOS temporal inputs +// +// In Mobile Safari, setting `display: block` on temporal inputs causes the +// text within the input to become vertically misaligned. As a workaround, we +// set a pixel line-height that matches the given height of the input, but only +// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848 + +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: @input-height-base; + + &.input-sm, + .input-group-sm & { + line-height: @input-height-small; + } + + &.input-lg, + .input-group-lg & { + line-height: @input-height-large; + } + } +} + + +// Form groups +// +// Designed to help with the organization and spacing of vertical forms. For +// horizontal forms, use the predefined grid classes. + +.form-group { + margin-bottom: @form-group-margin-bottom; +} + + +// Checkboxes and radios +// +// Indent the labels to position radios/checkboxes as hanging controls. + +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; + + label { + min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; + } +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing +} + +// Radios and checkboxes on same line +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; // space out consecutive inline controls +} + +// Apply same disabled cursor tweak as for inputs +// Some special care is needed because Star + +// Import the fonts +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('@{icon-font-path}@{icon-font-name}.eot'); + src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'), + url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'), + url('@{icon-font-path}@{icon-font-name}.woff') format('woff'), + url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'), + url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg'); +} + +// Catchall baseclass +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +// Individual icons +.glyphicon-asterisk { &:before { content: "\2a"; } } +.glyphicon-plus { &:before { content: "\2b"; } } +.glyphicon-euro, +.glyphicon-eur { &:before { content: "\20ac"; } } +.glyphicon-minus { &:before { content: "\2212"; } } +.glyphicon-cloud { &:before { content: "\2601"; } } +.glyphicon-envelope { &:before { content: "\2709"; } } +.glyphicon-pencil { &:before { content: "\270f"; } } +.glyphicon-glass { &:before { content: "\e001"; } } +.glyphicon-music { &:before { content: "\e002"; } } +.glyphicon-search { &:before { content: "\e003"; } } +.glyphicon-heart { &:before { content: "\e005"; } } +.glyphicon-star { &:before { content: "\e006"; } } +.glyphicon-star-empty { &:before { content: "\e007"; } } +.glyphicon-user { &:before { content: "\e008"; } } +.glyphicon-film { &:before { content: "\e009"; } } +.glyphicon-th-large { &:before { content: "\e010"; } } +.glyphicon-th { &:before { content: "\e011"; } } +.glyphicon-th-list { &:before { content: "\e012"; } } +.glyphicon-ok { &:before { content: "\e013"; } } +.glyphicon-remove { &:before { content: "\e014"; } } +.glyphicon-zoom-in { &:before { content: "\e015"; } } +.glyphicon-zoom-out { &:before { content: "\e016"; } } +.glyphicon-off { &:before { content: "\e017"; } } +.glyphicon-signal { &:before { content: "\e018"; } } +.glyphicon-cog { &:before { content: "\e019"; } } +.glyphicon-trash { &:before { content: "\e020"; } } +.glyphicon-home { &:before { content: "\e021"; } } +.glyphicon-file { &:before { content: "\e022"; } } +.glyphicon-time { &:before { content: "\e023"; } } +.glyphicon-road { &:before { content: "\e024"; } } +.glyphicon-download-alt { &:before { content: "\e025"; } } +.glyphicon-download { &:before { content: "\e026"; } } +.glyphicon-upload { &:before { content: "\e027"; } } +.glyphicon-inbox { &:before { content: "\e028"; } } +.glyphicon-play-circle { &:before { content: "\e029"; } } +.glyphicon-repeat { &:before { content: "\e030"; } } +.glyphicon-refresh { &:before { content: "\e031"; } } +.glyphicon-list-alt { &:before { content: "\e032"; } } +.glyphicon-lock { &:before { content: "\e033"; } } +.glyphicon-flag { &:before { content: "\e034"; } } +.glyphicon-headphones { &:before { content: "\e035"; } } +.glyphicon-volume-off { &:before { content: "\e036"; } } +.glyphicon-volume-down { &:before { content: "\e037"; } } +.glyphicon-volume-up { &:before { content: "\e038"; } } +.glyphicon-qrcode { &:before { content: "\e039"; } } +.glyphicon-barcode { &:before { content: "\e040"; } } +.glyphicon-tag { &:before { content: "\e041"; } } +.glyphicon-tags { &:before { content: "\e042"; } } +.glyphicon-book { &:before { content: "\e043"; } } +.glyphicon-bookmark { &:before { content: "\e044"; } } +.glyphicon-print { &:before { content: "\e045"; } } +.glyphicon-camera { &:before { content: "\e046"; } } +.glyphicon-font { &:before { content: "\e047"; } } +.glyphicon-bold { &:before { content: "\e048"; } } +.glyphicon-italic { &:before { content: "\e049"; } } +.glyphicon-text-height { &:before { content: "\e050"; } } +.glyphicon-text-width { &:before { content: "\e051"; } } +.glyphicon-align-left { &:before { content: "\e052"; } } +.glyphicon-align-center { &:before { content: "\e053"; } } +.glyphicon-align-right { &:before { content: "\e054"; } } +.glyphicon-align-justify { &:before { content: "\e055"; } } +.glyphicon-list { &:before { content: "\e056"; } } +.glyphicon-indent-left { &:before { content: "\e057"; } } +.glyphicon-indent-right { &:before { content: "\e058"; } } +.glyphicon-facetime-video { &:before { content: "\e059"; } } +.glyphicon-picture { &:before { content: "\e060"; } } +.glyphicon-map-marker { &:before { content: "\e062"; } } +.glyphicon-adjust { &:before { content: "\e063"; } } +.glyphicon-tint { &:before { content: "\e064"; } } +.glyphicon-edit { &:before { content: "\e065"; } } +.glyphicon-share { &:before { content: "\e066"; } } +.glyphicon-check { &:before { content: "\e067"; } } +.glyphicon-move { &:before { content: "\e068"; } } +.glyphicon-step-backward { &:before { content: "\e069"; } } +.glyphicon-fast-backward { &:before { content: "\e070"; } } +.glyphicon-backward { &:before { content: "\e071"; } } +.glyphicon-play { &:before { content: "\e072"; } } +.glyphicon-pause { &:before { content: "\e073"; } } +.glyphicon-stop { &:before { content: "\e074"; } } +.glyphicon-forward { &:before { content: "\e075"; } } +.glyphicon-fast-forward { &:before { content: "\e076"; } } +.glyphicon-step-forward { &:before { content: "\e077"; } } +.glyphicon-eject { &:before { content: "\e078"; } } +.glyphicon-chevron-left { &:before { content: "\e079"; } } +.glyphicon-chevron-right { &:before { content: "\e080"; } } +.glyphicon-plus-sign { &:before { content: "\e081"; } } +.glyphicon-minus-sign { &:before { content: "\e082"; } } +.glyphicon-remove-sign { &:before { content: "\e083"; } } +.glyphicon-ok-sign { &:before { content: "\e084"; } } +.glyphicon-question-sign { &:before { content: "\e085"; } } +.glyphicon-info-sign { &:before { content: "\e086"; } } +.glyphicon-screenshot { &:before { content: "\e087"; } } +.glyphicon-remove-circle { &:before { content: "\e088"; } } +.glyphicon-ok-circle { &:before { content: "\e089"; } } +.glyphicon-ban-circle { &:before { content: "\e090"; } } +.glyphicon-arrow-left { &:before { content: "\e091"; } } +.glyphicon-arrow-right { &:before { content: "\e092"; } } +.glyphicon-arrow-up { &:before { content: "\e093"; } } +.glyphicon-arrow-down { &:before { content: "\e094"; } } +.glyphicon-share-alt { &:before { content: "\e095"; } } +.glyphicon-resize-full { &:before { content: "\e096"; } } +.glyphicon-resize-small { &:before { content: "\e097"; } } +.glyphicon-exclamation-sign { &:before { content: "\e101"; } } +.glyphicon-gift { &:before { content: "\e102"; } } +.glyphicon-leaf { &:before { content: "\e103"; } } +.glyphicon-fire { &:before { content: "\e104"; } } +.glyphicon-eye-open { &:before { content: "\e105"; } } +.glyphicon-eye-close { &:before { content: "\e106"; } } +.glyphicon-warning-sign { &:before { content: "\e107"; } } +.glyphicon-plane { &:before { content: "\e108"; } } +.glyphicon-calendar { &:before { content: "\e109"; } } +.glyphicon-random { &:before { content: "\e110"; } } +.glyphicon-comment { &:before { content: "\e111"; } } +.glyphicon-magnet { &:before { content: "\e112"; } } +.glyphicon-chevron-up { &:before { content: "\e113"; } } +.glyphicon-chevron-down { &:before { content: "\e114"; } } +.glyphicon-retweet { &:before { content: "\e115"; } } +.glyphicon-shopping-cart { &:before { content: "\e116"; } } +.glyphicon-folder-close { &:before { content: "\e117"; } } +.glyphicon-folder-open { &:before { content: "\e118"; } } +.glyphicon-resize-vertical { &:before { content: "\e119"; } } +.glyphicon-resize-horizontal { &:before { content: "\e120"; } } +.glyphicon-hdd { &:before { content: "\e121"; } } +.glyphicon-bullhorn { &:before { content: "\e122"; } } +.glyphicon-bell { &:before { content: "\e123"; } } +.glyphicon-certificate { &:before { content: "\e124"; } } +.glyphicon-thumbs-up { &:before { content: "\e125"; } } +.glyphicon-thumbs-down { &:before { content: "\e126"; } } +.glyphicon-hand-right { &:before { content: "\e127"; } } +.glyphicon-hand-left { &:before { content: "\e128"; } } +.glyphicon-hand-up { &:before { content: "\e129"; } } +.glyphicon-hand-down { &:before { content: "\e130"; } } +.glyphicon-circle-arrow-right { &:before { content: "\e131"; } } +.glyphicon-circle-arrow-left { &:before { content: "\e132"; } } +.glyphicon-circle-arrow-up { &:before { content: "\e133"; } } +.glyphicon-circle-arrow-down { &:before { content: "\e134"; } } +.glyphicon-globe { &:before { content: "\e135"; } } +.glyphicon-wrench { &:before { content: "\e136"; } } +.glyphicon-tasks { &:before { content: "\e137"; } } +.glyphicon-filter { &:before { content: "\e138"; } } +.glyphicon-briefcase { &:before { content: "\e139"; } } +.glyphicon-fullscreen { &:before { content: "\e140"; } } +.glyphicon-dashboard { &:before { content: "\e141"; } } +.glyphicon-paperclip { &:before { content: "\e142"; } } +.glyphicon-heart-empty { &:before { content: "\e143"; } } +.glyphicon-link { &:before { content: "\e144"; } } +.glyphicon-phone { &:before { content: "\e145"; } } +.glyphicon-pushpin { &:before { content: "\e146"; } } +.glyphicon-usd { &:before { content: "\e148"; } } +.glyphicon-gbp { &:before { content: "\e149"; } } +.glyphicon-sort { &:before { content: "\e150"; } } +.glyphicon-sort-by-alphabet { &:before { content: "\e151"; } } +.glyphicon-sort-by-alphabet-alt { &:before { content: "\e152"; } } +.glyphicon-sort-by-order { &:before { content: "\e153"; } } +.glyphicon-sort-by-order-alt { &:before { content: "\e154"; } } +.glyphicon-sort-by-attributes { &:before { content: "\e155"; } } +.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } } +.glyphicon-unchecked { &:before { content: "\e157"; } } +.glyphicon-expand { &:before { content: "\e158"; } } +.glyphicon-collapse-down { &:before { content: "\e159"; } } +.glyphicon-collapse-up { &:before { content: "\e160"; } } +.glyphicon-log-in { &:before { content: "\e161"; } } +.glyphicon-flash { &:before { content: "\e162"; } } +.glyphicon-log-out { &:before { content: "\e163"; } } +.glyphicon-new-window { &:before { content: "\e164"; } } +.glyphicon-record { &:before { content: "\e165"; } } +.glyphicon-save { &:before { content: "\e166"; } } +.glyphicon-open { &:before { content: "\e167"; } } +.glyphicon-saved { &:before { content: "\e168"; } } +.glyphicon-import { &:before { content: "\e169"; } } +.glyphicon-export { &:before { content: "\e170"; } } +.glyphicon-send { &:before { content: "\e171"; } } +.glyphicon-floppy-disk { &:before { content: "\e172"; } } +.glyphicon-floppy-saved { &:before { content: "\e173"; } } +.glyphicon-floppy-remove { &:before { content: "\e174"; } } +.glyphicon-floppy-save { &:before { content: "\e175"; } } +.glyphicon-floppy-open { &:before { content: "\e176"; } } +.glyphicon-credit-card { &:before { content: "\e177"; } } +.glyphicon-transfer { &:before { content: "\e178"; } } +.glyphicon-cutlery { &:before { content: "\e179"; } } +.glyphicon-header { &:before { content: "\e180"; } } +.glyphicon-compressed { &:before { content: "\e181"; } } +.glyphicon-earphone { &:before { content: "\e182"; } } +.glyphicon-phone-alt { &:before { content: "\e183"; } } +.glyphicon-tower { &:before { content: "\e184"; } } +.glyphicon-stats { &:before { content: "\e185"; } } +.glyphicon-sd-video { &:before { content: "\e186"; } } +.glyphicon-hd-video { &:before { content: "\e187"; } } +.glyphicon-subtitles { &:before { content: "\e188"; } } +.glyphicon-sound-stereo { &:before { content: "\e189"; } } +.glyphicon-sound-dolby { &:before { content: "\e190"; } } +.glyphicon-sound-5-1 { &:before { content: "\e191"; } } +.glyphicon-sound-6-1 { &:before { content: "\e192"; } } +.glyphicon-sound-7-1 { &:before { content: "\e193"; } } +.glyphicon-copyright-mark { &:before { content: "\e194"; } } +.glyphicon-registration-mark { &:before { content: "\e195"; } } +.glyphicon-cloud-download { &:before { content: "\e197"; } } +.glyphicon-cloud-upload { &:before { content: "\e198"; } } +.glyphicon-tree-conifer { &:before { content: "\e199"; } } +.glyphicon-tree-deciduous { &:before { content: "\e200"; } } +.glyphicon-cd { &:before { content: "\e201"; } } +.glyphicon-save-file { &:before { content: "\e202"; } } +.glyphicon-open-file { &:before { content: "\e203"; } } +.glyphicon-level-up { &:before { content: "\e204"; } } +.glyphicon-copy { &:before { content: "\e205"; } } +.glyphicon-paste { &:before { content: "\e206"; } } +// The following 2 Glyphicons are omitted for the time being because +// they currently use Unicode codepoints that are outside the +// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle +// non-BMP codepoints in CSS string escapes, and thus can't display these two icons. +// Notably, the bug affects some older versions of the Android Browser. +// More info: https://github.com/twbs/bootstrap/issues/10106 +// .glyphicon-door { &:before { content: "\1f6aa"; } } +// .glyphicon-key { &:before { content: "\1f511"; } } +.glyphicon-alert { &:before { content: "\e209"; } } +.glyphicon-equalizer { &:before { content: "\e210"; } } +.glyphicon-king { &:before { content: "\e211"; } } +.glyphicon-queen { &:before { content: "\e212"; } } +.glyphicon-pawn { &:before { content: "\e213"; } } +.glyphicon-bishop { &:before { content: "\e214"; } } +.glyphicon-knight { &:before { content: "\e215"; } } +.glyphicon-baby-formula { &:before { content: "\e216"; } } +.glyphicon-tent { &:before { content: "\26fa"; } } +.glyphicon-blackboard { &:before { content: "\e218"; } } +.glyphicon-bed { &:before { content: "\e219"; } } +.glyphicon-apple { &:before { content: "\f8ff"; } } +.glyphicon-erase { &:before { content: "\e221"; } } +.glyphicon-hourglass { &:before { content: "\231b"; } } +.glyphicon-lamp { &:before { content: "\e223"; } } +.glyphicon-duplicate { &:before { content: "\e224"; } } +.glyphicon-piggy-bank { &:before { content: "\e225"; } } +.glyphicon-scissors { &:before { content: "\e226"; } } +.glyphicon-bitcoin { &:before { content: "\e227"; } } +.glyphicon-btc { &:before { content: "\e227"; } } +.glyphicon-xbt { &:before { content: "\e227"; } } +.glyphicon-yen { &:before { content: "\00a5"; } } +.glyphicon-jpy { &:before { content: "\00a5"; } } +.glyphicon-ruble { &:before { content: "\20bd"; } } +.glyphicon-rub { &:before { content: "\20bd"; } } +.glyphicon-scale { &:before { content: "\e230"; } } +.glyphicon-ice-lolly { &:before { content: "\e231"; } } +.glyphicon-ice-lolly-tasted { &:before { content: "\e232"; } } +.glyphicon-education { &:before { content: "\e233"; } } +.glyphicon-option-horizontal { &:before { content: "\e234"; } } +.glyphicon-option-vertical { &:before { content: "\e235"; } } +.glyphicon-menu-hamburger { &:before { content: "\e236"; } } +.glyphicon-modal-window { &:before { content: "\e237"; } } +.glyphicon-oil { &:before { content: "\e238"; } } +.glyphicon-grain { &:before { content: "\e239"; } } +.glyphicon-sunglasses { &:before { content: "\e240"; } } +.glyphicon-text-size { &:before { content: "\e241"; } } +.glyphicon-text-color { &:before { content: "\e242"; } } +.glyphicon-text-background { &:before { content: "\e243"; } } +.glyphicon-object-align-top { &:before { content: "\e244"; } } +.glyphicon-object-align-bottom { &:before { content: "\e245"; } } +.glyphicon-object-align-horizontal{ &:before { content: "\e246"; } } +.glyphicon-object-align-left { &:before { content: "\e247"; } } +.glyphicon-object-align-vertical { &:before { content: "\e248"; } } +.glyphicon-object-align-right { &:before { content: "\e249"; } } +.glyphicon-triangle-right { &:before { content: "\e250"; } } +.glyphicon-triangle-left { &:before { content: "\e251"; } } +.glyphicon-triangle-bottom { &:before { content: "\e252"; } } +.glyphicon-triangle-top { &:before { content: "\e253"; } } +.glyphicon-console { &:before { content: "\e254"; } } +.glyphicon-superscript { &:before { content: "\e255"; } } +.glyphicon-subscript { &:before { content: "\e256"; } } +.glyphicon-menu-left { &:before { content: "\e257"; } } +.glyphicon-menu-right { &:before { content: "\e258"; } } +.glyphicon-menu-down { &:before { content: "\e259"; } } +.glyphicon-menu-up { &:before { content: "\e260"; } } diff --git a/framework/core/less/common/bootstrap/grid.less b/framework/core/less/common/bootstrap/grid.less new file mode 100755 index 000000000..e100655b7 --- /dev/null +++ b/framework/core/less/common/bootstrap/grid.less @@ -0,0 +1,84 @@ +// +// Grid system +// -------------------------------------------------- + + +// Container widths +// +// Set the container width, and override it for fixed navbars in media queries. + +.container { + .container-fixed(); + + @media (min-width: @screen-sm-min) { + width: @container-sm; + } + @media (min-width: @screen-md-min) { + width: @container-md; + } + @media (min-width: @screen-lg-min) { + width: @container-lg; + } +} + + +// Fluid container +// +// Utilizes the mixin meant for fixed width containers, but without any defined +// width for fluid, full width layouts. + +.container-fluid { + .container-fixed(); +} + + +// Row +// +// Rows contain and clear the floats of your columns. + +.row { + .make-row(); +} + + +// Columns +// +// Common styles for small and large grid columns + +.make-grid-columns(); + + +// Extra small grid +// +// Columns, offsets, pushes, and pulls for extra small devices like +// smartphones. + +.make-grid(xs); + + +// Small grid +// +// Columns, offsets, pushes, and pulls for the small device range, from phones +// to tablets. + +@media (min-width: @screen-sm-min) { + .make-grid(sm); +} + + +// Medium grid +// +// Columns, offsets, pushes, and pulls for the desktop device range. + +@media (min-width: @screen-md-min) { + .make-grid(md); +} + + +// Large grid +// +// Columns, offsets, pushes, and pulls for the large desktop device range. + +@media (min-width: @screen-lg-min) { + .make-grid(lg); +} diff --git a/framework/core/less/common/bootstrap/input-groups.less b/framework/core/less/common/bootstrap/input-groups.less new file mode 100755 index 000000000..a8712f25b --- /dev/null +++ b/framework/core/less/common/bootstrap/input-groups.less @@ -0,0 +1,166 @@ +// +// Input groups +// -------------------------------------------------- + +// Base styles +// ------------------------- +.input-group { + position: relative; // For dropdowns + display: table; + border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table + + // Undo padding and float of grid classes + &[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; + } + + .form-control { + // Ensure that the input is always above the *appended* addon button for + // proper border colors. + position: relative; + z-index: 2; + + // IE9 fubars the placeholder attribute in text inputs and the arrows on + // select elements in input groups. To fix it, we float the input. Details: + // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855 + float: left; + + width: 100%; + margin-bottom: 0; + } +} + +// Sizing options +// +// Remix the default form control sizing classes into new ones for easier +// manipulation. + +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + .input-lg(); +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + .input-sm(); +} + + +// Display as table-cell +// ------------------------- +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; + + &:not(:first-child):not(:last-child) { + border-radius: 0; + } +} +// Addon and addon wrapper for buttons +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; // Match the inputs +} + +// Text input groups +// ------------------------- +.input-group-addon { + padding: @padding-base-vertical @padding-base-horizontal; + font-size: @font-size-base; + font-weight: normal; + line-height: 1; + color: @input-color; + text-align: center; + background-color: @input-group-addon-bg; + border: 1px solid @input-group-addon-border-color; + border-radius: @border-radius-base; + + // Sizing + &.input-sm { + padding: @padding-small-vertical @padding-small-horizontal; + font-size: @font-size-small; + border-radius: @border-radius-small; + } + &.input-lg { + padding: @padding-large-vertical @padding-large-horizontal; + font-size: @font-size-large; + border-radius: @border-radius-large; + } + + // Nuke default margins from checkboxes and radios to vertically center within. + input[type="radio"], + input[type="checkbox"] { + margin-top: 0; + } +} + +// Reset rounded corners +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + .border-right-radius(0); +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + .border-left-radius(0); +} +.input-group-addon:last-child { + border-left: 0; +} + +// Button input groups +// ------------------------- +.input-group-btn { + position: relative; + // Jankily prevent input button groups from wrapping with `white-space` and + // `font-size` in combination with `inline-block` on buttons. + font-size: 0; + white-space: nowrap; + + // Negative margin for spacing, position for bringing hovered/focused/actived + // element above the siblings. + > .btn { + position: relative; + + .btn { + margin-left: -1px; + } + // Bring the "active" button to the front + &:hover, + &:focus, + &:active { + z-index: 2; + } + } + + // Negative margin to only have a 1px border between the two + &:first-child { + > .btn, + > .btn-group { + margin-right: -1px; + } + } + &:last-child { + > .btn, + > .btn-group { + margin-left: -1px; + } + } +} diff --git a/framework/core/less/common/bootstrap/jumbotron.less b/framework/core/less/common/bootstrap/jumbotron.less new file mode 100755 index 000000000..fb4415bdc --- /dev/null +++ b/framework/core/less/common/bootstrap/jumbotron.less @@ -0,0 +1,50 @@ +// +// Jumbotron +// -------------------------------------------------- + + +.jumbotron { + padding: @jumbotron-padding (@jumbotron-padding / 2); + margin-bottom: @jumbotron-padding; + color: @jumbotron-color; + background-color: @jumbotron-bg; + + h1, + .h1 { + color: @jumbotron-heading-color; + } + + p { + margin-bottom: (@jumbotron-padding / 2); + font-size: @jumbotron-font-size; + font-weight: 200; + } + + > hr { + border-top-color: darken(@jumbotron-bg, 10%); + } + + .container &, + .container-fluid & { + border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container + } + + .container { + max-width: 100%; + } + + @media screen and (min-width: @screen-sm-min) { + padding: (@jumbotron-padding * 1.6) 0; + + .container &, + .container-fluid & { + padding-left: (@jumbotron-padding * 2); + padding-right: (@jumbotron-padding * 2); + } + + h1, + .h1 { + font-size: @jumbotron-heading-font-size; + } + } +} diff --git a/framework/core/less/common/bootstrap/labels.less b/framework/core/less/common/bootstrap/labels.less new file mode 100755 index 000000000..9a5a27006 --- /dev/null +++ b/framework/core/less/common/bootstrap/labels.less @@ -0,0 +1,64 @@ +// +// Labels +// -------------------------------------------------- + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: @label-color; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; + + // Add hover effects, but only for links + a& { + &:hover, + &:focus { + color: @label-link-hover-color; + text-decoration: none; + cursor: pointer; + } + } + + // Empty labels collapse automatically (not available in IE8) + &:empty { + display: none; + } + + // Quick fix for labels in buttons + .btn & { + position: relative; + top: -1px; + } +} + +// Colors +// Contextual variations (linked labels get darker on :hover) + +.label-default { + .label-variant(@label-default-bg); +} + +.label-primary { + .label-variant(@label-primary-bg); +} + +.label-success { + .label-variant(@label-success-bg); +} + +.label-info { + .label-variant(@label-info-bg); +} + +.label-warning { + .label-variant(@label-warning-bg); +} + +.label-danger { + .label-variant(@label-danger-bg); +} diff --git a/framework/core/less/common/bootstrap/list-group.less b/framework/core/less/common/bootstrap/list-group.less new file mode 100755 index 000000000..1462ce16b --- /dev/null +++ b/framework/core/less/common/bootstrap/list-group.less @@ -0,0 +1,124 @@ +// +// List groups +// -------------------------------------------------- + + +// Base class +// +// Easily usable on