Fixed a conflict in framework.js. Closures in the script are named now, for the memory profiling needs.

Conflicts:
	modules/system/assets/js/framework.js
This commit is contained in:
alekseybobkov 2015-04-11 18:58:24 -07:00
commit 06e5dce96a
155 changed files with 6545 additions and 3350 deletions

View File

@ -1,3 +1,6 @@
* **Build 239** (2015-04-06)
- Installing plugins has a new interface and themes can now be installed using the back-end.
* **Build 236** (2015-03-28)
- Default context of `manage` and `pivot` forms is now *create* and *update* respectively, instead of the old value *relation*. Use the `context` option to set it back to the old value (see Backend > Relations docs).

View File

@ -101,14 +101,15 @@ class ServiceProvider extends ModuleServiceProvider
'permissions' => ['backend.manage_branding'],
'order' => 500
],
'editor' => [
'label' => 'backend::lang.editor.menu_label',
'description' => 'backend::lang.editor.menu_description',
'myaccount' => [
'label' => 'backend::lang.myaccount.menu_label',
'description' => 'backend::lang.myaccount.menu_description',
'category' => SettingsManager::CATEGORY_MYSETTINGS,
'icon' => 'icon-code',
'url' => Backend::URL('backend/editorpreferences'),
'order' => 600,
'context' => 'mysettings'
'icon' => 'icon-user',
'url' => Backend::URL('backend/users/myaccount'),
'order' => 500,
'context' => 'mysettings',
'keywords' => 'backend::lang.myaccount.menu_keywords'
],
'backend_preferences' => [
'label' => 'backend::lang.backend_preferences.menu_label',
@ -116,18 +117,17 @@ class ServiceProvider extends ModuleServiceProvider
'category' => SettingsManager::CATEGORY_MYSETTINGS,
'icon' => 'icon-laptop',
'class' => 'Backend\Models\BackendPreferences',
'order' => 500,
'order' => 510,
'context' => 'mysettings'
],
'myaccount' => [
'label' => 'backend::lang.myaccount.menu_label',
'description' => 'backend::lang.myaccount.menu_description',
'editor' => [
'label' => 'backend::lang.editor.menu_label',
'description' => 'backend::lang.editor.menu_description',
'category' => SettingsManager::CATEGORY_MYSETTINGS,
'icon' => 'icon-user',
'url' => Backend::URL('backend/users/myaccount'),
'order' => 400,
'context' => 'mysettings',
'keywords' => 'backend::lang.myaccount.menu_keywords'
'icon' => 'icon-code',
'url' => Backend::URL('backend/editorpreferences'),
'order' => 520,
'context' => 'mysettings'
],
'access_logs' => [
'label' => 'backend::lang.access_log.menu_label',
@ -136,7 +136,7 @@ class ServiceProvider extends ModuleServiceProvider
'icon' => 'icon-lock',
'url' => Backend::url('backend/accesslogs'),
'permissions' => ['system.access_logs'],
'order' => 800
'order' => 920
]
]);
});
@ -183,6 +183,7 @@ class ServiceProvider extends ModuleServiceProvider
$combiner->registerBundle('~/modules/backend/formwidgets/datepicker/assets/js/build.js');
$combiner->registerBundle('~/modules/backend/formwidgets/richeditor/assets/less/richeditor.less');
$combiner->registerBundle('~/modules/backend/formwidgets/richeditor/assets/js/build.js');
$combiner->registerBundle('~/modules/backend/formwidgets/codeeditor/assets/less/codeeditor.less');
});
}

View File

@ -2285,7 +2285,7 @@ nav#layout-mainmenu.navbar ul li.icon a{padding:14px}
nav#layout-mainmenu.navbar ul li.power-off i,nav#layout-mainmenu.navbar ul li.preview i{font-size:20px}
nav#layout-mainmenu.navbar ul li.power-off a,nav#layout-mainmenu.navbar ul li.preview a{padding:22px 20px 20px 20px}
nav#layout-mainmenu.navbar ul li.account{margin-right:0;line-height:23px}
nav#layout-mainmenu.navbar ul li.account a{padding-right:20px;position:relative;z-index:900}
nav#layout-mainmenu.navbar ul li.account a{padding-right:20px;position:relative;z-index:590}
nav#layout-mainmenu.navbar ul li.account img{width:25px;margin-right:7px;position:relative;top:-2px}
nav#layout-mainmenu.navbar ul.nav{display:inline-block}
nav#layout-mainmenu.navbar .menu-toggle{display:none}
@ -2295,7 +2295,7 @@ nav#layout-mainmenu.navbar .toolbar-item:before{left:-12px}
nav#layout-mainmenu.navbar .toolbar-item:after{right:-12px}
nav#layout-mainmenu.navbar .toolbar-item.scroll-active-before:before{color:#ffffff}
nav#layout-mainmenu.navbar .toolbar-item.scroll-active-after:after{color:#ffffff}
nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu{position:fixed;top:63px;right:0;width:225px;background:#2b3e50;z-index:900;display:none}
nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu{position:fixed;top:63px;right:0;background:#2b3e50;z-index:590;display:none}
nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu.active{display:block}
nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu:after{content:'';display:block;width:0;height:0;border-left:11px solid transparent;border-right:11px solid transparent;border-bottom:12px solid #2b3e50;right:40px;top:-12px;position:absolute}
nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu ul{float:none;display:block}

View File

@ -66,7 +66,7 @@ nav#layout-mainmenu.navbar {
a {
padding-right: 20px;
position: relative;
z-index: 900;
z-index: 590;
}
img {
@ -98,9 +98,8 @@ nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu {
position: fixed;
top: 63px;
right: 0;
width: 225px;
background: @color-accountmenu-bg;
z-index: 900;
z-index: 590;
display: none;
&.active {

View File

@ -561,6 +561,12 @@ class RelationController extends ControllerBehavior
if ($config->recordUrl) {
$defaultOnClick = null;
}
elseif (
!$this->makeConfigForMode('manage', 'form', false) &&
!$this->makeConfigForMode('pivot', 'form', false)
) {
$defaultOnClick = null;
}
$config->recordOnClick = $this->getConfig('view[recordOnClick]', $defaultOnClick);
@ -898,7 +904,7 @@ class RelationController extends ControllerBehavior
$saveData = $this->manageWidget->getSaveData();
if ($this->viewMode == 'multi') {
$model = $this->relationObject->find($this->manageId);
$model = $this->relationModel->find($this->manageId);
$model->save($saveData, $this->manageWidget->getSessionKey());
}
elseif ($this->viewMode == 'single') {
@ -1267,7 +1273,7 @@ class RelationController extends ControllerBehavior
* Returns the configuration for a mode (view, manage, pivot) for an
* expected type (list, form). Uses fallback configuration.
*/
protected function makeConfigForMode($mode = 'view', $type = 'list')
protected function makeConfigForMode($mode = 'view', $type = 'list', $throwException = true)
{
$config = null;
@ -1293,12 +1299,16 @@ class RelationController extends ControllerBehavior
* - view.list => manage.list
*/
if (!$config) {
if ($mode == 'manage' && $type == 'list') {
return $this->makeConfigForMode('view', $type);
}
throw new ApplicationException('Missing configuration for '.$mode.'.'.$type.' in RelationController definition '.$this->field);
if ($throwException) {
throw new ApplicationException('Missing configuration for '.$mode.'.'.$type.' in RelationController definition '.$this->field);
}
else {
return false;
}
}
return $this->makeConfig($config);

View File

@ -56,6 +56,20 @@
})
}
/*
* This function transfers the supplied variables as hidden form inputs,
* to any popup that is spawned within the supplied container. The spawned
* popup must contain a form element.
*/
this.bindToPopups = function(container, vars) {
$(container).on('show.oc.popup', function(event, $trigger, $modal){
var $form = $('form', $modal)
$.each(vars, function(name, value){
$form.prepend($('<input />').attr({ type: 'hidden', name: name, value: value }))
})
})
}
}
$.oc.relationBehavior = new RelationBehavior;

View File

@ -1,41 +1,79 @@
<?php if ($relationManageId): ?>
<div id="<?= $relationManageWidget->getId('managePopup') ?>">
<?php if ($relationManageId): ?>
<?= Form::ajax('onRelationManageUpdate', ['data-popup-load-indicator' => true, 'sessionKey' => $newSessionKey]) ?>
<?= Form::ajax('onRelationManageUpdate', ['data-popup-load-indicator' => true, 'sessionKey' => $newSessionKey]) ?>
<!-- Passable fields -->
<input type="hidden" name="manage_id" value="<?= $relationManageId ?>" />
<input type="hidden" name="_relation_field" value="<?= $relationField ?>" />
<input type="hidden" name="_relation_mode" value="form" />
<input type="hidden" name="_relation_session_key" value="<?= $relationSessionKey ?>" />
<!-- Passable fields -->
<input type="hidden" name="manage_id" value="<?= $relationManageId ?>" />
<input type="hidden" name="_relation_field" value="<?= $relationField ?>" />
<input type="hidden" name="_relation_mode" value="form" />
<input type="hidden" name="_relation_session_key" value="<?= $relationSessionKey ?>" />
<div class="modal-header">
<button type="button" class="close" data-dismiss="popup">&times;</button>
<h4 class="modal-title">
<div class="modal-header">
<button type="button" class="close" data-dismiss="popup">&times;</button>
<h4 class="modal-title">
<?php if ($this->readOnly): ?>
<?= e(trans('backend::lang.relation.preview_name', ['name' => $relationLabel])) ?>
<?php else: ?>
<?= e(trans('backend::lang.relation.update_name', ['name' => $relationLabel])) ?>
<?php endif ?>
</h4>
</div>
<div class="modal-body">
<?= $relationManageWidget->render(['preview' => $this->readOnly]) ?>
</div>
<div class="modal-footer">
<?php if ($this->readOnly): ?>
<?= e(trans('backend::lang.relation.preview_name', ['name' => $relationLabel])) ?>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.relation.close')) ?>
</button>
<?php else: ?>
<?= e(trans('backend::lang.relation.update_name', ['name' => $relationLabel])) ?>
<button
type="submit"
class="btn btn-primary">
<?= e(trans('backend::lang.relation.update')) ?>
</button>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.relation.cancel')) ?>
</button>
<?php endif ?>
</h4>
</div>
</div>
<div class="modal-body">
<?= $relationManageWidget->render(['preview' => $this->readOnly]) ?>
</div>
<?= Form::close() ?>
<div class="modal-footer">
<?php if ($this->readOnly): ?>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.relation.close')) ?>
</button>
<?php else: ?>
<?php else: ?>
<?= Form::ajax('onRelationManageCreate', ['data-popup-load-indicator' => true, 'sessionKey' => $newSessionKey]) ?>
<!-- Passable fields -->
<input type="hidden" name="_relation_field" value="<?= $relationField ?>" />
<input type="hidden" name="_relation_mode" value="form" />
<input type="hidden" name="_relation_session_key" value="<?= $relationSessionKey ?>" />
<div class="modal-header">
<button type="button" class="close" data-dismiss="popup">&times;</button>
<h4 class="modal-title">
<?= e(trans('backend::lang.relation.create_name', ['name' => $relationLabel])) ?>
</h4>
</div>
<div class="modal-body">
<?= $relationManageWidget->render() ?>
</div>
<div class="modal-footer">
<button
type="submit"
class="btn btn-primary">
<?= e(trans('backend::lang.relation.update')) ?>
<?= e(trans('backend::lang.relation.create')) ?>
</button>
<button
type="button"
@ -43,43 +81,16 @@
data-dismiss="popup">
<?= e(trans('backend::lang.relation.cancel')) ?>
</button>
<?php endif ?>
</div>
</div>
<?= Form::close() ?>
<?= Form::close() ?>
<?php endif ?>
<?php else: ?>
</div>
<?= Form::ajax('onRelationManageCreate', ['data-popup-load-indicator' => true, 'sessionKey' => $newSessionKey]) ?>
<!-- Passable fields -->
<input type="hidden" name="_relation_field" value="<?= $relationField ?>" />
<input type="hidden" name="_relation_session_key" value="<?= $relationSessionKey ?>" />
<div class="modal-header">
<button type="button" class="close" data-dismiss="popup">&times;</button>
<h4 class="modal-title">
<?= e(trans('backend::lang.relation.create_name', ['name' => $relationLabel])) ?>
</h4>
</div>
<div class="modal-body">
<?= $relationManageWidget->render() ?>
</div>
<div class="modal-footer">
<button
type="submit"
class="btn btn-primary">
<?= e(trans('backend::lang.relation.create')) ?>
</button>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.relation.cancel')) ?>
</button>
</div>
<?= Form::close() ?>
<?php endif ?>
<script>
$.oc.relationBehavior.bindToPopups('#<?= $relationManageWidget->getId("managePopup") ?>', {
_relation_field: '<?= $relationField ?>',
_relation_mode: 'form'
})
</script>

View File

@ -1,105 +1,21 @@
.field-codeeditor {
width: 100%;
position: relative;
border: 2px solid #e0e0e0;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
}
.field-codeeditor textarea {
opacity: 0;
filter: alpha(opacity=0);
}
.field-codeeditor.editor-focus {
border: 2px solid #808c8d;
}
.field-codeeditor.size-tiny {
min-height: 50px;
}
.field-codeeditor.size-small {
min-height: 100px;
}
.field-codeeditor.size-large {
min-height: 200px;
}
.field-codeeditor.size-huge {
min-height: 250px;
}
.field-codeeditor.size-giant {
min-height: 350px;
}
.field-codeeditor .ace_search {
font-family: 'Open Sans', Arial, sans-serif;
font-size: 14px;
color: #333333;
z-index: 153;
}
.field-codeeditor .editor-code {
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
}
.field-codeeditor .editor-toolbar {
position: absolute;
top: 3px;
right: 3px;
z-index: 150;
}
.field-codeeditor .editor-toolbar > ul,
.field-codeeditor .editor-toolbar ul > li {
list-style-type: none;
padding: 0;
margin: 0;
}
.field-codeeditor .editor-toolbar > ul > li {
float: left;
}
.field-codeeditor .editor-toolbar > ul > li > a {
display: block;
height: 25px;
width: 25px;
color: #666;
font-size: 20px;
text-align: center;
text-decoration: none;
}
.field-codeeditor .editor-toolbar > ul > li > a > abbr {
position: absolute;
font: 0/0 a;
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
.field-codeeditor .editor-toolbar > ul > li > a > i {
opacity: 0.4;
filter: alpha(opacity=40);
display: block;
}
.field-codeeditor .editor-toolbar > ul > li > a > i:before {
font-size: 14px;
}
.field-codeeditor .editor-toolbar > ul > li > a:hover > i,
.field-codeeditor .editor-toolbar > ul > li > a:focus > i {
opacity: 1;
filter: alpha(opacity=100);
}
.field-codeeditor.editor-fullscreen {
z-index: 151;
position: fixed!important;
top: 0;
left: 0;
height: 100%;
border-width: 0;
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
}
.field-codeeditor.editor-fullscreen .editor-code {
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
}
.field-codeeditor.editor-fullscreen .editor-toolbar {
z-index: 152;
}
.field-codeeditor{width:100%;position:relative;border:2px solid #e0e0e0;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}
.field-codeeditor textarea{opacity:0;filter:alpha(opacity=0)}
.field-codeeditor.editor-focus{border:2px solid #808c8d}
.field-codeeditor.size-tiny{min-height:50px}
.field-codeeditor.size-small{min-height:100px}
.field-codeeditor.size-large{min-height:200px}
.field-codeeditor.size-huge{min-height:250px}
.field-codeeditor.size-giant{min-height:350px}
.field-codeeditor .ace_search{font-family:'Open Sans',Arial,sans-serif;font-size:14px;color:#333333;z-index:603}
.field-codeeditor .editor-code{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}
.field-codeeditor .editor-toolbar{position:absolute;top:3px;right:3px;z-index:600}
.field-codeeditor .editor-toolbar > ul,.field-codeeditor .editor-toolbar ul > li{list-style-type:none;padding:0;margin:0}
.field-codeeditor .editor-toolbar > ul > li{float:left}
.field-codeeditor .editor-toolbar > ul > li > a{display:block;height:25px;width:25px;color:#666;font-size:20px;text-align:center;text-decoration:none}
.field-codeeditor .editor-toolbar > ul > li > a > abbr{position:absolute;font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}
.field-codeeditor .editor-toolbar > ul > li > a > i{opacity:0.4;filter:alpha(opacity=40);display:block}
.field-codeeditor .editor-toolbar > ul > li > a > i:before{font-size:14px}
.field-codeeditor .editor-toolbar > ul > li > a:hover > i,.field-codeeditor .editor-toolbar > ul > li > a:focus > i{opacity:1;filter:alpha(opacity=100)}
.field-codeeditor.editor-fullscreen{z-index:601;position:fixed !important;top:0;left:0;height:100%;border-width:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
.field-codeeditor.editor-fullscreen .editor-code{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
.field-codeeditor.editor-fullscreen .editor-toolbar{z-index:602}

View File

@ -1,6 +1,6 @@
@import "../../../../assets/less/core/boot.less";
@codeeditor-zindex: 150;
@codeeditor-zindex: 600;
.field-codeeditor {
width: 100%;

View File

@ -11,7 +11,7 @@
aria-label="Remove"
data-request="<?= $this->getEventHandler('onRemoveItem') ?>"
data-request-data="'index': '<?= $indexValue ?>'"
data-request-success="$el.closest('.field-repeater-item').remove()"
data-request-success="$(this).closest('.field-repeater-item').remove()"
data-request-confirm="Are you sure?">
<span aria-hidden="true">&times;</span>
</button>

View File

@ -173,7 +173,7 @@ to{background-position:0 0}
.redactor-editor figure[data-type=quote] cite:before{content:"\2014\00a0"}
.redactor-editor figure[data-type=quote] cite:empty:before{opacity:0.4;content:"\2014 Type to add citation (optional)"}
.redactor-box figcaption:empty:before{opacity:.4;content:"Type to add caption (optional)"}
.redactor-box .oc-figure-controls{background:#2b3e50 !important;padding:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;position:absolute;display:none;white-space:nowrap;left:10px;top:-50px;margin:0 auto;font-family:'Open Sans',Arial,sans-serif;line-height:20px;font-style:normal;z-index:800;text-align:center}
.redactor-box .oc-figure-controls{background:#2b3e50 !important;padding:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;position:absolute;display:none;white-space:nowrap;left:10px;top:-50px;margin:0 auto;font-family:'Open Sans',Arial,sans-serif;line-height:20px;font-style:normal;z-index:1100;text-align:center}
.redactor-box .oc-figure-controls:after{content:' ';left:0;position:absolute;display:block;height:10px;background:rgba(0,0,0,0.1);width:100%;bottom:-10px;opacity:0.1;filter:alpha(opacity=10);filter:alpha(opacity=0.1);-moz-opacity:0.001;opacity:0.001}
.redactor-box .oc-figure-controls:before{content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-top:9px solid #2b3e50;border-bottom-width:0;position:absolute;left:14px;bottom:-8px}
.redactor-box figure:hover .oc-figure-controls{display:block}
@ -246,9 +246,9 @@ to{background-position:0 0}
.field-richeditor.size-giant .redactor-editor{height:320px !important}
.redactor-box{margin-bottom:0}
.redactor-box iframe{border:none}
.redactor-box-fullscreen{z-index:415 !important}
.redactor-toolbar,.redactor-dropdown{z-index:410 !important}
#redactor-modal-overlay,#redactor-modal-box,#redactor-modal{z-index:420 !important}
.redactor-box-fullscreen{z-index:715 !important}
.redactor-toolbar,.redactor-dropdown{z-index:710 !important}
#redactor-modal-overlay,#redactor-modal-box,#redactor-modal{z-index:720 !important}
.redactor-toolbar{background:#dddddd;-webkit-box-shadow:none;box-shadow:none}
.redactor-toolbar li.redactor-btn-right{float:right;margin-right:2px}
.redactor-toolbar li a{color:#404040;font-size:14px;width:20px;line-height:20px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,7 @@
@import "../../../../assets/less/core/boot.less";
@richeditor-toolbar-size: 30px;
@richeditor-zindex: 300;
@richeditor-zindex: 600;
@richeditor-gutter: 20px;
@import "_redactor.less";

View File

@ -38,29 +38,31 @@
.redactor-box textarea:focus {
outline: none;
}
/*
Z-index setup
*/
.redactor-editor,
.redactor-box {
background: #fff;
}
/*
Z-index setup
*/
.redactor-editor,
.redactor-box,
.redactor-box textarea {
z-index: auto !important;
z-index: auto;
}
.redactor-box-fullscreen {
z-index: 1052 !important;
z-index: 1051;
}
.redactor-toolbar {
z-index: 100;
}
.redactor-toolbar,
.redactor-dropdown {
z-index: 1053 !important;
z-index: 1052;
}
#redactor-modal-overlay,
#redactor-modal-box,
#redactor-modal {
z-index: 1054 !important;
z-index: 1053;
}
/*
Resize
@ -111,6 +113,9 @@ body .redactor-box-fullscreen {
.redactor-editor:focus {
outline: none;
}
.toolbar-fixed-box + .redactor-editor {
padding-top: 32px !important;
}
/*
Placeholder
*/
@ -650,7 +655,7 @@ body .redactor-box-fullscreen {
padding-left: 0;
list-style: none;
max-height: 250px;
overflow-x: scroll;
overflow-x: auto;
}
#redactor-modal #redactor-modal-list li {
border-bottom: 1px solid #ddd;

File diff suppressed because it is too large Load Diff

View File

@ -83,32 +83,33 @@
}
}
}
/*
Z-index setup
*/
.redactor-editor,
.redactor-box {
background: #fff;
}
/*
Z-index setup
*/
.redactor-editor,
.redactor-box,
.redactor-box textarea {
z-index: auto !important;
z-index: auto;
}
.redactor-box-fullscreen {
z-index: 1052 !important;
z-index: 1051;
}
.redactor-toolbar {
z-index: 100;
}
.redactor-toolbar,
.redactor-dropdown {
z-index: 1053 !important;
z-index: 1052;
}
#redactor-modal-overlay,
#redactor-modal-box,
#redactor-modal {
z-index: 1054 !important;
z-index: 1053;
}
@ -164,6 +165,9 @@ body .redactor-box-fullscreen {
outline: none;
}
}
.toolbar-fixed-box + .redactor-editor {
padding-top: 32px !important;
}
/*
Placeholder
@ -698,7 +702,7 @@ body .redactor-box-fullscreen {
padding-left: 0;
list-style: none;
max-height: 250px;
overflow-x: scroll;
overflow-x: auto;
& li {
border-bottom: 1px solid #ddd;
&:last-child {

File diff suppressed because one or more lines are too long

View File

@ -256,7 +256,7 @@ return [
],
'mysettings' => [
'menu_label' => 'My Settings',
'menu_description' => 'Settings relate to your administration account'
'menu_description' => 'Settings related to your administration account'
],
'myaccount' => [
'menu_label' => 'My account',
@ -299,6 +299,6 @@ return [
'email' => 'Email'
],
'filter' => [
'all' => 'all'
]
'all' => 'all',
],
];

View File

@ -0,0 +1,306 @@
<?php
return [
'auth' => [
'title' => 'Administrasjonsområde'
],
'field' => [
'invalid_type' => 'Ugyldig felttype brukt :type.',
'options_method_not_exists' => "Modellklassen :model må definere en metode :method() som returnerer vilkår for formfeltet ':field'."
],
'widget' => [
'not_registered' => "En widget med klassenavnet ':name' har ikke blitt registrert",
'not_bound' => "En widget med klassenavnet ':name' er ikke bundet til kontrolleren"
],
'page' => [
'untitled' => 'Uten navn',
'access_denied' => [
'label' => 'Ingen tilgang',
'help' => "Du har ikke nødvendig tilgang til å se denne siden.",
'cms_link' => 'Tilbake til backend'
]
],
'partial' => [
'not_found_name' => "En partial ved navn ':name' ble ikke funnet."
],
'account' => [
'sign_out' => 'Logg ut',
'login' => 'Logg inn',
'reset' => 'Nullstill',
'restore' => 'Gjenopprett',
'login_placeholder' => 'brukernavn',
'password_placeholder' => 'passord',
'forgot_password' => 'Glemt passordet ditt?',
'enter_email' => 'Din e-postadresse',
'enter_login' => 'Ditt brukernavn',
'email_placeholder' => 'e-postadresse',
'enter_new_password' => 'Skriv inn nytt passord',
'password_reset' => 'Gjenopprett passord',
'restore_success' => 'En e-post har blitt sendt til din e-postadresse med informasjon om gjenoppretting av passord.',
'restore_error' => "Brukernavnet ':login' eksisterer ikke.",
'reset_success' => 'Ditt passord har blitt gjenopprettet. Du kan nå logge inn.',
'reset_error' => 'Ugyldig data. Vennligst prøv igjen!',
'reset_fail' => 'Kunne ikke gjenopprette passord!',
'apply' => 'Fortsett',
'cancel' => 'Avbryt',
'delete' => 'Slett',
'ok' => 'OK'
],
'dashboard' => [
'menu_label' => 'Dashboard',
'widget_label' => 'Widget',
'widget_width' => 'Bredde',
'full_width' => 'full bredde',
'add_widget' => 'Legg til widget',
'widget_inspector_title' => 'Widget-konfigurasjon',
'widget_inspector_description' => 'Konfigurer widgeten',
'widget_columns_label' => 'Bredde :columns',
'widget_columns_description' => 'Bredden på widgeten. Tall mellom 1 og 10.',
'widget_columns_error' => 'Vennligst spesifiser bredden på weidgeten som et tall mellom 1 og 10.',
'columns' => '{1} kolonne|[2,Inf] kolonner',
'widget_new_row_label' => 'Tving ny rad',
'widget_new_row_description' => 'Plasserer widgeten i en ny rad.',
'widget_title_label' => 'Widget-tittel',
'widget_title_error' => 'Tittel er obligatorisk.',
'status' => [
'widget_title_default' => 'Systemstatus',
'online' => 'online',
'maintenance' => 'in maintenance',
'update_available' => '{0} oppdateringer tilgjengelig!|{1} oppdatering tilgjengelig!|[2,Inf] oppdateringer tilgjengelig!'
]
],
'user' => [
'name' => 'Administrator',
'menu_label' => 'Administratorer',
'menu_description' => 'Håndter backend-administratorer, grupper og tilganger.',
'list_title' => 'Håndter administratorer',
'new' => 'Ny administrator',
'login' => 'Brukernavn',
'first_name' => 'Fornavn',
'last_name' => 'Etternavn',
'full_name' => 'Fult navn',
'email' => 'E-postadresse',
'groups' => 'Grupper',
'groups_comment' => 'Spesifiser hvilke grupper personen tilhører.',
'avatar' => 'Avatar',
'password' => 'Passord',
'password_confirmation' => 'Bekreft passord',
'permissions' => 'Tilganger',
'superuser' => 'Superbruker',
'superuser_comment' => 'Kryss av denne boksen for å gi personen tilgang til alle områder.',
'send_invite' => 'Send invitasjon via e-post',
'send_invite_comment' => 'Kryss av denne boksen for å sende personen en invitasjon via e-post',
'delete_confirm' => 'Vil du virkelig slette denne administratoren?',
'return' => 'Tilbake til administratoroversikten',
'allow' => 'Tillat',
'inherit' => 'Arv',
'deny' => 'Nekt',
'group' => [
'name' => 'Gruppe',
'name_field' => 'Navn',
'description_field' => 'Beskrivelse',
'is_new_user_default_field' => 'Legg til nye administratorer til denne gruppen automatisk',
'code_field' => 'Kode',
'code_comment' => 'Fyll inn en unik kode for å bruke API-en.',
'menu_label' => 'Grupper',
'list_title' => 'Håndter grupper',
'new' => 'New Administrator Group',
'delete_confirm' => 'Vil du virkelig slette denne administratorgruppen?',
'return' => 'Tilbake til gruppeoversikten',
],
'preferences' => [
'not_authenticated' => 'Det er ingen autentiserte brukere å laste eller lagre innstillinger for.'
]
],
'list' => [
'default_title' => 'Liste',
'search_prompt' => 'Søk...',
'no_records' => 'Det er ingen treff i denne visningen.',
'missing_model' => 'List-egenskapen brukt i :class mangler en modelldefinisjon.',
'missing_column' => 'Det er ingen kolonnedefinisjoner for :columns.',
'missing_columns' => 'List brukt i :class har ingen definerte kolonner.',
'missing_definition' => "List-egenskapen inneholder ingen kolonner for ':field'.",
'behavior_not_ready' => 'List-egenskapen har ikke blir initialisert, sjekk at du har kalt makeList() i kontrolleren.',
'invalid_column_datetime' => "Kolonneverdien ':column' er ikke et DateTime-objekt, mangler du en \$dates referanse i modellen?",
'pagination' => 'Viser rader: :from-:to av :total',
'prev_page' => 'Forrige side',
'next_page' => 'Neste side',
'loading' => 'Laster...',
'setup_title' => 'Listeinnstillinger',
'setup_help' => 'Kryss av sjekkboksene for å velge hvilke kolonner du vil ha i listen. Du kan sortere kolonnene ved å dra sjekkboksene opp eller ned.',
'records_per_page' => 'Rader per side',
'records_per_page_help' => 'Velg antall rader som skal vises på hver side. Vær oppmerksom på at et høyt antall kan redusere ytelsen på siden.',
'delete_selected' => 'Slett valgte',
'delete_selected_empty' => 'Det er ingen valgte rader å slette.',
'delete_selected_confirm' => 'Vil du slette valgte rader?',
'delete_selected_success' => 'Rader har blitt slettet.',
],
'fileupload' => [
'attachment' => 'Vedlegg',
'help' => 'Legg til tittel og beskrivelse for dette vedlegget.',
'title_label' => 'Tittel',
'description_label' => 'Beskrivelse'
],
'form' => [
'create_title' => 'Ny :name',
'update_title' => 'Endre :name',
'preview_title' => 'Forhåndsvis :name',
'create_success' => ':name har blitt opprettet',
'update_success' => ':name har blitt endret',
'delete_success' => ':name har blitt slettet',
'missing_id' => 'Record ID for skjemaet har ikke blitt spesifisert.',
'missing_model' => 'Skjemaegenskapen brukt i :class mangler en modell.',
'missing_definition' => "Skjemaegenskapen mangler et felt for ':field'.",
'not_found' => 'Record ID :id ble ikke funnet.',
'action_confirm' => 'Er du sikker?',
'create' => 'Opprett',
'create_and_close' => 'Opprett og lukk',
'creating' => 'Oppretter...',
'creating_name' => 'Oppretter :name...',
'save' => 'Lagre',
'save_and_close' => 'Lagre og lukk',
'saving' => 'Lagrer...',
'saving_name' => 'Lagrer :name...',
'delete' => 'Slett',
'deleting' => 'Sletter...',
'deleting_name' => 'Sletter :name...',
'reset_default' => 'Tilbakestill',
'resetting' => 'Tilbakestiller',
'resetting_name' => 'Tilbakestiller :name',
'undefined_tab' => 'Div.',
'field_off' => 'Av',
'field_on' => 'På',
'add' => 'Legg til',
'apply' => 'Fortsett',
'cancel' => 'Avbryt',
'close' => 'Lukk',
'confirm' => 'Bekreft',
'reload' => 'Oppdater',
'ok' => 'OK',
'or' => 'eller',
'confirm_tab_close' => 'Vil du virkelig lukke fanen? Endringer som ikke er lagret vil gå tapt.',
'behavior_not_ready' => 'Skjemaegenskap har ikke blitt initialisert, sjekk at du har kalt initForm() i kontrolleren.',
'preview_no_files_message' => 'Filer er ikke opplastet',
'select' => 'Velg',
'select_all' => 'alle',
'select_none' => 'ingen',
'select_placeholder' => 'velg',
'insert_row' => 'Sett inn rad',
'delete_row' => 'Slett rad',
'concurrency_file_changed_title' => 'Fil endret',
'concurrency_file_changed_description' => "The file you're editing has been changed on disk by another user. You can either reload the file and lose your changes or override the file on the disk.",
'concurrency_file_changed_description' => "Filen du endrer på har blitt endret på disken av en annen bruker. Du kan enten oppdatere filen og tape endret data eller overskrive filen på disken.",
],
'relation' => [
'missing_config' => "Relasjonen mangler en konfigurasjon for ':config'.",
'missing_definition' => "Relasjonen mangler en definisjon for ':field'.",
'missing_model' => "Relasjonen brukt i :class har ingen definert modell.",
'invalid_action_single' => "Denne handlingen kan ikke brukes på en enkel relasjon.",
'invalid_action_multi' => "Denne relasjonen kan ikke brukes på fler-relasjoner.",
'help' => "Klikk på et element for å legge til",
'related_data' => "Relatert :name data",
'add' => "Legg til",
'add_selected' => "Legg til valgte",
'add_a_new' => "Legg til ny :name",
'link_selected' => "Link valgte",
'link_a_new' => "Link en ny :name",
'cancel' => "Avbryt",
'close' => "Lukk",
'add_name' => "Legg til :name",
'create' => "Opprett",
'create_name' => "Opprett :name",
'update' => "Oppdater",
'update_name' => "Oppdater :name",
'preview' => "Forhåndsvis",
'preview_name' => "Forhåndsvis :name",
'remove' => "Fjern",
'remove_name' => "Fjern :name",
'delete' => "Slett",
'delete_name' => "Slett :name",
'delete_confirm' => "Er du sikker?",
'link' => "Link",
'link_name' => "Link :name",
'unlink' => "Fjern link",
'unlink_name' => "Fjern link :name",
'unlink_confirm' => "Er du sikker?",
],
'model' => [
'name' => 'Modell',
'not_found' => "Modellen ':class' med ID-en :id ble ikke funnet",
'missing_id' => 'Det er ingen ID spesifisert for å se opp modellen.',
'missing_relation' => "Modellen ':class' mangler en definisjon for ':relation'.",
'missing_method' => "Modellen ':class' mangler metoden ':method'.",
'invalid_class' => "Modellen :model som brukes i :class er ugyldig, den må arve \Model-klassen.",
'mass_assignment_failed' => "Mass assignment feilet for modell-attributten ':attribute'."
],
'warnings' => [
'tips' => 'Tips for systemkonfigurasjon',
'tips_description' => 'Det er problemer du må være oppmerksom på for å konfigurere systemet riktig.',
'permissions' => 'Mappen :name eller dens undermapper kan ikke skrives på av PHP. Vennligst sjekk skrivetilganger på serveren.',
'extension' => 'PHP-extensionen :name er ikke installert..'
],
'editor' => [
'menu_label' => 'Teksteditor-innstillinger',
'menu_description' => 'Endre teksteditor-innstillingene dine, for eksemplem tekststørrelse og fargevalg.',
'font_size' => 'Tekststørrelse',
'tab_size' => 'Tab-størrelse',
'use_hard_tabs' => 'Inntrykk med tabs',
'code_folding' => 'Code folding',
'word_wrap' => 'Word wrap',
'highlight_active_line' => 'Fremhev aktiv linje',
'show_invisibles' => 'Vis usynlige tegn',
'show_gutter' => 'Vis linjenummer',
'theme' => 'Fargevalg'
],
'tooltips' => [
'preview_website' => 'Forhåndsvis nettsiden'
],
'mysettings' => [
'menu_label' => 'Mine innstillinger',
'menu_description' => 'Innstillinger relatert til din administratorkonto'
],
'myaccount' => [
'menu_label' => 'Min konto',
'menu_description' => 'Oppdater dine kontodetaljer, som navn, e-postadresse og passord.',
'menu_keywords' => 'sikkerhetsinnlogging'
],
'branding' => [
'menu_label' => 'Tilpass backend',
'menu_description' => 'Tilpass administratorområdet, for eksempel navn, farger og logo.',
'brand' => 'Merkevare',
'logo' => 'Logo',
'logo_description' => 'Last opp logo for å bruke backend.',
'app_name' => 'App-navn',
'app_name_description' => 'Dette navnet vises i tittelområdet backend.',
'app_tagline' => 'App Tagline',
'app_tagline_description' => 'Denne teksten vises på innloggingssiden backend.',
'colors' => 'Farger',
'primary_light' => 'Primær (Lys)',
'primary_dark' => 'Primær (Mørk)',
'secondary_light' => 'Sekundær (Lys)',
'secondary_dark' => 'Sekundær (Mørk)',
'styles' => 'Stilsett',
'custom_stylesheet' => 'Eget stilsett'
],
'backend_preferences' => [
'menu_label' => 'Backend-innstillinger',
'menu_description' => 'Håndter kontoinnstillinger som for eksempel språk.',
'menu_description' => 'Manage your account preferences such as desired language.',
'locale' => 'Språk',
'locale_comment' => 'Velg ditt ønsket språk.'
],
'access_log' => [
'hint' => 'Denne loggen viser en liste over vellykkede administratorinnlogginger. Innloggingene blir lagret i 60 dager.',
'menu_label' => 'Aksesslogg',
'menu_description' => 'Se en liste over vellykkede innlogginger på backend.',
'created_at' => 'Tid',
'login' => 'Brukernavn',
'ip_address' => 'IP-adresse',
'first_name' => 'Fornavn',
'last_name' => 'Etternavn',
'email' => 'E-postadresse'
],
'filter' => [
'all' => 'alle'
]
];

View File

@ -2,26 +2,26 @@
return [
'auth' => [
'title' => 'Área de Administração'
'title' => 'Área Administrativa',
],
'field' => [
'invalid_type' => 'Tipo de campo inválido utilizado :type.',
'options_method_not_exists' => 'A classe do modelo :model deve definir um método :method() retornando opções pro campo ":field".',
'invalid_type' => 'Tipo de campo inválido :type.',
'options_method_not_exists' => 'A classe :model deve definir um método :method() retornando opções para o campo ":field".',
],
'widget' => [
'not_registered' => "Uma classe de widget com o nome ':name' não foi definida",
'not_bound' => "Um widget cuja classe se chama ':name' não foi indexado ao controlador",
'not_registered' => 'Uma classe de widget com o nome ":name" não foi definida',
'not_bound' => 'Um widget da classe ":name" não foi ligado ao controlador',
],
'page' => [
'untitled' => "Sem Título",
'untitled' => 'Sem Título',
'access_denied' => [
'label' => "Acesso negado",
'help' => "Você não tem as permissões necessárias para visualizar esta página.",
'cms_link' => "Voltar à área de administração",
'label' => 'Acesso negado',
'help' => 'Você não tem as permissões necessárias para visualizar esta página.',
'cms_link' => 'Retornar à área administrativa',
],
],
'partial' => [
'not_found_name' => "O bloco ':name' não foi encontrado.",
'not_found_name' => 'O bloco ":name" não foi encontrado.',
],
'account' => [
'sign_out' => 'Sair',
@ -30,31 +30,31 @@ return [
'restore' => 'Restaurar',
'login_placeholder' => 'usuário',
'password_placeholder' => 'senha',
'forgot_password' => "Esqueceu sua senha?",
'enter_email' => "Digite seu email",
'enter_login' => "Digite seu nome de usuário",
'email_placeholder' => "e-mail",
'enter_new_password' => "Digite uma nova senha",
'password_reset' => "Redefinir sua senha",
'restore_success' => "Um email com instruções para redfinir sua senha foram enviados para o seu email.",
'restore_error' => "O usuário ':login' não foi encontrado",
'reset_success' => "Sua senha foi redefinida com sucesso. Você já pode fazer o login.",
'reset_error' => "Erro ao redefinir sua senha. Por favor, tente de novo.",
'reset_fail' => "Falha ao redefinir sua senha!",
'forgot_password' => 'Esqueceu sua senha?',
'enter_email' => 'Digite seu email',
'enter_login' => 'Digite seu nome de usuário',
'email_placeholder' => 'e-mail',
'enter_new_password' => 'Digite uma nova senha',
'password_reset' => 'Redefinir sua senha',
'restore_success' => 'Um email com instruções para redfinir sua senha foram enviados para o seu email.',
'restore_error' => 'O usuário ":login" não foi encontrado',
'reset_success' => 'Sua senha foi redefinida com sucesso. Você já pode entrar novamente.',
'reset_error' => 'A senha redefinida é inválida. Por favor, tente de novo!',
'reset_fail' => 'Falha ao redefinir sua senha!',
'apply' => 'Aplicar',
'cancel' => 'Cancelar',
'delete' => 'Excluir',
'ok' => 'OK',
'ok' => 'Ok',
],
'dashboard' => [
'menu_label' => 'Painel',
'widget_label' => 'Widget',
'widget_width' => 'Largura',
'full_width' => 'Largura completa',
'full_width' => 'Largura total',
'add_widget' => 'Adicionar widget',
'widget_inspector_title' => 'Configurações do widget',
'widget_inspector_description' => 'Relatório de configurações do widget',
'widget_columns_label' => 'Largura de :columns',
'widget_inspector_description' => 'Configurar widget de relatório',
'widget_columns_label' => 'Largura :columns',
'widget_columns_description' => 'Largura do widget, um número entre 1 e 10.',
'widget_columns_error' => 'Por favor, entre com a largura do widget. Deve ser um número entre 1 e 10.',
'columns' => '{1} coluna|[2,Inf] colunas',
@ -63,11 +63,11 @@ return [
'widget_title_label' => 'Título do widget',
'widget_title_error' => 'O título do widget é necessário.',
'status' => [
'widget_title_default' => 'Condição do Sistema',
'widget_title_default' => 'Status do Sistema',
'online' => 'online',
'maintenance' => 'em manutenção',
'update_available' => '{0} atualizações disponíveis!|{1} atualização disponível!|[2,Inf] atualizações disponíveis!',
]
],
],
'user' => [
'name' => 'Administrador',
@ -75,22 +75,22 @@ return [
'menu_description' => 'Gerenciar administradores, grupos e permissões.',
'list_title' => 'Gerenciar administradores',
'new' => 'Novo administrador',
'login' => "Usuário",
'first_name' => "Nome",
'last_name' => "Sobrenome",
'full_name' => "Nome Completo",
'email' => "E-mail",
'groups' => "Grupos",
'groups_comment' => "Defina a quais grupos essa pessoa pertence.",
'avatar' => "Foto",
'password' => "Senha",
'password_confirmation' => "Confirme a senha",
'login' => 'Usuário',
'first_name' => 'Nome',
'last_name' => 'Sobrenome',
'full_name' => 'Nome Completo',
'email' => 'E-mail',
'groups' => 'Grupos',
'groups_comment' => 'Defina a quais grupos essa pessoa pertence.',
'avatar' => 'Foto',
'password' => 'Senha',
'password_confirmation' => 'Confirme a senha',
'permissions' => 'Permissões',
'superuser' => "Super Usuário",
'superuser_comment' => "Marque essa caixa para liberar o acesso completo para este usuário.",
'superuser' => 'Super Usuário',
'superuser_comment' => 'Marque para liberar o acesso irrestrito para este usuário.',
'send_invite' => 'Enviar convite por e-mail',
'send_invite_comment' => 'Marque esta caixa para enviar um convite por e-mail',
'delete_confirm' => 'Você realmente quer apagar este administrador?',
'send_invite_comment' => 'Marque para enviar um convite por e-mail',
'delete_confirm' => 'Você realmente deseja apagar este administrador?',
'return' => 'Retornar à lista de administradores',
'allow' => 'Permitir',
'inherit' => 'Herdar',
@ -99,58 +99,58 @@ return [
'name' => 'Grupo',
'name_field' => 'Nome',
'description_field' => 'Descrição',
'is_new_user_default_field' => 'Adicionar novos administradores para este grupo por padrão',
'is_new_user_default_field' => 'Adicionar novos administradores a este grupo por padrão',
'code_field' => 'Código',
'code_comment' => 'Insira um código único, se você quiser acessá-lo com a API.',
'code_comment' => 'Insira um código exclusivo se você quiser acessá-lo com a API.',
'menu_label' => 'Grupos',
'list_title' => 'Gerenciar grupos',
'new' => 'Novo grupo administrador',
'delete_confirm' => 'Você realmente deseja excluir este grupo de administradores?',
'return' => 'Voltar para a lista de grupos de administradores',
'delete_confirm' => 'Você realmente deseja excluir este grupo?',
'return' => 'Voltar para a lista de grupos',
],
'preferences' => [
'not_authenticated' => 'Nenhum usuário autenticado pra carregar as preferências.'
]
'not_authenticated' => 'Nenhum usuário autenticado para carregar as preferências.',
],
],
'list' => [
'default_title' => 'Lista',
'search_prompt' => 'Buscar...',
'no_records' => 'Nenhum registro encontrado.',
'missing_model' => 'Lista usado em :class não tem um modelo definido.',
'missing_model' => 'Lista usada em :class não tem um model definido.',
'missing_column' => 'Não existe definição de coluna para :columns.',
'missing_columns' => 'Lista utilizada em :class não possui colunas de lista definidas.',
'missing_definition' => "Lista não possui uma coluna para o campo ':field'.",
'behavior_not_ready' => 'Lista não foi inicializada. Confira se você chamou makeLists() no seu controlador.',
'invalid_column_datetime' => "Valor da coluna ':column' não é um objeto DateTime, você esqueceu da referência de \$dates no modelo?",
'missing_definition' => 'Lista não possui uma coluna para ":field".',
'behavior_not_ready' => 'Lista não foi inicializada. Confira se você chamou makeLists() no controller.',
'invalid_column_datetime' => 'Valor da coluna ":column" não é um objeto DateTime, você esqueceu registrar \$dates no Model?',
'pagination' => 'Registros exibidos: :from-:to de :total',
'prev_page' => 'Anterior',
'next_page' => 'Próxima',
'loading' => 'Carregando...',
'setup_title' => 'Configuração da Lista',
'setup_help' => 'Utilize as caixas para selecionar as colunas que deseja ver na lista. Você pode alterar as posições das colunas arrastando-as para cima ou para baixo.',
'setup_help' => 'Selecione as colunas que deseja ver na lista. Você pode alterar as posições das colunas arrastando-as para cima ou para baixo.',
'records_per_page' => 'Registros por página',
'records_per_page_help' => 'Selecione o número de registros por página a serem exibidos. Mas, atenção! Números elevados podem prejudicar a performance do sistema.',
'records_per_page_help' => 'Selecione o número de registros a serem exibidos por página. Note que um número grande pode prejudicar a performance.',
'delete_selected' => 'Deletar selecionado',
'delete_selected_empty' => 'Não há registros selecionados para excluir.',
'delete_selected_confirm' => 'Excluir os registros selecionados?',
'delete_selected_success' => 'Registros selecionados excluidos com sucesso.',
'delete_selected_success' => 'Registros selecionados excluídos com sucesso.',
],
'fileupload' => [
'attachment' => 'Anexo',
'help' => 'Adicione um título e descrição a este anexo.',
'title_label' => 'Título',
'description_label' => 'Descrição'
'description_label' => 'Descrição',
],
'form' => [
'create_title' => "Novo :name",
'update_title' => "Editar :name",
'preview_title' => "Visualizar :name",
'create_title' => 'Novo :name',
'update_title' => 'Editar :name',
'preview_title' => 'Visualizar :name',
'create_success' => ':name foi criado com sucesso',
'update_success' => ':name foi atualizado com sucesso',
'delete_success' => ':name foi apagado com sucesso',
'missing_id' => "ID do registro não especificado",
'missing_model' => 'Formulário utilizado na classe :class não tem um modelo definido.',
'missing_definition' => "Formulário não contém um campo ':field'.",
'missing_id' => 'O ID do registro não foi fornecido',
'missing_model' => 'Formulário utilizado na classe :class não tem um model definido.',
'missing_definition' => 'Formulário não contém um campo ":field".',
'not_found' => 'Nenhum registro encontrado com o ID :id',
'action_confirm' => 'Você tem certeza?',
'create' => 'Criar',
@ -179,7 +179,7 @@ return [
'ok' => 'Ok',
'or' => 'ou',
'confirm_tab_close' => 'Tem certeza que deseja fechar essa aba? As alterações que não foram salvas serão perdidas',
'behavior_not_ready' => 'O formulário não foi inicializado. Confira se você chamou initForm() no seu controlador.',
'behavior_not_ready' => 'O formulário não foi inicializado. Confira se você chamou initForm() no controller.',
'preview_no_files_message' => 'Os arquivos não foram carregados',
'select' => 'Selecionar',
'select_all' => 'todos',
@ -188,55 +188,55 @@ return [
'insert_row' => 'Inserir linha',
'delete_row' => 'Excluir linha',
'concurrency_file_changed_title' => 'O arquivo foi alterado',
'concurrency_file_changed_description' => "O arquivo que você está editando foi alterado por outro usuário. Você pode recarregar o arquivo e perder suas alterações ou substituir o arquivo."
'concurrency_file_changed_description' => 'O arquivo que você está editando foi alterado em disco. Você pode recarregá-lo e perder suas alterações ou sobrescrever o arquivo do disco.',
],
'relation' => [
'missing_config' => "Comportamento de relação não tem qualquer configuração ':config'.",
'missing_definition' => "Relacionamento não contém uma definição para ':field'.",
'missing_model' => "Relacionamento utilizado na classe :class não possui um modelo definido.",
'invalid_action_single' => "Essa ação não pode ser realizada num relacionamento singular.",
'invalid_action_multi' => "Essa ação não pode ser realizada num relacionamento múltiplo.",
'help' => "Clique em um item para adicionar",
'related_data' => "Dados do :name relacionados",
'add' => "Adicionar",
'add_selected' => "Adicionar seleção",
'add_a_new' => "Adicionar um(a) novo(a) :name",
'link_selected' => "Vincular selecionado",
'link_a_new' => "Vincular um novo :name",
'cancel' => "Cancelar",
'close' => "Fechar",
'add_name' => "Adicionar :name",
'create' => "Criar",
'create_name' => "Criar :name",
'update' => "Atualizar",
'update_name' => "Atualizar :name",
'preview' => "Visualizar",
'preview_name' => "Visualizar :name",
'remove' => "Remover",
'remove_name' => "Remover :name",
'delete' => "Excluir",
'delete_name' => "Excluir :name",
'delete_confirm' => "Você tem certeza?",
'link' => "Vincular",
'link_name' => "Vincular :name",
'unlink' => "Desvincular",
'unlink_name' => "Desvincular :name",
'unlink_confirm' => "Você tem certeza?",
'missing_config' => 'Comportamento relation não tem uma configuração para ":config".',
'missing_definition' => 'Comportamento relation não contém uma definição para ":field".',
'missing_model' => 'Comportamento relation utilizado na classe :class não possui um model definido.',
'invalid_action_single' => 'Essa ação não pode ser realizada num relacionamento singular.',
'invalid_action_multi' => 'Essa ação não pode ser realizada num relacionamento múltiplo.',
'help' => 'Clique em um item para adicionar',
'related_data' => 'Dados de :name relacionado',
'add' => 'Adicionar',
'add_selected' => 'Adicionar seleção',
'add_a_new' => 'Adicionar um(a) novo(a) :name',
'link_selected' => 'Vincular selecionado',
'link_a_new' => 'Vincular um novo :name',
'cancel' => 'Cancelar',
'close' => 'Fechar',
'add_name' => 'Adicionar :name',
'create' => 'Criar',
'create_name' => 'Criar :name',
'update' => 'Atualizar',
'update_name' => 'Atualizar :name',
'preview' => 'Visualizar',
'preview_name' => 'Visualizar :name',
'remove' => 'Remover',
'remove_name' => 'Remover :name',
'delete' => 'Excluir',
'delete_name' => 'Excluir :name',
'delete_confirm' => 'Você tem certeza?',
'link' => 'Vincular',
'link_name' => 'Vincular :name',
'unlink' => 'Desvincular',
'unlink_name' => 'Desvincular :name',
'unlink_confirm' => 'Você tem certeza?',
],
'model' => [
'name' => "Modelo",
'not_found' => "Modelo ':class' com ID :id não foi encontrado",
'missing_id' => "ID do registro não especificado.",
'missing_relation' => "Modelo ':class' não contém uma definição para o relacionamento ':relation'.",
'missing_method' => "Modelo ':class' não contém o método ':method'.",
'invalid_class' => "Modelo :model utilizado na classe :class não é válido. É necessário herdar a classe \Model.",
'mass_assignment_failed' => "Mass assignment failed for Model attribute ':attribute'.",
'name' => 'Model',
'not_found' => 'Model ":class" com ID :id não foi encontrado',
'missing_id' => 'ID do registro não especificado.',
'missing_relation' => 'Model ":class" não contém uma definição para o relacionamento ":relation".',
'missing_method' => 'Model ":class" não contém o método ":method".',
'invalid_class' => 'Model :model utilizado na classe :class não é válido. É necessário herdar a classe \Model.',
'mass_assignment_failed' => 'Falha na atribuição em massa do atributo ":attribute" do Model.',
],
'warnings' => [
'tips' => 'Dicas de configuração do sistema',
'tips_description' => 'Há questões que você precisa prestar atenção, a fim de configurar o sistema corretamente.',
'permissions' => 'Diretório :name ou em seus subdiretórios não é gravável para o PHP. Por favor, defina permissões para o servidor neste diretório correspondente.',
'extension' => 'A extenção PHP :name não está instalada. Por favor, instale esta biblioteca para ativar a extensão.'
'tips_description' => 'Há itens que demandam atenção para configurar o sistema corretamente.',
'permissions' => 'Diretório :name ou seus subdiretórios não são graváveis pelo PHP. Por favor, defina permissões de escrita para o servidor neste diretório.',
'extension' => 'A extensão PHP :name não está instalada. Por favor, instale esta biblioteca para ativar a extensão.',
],
'editor' => [
'menu_label' => 'Definições do Editor',
@ -260,30 +260,30 @@ return [
],
'myaccount' => [
'menu_label' => 'Minha Conta',
'menu_description' => 'Atualize os detalhes da sua conta, como nome, endereço de e-mail e senha.',
'menu_description' => 'Atualizar detalhes da sua conta, como nome, e-mail e senha.',
'menu_keywords' => 'login de segurança'
],
'branding' => [
'menu_label' => 'Personalize back-end',
'menu_description' => 'Personalize a área de administração, tais como nome, cores e logo.',
'menu_label' => 'Personalização',
'menu_description' => 'Personalizar detalhes da área administrativa, tais como título, cores e logo.',
'brand' => 'Marca',
'logo' => 'Logo',
'logo_description' => 'Fazer upload de um logo personalizada para usar no back-end.',
'logo_description' => 'Fazer upload de uma logo para usar na área administrativa.',
'app_name' => 'Nome do Aplicativo',
'app_name_description' => 'Este nome é mostrado no título da área no back-end.',
'app_name_description' => 'Este nome é mostrado no título da área administrativa.',
'app_tagline' => 'Slogan do Aplicativo',
'app_tagline_description' => 'Esta frase é mostrada na tela de login do back-end.',
'app_tagline_description' => 'Esta frase é mostrada na tela de login administrativo.',
'colors' => 'Cores',
'primary_light' => 'Primária (Clara)',
'primary_dark' => 'Primária (Escura)',
'secondary_light' => 'Secundária (Clara)',
'secondary_dark' => 'Secundária (Escura)',
'styles' => 'Estilos',
'custom_stylesheet' => 'Personalização do estilo CSS'
'custom_stylesheet' => 'CSS customizado',
],
'backend_preferences' => [
'menu_label' => 'Preferências da Administração',
'menu_description' => 'Gerencie as preferências de idiomas e aparência da administração.',
'menu_description' => 'Gerenciar idiomas e aparência da administração.',
'locale' => 'Idioma',
'locale_comment' => 'Selecione o idioma de sua preferência.',
],
@ -294,11 +294,11 @@ return [
'created_at' => 'Data & Hora',
'login' => 'Login',
'ip_address' => 'Endereço IP',
'first_name' => 'Primeiro Nome',
'first_name' => 'Nome',
'last_name' => 'Sobrenome',
'email' => 'E-mail',
],
'filter' => [
'all' => 'todos'
]
'all' => 'todos',
],
];

View File

@ -56,6 +56,8 @@ class BackendPreferences extends Model
'tr' => [Lang::get('system::lang.locale.tr'), 'flag-tr'],
'pl' => [Lang::get('system::lang.locale.pl'), 'flag-pl'],
'sk' => [Lang::get('system::lang.locale.sk'), 'flag-sk'],
'zh-cn' => [Lang::get('system::lang.locale.zh-cn'), 'flag-cn'],
'nb-no' => [Lang::get('system::lang.locale.nb-no'), 'flag-no'],
];
// Sort locales alphabetically

View File

@ -76,17 +76,23 @@ class User extends UserBase
/**
* Returns the public image file path to this user's avatar.
*/
public function getAvatarThumb($size = 25, $default = null)
public function getAvatarThumb($size = 25, $options = null)
{
if (!$default) {
$default = 'mm'; // Mystery man
if (is_string($options)) {
$options = ['default' => $options];
}
elseif (!is_array($options)) {
$options = [];
}
// Default is "mm" (Mystery man)
$default = array_get($options, 'default', 'mm');
if ($this->avatar) {
return $this->avatar->getThumb($size, $size);
return $this->avatar->getThumb($size, $size, $options);
}
else {
return '//www.gravatar.com/avatar/'.
return '//www.gravatar.com/avatar/' .
md5(strtolower(trim($this->email))) .
'?s='. $size .
'&d='. urlencode($default);

View File

@ -361,25 +361,6 @@ class Lists extends WidgetBase
$joins[] = $column->relation;
}
/*
* Include any relation constraints
*/
if ($joins) {
foreach (array_unique($joins) as $join) {
/*
* Apply a supplied search term for relation columns and
* constrain the query only if there is something to search for
*/
$columnsToSearch = array_get($relationSearchable, $join, []);
if (count($columnsToSearch) > 0) {
$query->whereHas($join, function ($_query) use ($columnsToSearch) {
$_query->searchWhere($this->searchTerm, $columnsToSearch);
});
}
}
}
/*
* Add eager loads to the query
*/
@ -387,6 +368,39 @@ class Lists extends WidgetBase
$query->with(array_unique($withs));
}
/*
* Apply search term
*/
$query->where(function ($innerQuery) use ($primarySearchable, $relationSearchable, $joins) {
/*
* Search primary columns
*/
if (count($primarySearchable) > 0) {
$innerQuery->orSearchWhere($this->searchTerm, $primarySearchable);
}
/*
* Search relation columns
*/
if ($joins) {
foreach (array_unique($joins) as $join) {
/*
* Apply a supplied search term for relation columns and
* constrain the query only if there is something to search for
*/
$columnsToSearch = array_get($relationSearchable, $join, []);
if (count($columnsToSearch) > 0) {
$innerQuery->orWhereHas($join, function ($_query) use ($columnsToSearch) {
$_query->searchWhere($this->searchTerm, $columnsToSearch);
});
}
}
}
});
/*
* Custom select queries
*/
@ -428,15 +442,6 @@ class Lists extends WidgetBase
}
}
/*
* Apply a supplied search term for primary columns
*/
if (count($primarySearchable) > 0) {
$query->where(function ($innerQuery) use ($primarySearchable) {
$innerQuery->searchWhere($this->searchTerm, $primarySearchable);
});
}
/*
* Apply sorting
*/

View File

@ -13,6 +13,7 @@
this.options = options || {};
this.bindDependants()
this.bindCheckboxlist()
this.toggleEmptyTabs()
}
@ -20,6 +21,28 @@
refreshHandler: null
}
/*
* Logic for checkboxlist
*/
FormWidget.prototype.bindCheckboxlist = function() {
var checkAllBoxes = function($field, flag) {
$('input[type=checkbox]', $field)
.prop('checked', flag)
.first()
.trigger('change')
}
this.$el.on('click', '[data-field-checkboxlist-all]', function() {
checkAllBoxes($(this).closest('.field-checkboxlist'), true)
})
this.$el.on('click', '[data-field-checkboxlist-none]', function() {
checkAllBoxes($(this).closest('.field-checkboxlist'), false)
})
}
/*
* Bind dependant fields
*/

View File

@ -40,12 +40,12 @@
<!-- Quick selection -->
<small>
<?= e(trans('backend::lang.form.select')) ?>:
<a href="javascript:;" onclick="jQuery('#<?= $field->getId('scrollable') ?> input[type=checkbox]').prop('checked', true)"><?= e(trans('backend::lang.form.select_all')) ?></a>,
<a href="javascript:;" onclick="jQuery('#<?= $field->getId('scrollable') ?> input[type=checkbox]').prop('checked', false)"><?= e(trans('backend::lang.form.select_none')) ?></a>
<a href="javascript:;" data-field-checkboxlist-all><?= e(trans('backend::lang.form.select_all')) ?></a>,
<a href="javascript:;" data-field-checkboxlist-none><?= e(trans('backend::lang.form.select_none')) ?></a>
</small>
<!-- Scrollable Checkbox list -->
<div class="field-checkboxlist-scrollable" id="<?= $field->getId('scrollable') ?>">
<div class="field-checkboxlist-scrollable">
<div class="control-scrollbar" data-control="scrollbar">
<?php endif ?>
@ -93,4 +93,4 @@
<p><?= e(trans($field->placeholder)) ?></p>
<?php endif ?>
<?php endif ?>
<?php endif ?>

View File

@ -1,6 +1,6 @@
<?= Form::open([
'data-request' => $this->getEventHandler('onAddWidget'),
'data-request-success' => "\$el.trigger('close.oc.popup'); \$(window).trigger('oc.report-widget-added')",
'data-request-success' => "\$(this).trigger('close.oc.popup'); \$(window).trigger('oc.report-widget-added')",
'data-popup-load-indicator' => 1
]) ?>
<div class="modal-header">

View File

@ -145,7 +145,7 @@ class ServiceProvider extends ModuleServiceProvider
'icon' => 'icon-picture-o',
'url' => Backend::URL('cms/themes'),
'permissions' => ['system.manage_themes'],
'order' => 200
'order' => 300
],
'maintenance_settings' => [
'label' => 'cms::lang.maintenance.settings_menu',

View File

@ -362,13 +362,13 @@ class CmsCompoundObject extends CmsObject
$objectComponentMap[$objectCode] = [];
}
else {
foreach ($this->settings['components'] as $componentName => $componentSettings) {
$nameParts = explode(' ', $componentName);
foreach ($this->settings['components'] as $name => $settings) {
$nameParts = explode(' ', $name);
if (count($nameParts > 1)) {
$componentName = trim($nameParts[0]);
$name = trim($nameParts[0]);
}
$component = $this->getComponent($componentName);
$component = $this->getComponent($name);
if (!$component) {
continue;
}
@ -379,7 +379,7 @@ class CmsCompoundObject extends CmsObject
$componentProperties[$propertyName] = $component->property($propertyName);
}
$objectComponentMap[$objectCode][$componentName] = $componentProperties;
$objectComponentMap[$objectCode][$name] = $componentProperties;
}
}
@ -441,8 +441,9 @@ class CmsCompoundObject extends CmsObject
protected function fillViewBagArray()
{
$viewBag = $this->getViewBag();
foreach ($viewBag->getProperties() as $name=>$value)
foreach ($viewBag->getProperties() as $name => $value) {
$this->viewBag[$name] = $value;
}
}
/**

View File

@ -13,6 +13,6 @@
class="btn btn-default empty oc-icon-trash-o <?php if (!$templatePath): ?>hide<?php endif ?>"
data-request="onDelete"
data-request-confirm="<?= e(trans('cms::lang.content.delete_confirm_single')) ?>"
data-request-success="$.oc.cmsPage.updateTemplateList('content'); $(element).trigger('close.oc.tab', [{force: true}])"
data-request-success="$.oc.cmsPage.updateTemplateList('content'); $(this).trigger('close.oc.tab', [{force: true}])"
data-control="delete-button"></button>
</div>

View File

@ -13,6 +13,6 @@
class="btn btn-default empty oc-icon-trash-o <?php if (!$templatePath): ?>hide<?php endif ?>"
data-request="onDelete"
data-request-confirm="<?= e(trans('cms::lang.layout.delete_confirm_single')) ?>"
data-request-success="$.oc.cmsPage.updateTemplateList('layout'); $(element).trigger('close.oc.tab', [{force: true}])"
data-request-success="$.oc.cmsPage.updateTemplateList('layout'); $(this).trigger('close.oc.tab', [{force: true}])"
data-control="delete-button"></button>
</div>

View File

@ -24,6 +24,6 @@
class="btn btn-default empty oc-icon-trash-o <?php if (!$templatePath): ?>hide<?php endif ?>"
data-request="onDelete"
data-request-confirm="<?= e(trans('cms::lang.page.delete_confirm_single')) ?>"
data-request-success="$.oc.cmsPage.updateTemplateList('page'); $(element).trigger('close.oc.tab', [{force: true}])"
data-request-success="$.oc.cmsPage.updateTemplateList('page'); $(this).trigger('close.oc.tab', [{force: true}])"
data-control="delete-button"></button>
</div>

View File

@ -13,6 +13,6 @@
class="btn btn-default empty oc-icon-trash-o <?php if (!$templatePath): ?>hide<?php endif ?>"
data-request="onDelete"
data-request-confirm="<?= e(trans('cms::lang.partial.delete_confirm_single')) ?>"
data-request-success="$.oc.cmsPage.updateTemplateList('partial'); $(element).trigger('close.oc.tab', [{force: true}])"
data-request-success="$.oc.cmsPage.updateTemplateList('partial'); $(this).trigger('close.oc.tab', [{force: true}])"
data-control="delete-button"></button>
</div>

View File

@ -60,7 +60,7 @@ return [
'export_button' => 'Export',
'export_title' => 'Export theme',
'export_folders_label' => 'Folders',
'export_folders_comment' => 'Please select the theme folders you would like to import',
'export_folders_comment' => 'Please select the theme folders you would like to export',
'delete_button' => 'Delete',
'delete_confirm' => 'Are you sure you want to delete this theme? It cannot be undone!',
'delete_active_theme_failed' => 'Cannot delete the active theme, try making another theme active first.',

View File

@ -0,0 +1,232 @@
<?php
return [
'cms_object' => [
'invalid_file' => 'Ugyldig filnavn: :name. Filnavn kan kun inneholde alfanumeriske tegn, understrek, bindestrek og punktum. Eksempel: page.htm, page, subdirectory/page',
'invalid_property' => "Egenskapen ':name' kan ikke settes",
'file_already_exists' => "Filen ':name' eksisterer allerede.",
'error_saving' => "Kunne ikke lagre filen ':name'. Vennligst sjekk skriverettigheter på serveren.",
'error_creating_directory' => 'Kunne ikke opprette mappen :name. Vennligst sjekk skriverettigheter på serveren.',
'invalid_file_extension' => 'Ugyldig filtype: :invalid. Tillatte filtyper er: :allowed.',
'error_deleting' => "Kunne ikke slette filen ':name'. Vennligst sjekk skriverettigheter på serveren.",
'delete_success' => 'Templates som ble slettet: :count.',
'file_name_required' => 'Filnavnfeltet er obligatorisk.'
],
'theme' => [
'not_found_name' => "Tema ':name' ble ikke funnet.",
'active' => [
'not_set' => 'Aktivt tema er ikke valgt.',
'not_found' => 'Aktivt tema ikke funnet.'
],
'edit' => [
'not_set' => 'Redigeringstema er ikke valgt.',
'not_found' => 'Redigeringstema ikke funnet.',
'not_match' => "Objektet du prøver å åpne tilhører ikke temaet som endres. Vennligst oppdater siden."
],
'settings_menu' => 'Frontend tema',
'settings_menu_description' => 'Forhåndsvis en liste over installerte temaer og velg et aktivt tema.',
'name_label' => 'Navn',
'name_create_placeholder' => 'Temanavn',
'author_label' => 'Forfatter',
'author_placeholder' => 'Person eller bedrift',
'description_label' => 'Beskrivelse',
'description_placeholder' => 'Temabeskrivelse',
'homepage_label' => 'Hjemmeside',
'homepage_placeholder' => 'Nettside-URL',
'code_label' => 'Kode',
'code_placeholder' => 'En unik kode som brukes for distribusjon',
'dir_name_label' => 'Mappenavn',
'dir_name_create_label' => 'Temaets mappenavn',
'theme_label' => 'Tema',
'activate_button' => 'Aktivér',
'active_button' => 'Aktivér',
'customize_button' => 'Tilpass',
'duplicate_button' => 'Duplisér',
'duplicate_title' => 'Duplisér tema',
'duplicate_theme_success' => 'Temaet har blitt duplisert!',
'manage_button' => 'Administrer',
'manage_title' => 'Administrer tema',
'edit_properties_title' => 'Tema',
'edit_properties_button' => 'Endre egenskaper',
'save_properties' => 'Lagre egenskaper',
'import_button' => 'Importér',
'import_title' => 'Importér tema',
'import_theme_success' => 'Temaet har blitt importert!',
'import_uploaded_file' => 'Temaets arkivfil',
'import_overwrite_label' => 'Overskriv eksisterende filer',
'import_overwrite_comment' => 'Fjern kryss for å kun importere nye filer',
'import_folders_label' => 'Mapper',
'import_folders_comment' => 'Vennligst velg mappene du vil importere',
'export_button' => 'Eksportér',
'export_title' => 'Eksportér tema',
'export_folders_label' => 'Mapper',
'export_folders_comment' => 'Vennligst velg mappene du vil eksportere',
'delete_button' => 'Slett',
'delete_confirm' => 'Vil du virkelig slette dette temaet? Handlingen kan ikke angres!',
'delete_active_theme_failed' => 'Kan ikke slette det aktive temaet. Gjør et annet tema aktivt først.',
'delete_theme_success' => 'Temaet har blitt slettet!',
'create_title' => 'Opprett tema',
'create_button' => 'Opprett',
'create_new_blank_theme' => 'Lag et nytt blankt tema',
'create_theme_success' => 'Temaet har blitt opprettet!',
'create_theme_required_name' => 'Vennligst gi temaet et navn.',
'new_directory_name_label' => 'Temamappe',
'new_directory_name_comment' => 'Oppgi en ny mappe for det dupliserte temaet.',
'dir_name_invalid' => 'Navnet kan kun inneholde tall, latinske bokstaver og følgende symbol: _-',
'dir_name_taken' => 'Temamappen eksiterer allerede.',
'find_more_themes' => 'Finn flere temaer på OctoberCMS Theme Marketplace',
'return' => 'Tilbake til temaliste',
],
'maintenance' => [
'settings_menu' => 'Vedlikeholdsmodus',
'settings_menu_description' => 'Konfigurer vedlikeholdsmodussiden og endre innstillinger.',
'is_enabled' => 'Aktivér vedlikeholdsmodus',
'is_enabled_comment' => 'Når aktivert, vil besøkende se følgende side:'
],
'page' => [
'not_found_name' => "Siden ':name' ble ikke funnet",
'not_found' => [
'label' => 'Side ikke funnet',
'help' => 'Den forespurte siden ble ikke funnet.'
],
'custom_error' => [
'label' => 'Side-feil',
'help' => "Noe gikk galt. Siden kan ikke vises."
],
'menu_label' => 'Sider',
'unsaved_label' => 'Ulagrede sider',
'no_list_records' => 'Ingen sider funnet',
'new' => 'Ny side',
'invalid_url' => 'Ugyldig URL-format. URL-en skal starte med skråstrek og kan inneholde tall, latinske bokstaver og følgende symbol: ._-[]:?|/+*^$',
'delete_confirm_multiple' => 'Vil du virkelig slette valgte sider?',
'delete_confirm_single' => 'Vil du virkelig slette denne siden?',
'no_layout' => '-- ingen layout --'
],
'layout' => [
'not_found_name' => "Layouten ':name' ble ikke funnet",
'menu_label' => 'Layouts',
'unsaved_label' => 'Ulagrede layouts',
'no_list_records' => 'Ingen layouts funnet',
'new' => 'Ny layout',
'delete_confirm_multiple' => 'Vil du virkelig slette valgte layouts?',
'delete_confirm_single' => 'Vil du virkelig slette denne layout?'
],
'partial' => [
'not_found_name' => "Partial ':name' ble ikke funnet.",
'invalid_name' => 'Ugyldig partial navn: :name.',
'menu_label' => 'Partials',
'unsaved_label' => 'Ulagrede partials',
'no_list_records' => 'Ingen partials funnet',
'delete_confirm_multiple' => 'Vil du virkelig slette valgte partials?',
'delete_confirm_single' => 'Vil du virkelig slette denne partialen?',
'new' => 'Ny partial'
],
'content' => [
'not_found_name' => "Innholdsfilen ':name' ble ikke funnet.",
'menu_label' => 'Innhold',
'unsaved_label' => 'Ulagret innhold',
'no_list_records' => 'No content files found',
'delete_confirm_multiple' => 'Vil du virkelig slette valgte innholdsfiler eller -mapper?',
'delete_confirm_single' => 'Vil du virkelig slette denne innholdsfilen eller -mappen?',
'new' => 'Ny innholdsfil'
],
'ajax_handler' => [
'invalid_name' => 'Ugyldig AJAX handler navn: :name.',
'not_found' => "AJAX handler ':name' ble ikke funnet."
],
'cms' => [
'menu_label' => 'CMS'
],
'sidebar' => [
'add' => 'Legg til',
'search' => 'Søk...'
],
'editor' => [
'settings' => 'Innstillinger',
'title' => 'Tittel',
'new_title' => 'Ny side tittel',
'url' => 'URL',
'filename' => 'Filnavn',
'layout' => 'Layout',
'description' => 'Beskrivelse',
'preview' => 'Forhåndsvis',
'meta' => 'Meta',
'meta_title' => 'Meta-tittel',
'meta_description' => 'Meta-beskrivelse',
'markup' => 'Markup',
'code' => 'Kode',
'content' => 'Innhold',
'hidden' => 'Skjult',
'hidden_comment' => 'Kun backend-brukere har tilgang til skjulte sider.',
'enter_fullscreen' => 'Fullskjermmodus',
'exit_fullscreen' => 'Avslutt fullskjermmodus'
],
'asset' => [
'menu_label' => 'Ressurser',
'unsaved_label' => 'Ulagrede ressurser',
'drop_down_add_title' => 'Legg til...',
'drop_down_operation_title' => 'Handling...',
'upload_files' => 'Last opp fil(er)',
'create_file' => 'Opprett fil',
'create_directory' => 'Opprett mappe',
'directory_popup_title' => 'Ny mappe',
'directory_name' => 'Mappenavn',
'rename' => 'Nytt navn',
'delete' => 'Slett',
'move' => 'Flytt',
'select' => 'Velg',
'new' => 'Ny fil',
'rename_popup_title' => 'Nytt navn',
'rename_new_name' => 'Nytt navn',
'invalid_path' => 'Mappestien kan kun inneholde tall, latinske bokstaver, mellomrom og følgende symbol: ._-/',
'error_deleting_file' => 'Kunne ikke slette :name.',
'error_deleting_dir_not_empty' => 'Kunne ikke slette :name. Mappen er ikke tom.',
'error_deleting_dir' => 'Kunne ikke slette :name.',
'invalid_name' => 'Navnet kan kun inneholde tall, latinske bokstaver, mellomrom og følgende symbol: ._-',
'original_not_found' => 'Original fil eller mappe ikke funnet',
'already_exists' => 'Fil eller mappe med samme navn eksiterer allerede',
'error_renaming' => 'Kunne ikke gi filen eller mappen nytt navn',
'name_cant_be_empty' => 'Navnet kan ikke være tomt',
'too_large' => 'Opplastet fil er for stor. Maksimum filstørrelse er :max_size',
'type_not_allowed' => 'Kun følgende filtyper er tillat: :allowed_types',
'file_not_valid' => 'Filen er ugyldig',
'error_uploading_file' => "Kunne ikke laste opp filen ':name': :error",
'move_please_select' => 'velg',
'move_destination' => 'Målmappe',
'move_popup_title' => 'Flytt ressurser',
'move_button' => 'Flytt',
'selected_files_not_found' => 'Valgte filer ikke funnet',
'select_destination_dir' => 'Vennligst velg en målmappe',
'destination_not_found' => 'Målmappe ikke funnet',
'error_moving_file' => 'Kunne ikke flytte filen :file',
'error_moving_directory' => 'Kunne ikke flytte mappen :dir',
'error_deleting_directory' => 'Kunne ikke slette original mappe :dir',
'path' => 'Mål'
],
'component' => [
'menu_label' => 'Komponenter',
'unnamed' => 'Navnløs',
'no_description' => 'Ingen beskrivelse spesifisert',
'alias' => 'Alias',
'alias_description' => 'Et unikt navn gitt til komponenten for å benytte den i sider og layouts.',
'validation_message' => 'Komponentaliaser kan kun inneholde latinske symboler, tall og understreker. Aliaser skal starte med et latinsk symbol.',
'invalid_request' => 'Templaten kan ikke lagres på grunn av ugyldig komponentdata.',
'no_records' => 'Ingen komponenter funnet',
'not_found' => "Komponenten ':name' ble ikke funnet.",
'method_not_found' => "Komponenten ':name' inneholder ikke en metode ':method'."
],
'template' => [
'invalid_type' => 'Ukjent template-type.',
'not_found' => 'Forespurt template ikke funnet.',
'saved' => 'Templaten har blitt lagret.'
],
'permissions' => [
'name' => 'Cms',
'manage_content' => 'Håndter innholdsfiler',
'manage_assets' => 'Håndter ressurser',
'manage_pages' => 'Håndter sider',
'manage_layouts' => 'Håndter layouts',
'manage_partials' => 'Håndter partials',
'manage_themes' => 'Håndter maler'
]
];

View File

@ -2,84 +2,144 @@
return [
'cms_object' => [
'invalid_file' => 'Nome de arquivo inválido: :name. Os nomes de arquivos podem conter apenas símbolos alfa-numéricos, sublinhados, traços e pontos. Veja alguns exemplos de nomes de arquivos corretos: page.htm, página subdiretório/página',
'invalid_file' => 'Nome de arquivo inválido: ":name". Os nomes de arquivos podem conter apenas letras, números, sublinhados, traços e pontos. Veja alguns exemplos de nomes de arquivos corretos: pagina.htm, pagina, subdiretorio/pagina',
'invalid_property' => 'A propriedade ":nome" não pode ser definida',
'file_already_exists' => 'Arquivo ":name" já existe.',
'error_saving' => 'Erro ao salvar arquivo ":name".',
'error_creating_directory' => 'Erro ao criar o diretório :name',
'invalid_file_extension'=>'Extenção de arquivo inválido: :invalid. Extenções válidas: :allowed.',
'error_deleting' => 'Erro ao excluir o arquivo de modelo ":name".',
'delete_success' => 'Modelos apagados com sucesso: :count.',
'file_name_required' => 'O campo Nome do Arquivo é necessária.'
'error_saving' => 'Erro ao salvar arquivo ":name". Verifique as permissões de escrita.',
'error_creating_directory' => 'Erro ao criar o diretório :name. Verifique as permissões de escrita.',
'invalid_file_extension'=>'Extensão de arquivo inválida: :invalid. Extensões válidas: :allowed.',
'error_deleting' => 'Erro ao excluir o arquivo de template ":name". Verifique as permissões de escrita.',
'delete_success' => 'Templates apagados com sucesso: :count.',
'file_name_required' => 'O campo de Nome do Arquivo é necessário.',
],
'theme' => [
'not_found_name' => 'O tema ":name" não foi encontrado.',
'active' => [
'not_set' => "O tema ativo não foi definido.",
'not_found' => "O tema ativo não foi encontrado.",
'not_set' => 'O tema ativo não foi definido.',
'not_found' => 'O tema ativo não foi encontrado.',
],
'edit' => [
'not_set' => "O tema de edição não foi definido.",
'not_found' => "O tema de edição não foi encontrado.",
'not_match' => "O objeto que você está tentando acessar não pertence ao tema que está sendo editado. Por favor, recarregue a página."
'not_set' => 'O tema de edição não foi definido.',
'not_found' => 'O tema de edição não foi encontrado.',
'not_match' => 'O objeto que você está tentando acessar não pertence ao tema que está sendo editado. Por favor, recarregue a página.',
],
'settings_menu' => 'Temas',
'settings_menu_description' => 'Veja a lista de temas instalados.',
'find_more_themes' => 'Encontrar mais temas.',
'settings_menu_description' => 'Veja a lista de temas instalados e selecione o tema ativo.',
'name_label' => 'Nome',
'name_create_placeholder' => 'Nome do novo tema',
'author_label' => 'Autor',
'author_placeholder' => 'Nome do autor',
'description_label' => 'Descrição',
'description_placeholder' => 'Descrição do tema',
'homepage_label' => 'Site',
'homepage_placeholder' => 'URL do site',
'code_label' => 'Código',
'code_placeholder' => 'Um código exclusivo para esse tema a ser usado para distribuição',
'dir_name_label' => 'Nome do diretório',
'dir_name_create_label' => 'O diretório-alvo de temas',
'theme_label' => 'Tema',
'activate_button' => 'Ativar',
'active_button' => 'Ativar',
'active_button' => 'Ativado',
'customize_button' => 'Customizar',
'duplicate_button' => 'Duplicar',
'duplicate_title' => 'Duplicar tema',
'duplicate_theme_success' => 'Tema duplicado com sucesso!',
'manage_button' => 'Gerenciar',
'manage_title' => 'Gerenciar tema',
'edit_properties_title' => 'Tema',
'edit_properties_button' => 'Editar propriedades',
'save_properties' => 'Salvar propriedades',
'import_button' => 'Importar',
'import_title' => 'Importar tema',
'import_theme_success' => 'Tema importado com sucesso!',
'import_uploaded_file' => 'Arquivo de tema',
'import_overwrite_label' => 'Sobrescrever arquivos existentes',
'import_overwrite_comment' => 'Desmarque para importar apenas arquivos novos',
'import_folders_label' => 'Pastas',
'import_folders_comment' => 'Por favor selecione as pastas de temas que deseja importar',
'export_button' => 'Exportar',
'export_title' => 'Exportar tema',
'export_folders_label' => 'Pastas',
'export_folders_comment' => 'Por favor selecione as pastas de temas que deseja exportar',
'delete_button' => 'Deletar',
'delete_confirm' => 'Tem certeza que deseja deletar este tema? Isto não pode ser revertido!',
'delete_active_theme_failed' => 'Não é possível deletar o tema ativo, torne outro tema ativo antes.',
'delete_theme_success' => 'Tema deletado com sucesso!',
'create_title' => 'Criar tema',
'create_button' => 'Criar',
'create_new_blank_theme' => 'Criar novo tema em branco',
'create_theme_success' => 'Tema criado com sucesso!',
'create_theme_required_name' => 'Por favor forneça um nome para o tema.',
'new_directory_name_label' => 'Diretório do tema',
'new_directory_name_comment' => 'Forneça um novo nome de diretório para o tema duplicado.',
'dir_name_invalid' => 'O nome só pode conter letras, números, e os símbolos: _-',
'dir_name_taken' => 'Diretório de tema escolhido já existe.',
'find_more_themes' => 'Encontrar mais temas.',
'return' => 'Retornar à lista de temas',
],
'maintenance' => [
'settings_menu' => 'Modo de manutenção',
'settings_menu_description' => 'Configurar modo de manutenção e a página exibida.',
'is_enabled' => 'Ativar modo de manutenção',
'is_enabled_comment' => 'Quando ativado visitantes do site vão ver a página selecionada.',
],
'page' => [
'not_found_name' => 'A página ":name" não foi encontrada',
'not_found' => [
'label' => "Página não encontrada",
'help' => "A página solicitada não pode ser encontrada.",
'label' => 'Página não encontrada',
'help' => 'A página solicitada não pode ser encontrada.',
],
'custom_error' => [
'label' => "Erro na página",
'help' => "Lamentamos, mas algo deu errado e que a página não pode ser exibida.",
'label' => 'Erro na página',
'help' => 'Lamentamos, mas algo deu errado e que a página não pode ser exibida.',
],
'menu_label' => 'Páginas',
'no_list_records' => 'Nenhuma página foi encontradas',
'unsaved_label' => 'Página(s) não salva(s)',
'no_list_records' => 'Nenhuma página encontrada',
'new' => 'Nova página',
'invalid_url' => 'Formato de URL inválido. O URL deve começar com o símbolo de barra e pode conter dígitos, letras latinas e os seguintes símbolos: _-[]:?|/+*^$',
'delete_confirm_multiple' => 'Você realmente quer excluir as páginas selecionadas?',
'delete_confirm_single' => 'Você realmente quer excluir esta página?',
'no_layout' => '-- sem layout --'
'invalid_url' => 'Formato de URL inválido. A URL deve começar com uma barra e pode conter letras, números e os símbolos: _-[]:?|/+*^$',
'delete_confirm_multiple' => 'Você realmente deseja excluir as páginas selecionadas?',
'delete_confirm_single' => 'Você realmente deseja excluir esta página?',
'no_layout' => '-- sem layout --',
],
'layout' => [
'not_found_name' => "O layout ':name' não foi encontrado",
'not_found_name' => 'O layout ":name" não foi encontrado',
'menu_label' => 'Layouts',
'no_list_records' => 'Nenhum layout foi encontrado',
'unsaved_label' => 'Layout(s) não salvo(s)',
'no_list_records' => 'Nenhum layout encontrado',
'new' => 'Novo layout',
'delete_confirm_multiple' => 'Você realmente deseja excluir os layouts selecionados?',
'delete_confirm_single' => 'Você realmente quer excluir este layout?'
'delete_confirm_single' => 'Você realmente deseja excluir este layout?',
],
'partial' => [
'not_found_name' => "O bloco ':name' não foi encontrado.",
'invalid_name' => "Nome bloco inválido: :name.",
'not_found_name' => 'O bloco ":name" não foi encontrado.',
'invalid_name' => 'Nome de bloco inválido: :name.',
'menu_label' => 'Blocos',
'no_list_records' => 'Nenhum bloco foi encontrado',
'delete_confirm_multiple' => 'Você realmente quer apagar os blocos selecionados?',
'delete_confirm_single' => 'Você realmente quer apagar este bloco?',
'new' => 'Novo bloco'
'unsaved_label' => 'Bloco(s) não salvo(s)',
'no_list_records' => 'Nenhum bloco encontrado',
'delete_confirm_multiple' => 'Você realmente deseja apagar os blocos selecionados?',
'delete_confirm_single' => 'Você realmente deseja apagar este bloco?',
'new' => 'Novo bloco',
],
'content' => [
'not_found_name' => "O arquivo de conteúdo ':name' não foi encontrado.",
'not_found_name' => 'O arquivo de conteúdo ":name" não foi encontrado.',
'menu_label' => 'Conteúdo',
'no_list_records' => 'Nenhum arquivo de conteúdo foi encontrado',
'delete_confirm_multiple' => 'Você realmente quer apagar arquivos de conteúdo selecionados ou diretórios?',
'delete_confirm_single' => 'Você realmente quer apagar este arquivo de conteúdo?',
'new' => 'Novo arquivo de conteúdo'
'unsaved_label' => 'Conteúdo não salvo',
'no_list_records' => 'Nenhum arquivo de conteúdo encontrado',
'delete_confirm_multiple' => 'Você realmente deseja apagar arquivos ou diretórios de conteúdo selecionados?',
'delete_confirm_single' => 'Você realmente deseja apagar este arquivo de conteúdo?',
'new' => 'Novo arquivo de conteúdo',
],
'ajax_handler' => [
'invalid_name' => "O nome do Manipulador AJAX é inválido: :name.",
'not_found' => "Manipulador AJAX ':name' não foi encontrado.",
'invalid_name' => 'O nome do manipulador AJAX é inválido: :name.',
'not_found' => 'Manipulador AJAX ":name" não encontrado.',
],
'cms' => [
'menu_label' => "Design"
'menu_label' => 'CMS',
],
'sidebar' => [
'add' => 'Adicionar',
'search' => 'Buscar...'
'search' => 'Buscar...',
],
'editor' => [
'settings' => 'Configurações',
@ -89,7 +149,7 @@ return [
'filename' => 'Nome do Arquivo',
'layout' => 'Layout',
'description' => 'Descrição',
'preview' => 'Pré-visualização',
'preview' => 'Visualizar',
'meta' => 'Meta',
'meta_title' => 'Meta Título',
'meta_description' => 'Meta Descrição',
@ -99,10 +159,11 @@ return [
'hidden' => 'Oculta',
'hidden_comment' => 'Páginas ocultas são acessíveis somente para administradores.',
'enter_fullscreen' => 'Entrar no modo de tela cheia',
'exit_fullscreen' => 'Sair do modo de tela cheia'
'exit_fullscreen' => 'Sair do modo de tela cheia',
],
'asset' => [
'menu_label' => "Arquivos",
'menu_label' => 'Arquivos',
'unsaved_label' => 'Arquivo(s) não salvo(s)',
'drop_down_add_title' => 'Adicionar...',
'drop_down_operation_title' => 'Ação...',
'upload_files' => 'Enviar arquivo(s)',
@ -117,54 +178,55 @@ return [
'new' => 'Novo arquivo',
'rename_popup_title' => 'Renomear',
'rename_new_name' => 'Novo nome',
'invalid_path' => 'O caminho pode conter apenas dígitos, letras latinas, espaços e os seguintes símbolos: ._-/',
'invalid_path' => 'O caminho pode conter apenas letras, números, espaços e os símbolos: ._-/',
'error_deleting_file' => 'Erro ao excluir arquivo :name.',
'error_deleting_dir_not_empty' => 'Erro ao excluir diretório :name. O diretório não está vazio.',
'error_deleting_dir' => 'Erro ao excluir diretório :name.',
'invalid_name' => 'O nome pode conter apenas dígitos, letras latinas, espaços e os seguintes símbolos: ._-',
'original_not_found' => 'O arquivo original ou diretório não foi encontrado',
'already_exists' => 'Arquivo ou diretório com este nome já existe',
'invalid_name' => 'O nome pode conter apenas letras, números, espaços e os símbolos: ._-',
'original_not_found' => 'Arquivo ou diretório original não encontrado',
'already_exists' => 'Um arquivo ou diretório com este nome já existe',
'error_renaming' => 'Erro ao renomear o arquivo ou diretório',
'name_cant_be_empty' => 'O nome não pode ser vazio',
'too_large' => 'O arquivo enviado é muito grande. O tamanho máximo de envio permitido é :max_size',
'name_cant_be_empty' => 'O nome não pode estar vazio',
'too_large' => 'O arquivo enviado é muito grande. O tamanho máximo permitido é :max_size',
'type_not_allowed' => 'Apenas os seguintes tipos de arquivos são permitidos: :allowed_types',
'file_not_valid' => 'O arquivo não é válido',
'error_uploading_file' => 'Erro ao enviar arquivo ":name": :error',
'move_please_select' => 'por favor, selecione',
'error_uploading_file' => 'Error uploading file ":name": :error',
'move_please_select' => 'por favor selecione',
'move_destination' => 'Diretório de destino',
'move_popup_title' => 'Mover arquivo',
'move_popup_title' => 'Mover arquivos',
'move_button' => 'Mover',
'selected_files_not_found' => 'Os arquivos selecionados não foram encontrados',
'selected_files_not_found' => 'Arquivos selecionados não encontrados',
'select_destination_dir' => 'Por favor, selecione um diretório de destino',
'destination_not_found' => 'Diretório de destino não foi encontrado',
'destination_not_found' => 'Diretório de destino não encontrado',
'error_moving_file' => 'Erro ao mover arquivo :file',
'error_moving_directory' => 'Erro ao mover diretório :dir',
'error_deleting_directory' => 'Erro ao excluir o diretório :dir',
'path' => 'Caminho'
'error_deleting_directory' => 'Erro ao excluir o diretório original :dir',
'path' => 'Caminho',
],
'component' => [
'menu_label' => "Componentes",
'unnamed' => "Não nomeado",
'no_description' => "Sem descrição fornecida",
'alias' => "Pseudônimo",
'alias_description' => "Um nome exclusivo dado a este componente quando usá-lo na página ou layout de código.",
'validation_message' => "Aliases de componentes são necessários e podem conter apenas símbolos latinos, dígitos e sublinhados. Os aliases deve começar com um símbolo Latina.",
'invalid_request' => "O modelo não pode ser salvo por causa de dados de componentes inválidos.",
'no_records' => 'Nenhum dos componentes foi encontrado',
'not_found' => "O componente ':name' não foi encontrado.",
'method_not_found' => "o componente ':name' não contém um método ':method'.",
'menu_label' => 'Componentes',
'unnamed' => 'Sem nome',
'no_description' => 'Nenhuma descrição fornecida',
'alias' => 'Alias',
'alias_description' => 'Um nome exclusivo dado a este componente quando usá-lo no código de uma página ou layout.',
'validation_message' => 'Aliases de componentes são necessários e podem conter letras, números e sublinhados. Os aliases deve começar com uma letra.',
'invalid_request' => 'O template não pode ser salvo devido a dados inválidos nos componentes.',
'no_records' => 'Nenhum componente encontrado',
'not_found' => 'O componente ":name" não foi encontrado.',
'method_not_found' => 'O componente ":name" não tem um método ":method".',
],
'template' => [
'invalid_type' => "Tipo de modelo desconhecido.",
'not_found' => "O modelo solicitado não foi encontrado.",
'saved'=> "O modelo foi salvo com sucesso."
'invalid_type' => 'Tipo de template desconhecido.',
'not_found' => 'O template solicitado não foi encontrado.',
'saved'=> 'O modelo foi salvo com sucesso.',
],
'permissions' => [
'name' => 'Cms',
'manage_content' => 'Gerenciar conteúdo',
'manage_assets' => 'Gerenciar arquivos',
'manage_pages' => 'Gerenciar páginas',
'manage_layouts' => 'Gerenciar layouts',
'manage_partials' => 'Gerenciar blocos',
'manage_themes' => 'Gerenciar temas'
]
'manage_themes' => 'Gerenciar temas',
],
];

View File

@ -1,6 +1,6 @@
<?= Form::open([
'data-request'=>$this->getEventHandler('onMove'),
'data-request-success'=>"\$el.trigger('close.oc.popup')",
'data-request-success'=>"\$(this).trigger('close.oc.popup')",
'data-stripe-load-indicator'=>1,
'id'=>'asset-move-popup-form'
]) ?>

View File

@ -1,6 +1,6 @@
<?= Form::open([
'data-request'=>$this->getEventHandler('onNewDirectory'),
'data-request-success'=>"\$el.trigger('close.oc.popup')",
'data-request-success'=>"\$(this).trigger('close.oc.popup')",
'data-stripe-load-indicator'=>1,
'id'=>'asset-new-dir-popup-form'
]) ?>

View File

@ -238,15 +238,6 @@ class ServiceProvider extends ModuleServiceProvider
*/
SettingsManager::instance()->registerCallback(function ($manager) {
$manager->registerSettingItems('October.System', [
'administrators' => [
'label' => 'backend::lang.user.menu_label',
'description' => 'backend::lang.user.menu_description',
'category' => SettingsManager::CATEGORY_SYSTEM,
'icon' => 'icon-users',
'url' => Backend::url('backend/users'),
'permissions' => ['backend.manage_users'],
'order' => 600
],
'updates' => [
'label' => 'system::lang.updates.menu_label',
'description' => 'system::lang.updates.menu_description',
@ -254,25 +245,16 @@ class ServiceProvider extends ModuleServiceProvider
'icon' => 'icon-cloud-download',
'url' => Backend::url('system/updates'),
'permissions' => ['system.manage_updates'],
'order' => 700
'order' => 300
],
'event_logs' => [
'label' => 'system::lang.event_log.menu_label',
'description' => 'system::lang.event_log.menu_description',
'category' => SettingsManager::CATEGORY_LOGS,
'icon' => 'icon-exclamation-triangle',
'url' => Backend::url('system/eventlogs'),
'permissions' => ['system.access_logs'],
'order' => 800
],
'request_logs' => [
'label' => 'system::lang.request_log.menu_label',
'description' => 'system::lang.request_log.menu_description',
'category' => SettingsManager::CATEGORY_LOGS,
'icon' => 'icon-file-o',
'url' => Backend::url('system/requestlogs'),
'permissions' => ['system.access_logs'],
'order' => 800
'administrators' => [
'label' => 'backend::lang.user.menu_label',
'description' => 'backend::lang.user.menu_description',
'category' => SettingsManager::CATEGORY_SYSTEM,
'icon' => 'icon-users',
'url' => Backend::url('backend/users'),
'permissions' => ['backend.manage_users'],
'order' => 400
],
'mail_settings' => [
'label' => 'system::lang.mail.menu_label',
@ -281,7 +263,7 @@ class ServiceProvider extends ModuleServiceProvider
'icon' => 'icon-envelope',
'class' => 'System\Models\MailSettings',
'permissions' => ['system.manage_mail_settings'],
'order' => 400
'order' => 600
],
'mail_templates' => [
'label' => 'system::lang.mail_templates.menu_label',
@ -290,7 +272,25 @@ class ServiceProvider extends ModuleServiceProvider
'icon' => 'icon-envelope-square',
'url' => Backend::url('system/mailtemplates'),
'permissions' => ['system.manage_mail_templates'],
'order' => 500
'order' => 610
],
'event_logs' => [
'label' => 'system::lang.event_log.menu_label',
'description' => 'system::lang.event_log.menu_description',
'category' => SettingsManager::CATEGORY_LOGS,
'icon' => 'icon-exclamation-triangle',
'url' => Backend::url('system/eventlogs'),
'permissions' => ['system.access_logs'],
'order' => 900
],
'request_logs' => [
'label' => 'system::lang.request_log.menu_label',
'description' => 'system::lang.request_log.menu_description',
'category' => SettingsManager::CATEGORY_LOGS,
'icon' => 'icon-file-o',
'url' => Backend::url('system/requestlogs'),
'permissions' => ['system.access_logs'],
'order' => 910
]
]);
});
@ -309,6 +309,7 @@ class ServiceProvider extends ModuleServiceProvider
$this->registerConsoleCommand('october.down', 'System\Console\OctoberDown');
$this->registerConsoleCommand('october.update', 'System\Console\OctoberUpdate');
$this->registerConsoleCommand('october.util', 'System\Console\OctoberUtil');
$this->registerConsoleCommand('october.mirror', 'System\Console\OctoberMirror');
$this->registerConsoleCommand('plugin.install', 'System\Console\PluginInstall');
$this->registerConsoleCommand('plugin.remove', 'System\Console\PluginRemove');
$this->registerConsoleCommand('plugin.refresh', 'System\Console\PluginRefresh');

View File

@ -7,14 +7,6 @@
margin: 0;
padding: 10px 0;
overflow: hidden;
/* clearfix */
}
.product-list li button,
.product-list li .image,
.product-list li .details {
-webkit-transition: opacity .2s linear;
-moz-transition: opacity .2s linear;
transition: opacity .2s linear;
}
.product-list li button {
position: absolute;
@ -25,6 +17,13 @@
opacity: 0;
outline: none;
}
.product-list li button,
.product-list li .image,
.product-list li .details {
-webkit-transition: opacity .2s linear;
-moz-transition: opacity .2s linear;
transition: opacity .2s linear;
}
.product-list li:hover button {
opacity: .3;
}

View File

@ -91,7 +91,7 @@ if (window.jQuery === undefined)
* Halt here if beforeUpdate() or data-request-before-update returns false
*/
if (this.options.beforeUpdate.apply(this, [data, textStatus, jqXHR]) === false) return
if (options.evalBeforeUpdate && eval('(function($el, context, data, textStatus, jqXHR) {'+options.evalBeforeUpdate+'}($el, context, data, textStatus, jqXHR))') === false) return
if (options.evalBeforeUpdate && eval('(function($el, context, data, textStatus, jqXHR) {'+options.evalBeforeUpdate+'}.call($el.get(0), $el, context, data, textStatus, jqXHR))') === false) return
/*
* Trigger 'ajaxBeforeUpdate' on the form, halt if event.preventDefault() is called
@ -107,7 +107,7 @@ if (window.jQuery === undefined)
updatePromise.done(function(){
form.trigger('ajaxSuccess', [context, data, textStatus, jqXHR])
options.evalSuccess && eval('(function($el, context, data, textStatus, jqXHR) {'+options.evalSuccess+'}($el, context, data, textStatus, jqXHR))')
options.evalSuccess && eval('(function($el, context, data, textStatus, jqXHR) {'+options.evalSuccess+'}.call($el.get(0), $el, context, data, textStatus, jqXHR))')
})
return updatePromise
@ -154,7 +154,7 @@ if (window.jQuery === undefined)
/*
* Halt here if the data-request-error attribute returns false
*/
if (options.evalError && eval('(function($el, context, textStatus, jqXHR) {'+options.evalError+'}($el, context, textStatus, jqXHR))') === false)
if (options.evalError && eval('(function($el, context, textStatus, jqXHR) {'+options.evalError+'}.call($el.get(0), $el, context, textStatus, jqXHR))') === false)
return
requestOptions.handleErrorMessage(errorMsg)
@ -162,6 +162,10 @@ if (window.jQuery === undefined)
return updatePromise
},
complete: function(data, textStatus, jqXHR) {
form.trigger('ajaxComplete', [context, data, textStatus, jqXHR])
options.evalComplete && eval('(function($el, context, data, textStatus, jqXHR) {'+options.evalComplete+'}.call($el.get(0), $el, context, data, textStatus, jqXHR))')
},
/*
* Custom function, display an error message to the user
@ -185,7 +189,7 @@ if (window.jQuery === undefined)
var updatePromise = $.Deferred().done(function(){
for (var partial in data) {
/*
* If a partial has been supplied on the client side that matches the server supplied key, look up
* If a partial has been supplied on the client side that matches the server supplied key, look up
* it's selector and use that. If not, we assume it is an explicit selector reference.
*/
var selector = (options.update[partial]) ? options.update[partial] : partial
@ -258,6 +262,7 @@ if (window.jQuery === undefined)
*/
context.success = requestOptions.success
context.error = requestOptions.error
context.complete = requestOptions.complete
requestOptions = $.extend(requestOptions, options)
requestOptions.data = data.join('&')
@ -290,7 +295,8 @@ if (window.jQuery === undefined)
beforeUpdate: function(data, textStatus, jqXHR) {},
evalBeforeUpdate: null,
evalSuccess: null,
evalError: null
evalError: null,
evalComplete: null,
}
/*
@ -318,6 +324,7 @@ if (window.jQuery === undefined)
evalBeforeUpdate: $this.data('request-before-update'),
evalSuccess: $this.data('request-success'),
evalError: $this.data('request-error'),
evalComplete: $this.data('request-complete'),
confirm: $this.data('request-confirm'),
redirect: $this.data('request-redirect'),
loading: $this.data('request-loading'),
@ -377,7 +384,7 @@ if (window.jQuery === undefined)
}
})
$(document).on('keyup', 'input[type=text][data-request][data-track-input], input[type=password][data-request][data-track-input]', function documentOnKeyup(e){
$(document).on('keyup', 'input[type=text][data-request][data-track-input], input[type=password][data-request][data-track-input], input[type=number][data-request][data-track-input]', function documentOnKeyup(e){
var
$el = $(this),
lastValue = $el.data('oc.lastvalue')
@ -411,7 +418,7 @@ if (window.jQuery === undefined)
/*
* Invent our own event that unifies document.ready with window.ajaxUpdateComplete
*
*
* $(document).render(function() { })
* $(document).on('render', function(){ })
*/

View File

@ -5,187 +5,194 @@
font-size: 16px;
color: #999;
}
.product-list {
margin: 0;
padding: 10px 0;
overflow: hidden; /* clearfix */
}
.product-list li button,
.product-list li .image,
.product-list li .details {
-webkit-transition: opacity .2s linear;
-moz-transition: opacity .2s linear;
transition: opacity .2s linear;
}
.product-list li button {
position: absolute;
top: 0;
right: 0;
width: 20px;
height: 20px;
opacity: 0;
outline: none;
}
.product-list li:hover button {
opacity: .3;
}
.product-list li:hover button:hover {
opacity: .8;
li {
button {
position: absolute;
top: 0;
right: 0;
width: 20px;
height: 20px;
opacity: 0;
outline: none;
}
button, .image, .details {
-webkit-transition: opacity .2s linear;
-moz-transition: opacity .2s linear;
transition: opacity .2s linear;
}
}
li:hover {
button {
opacity: .3;
}
button:hover {
opacity: .8;
}
}
}
.plugin-list {
li {
list-style: none;
position: relative;
border-bottom: 1px solid #E6E9E9;
margin-bottom: 10px;
padding-bottom: 10px;
overflow: hidden;
.image {
float: left;
margin-right: 15px;
margin-left: 5px;
img {
width: 50px;
height: 50px;
}
}
.details {
p {
padding: 0;
margin: 3px 0 0 0;
color: #808C8D;
}
}
h4 {
padding: 5px 0 0;
margin: 0;
color: #C03F31;
font-weight: 400;
}
}
li:last-child {
border-bottom: none;
}
}
.plugin-list li {
list-style: none;
position: relative;
border-bottom: 1px solid #E6E9E9;
margin-bottom: 10px;
padding-bottom: 10px;
overflow: hidden;
}
.plugin-list li:last-child {
border-bottom: none;
}
.plugin-list li .image {
float: left;
margin-right: 15px;
margin-left: 5px;
}
.plugin-list li .image img {
width: 50px;
height: 50px;
}
.plugin-list li .details p {
padding: 0;
margin: 3px 0 0 0;
color: #808C8D;
}
.plugin-list li h4 {
padding: 5px 0 0;
margin: 0;
color: #C03F31;
font-weight: 400;
.theme-list {
li {
float: left;
padding: 0;
margin: 0 10px 10px 0;
list-style: none;
border: 1px solid #E6E9E9;
background: #fff;
position: relative;
border-radius: 3px;
-webkit-transition: border .2s linear;
-moz-transition: border .2s linear;
transition: border .2s linear;
.image {
padding: 5px;
img {
width: 210px;
height: 140px;
}
}
.details {
position: absolute;
bottom: 0;
left: 0;
opacity: 0;
padding: 10px;
overflow: hidden;
}
h4 {
padding: 15px 0 0;
margin: 0;
}
p {
padding: 0;
margin: 0;
color: #999;
text-transform: uppercase;
font-size: 12px;
}
}
li:hover {
border-color: transparent;
.image {
opacity: 0;
}
.details {
opacity: 1;
}
}
}
.theme-list li {
float: left;
padding: 0;
margin: 0 10px 10px 0;
list-style: none;
border: 1px solid #E6E9E9;
background: #fff;
position: relative;
border-radius: 3px;
}
.theme-list li:hover {
border-color: transparent;
}
.theme-list li {
-webkit-transition: border .2s linear;
-moz-transition: border .2s linear;
transition: border .2s linear;
}
.theme-list li .image {
padding: 5px;
}
.theme-list li .image img {
width: 210px;
height: 140px;
}
.theme-list li:hover .image {
opacity: 0;
}
.theme-list li .details {
position: absolute;
bottom: 0;
left: 0;
opacity: 0;
padding: 10px;
overflow: hidden;
}
.theme-list li:hover .details {
opacity: 1;
}
.theme-list li h4 {
padding: 15px 0 0;
margin: 0;
}
.theme-list li p {
padding: 0;
margin: 0;
color: #999;
text-transform: uppercase;
font-size: 12px;
}
.suggested-products-container {
}
.suggested-products {
padding: 0;
.product {
padding: 0;
}
.image {
float: left;
position: relative;
img {
width: 40px;
height: 40px;
margin-top: 10px;
}
}
.details {
margin-left: 50px;
padding: 10px 0;
h5 {
margin: 0 0 3px;
font-size: 14px;
color: #C03F31;
font-weight: 400;
}
p {
font-size: 12px;
}
}
a {
color: #777;
background: #fff;
padding: 5px;
text-decoration: none;
display: block;
overflow: hidden;
border-bottom: 1px solid #E6E9E9;
}
a:hover {
color: #333;
background: #f9f9f9;
.image:after {
content: "+";
color: #999;
font-size: 32px;
display: block;
width: 40px;
height: 40px;
text-align: center;
line-height: 40px;
position: absolute;
top: 7px;
left: 0;
}
.image {
img {
opacity: .5;
}
}
}
}
.suggested-products .product {
padding: 0;
}
.suggested-products .image img {
width: 40px;
height: 40px;
margin-top: 10px;
}
.suggested-themes .image img {
width: 60px;
height: 40px;
}
.suggested-products .image {
float: left;
position: relative;
}
.suggested-products .details {
margin-left: 50px;
padding: 10px 0;
}
.suggested-themes .details {
margin-left: 70px;
}
.suggested-products .details h5 {
margin: 0 0 3px;
font-size: 14px;
color: #C03F31;
font-weight: 400;
}
.suggested-products .details p {
font-size: 12px;
}
.suggested-products a {
color: #777;
background: #fff;
padding: 5px;
text-decoration: none;
display: block;
overflow: hidden;
border-bottom: 1px solid #E6E9E9;
}
.suggested-products a:hover {
color: #333;
background: #f9f9f9;
}
.suggested-products a:hover .image {
}
.suggested-products a:hover .image:after {
content: "+";
color: #999;
font-size: 32px;
display: block;
width: 40px;
height: 40px;
text-align: center;
line-height: 40px;
position: absolute;
top: 7px;
left: 0;
}
.suggested-products a:hover .image img {
opacity: .5;
.suggested-themes {
.image {
img {
width: 60px;
height: 40px;
}
}
.details {
margin-left: 70px;
}
}
/*!
@ -199,12 +206,10 @@
text-align: left;
padding-bottom: 15px;
}
.twitter-typeahead {
width: 100%;
}
.typeahead,
.tt-hint {
.typeahead, .tt-hint {
width: 100%;
height: 46px;
padding: 8px 12px;
@ -242,52 +247,55 @@
.tt-suggestion {
font-size: 14px;
line-height: 18px;
+ {
.tt-suggestion {
font-size: 14px;
border-top: 1px solid #ccc;
}
}
}
.tt-suggestion + .tt-suggestion {
font-size: 14px;
border-top: 1px solid #ccc;
.tt-suggestions {
.product-details {
padding: 5px;
overflow: hidden;
position: relative;
}
.product-image {
float: left;
margin-right: 10px;
img {
height: 45px;
width: 45px;
}
}
.product-name {
font-size: 20px;
padding-top: 5px;
}
}
.tt-suggestions .product-details {
padding: 5px;
overflow: hidden;
position: relative;
}
.tt-suggestions .product-image {
float: left;
margin-right: 10px;
}
.tt-suggestions .product-image img {
height: 45px;
width: 45px;
}
.tt-suggestions .product-name {
font-size: 20px;
padding-top: 5px;
}
.tt-suggestions .product-description {
}
.tt-suggestion.tt-cursor {
cursor: pointer;
}
.tt-suggestion.tt-cursor .product-details {
color: #333;
background: #f9f9f9;
border-color: #f0f0f0;
}
.tt-suggestion.tt-cursor .product-details .product-image:after {
content: "+";
color: #999;
font-size: 38px;
display: block;
width: 45px;
height: 45px;
text-align: center;
line-height: 45px;
position: absolute;
top: 5px;
left: 5px;
}
.tt-suggestion.tt-cursor .product-details .product-image img {
opacity: .5;
.product-details {
color: #333;
background: #f9f9f9;
border-color: #f0f0f0;
.product-image:after {
content: "+";
color: #999;
font-size: 38px;
display: block;
width: 45px;
height: 45px;
text-align: center;
line-height: 45px;
position: absolute;
top: 5px;
left: 5px;
}
.product-image {
img {
opacity: .5;
}
}
}
}

View File

@ -49,7 +49,14 @@ class ErrorHandler extends ErrorHandlerBase
// Route to the CMS error page.
$controller = new Controller($theme);
return $controller->run('/error');
$result = $controller->run('/error');
// Extract content from response object
if ($result instanceof \Symfony\Component\HttpFoundation\Response) {
$result = $result->getContent();
}
return $result;
}
/**

View File

@ -0,0 +1,141 @@
<?php namespace System\Console;
use File;
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
class OctoberMirror extends Command
{
/**
* The console command name.
*/
protected $name = 'october:mirror';
/**
* The console command description.
*/
protected $description = '(Experimental) Generates a mirrored public folder using symbolic links.';
protected $files = [
'index.php'
];
protected $directories = [
'storage/app/uploads',
'storage/app/media',
];
protected $wildcards = [
'modules/*/assets',
'plugins/*/*/assets',
'themes/*/assets',
];
protected $destinationPath;
/**
* Create a new command instance.
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*/
public function fire()
{
$this->getDestinationPath();
foreach ($this->files as $file) {
$this->mirrorFile($file);
}
foreach ($this->directories as $directory) {
$this->mirrorDirectory($directory);
}
foreach ($this->wildcards as $wildcard) {
$this->mirrorWildcard($wildcard);
}
$this->output->writeln('<info>Mirror complete!</info>');
}
protected function mirrorFile($file)
{
$this->output->writeln(sprintf('<info> - Mirrored: %s</info>', $file));
$src = base_path().'/'.$file;
$dest = $this->getDestinationPath().'/'.$file;
if (!File::isFile($src) || File::isFile($dest)) return false;
symlink($src, $dest);
}
protected function mirrorDirectory($directory)
{
$this->output->writeln(sprintf('<info> - Mirrored: %s</info>', $directory));
$src = base_path().'/'.$directory;
$dest = $this->getDestinationPath().'/'.$directory;
if (!File::isDirectory($src) || File::isDirectory($dest)) return false;
File::makeDirectory(dirname($dest), 0755, true);
symlink($src, $dest);
}
protected function mirrorWildcard($wildcard)
{
if (strpos($wildcard, '*') === false) {
return $this->mirrorDirectory($wildcard);
}
list($start, $end) = explode('*', $wildcard, 2);
$startDir = base_path().'/'.$start;
if (!File::isDirectory($startDir)) return false;
foreach (File::directories($startDir) as $directory) {
$this->mirrorWildcard($start.basename($directory).$end);
}
}
protected function getDestinationPath()
{
if ($this->destinationPath !== null) {
return $this->destinationPath;
}
$destPath = $this->argument('destination');
if (realpath($destPath) === false) {
$destPath = base_path() . '/' . $destPath;
}
if (!File::isDirectory($destPath)) {
File::makeDirectory($destPath, 0755, true);
}
$this->output->writeln(sprintf('<info>Destination: %s</info>', $destPath));
return $this->destinationPath = $destPath;
}
/**
* Get the console command arguments.
*/
protected function getArguments()
{
return [
['destination', InputArgument::REQUIRED, 'The destination path relative to the current directory. Eg: public/'],
];
}
/**
* Get the console command options.
*/
protected function getOptions()
{
return [];
}
}

View File

@ -711,7 +711,7 @@ class Updates extends Controller
}
}
return $popular;
return array_values($popular);
}
}

View File

@ -17,7 +17,7 @@
data-trigger-action="enable"
data-trigger=".control-list input[type=checkbox]"
data-trigger-condition="checked"
data-request-success="$el.prop('disabled', false)"
data-request-success="$(this).prop('disabled', false)"
data-stripe-load-indicator>
<?= e(trans('backend::lang.list.delete_selected')) ?>
</button>

View File

@ -17,7 +17,7 @@
data-trigger-action="enable"
data-trigger=".control-list input[type=checkbox]"
data-trigger-condition="checked"
data-request-success="$el.prop('disabled', false)"
data-request-success="$(this).prop('disabled', false)"
data-stripe-load-indicator>
<?= e(trans('backend::lang.list.delete_selected')) ?>
</button>

View File

@ -29,7 +29,7 @@
<h4 class="section-header">
<a href="<?= Backend::url('cms/themes') ?>">Installed themes</a>
<small>(<span class="product-counter">0</span>)</small>
<small>(<span class="product-counter"><?= count($installedThemes) ?></span>)</small>
</h4>
<?php if (!count($installedThemes)): ?>

View File

@ -18,6 +18,7 @@ return [
'ro' => 'Romana',
'pt-br' => 'Brazilian Portuguese',
'fa' => 'Persian',
'nb-no' => 'Norwegisch (Bokmål)'
],
'directory' => [
'create_fail' => "Konnte Verzeichnis: :name nicht erstellen",

View File

@ -23,7 +23,8 @@ return [
'ru' => 'Russian',
'se' => 'Swedish',
'sk' => 'Slovak (Slovakia)',
'tr' => 'Turkish'
'tr' => 'Turkish',
'nb-no' => 'Norwegian (Bokmål)'
],
'directory' => [
'create_fail' => 'Cannot create directory: :name'
@ -114,7 +115,6 @@ return [
'sender_name' => 'Sender Name',
'sender_email' => 'Sender Email',
'php_mail' => 'PHP mail',
'sendmail' => 'Sendmail',
'smtp' => 'SMTP',
'smtp_address' => 'SMTP Address',
'smtp_authorization' => 'SMTP authorization required',

View File

@ -18,6 +18,7 @@ return [
'ro' => 'Romana',
'pt-br' => 'Portugués Brasilero',
'es-Ar' => 'Español Argentino',
'nb-no' => 'Noruego (Bokmål)'
],
'directory' => [
'create_fail' => "No se puede crear el directorio: :name",

View File

@ -20,6 +20,7 @@
'pt-br' => 'Portugués Brasilero',
'es-ar' => 'Español Argentino',
'es' => 'Español',
'nb-no' => 'Noruego (Bokmål)'
],
'directory' => [
'create_fail' => "No es posible crear el directorio: :name",

View File

@ -18,6 +18,7 @@ return [
'ro' => 'رومانیایی',
'pt-br' => 'پرتغالی برزیل',
'fa' => 'فارسی',
'nb-no' => 'نروژی (Bokmål)'
],
'directory' => [
'create_fail' => "مشکلی در ایجاد پوشه ی :name به وجود آمده است",

View File

@ -16,6 +16,7 @@ return [
'fr' => 'Français',
'pt-br' => 'Portugais-Brésilien',
'fa' => 'Persian',
'nb-no' => 'Norvégien (Bokmål)'
],
'directory' => [
'create_fail' => "Impossible de créer le répertoire : :name",

View File

@ -22,7 +22,8 @@ return [
'ro' => 'Román',
'ru' => 'Orosz',
'se' => 'Svéd',
'tr' => 'Török'
'tr' => 'Török',
'nb-no' => 'Norvég (Bokmål)'
],
'directory' => [
'create_fail' => 'Nem hozható létre a könyvtár: :name'

View File

@ -23,7 +23,8 @@ return [
'ru' => 'Rusia',
'se' => 'Swedia',
'sk' => 'Slowakia (Slovakia)',
'tr' => 'Turki'
'tr' => 'Turki',
'nb-no' => 'Norwegian (Bokmål)'
],
'directory' => [
'create_fail' => 'Tidak dapat membuat direktori: :name'

View File

@ -17,6 +17,7 @@ return [
'it' => 'Italiano',
'pt-br' => 'Portoghese (Brasile)',
'fa' => 'Persian',
'nb-no' => 'Norvegese (Bokmål)'
],
'directory' => [
'create_fail' => "Impossibile creare la cartella: :name",

View File

@ -20,7 +20,8 @@ return [
'ro' => 'Romanian',
'ru' => 'Russian',
'se' => 'Swedish',
'tr' => 'Turkish'
'tr' => 'Turkish',
'nb-no' => 'Norwegian (Bokmål)'
],
'directory' => [
'create_fail' => "ディレクトリ':name'を作成できません。",

View File

@ -0,0 +1,263 @@
<?php
return [
'app' => [
'name' => 'October CMS',
'tagline' => 'Getting back to basics'
],
'locale' => [
'en' => 'Engelsk',
'de' => 'Tysk',
'es' => 'Spansk',
'es-ar' => 'Spansk (Argentina)',
'fa' => 'Persisk',
'fr' => 'Fransk',
'hu' => 'Ungarsk',
'id' => 'Indonesisk',
'it' => 'Italiensk',
'ja' => 'Japansk',
'nl' => 'Nederlandsk',
'pl' => 'Polsk',
'pt-br' => 'Brasiliansk Portugisk',
'ro' => 'Rumensk',
'ru' => 'Russisk',
'se' => 'Svensk',
'sk' => 'Slovak (Slovakia)',
'tr' => 'Tyrkisk',
'nb-no' => 'Norwegian (Bokmål)'
],
'directory' => [
'create_fail' => 'Kan ikke opprette mappen: :name'
],
'file' => [
'create_fail' => 'Kan ikke opprette filen: :name'
],
'combiner' => [
'not_found' => "Kombinasjonsfilen ':name' ble ikke funnet."
],
'system' => [
'name' => 'System',
'menu_label' => 'System',
'categories' => [
'cms' => 'CMS',
'misc' => 'Div.',
'logs' => 'Logger',
'mail' => 'E-post',
'shop' => 'Shop',
'team' => 'Team',
'users' => 'Brukere',
'system' => 'System',
'social' => 'Sosialt',
'events' => 'Hendelser',
'customers' => 'Kunder',
'my_settings' => 'Mine innstillinger'
]
],
'plugin' => [
'unnamed' => 'Navnløs plugin',
'name' => [
'label' => 'Plugin-navn',
'help' => 'Navngi pluginen ved et unikt navn. For eksempel, RainLab.Blog'
]
],
'plugins' => [
'manage' => 'Håndtere plugins',
'enable_or_disable' => 'Aktivere eller deaktivere',
'enable_or_disable_title' => 'Aktivere eller deaktivere plugins',
'remove' => 'Fjern',
'refresh' => 'Oppdater',
'disabled_label' => 'Deaktivert',
'disabled_help' => 'Deaktiverte plugins blir ignorert av applikasjonen.',
'selected_amount' => 'Valgte plugins: :amount',
'remove_confirm' => 'Er du sikker?',
'remove_success' => 'Plugins har blitt fjernet fra systemet.',
'refresh_confirm' => 'Er du sikker?',
'refresh_success' => 'Plugins har blitt oppdatert i systemet.',
'disable_confirm' => 'Er du sikker?',
'disable_success' => 'Plugins har blitt deaktivert.',
'enable_success' => 'Plugins har blitt aktivert.',
'unknown_plugin' => 'Plugins har blitt fjernet fra systemet.'
],
'project' => [
'name' => 'Prosjekt',
'owner_label' => 'Eier',
'attach' => 'Tilkoble prosjekt',
'detach' => 'Avkoble prosjekt',
'none' => 'Ingen',
'id' => [
'label' => 'Prosjekt-ID',
'help' => 'Hvordan finne din prosjekt-ID',
'missing' => 'Vennligst spesifiser en prosjekt-ID.'
],
'detach_confirm' => 'Vil du virkelig avkoble dette prosjektet?',
'unbind_success' => 'Prosjektet har blitt avkoblet.'
],
'settings' => [
'menu_label' => 'Innstillinger',
'not_found' => 'Fant ikke spesifiserte innstilling.',
'missing_model' => 'Innstillingssiden mangler en modell-definisjon.',
'update_success' => 'Innstillingene for :name har blitt lagret.',
'return' => 'Tilbake til systeminnstillinger',
'search' => 'Søk'
],
'mail' => [
'log_file' => 'Loggfil',
'menu_label' => 'E-postinnstillinger',
'menu_description' => 'Administrere e-postinnstillinger.',
'general' => 'Generelt',
'method' => 'E-postmetode',
'sender_name' => 'Avsendernavn',
'sender_email' => 'Avsenderens e-postadresse',
'php_mail' => 'PHP mail',
'sendmail' => 'Sendmail',
'smtp' => 'SMTP',
'smtp_address' => 'SMTP-adresse',
'smtp_authorization' => 'SMTP-autentisering kreves',
'smtp_authorization_comment' => 'Kryss av dersom SMTP-tjeneren krever autentisering.',
'smtp_username' => 'Brukernavn',
'smtp_password' => 'Passord',
'smtp_port' => 'SMTP-port',
'smtp_ssl' => 'SSL-tilkobling påkrevd',
'sendmail' => 'Sendmail',
'sendmail_path' => 'Sendmail-sti',
'sendmail_path_comment' => 'Vennligst oppgi stien til sendmail-programmet.',
'mailgun' => 'Mailgun',
'mailgun_domain' => 'Mailgun-domene',
'mailgun_domain_comment' => 'Vennligst oppgi Mailgun-domenenavnet.',
'mailgun_secret' => 'Mailgun Secret',
'mailgun_secret_comment' => 'Oppgi din Mailgun-API-nøkkel.',
'mandrill' => 'Mandrill',
'mandrill_secret' => 'Mandrill Secret',
'mandrill_secret_comment' => 'Enter your Mandrill API key.'
],
'mail_templates' => [
'menu_label' => 'E-postmaler',
'menu_description' => 'Modifisere e-postmalene som blir sendt til brukere og administratorer, håndtere e-postlayouts.',
'new_template' => 'Ny mal',
'new_layout' => 'Ny layout',
'template' => 'Mal',
'templates' => 'Maler',
'menu_layouts_label' => 'E-postlayouts',
'layout' => 'Layout',
'layouts' => 'Layouts',
'name' => 'Navn',
'name_comment' => 'Unikt navn som tilknyttes denne layouten',
'code' => 'Code',
'code_comment' => 'Unik kode som tilknyttes denne malen',
'subject' => 'Emne',
'subject_comment' => 'Emnet til e-posten',
'description' => 'Beskrivelse',
'content_html' => 'HTML',
'content_css' => 'CSS',
'content_text' => 'Klartekst',
'test_send' => 'Send testmelding',
'test_success' => 'Testmeldingen har blitt sendt.',
'return' => 'Tilbake til malliste'
],
'install' => [
'project_label' => 'Tilkoble prosjekt',
'plugin_label' => 'Installér',
'missing_plugin_name' => 'Vennligst oppgi pluginens navn.',
'install_completing' => 'Fullfører installasjonen',
'install_success' => 'Plugin har blitt installert.'
],
'updates' => [
'title' => 'Håndtere oppdateringer',
'name' => 'Programvareoppdateringer',
'menu_label' => 'Oppdateringer',
'menu_description' => 'Oppdatere systemet, håndtere og installere plugins og themes.',
'check_label' => 'Se etter oppdateringer',
'retry_label' => 'Prøv igjen',
'plugin_name' => 'Navn',
'plugin_description' => 'Beskrivelse',
'plugin_version' => 'Versjon',
'plugin_author' => 'Utgiver',
'core_build' => 'Nåværende build',
'core_build_old' => 'Nåværende build :build',
'core_build_new' => 'Build :build',
'core_build_new_help' => 'Siste build er tilgjengelig.',
'core_downloading' => 'Laster ned applikasjonsfiler',
'core_extracting' => 'Pakker opp applikasjonsfiler',
'plugins' => 'Plugins',
'disabled' => 'Deaktivert',
'plugin_downloading' => 'Laster ned plugin: :name',
'plugin_extracting' => 'Pakker opp plugin: :name',
'plugin_version_none' => 'Ny plugin',
'plugin_version_old' => 'Nåværende v:version',
'plugin_version_new' => 'v:version',
'theme_label' => 'Theme',
'theme_new_install' => 'New theme installation.', # ---
'theme_downloading' => 'Laster ned theme: :name',
'theme_extracting' => 'Pakker opp theme: :name',
'update_label' => 'Oppdatér programvare',
'update_completing' => 'Ferdiggjør oppdatering',
'update_loading' => 'Henter tilgjengelige oppdateringer...',
'update_success' => 'Oppdatering har fullført.',
'update_failed_label' => 'Oppdateringen mislyktes',
'force_label' => 'Tving update',
'found' => [
'label' => 'Fant nye oppdateringer!',
'help' => 'Klikk på Oppdatér programvare for å oppdatere.'
],
'none' => [
'label' => 'Ingen oppdateringer',
'help' => 'Ingen nye oppdateringer ble funnet.'
]
],
'server' => [
'connect_error' => 'Kunne ikke koble til serveren.',
'response_not_found' => 'Oppdateringsserveren ble ikke funnet.',
'response_invalid' => 'Feilaktig respons fra serveren.',
'response_empty' => 'Tom respons fra serveren.',
'file_error' => 'Serveren kunne ikke levere pakken.',
'file_corrupt' => 'Pakken fra serveren er korrupt.'
],
'behavior' => [
'missing_property' => 'Klassen :class må definere egenskapen $:property som brukes av :behavior -egenskapen.'
],
'config' => [
'not_found' => 'Fant ikke konfigurasjonsfilen :file definert for for :location.',
'required' => "Konfigurasjon brukt i :location må angi verdien ':property'."
],
'zip' => [
'extract_failed' => "Kunne ikke pakke opp core-fil ':file'."
],
'event_log' => [
'hint' => 'Denne loggen viser en liste over potensielle feilmeldinger som oppstår i applikasjonen, for eksempel unntak og debugginginformasjon.',
'menu_label' => 'Hendelseslogg',
'menu_description' => 'Se systemloggmeldinger med registrert tid og detaljer.',
'empty_link' => 'Tøm hendelseslogg',
'empty_loading' => 'Tømmer hendelseslogg...',
'empty_success' => 'Hendelsesloggen er tømt.',
'return_link' => 'Tilbake til hendelseslogg',
'id' => 'ID',
'id_label' => 'Hendelses-ID',
'created_at' => 'Tid',
'message' => 'Melding',
'level' => 'Nivå'
],
'request_log' => [
'hint' => 'Denne loggen viser en liste over nettleserforespørsler som kan kreve oppmerksomhet. For eksempel, hvis en bruker besøker en side som ikke eksisterer, vil det bli oppført her med statuskode 404.',
'menu_label' => 'Forespørselslogg',
'menu_description' => 'Se feilaktige forespørsler, for eksempel Ikke funnet (404).',
'empty_link' => 'Tøm forespørselslogg',
'empty_loading' => 'Tømmer forespørselslogg...',
'empty_success' => 'Forespørselsloggen er tømt.',
'return_link' => 'Tilbake til forespørselslogg',
'id' => 'ID',
'id_label' => 'Logg-ID',
'count' => 'Antall',
'referer' => 'Referers',
'url' => 'URL',
'status_code' => 'Status'
],
'permissions' => [
'name' => 'System',
'manage_system_settings' => 'Håndtere systeminnstillinger',
'manage_software_updates' => 'Håndtere programvareoppdateringer',
'manage_mail_templates' => 'Håndtere e-postmaler',
'manage_mail_settings' => 'Håndtere e-postinnstillinger',
'manage_other_administrators' => 'Håndtere andre administratorer',
'view_the_dashboard' => 'Se dashboard'
]
];

View File

@ -0,0 +1,102 @@
<?php
/*
* Status: NOT complete.
*/
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| such as the size rules. Feel free to tweak each of these messages.
|
*/
"accepted" => ":attribute må aksepteres.",
"active_url" => ":attribute er ikke en gyldig URL.",
"after" => ":attribute må være en dato etter :date.",
"alpha" => ":attribute kan kun inneholde bokstaver.",
"alpha_dash" => ":attribute kan kun inneholde bokstaver, tall og bindestreker.",
"alpha_num" => ":attribute kan kun inneholde bokstaver og tall.",
"array" => ":attribute må være et array.",
"before" => ":attribute må være en dato før :date.",
"between" => [
"numeric" => ":attribute må være mellom :min - :max.",
"file" => ":attribute må være mellom :min - :max kilobytes.",
"string" => ":attribute må være mellom :min - :max tegn.",
"array" => ":attribute må ha mellom :min - :max elementer.",
],
"confirmed" => ":attribute bekreftelse samsvarer ikke.",
"date" => ":attribute er ikke en gyldig dato.",
"date_format" => ":attribute samsvarer ikke med formatet :format.",
"different" => ":attribute og :other må være forskjellig.",
"digits" => ":attribute må være :digits tall.",
"digits_between" => ":attribute må være mellom :min og :max tall.",
"email" => ":attribute format ugyldig.",
"exists" => "Valgt :attribute er ugyldig.",
"image" => ":attribute må være et bilde.",
"in" => "Valgt :attribute er ugyldig.",
"integer" => ":attribute må være et heltall.",
"ip" => ":attribute må være en gyldig IP-adresse.",
"max" => [
"numeric" => ":attribute kan ikke være større enn :max.",
"file" => ":attribute kan ikke være større enn :max kilobytes.",
"string" => ":attribute kan ikke inneholde mer enn :max tegn.",
"array" => ":attribute kan ikke ha mer enn :max elementer.",
],
"mimes" => ":attribute må være av filtype: :values.",
"min" => [
"numeric" => ":attribute må være minst :min.",
"file" => ":attribute må være minst :min kilobytes.",
"string" => ":attribute må være minst :min tegn.",
"array" => ":attribute må ha minst :min elementer.",
],
"not_in" => "Valgt :attribute er ugyldig.",
"numeric" => ":attribute må være et tall.",
"regex" => ":attribute format er ugyldig.",
"required" => ":attribute felt kreves.",
"required_if" => ":attribute felt kreves når :other er :value.",
"required_with" => ":attribute felt kreves når :values er til stede.",
"required_without" => ":attribute felt kreves når :values ikke er til stede.",
"same" => ":attribute og :other må samsvare.",
"size" => [
"numeric" => ":attribute må være :size.",
"file" => ":attribute må være :size kilobytes.",
"string" => ":attribute må være :size tegn.",
"array" => " :attribute må inneholde :size elementer.",
],
"unique" => ":attribute er allerede i bruk.",
"url" => ":attribute format er ugyldig.",
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [],
);

View File

@ -18,6 +18,7 @@ return [
'ro' => 'Roemeens',
'pt-br' => 'Braziliaans Portugees',
'fa' => 'Persian',
'nb-no' => 'Noors (Bokmål)'
],
'directory' => [
'create_fail' => "Map aanmaken mislukt: :name",

View File

@ -21,7 +21,8 @@ return [
'ru' => 'Rosyjski',
'se' => 'Szwedzki',
'tr' => 'Turecki',
'pl' => 'Polski'
'pl' => 'Polski',
'nb-no' => 'Norweski (Bokmål)'
],
'directory' => [
'create_fail' => 'Nie można stworzyć katalogu: :name'

View File

@ -7,32 +7,39 @@ return [
],
'locale' => [
'en' => 'Inglês',
'nl' => 'Holandês',
'ja' => 'Japonês',
'se' => 'Sueco',
'tr' => 'Turco',
'de' => 'Alemão',
'ru' => 'Russo',
'es' => 'Espanhol',
'es-ar' => 'Espanhol da Argentina',
'fa' => 'Persa',
'fr' => 'Francês',
'hu' => 'Húngaro',
'id' => 'Indonésio',
'it' => 'Italiano',
'ro' => 'Romano',
'ja' => 'Japonês',
'nl' => 'Holandês ',
'pl' => 'Polonês',
'pt-br' => 'Português do Brasil',
'fa' => 'Persian',
'ro' => 'Romeno',
'ru' => 'Russo',
'se' => 'Sueco',
'sk' => 'Eslovaco',
'tr' => 'Turco',
'nb-no' => 'Norueguês (Bokmål)'
],
'directory' => [
'create_fail' => "Não é possível criar o diretório: :name",
'create_fail' => 'Não é possível criar o diretório: :name',
],
'file' => [
'create_fail' => "Não é possível criar o arquivo: :name",
'create_fail' => 'Não é possível criar o arquivo: :name',
],
'combiner' => [
'not_found' => "O arquivo combinador ':name' não foi encontrado.",
'not_found' => 'O arquivo combinador ":name" não foi encontrado.',
],
'system' => [
'name' => 'Sistema',
'menu_label' => 'Sistema',
'categories' => [
'cms' => 'Temas',
'cms' => 'CMS',
'misc' => 'Diversos',
'logs' => 'Registros',
'mail' => 'E-mail',
@ -44,13 +51,13 @@ return [
'events' => 'Eventos',
'customers' => 'Clientes',
'my_settings' => 'Configurações',
],
]
],
'plugin' => [
'unnamed' => 'Plugin não nomeado',
'unnamed' => 'Plugin sem nome',
'name' => [
'label' => 'Nome do Plugin',
'help' => 'Nome do plugin pelo seu código único. Por exemplo, RainLab.Blog',
'help' => 'Nomeie o plugin pelo seu código exclusivo. Por exemplo, RainLab.Blog',
],
],
'plugins' => [
@ -63,13 +70,13 @@ return [
'disabled_help' => 'Plugins que estão desabilitados são ignorados pela aplicação.',
'selected_amount' => 'Plugins selecionados: :amount',
'remove_confirm' => 'Você tem certeza?',
'remove_success' => "Plugins removidos com sucesso do sistema.",
'remove_success' => 'Plugins removidos com sucesso do sistema.',
'refresh_confirm' => 'Você tem certeza?',
'refresh_success' => "Plugins atualizados com sucesso.",
'refresh_success' => 'Plugins atualizados com sucesso.',
'disable_confirm' => 'Você tem certeza?',
'disable_success' => "Plugins desabilitados com sucesso.",
'enable_success' => "Plugins habilitados com sucesso.",
'unknown_plugin' => "Plugin removido do sistema de arquivos.",
'disable_success' => 'Plugins desabilitados com sucesso.',
'enable_success' => 'Plugins habilitados com sucesso.',
'unknown_plugin' => 'Plugin removido do sistema de arquivos.',
],
'project' => [
'name' => 'Projeto',
@ -79,26 +86,29 @@ return [
'none' => 'Nenhum',
'id' => [
'label' => 'ID do Projeto',
'help' => 'Como encontrar o ID do seu projeto?',
'missing' => 'Por favor, especifique um ID de Projeto para usar.',
'help' => 'Como encontrar o ID do seu projeto',
'missing' => 'Por favor, forneça um ID de projeto para usar.',
],
'detach_confirm' => 'Tem certeza de que deseja desanexar este projeto?',
'detach_confirm' => 'Tem certeza que deseja desanexar este projeto?',
'unbind_success' => 'Projeto desanexado com sucesso.',
],
'settings' => [
'menu_label' => 'Configurações',
'missing_model' => 'A página de configurações está faltando uma definição de modelo.',
'not_found' => 'Impossível encontrar as configurações solicitadas.',
'missing_model' => 'Falta uma definição de model na página de configurações.',
'update_success' => 'Configurações para :name foram atualizados com sucesso.',
'return' => 'Retornar para as configurações do sistema',
'search' => 'Buscar'
'search' => 'Buscar',
],
'mail' => [
'log_file' => 'Arquivo de registro',
'menu_label' => 'Configurações de E-mail',
'menu_description' => 'Gerenciar configurações de e-mail.',
'general' => 'Geral',
'method' => 'Método de Envio',
'sender_name' => 'Nome do Remetente',
'sender_email' => 'E-mail do Remetente',
'php_mail' => 'PHP mail',
'smtp' => 'SMTP',
'smtp_address' => 'Endereço SMTP',
'smtp_authorization' => 'Autenticação SMTP obrigatória',
@ -110,21 +120,29 @@ return [
'sendmail' => 'Sendmail',
'sendmail_path' => 'Caminho do Sendmail',
'sendmail_path_comment' => 'Por favor, especifique o caminho do programa sendmail.',
'mailgun' => 'Mailgun',
'mailgun_domain' => 'Domínio do Mailgun',
'mailgun_domain_comment' => 'Por favor, forneça o domínio do Mailgun.',
'mailgun_secret' => 'Mailgun Secret',
'mailgun_secret_comment' => 'Forneça sua chave de API do Mailgun.',
'mandrill' => 'Mandrill',
'mandrill_secret' => 'Mandrill Secret',
'mandrill_secret_comment' => 'Forneça sua chave de API do Mandrill',
],
'mail_templates' => [
'menu_label' => 'Modelos de E-mail',
'menu_description' => 'Modificar os modelos de e-mail que são enviados para usuários e administradores.',
'new_template' => 'Novo modelo',
'menu_label' => 'Templates de E-mail',
'menu_description' => 'Modificar os templates dos e-mails que são enviados para usuários e administradores.',
'new_template' => 'Novo template',
'new_layout' => 'Novo layout',
'template' => 'Modelo',
'templates' => 'Modelos',
'template' => 'Template',
'templates' => 'Templates',
'menu_layouts_label' => 'Layouts de E-mail',
'layout' => 'Layout',
'layouts' => 'Layouts',
'name' => 'Nome',
'name_comment' => 'Nome exclusivo usado para se referir à este modelo',
'name_comment' => 'Nome exclusivo usado para se referir a este template',
'code' => 'Código',
'code_comment' => 'Código único usado para se referir à este modelo',
'code_comment' => 'Código exclusivo usado para se referir a este template',
'subject' => 'Assunto',
'subject_comment' => 'Assunto da mensagem',
'description' => 'Descrição',
@ -133,13 +151,13 @@ return [
'content_text' => 'Texto Simples',
'test_send' => 'Enviar mensagem de teste',
'test_success' => 'Mensagem de teste enviada com sucesso.',
'return' => 'Retornar à lista de modelos'
'return' => 'Retornar à lista de templates'
],
'install' => [
'project_label' => 'Anexar ao projeto',
'plugin_label' => 'Instalar plugin',
'missing_plugin_name' => 'Por favor, especifique um nome de plugin para instalar.',
'install_completing' => 'Finalizando processo de instalação.',
'install_completing' => 'Finalizando processo de instalação',
'install_success' => 'O plugin foi instalado com sucesso.',
],
'updates' => [
@ -158,7 +176,9 @@ return [
'core_build_new' => 'Compilação :build',
'core_build_new_help' => 'Última versão está disponível.',
'core_downloading' => 'Baixando arquivos do aplicativo',
'core_extracting' => 'Desempacotando arquivos de aplicativos',
'core_extracting' => 'Desempacotando arquivos do aplicativo',
'plugins' => 'Plugins',
'disabled' => 'Desabilitados',
'plugin_downloading' => 'Baixando o plugin: :name',
'plugin_extracting' => 'Desempacotando o plugin: :name',
'plugin_version_none' => 'Novo plugin',
@ -171,43 +191,43 @@ return [
'update_label' => 'Atualizar o software',
'update_completing' => 'Finalizando processo de atualização',
'update_loading' => 'Carregando atualizações disponíveis...',
'update_success' => 'O processo de atualização foi realizada com sucesso.',
'update_success' => 'O processo de atualização foi realizado com sucesso.',
'update_failed_label' => 'Falha na atualização',
'force_label' => 'Forçar atualização',
'found' => [
'label' => 'Encontrado novas atualizações!',
'label' => 'Atualizações encontradas!',
'help' => 'Clique Atualizar o software para iniciar o processo de atualização.',
],
'none' => [
'label' => 'Não há atualizações',
'label' => 'Nenhuma atualização',
'help' => 'Não há novas atualizações.',
],
],
'server' => [
'connect_error' => 'Erro ao conectar-se ao servidor.',
'connect_error' => 'Erro ao conectar-se com o servidor.',
'response_not_found' => 'O servidor de atualização não pôde ser encontrado.',
'response_invalid' => 'Resposta inválida do servidor.',
'response_empty' => 'Resposta vazia a partir do servidor.',
'response_empty' => 'Resposta vazia do servidor.',
'file_error' => 'Servidor não conseguiu entregar o pacote.',
'file_corrupt' => 'Arquivo do servidor está corrompido.',
],
'behavior' => [
'missing_property' => 'Classe :class deve definir a $:property imóvel usado por:behavior comportamento.',
'missing_property' => 'Classe :class deve definir a propriedade $:property usada pelo :behavior behavior.',
],
'config' => [
'not_found' => 'Não foi possível localizar arquivos de configuração :file definido para :location.',
'not_found' => 'Não foi possível localizar o arquivo de configuração :file definido para :location.',
'required' => 'Configuração usada em :location deve fornecer um valor :property.',
],
'zip' => [
'extract_failed' => "Não foi possível extrair arquivo core ':file'.",
'extract_failed' => 'Não foi possível extrair arquivo do core ":file".',
],
'event_log' => [
'hint' => 'Este registro mostra a lista dos potenciais erros que ocorreram na aplicação, assim como as exceções e informações de depuração.',
'hint' => 'Este registro mostra a lista dos potenciais erros que ocorreram na aplicação, como exceções e informações de depuração.',
'menu_label' => 'Registro de Eventos',
'menu_description' => 'Visualize as mensagens do sistema, com o tempo de registro e detalhes.',
'empty_link' => 'Registro de eventos vazio',
'empty_loading' => 'Limpando registro de eventos...',
'empty_success' => 'Registro de eventos limpo com sucesso.',
'menu_description' => 'Visualize as mensagens do sistema, com horário e detalhes.',
'empty_link' => 'Esvaziar registro de eventos',
'empty_loading' => 'Esvaziando registro de eventos...',
'empty_success' => 'Registro de eventos esvaziado com sucesso.',
'return_link' => 'Retornar ao registro de eventos',
'id' => 'ID',
'id_label' => 'ID do Evento',
@ -216,25 +236,27 @@ return [
'level' => 'Nível',
],
'request_log' => [
'hint' => 'Este registro mostra a lista de requisições do navegador que requerem atenção. Por exemplo, se um usuário acessar uma página inexistente, será armazenado o registro nesta lista.',
'hint' => 'Este registro mostra uma lista de requisições que requerem atenção. Por exemplo, se um usuário solicitar uma página não encontrada, será registrado com o status 404.',
'menu_label' => 'Registro de Requisições',
'menu_description' => 'Visualize requisições com problema na aplicação, como Página não encontrada (404).',
'empty_link' => 'Registro de requisições vazio.',
'empty_loading' => 'Limpando registro de requisições...',
'empty_success' => 'Registro de requisições limpo com sucesso.',
'menu_description' => 'Visualize requisições malsucedidas na aplicação, como Página não encontrada (404).',
'empty_link' => 'Esvaziar registro de requisições.',
'empty_loading' => 'Esvaziando registro de requisições...',
'empty_success' => 'Registro de requisições esvaziado com sucesso.',
'return_link' => 'Retornar ao registro de requisições',
'id' => 'ID',
'id_label' => 'ID',
'id_label' => 'ID do registro',
'count' => 'Contador',
'referer' => 'Referentes',
'referer' => 'Referers',
'url' => 'URL',
'status_code' => 'Código',
'status_code' => 'Status',
],
'permissions' => [
'name' => 'System',
'manage_system_settings' => 'Gerenciar configurações do sistema',
'manage_software_updates' => 'Gerenciar atualizações',
'manage_mail_templates' => 'Gerenciar modelos de e-mail',
'manage_mail_templates' => 'Gerenciar templates de e-mail',
'manage_mail_settings' => 'Gerenciar configurações de e-mail',
'manage_other_administrators' => 'Gerenciar outros administradores',
'view_the_dashboard' => 'Visualizar o painel'
]
'view_the_dashboard' => 'Visualizar o painel',
],
];

View File

@ -1,6 +1,6 @@
<?php
return array(
return [
/*
|--------------------------------------------------------------------------
@ -13,61 +13,61 @@ return array(
|
*/
"accepted" => "O :attribute deve ser aceito.",
"active_url" => "O :attribute não é uma URL válida.",
"after" => "O :attribute deve ser uma data após :date.",
"alpha" => "O :attribute só pode conter letras.",
"alpha_dash" => "O :attribute só pode conter letras, números e traços.",
"alpha_num" => "O :attribute só pode conter letras e números.",
"array" => "O :attribute deve ser uma matriz.",
"before" => "O :attribute deve ser uma data antes :date.",
"between" => array(
"numeric" => "O :attribute deve situar-se entre :min - :max.",
"file" => "O :attribute deve situar-se entre :min - :max kilobytes.",
"string" => "O :attribute deve situar-se entre :min - :max carácteres.",
"array" => "O :attribute tem de ter entre :min - :max itens.",
),
"confirmed" => "O :attribute confirmação não corresponde.",
"date" => "O :attribute não é uma data válida.",
"date_format" => "O :attribute não coincide com o formato :format.",
"different" => "O :attribute e :other deve ser diferente.",
"digits" => "O :attribute deve ser :digits dígitos.",
"digits_between" => "O :attribute deve situar-se entre :min e :max dígitos.",
"email" => "O :attribute formato é inválido.",
"exists" => "O :attribute selecioado é inválido.",
"image" => "O :attribute deve ser uma imagem.",
"in" => "O :attribute selecioado é inválido.",
"integer" => "O :attribute deve ser um número inteiro.",
"ip" => "O :attribute deve ser um endereço IP válido.",
"max" => array(
"numeric" => "O :attribute não pode ser maior do que :max.",
"file" => "O :attribute não pode ser maior do que :max kilobytes.",
"string" => "O :attribute não pode ser maior do que :max carácteres.",
"array" => "O :attribute não podem ter mais do que :max itens.",
),
"mimes" => "O :attribute deve ser um arquivo do tipo: :values.",
"min" => array(
"numeric" => "O :attribute deve ser de pelo menos :min.",
"file" => "O :attribute deve ser de pelo menos :min kilobytes.",
"string" => "O :attribute deve ser de pelo menos :min carácteres.",
"array" => "O :attribute deve ter pelo menos :min itens.",
),
"not_in" => "O :attribute selecionado é inválido.",
"numeric" => "O :attribute deve ser um número.",
"regex" => "O :attribute formato é inválido.",
"required" => "O campo :attribute é obrigatório.",
"required_if" => "O campo :attribute é obrigatório quando :other é :value.",
"required_with" => "O campo :attribute é obrigatório quando :values está presente.",
"required_without" => "O campo :attribute é obrigatório quando :values não está presente.",
"same" => "O campo :attribute e :other devem corresponder.",
"size" => array(
"numeric" => "O :attribute deve ser :size.",
"file" => "O :attribute deve ser :size kilobytes.",
"string" => "O :attribute deve ser :size carácteres.",
"array" => "O :attribute deve conter :size itens.",
),
"unique" => "O :attribute já foi utilizado.",
"url" => "O :attribute formato é inválido.",
'accepted' => ':attribute deve ser aceito.',
'active_url' => ':attribute não é uma URL válida.',
'after' => ':attribute deve ser uma data após :date.',
'alpha' => ':attribute só pode conter letras.',
'alpha_dash' => ':attribute só pode conter letras, números e traços.',
'alpha_num' => ':attribute só pode conter letras e números.',
'array' => ':attribute deve ser uma matriz.',
'before' => ':attribute deve ser uma data antes :date.',
'between' => [
'numeric' => ':attribute deve situar-se entre :min e :max.',
'file' => ':attribute deve ter entre :min e :max kilobytes.',
'string' => ':attribute deve ter entre :min e :max caracteres.',
'array' => ':attribute deve ter entre :min e :max itens.',
],
'confirmed' => 'A confirmação de :attribute não corresponde.',
'date' => ':attribute não é uma data válida.',
'date_format' => ':attribute não coincide com o formato :format.',
'different' => ':attribute e :other devem ser diferentes.',
'digits' => ':attribute deve ser :digits dígitos.',
'digits_between' => ':attribute deve ter entre :min e :max dígitos.',
'email' => 'Formato de :attribute é inválido.',
'exists' => ':attribute selecionado é inválido.',
'image' => ':attribute deve ser uma imagem.',
'in' => ':attribute selecionado é inválido.',
'integer' => ':attribute deve ser um número inteiro.',
'ip' => ':attribute deve ser um endereço IP válido.',
'max' => [
'numeric' => ':attribute não pode ser maior do que :max.',
'file' => ':attribute não pode ser maior do que :max kilobytes.',
'string' => ':attribute não pode ser maior do que :max caracteres.',
'array' => ':attribute não pode ter mais que :max itens.',
],
'mimes' => ':attribute deve ser um arquivo do tipo: :values.',
'min' => [
'numeric' => ':attribute deve ser no mínimo :min.',
'file' => ':attribute deve ter pelo menos :min kilobytes.',
'string' => ':attribute deve ter pelo menos :min caracteres.',
'array' => ':attribute deve ter pelo menos :min itens.',
],
'not_in' => ':attribute selecionado é inválido.',
'numeric' => ':attribute deve ser um número.',
'regex' => 'Formato de :attribute é inválido.',
'required' => 'O campo :attribute é obrigatório.',
'required_if' => 'O campo :attribute é obrigatório quando :other é :value.',
'required_with' => 'O campo :attribute é obrigatório quando :values está presente.',
'required_without' => 'O campo :attribute é obrigatório quando :values não está presente.',
'same' => 'O campo :attribute e :other devem corresponder.',
'size' => [
'numeric' => ':attribute deve ser :size.',
'file' => ':attribute deve ser :size kilobytes.',
'string' => ':attribute deve ter :size caracteres.',
'array' => ':attribute deve conter :size itens.',
],
'unique' => ':attribute já está sendo utilizado.',
'url' => 'Formato de :attribute é inválido.',
/*
|--------------------------------------------------------------------------
@ -75,12 +75,12 @@ return array(
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| convention 'attribute.rule' to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => array(),
'custom' => [],
/*
|--------------------------------------------------------------------------
@ -89,10 +89,10 @@ return array(
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
| of 'email'. This simply helps us make messages a little cleaner.
|
*/
'attributes' => array(),
'attributes' => [],
);
];

View File

@ -17,6 +17,7 @@ return [
'ro' => 'Romana',
'pt-br' => 'Portugheza (Brazilia)',
'fa' => 'Persian',
'nb-no' => 'Norvegiană (Bokmål)'
],
'directory' => [
'create_fail' => "Nu se poate crea directorul: :name",

View File

@ -24,6 +24,7 @@ return [
'se' => 'Swedish',
'sk' => 'Slovak (Slovakia)',
'tr' => 'Turkish'
'nb-no' => 'Norwegian (Bokmål)'
],
'directory' => [
'create_fail' => 'Невозможно создать директорию: :name',

View File

@ -24,6 +24,7 @@ return [
'se' => 'Swedish',
'sk' => 'Slovak (Slovakia)',
'tr' => 'Turkish'
'nb-no' => 'Norska (Bokmål)'
],
'directory' => [
'create_fail' => "Kunde inte skapa mapp: :name",

View File

@ -20,7 +20,8 @@ return [
'ro' => 'Română (România)',
'ru' => 'Русский (Россия - Russia)',
'se' => 'Svenska (Sverige)',
'tr' => 'Türkçe (Türkiye)'
'tr' => 'Türkçe (Türkiye)',
'nb-no' => 'Norwegian (Bokmål)'
],
'directory' => [
'create_fail' => "Klasör oluşturulamıyor: :name"

View File

@ -24,7 +24,8 @@ return [
'se' => 'Swedish',
'sk' => 'Slovak (Slovakia)',
'tr' => 'Turkish',
'zh-cn' => 'Chinese (China)'
'zh-cn' => 'Chinese (China)',
'nb-no' => 'Norwegian (Bokmål)'
],
'directory' => [
'create_fail' => '不能创建目录: :name'
@ -226,8 +227,8 @@ return [
'hint' => '日志显示了程序中的潜在错误, 比如异常和调试信息.',
'menu_label' => '事件日志',
'menu_description' => '查看系统日志信息, 包括时间和详细信息.',
'empty_link' => '空事件日志',
'empty_loading' => '空事件日志...',
'empty_link' => '空事件日志',
'empty_loading' => '空事件日志...',
'empty_success' => '成功清空时间日志.',
'return_link' => '返回时间日志',
'id' => 'ID',
@ -240,8 +241,8 @@ return [
'hint' => '这个日志显示了需要注意的浏览器请求. 比如如果一个访问者打开一个没有的CMS页面, 一条返回状态404的记录被创建.',
'menu_label' => '请求日志',
'menu_description' => '查看坏的或者重定向的请求, 比如页面找不到(404).',
'empty_link' => '空请求日志',
'empty_loading' => '空请求日志...',
'empty_link' => '空请求日志',
'empty_loading' => '空请求日志...',
'empty_success' => '成功清空请求日志.',
'return_link' => '返回请求日志',
'id' => 'ID',

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,8 @@
/* ========================================================================
* Bootstrap: affix.js v3.1.0
* Bootstrap: affix.js v3.3.4
* http://getbootstrap.com/javascript/#affix
* ========================================================================
* Copyright 2011-2014 Twitter, Inc.
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@ -15,28 +15,54 @@
var Affix = function (element, options) {
this.options = $.extend({}, Affix.DEFAULTS, options)
this.$window = $(window)
this.$target = $(this.options.target)
.on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
.on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
this.$element = $(element)
this.affixed =
this.unpin =
this.affixed = null
this.unpin = null
this.pinnedOffset = null
this.checkPosition()
}
Affix.RESET = 'affix affix-top affix-bottom'
Affix.VERSION = '3.3.4'
Affix.RESET = 'affix affix-top affix-bottom'
Affix.DEFAULTS = {
offset: 0
offset: 0,
target: window
}
Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
var scrollTop = this.$target.scrollTop()
var position = this.$element.offset()
var targetHeight = this.$target.height()
if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
if (this.affixed == 'bottom') {
if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
}
var initializing = this.affixed == null
var colliderTop = initializing ? scrollTop : position.top
var colliderHeight = initializing ? targetHeight : height
if (offsetTop != null && scrollTop <= offsetTop) return 'top'
if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
return false
}
Affix.prototype.getPinnedOffset = function () {
if (this.pinnedOffset) return this.pinnedOffset
this.$element.removeClass(Affix.RESET).addClass('affix')
var scrollTop = this.$window.scrollTop()
var scrollTop = this.$target.scrollTop()
var position = this.$element.offset()
return (this.pinnedOffset = position.top - scrollTop)
}
@ -48,43 +74,41 @@
Affix.prototype.checkPosition = function () {
if (!this.$element.is(':visible')) return
var scrollHeight = $(document).height()
var scrollTop = this.$window.scrollTop()
var position = this.$element.offset()
var height = this.$element.height()
var offset = this.options.offset
var offsetTop = offset.top
var offsetBottom = offset.bottom
if (this.affixed == 'top') position.top += scrollTop
var scrollHeight = $(document.body).height()
if (typeof offset != 'object') offsetBottom = offsetTop = offset
if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
if (this.affixed === affix) return
if (this.unpin) this.$element.css('top', '')
if (this.affixed != affix) {
if (this.unpin != null) this.$element.css('top', '')
var affixType = 'affix' + (affix ? '-' + affix : '')
var e = $.Event(affixType + '.bs.affix')
var affixType = 'affix' + (affix ? '-' + affix : '')
var e = $.Event(affixType + '.bs.affix')
this.$element.trigger(e)
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
if (e.isDefaultPrevented()) return
this.affixed = affix
this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
this.affixed = affix
this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
this.$element
.removeClass(Affix.RESET)
.addClass(affixType)
.trigger($.Event(affixType.replace('affix', 'affixed')))
this.$element
.removeClass(Affix.RESET)
.addClass(affixType)
.trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
}
if (affix == 'bottom') {
this.$element.offset({ top: scrollHeight - offsetBottom - this.$element.height() })
this.$element.offset({
top: scrollHeight - height - offsetBottom
})
}
}
@ -92,9 +116,7 @@
// AFFIX PLUGIN DEFINITION
// =======================
var old = $.fn.affix
$.fn.affix = function (option) {
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.affix')
@ -105,6 +127,9 @@
})
}
var old = $.fn.affix
$.fn.affix = Plugin
$.fn.affix.Constructor = Affix
@ -127,10 +152,10 @@
data.offset = data.offset || {}
if (data.offsetBottom) data.offset.bottom = data.offsetBottom
if (data.offsetTop) data.offset.top = data.offsetTop
if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
if (data.offsetTop != null) data.offset.top = data.offsetTop
$spy.affix(data)
Plugin.call($spy, data)
})
})

View File

@ -1,8 +1,8 @@
/* ========================================================================
* Bootstrap: alert.js v3.1.0
* Bootstrap: alert.js v3.3.4
* http://getbootstrap.com/javascript/#alerts
* ========================================================================
* Copyright 2011-2014 Twitter, Inc.
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@ -18,6 +18,10 @@
$(el).on('click', dismiss, this.close)
}
Alert.VERSION = '3.3.4'
Alert.TRANSITION_DURATION = 150
Alert.prototype.close = function (e) {
var $this = $(this)
var selector = $this.attr('data-target')
@ -32,7 +36,7 @@
if (e) e.preventDefault()
if (!$parent.length) {
$parent = $this.hasClass('alert') ? $this : $this.parent()
$parent = $this.closest('.alert')
}
$parent.trigger(e = $.Event('close.bs.alert'))
@ -42,13 +46,14 @@
$parent.removeClass('in')
function removeElement() {
$parent.trigger('closed.bs.alert').remove()
// detach from parent, fire event then clean up data
$parent.detach().trigger('closed.bs.alert').remove()
}
$.support.transition && $parent.hasClass('fade') ?
$parent
.one($.support.transition.end, removeElement)
.emulateTransitionEnd(150) :
.one('bsTransitionEnd', removeElement)
.emulateTransitionEnd(Alert.TRANSITION_DURATION) :
removeElement()
}
@ -56,9 +61,7 @@
// ALERT PLUGIN DEFINITION
// =======================
var old = $.fn.alert
$.fn.alert = function (option) {
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.alert')
@ -68,6 +71,9 @@
})
}
var old = $.fn.alert
$.fn.alert = Plugin
$.fn.alert.Constructor = Alert

View File

@ -1,8 +1,8 @@
/* ========================================================================
* Bootstrap: button.js v3.1.0
* Bootstrap: button.js v3.3.4
* http://getbootstrap.com/javascript/#buttons
* ========================================================================
* Copyright 2011-2014 Twitter, Inc.
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@ -19,6 +19,8 @@
this.isLoading = false
}
Button.VERSION = '3.3.4'
Button.DEFAULTS = {
loadingText: 'loading...'
}
@ -31,12 +33,12 @@
state = state + 'Text'
if (!data.resetText) $el.data('resetText', $el[val]())
$el[val](data[state] || this.options[state])
if (data.resetText == null) $el.data('resetText', $el[val]())
// push to event loop to allow forms to submit
setTimeout($.proxy(function () {
$el[val](data[state] == null ? this.options[state] : data[state])
if (state == 'loadingText') {
this.isLoading = true
$el.addClass(d).attr(d, d)
@ -58,6 +60,8 @@
else $parent.find('.active').removeClass('active')
}
if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
} else {
this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
}
if (changed) this.$element.toggleClass('active')
@ -67,9 +71,7 @@
// BUTTON PLUGIN DEFINITION
// ========================
var old = $.fn.button
$.fn.button = function (option) {
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.button')
@ -82,6 +84,9 @@
})
}
var old = $.fn.button
$.fn.button = Plugin
$.fn.button.Constructor = Button
@ -97,11 +102,15 @@
// BUTTON DATA-API
// ===============
$(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {
var $btn = $(e.target)
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
$btn.button('toggle')
e.preventDefault()
})
$(document)
.on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
var $btn = $(e.target)
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
Plugin.call($btn, 'toggle')
e.preventDefault()
})
.on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
$(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
})
}(jQuery);

View File

@ -1,8 +1,8 @@
/* ========================================================================
* Bootstrap: carousel.js v3.1.0
* Bootstrap: carousel.js v3.3.4
* http://getbootstrap.com/javascript/#carousel
* ========================================================================
* Copyright 2011-2014 Twitter, Inc.
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@ -17,24 +17,42 @@
this.$element = $(element)
this.$indicators = this.$element.find('.carousel-indicators')
this.options = options
this.paused =
this.sliding =
this.interval =
this.$active =
this.paused = null
this.sliding = null
this.interval = null
this.$active = null
this.$items = null
this.options.pause == 'hover' && this.$element
.on('mouseenter', $.proxy(this.pause, this))
.on('mouseleave', $.proxy(this.cycle, this))
this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
.on('mouseenter.bs.carousel', $.proxy(this.pause, this))
.on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
}
Carousel.VERSION = '3.3.4'
Carousel.TRANSITION_DURATION = 600
Carousel.DEFAULTS = {
interval: 5000,
pause: 'hover',
wrap: true
wrap: true,
keyboard: true
}
Carousel.prototype.cycle = function (e) {
Carousel.prototype.keydown = function (e) {
if (/input|textarea/i.test(e.target.tagName)) return
switch (e.which) {
case 37: this.prev(); break
case 39: this.next(); break
default: return
}
e.preventDefault()
}
Carousel.prototype.cycle = function (e) {
e || (this.paused = false)
this.interval && clearInterval(this.interval)
@ -46,23 +64,31 @@
return this
}
Carousel.prototype.getActiveIndex = function () {
this.$active = this.$element.find('.item.active')
this.$items = this.$active.parent().children()
Carousel.prototype.getItemIndex = function (item) {
this.$items = item.parent().children('.item')
return this.$items.index(item || this.$active)
}
return this.$items.index(this.$active)
Carousel.prototype.getItemForDirection = function (direction, active) {
var activeIndex = this.getItemIndex(active)
var willWrap = (direction == 'prev' && activeIndex === 0)
|| (direction == 'next' && activeIndex == (this.$items.length - 1))
if (willWrap && !this.options.wrap) return active
var delta = direction == 'prev' ? -1 : 1
var itemIndex = (activeIndex + delta) % this.$items.length
return this.$items.eq(itemIndex)
}
Carousel.prototype.to = function (pos) {
var that = this
var activeIndex = this.getActiveIndex()
var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
if (pos > (this.$items.length - 1) || pos < 0) return
if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) })
if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
if (activeIndex == pos) return this.pause().cycle()
return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
}
Carousel.prototype.pause = function (e) {
@ -90,22 +116,20 @@
Carousel.prototype.slide = function (type, next) {
var $active = this.$element.find('.item.active')
var $next = next || $active[type]()
var $next = next || this.getItemForDirection(type, $active)
var isCycling = this.interval
var direction = type == 'next' ? 'left' : 'right'
var fallback = type == 'next' ? 'first' : 'last'
var that = this
if (!$next.length) {
if (!this.options.wrap) return
$next = this.$element.find('.item')[fallback]()
}
if ($next.hasClass('active')) return (this.sliding = false)
if ($next.hasClass('active')) return this.sliding = false
var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
var relatedTarget = $next[0]
var slideEvent = $.Event('slide.bs.carousel', {
relatedTarget: relatedTarget,
direction: direction
})
this.$element.trigger(slideEvent)
if (slideEvent.isDefaultPrevented()) return
this.sliding = true
@ -113,30 +137,31 @@
if (this.$indicators.length) {
this.$indicators.find('.active').removeClass('active')
this.$element.one('slid.bs.carousel', function () {
var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
$nextIndicator && $nextIndicator.addClass('active')
})
var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
$nextIndicator && $nextIndicator.addClass('active')
}
var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
if ($.support.transition && this.$element.hasClass('slide')) {
$next.addClass(type)
$next[0].offsetWidth // force reflow
$active.addClass(direction)
$next.addClass(direction)
$active
.one($.support.transition.end, function () {
.one('bsTransitionEnd', function () {
$next.removeClass([type, direction].join(' ')).addClass('active')
$active.removeClass(['active', direction].join(' '))
that.sliding = false
setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)
setTimeout(function () {
that.$element.trigger(slidEvent)
}, 0)
})
.emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
.emulateTransitionEnd(Carousel.TRANSITION_DURATION)
} else {
$active.removeClass('active')
$next.addClass('active')
this.sliding = false
this.$element.trigger('slid.bs.carousel')
this.$element.trigger(slidEvent)
}
isCycling && this.cycle()
@ -148,9 +173,7 @@
// CAROUSEL PLUGIN DEFINITION
// ==========================
var old = $.fn.carousel
$.fn.carousel = function (option) {
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.carousel')
@ -164,6 +187,9 @@
})
}
var old = $.fn.carousel
$.fn.carousel = Plugin
$.fn.carousel.Constructor = Carousel
@ -179,26 +205,32 @@
// CAROUSEL DATA-API
// =================
$(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
var $this = $(this), href
var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
var clickHandler = function (e) {
var href
var $this = $(this)
var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
if (!$target.hasClass('carousel')) return
var options = $.extend({}, $target.data(), $this.data())
var slideIndex = $this.attr('data-slide-to')
if (slideIndex) options.interval = false
$target.carousel(options)
Plugin.call($target, options)
if (slideIndex = $this.attr('data-slide-to')) {
if (slideIndex) {
$target.data('bs.carousel').to(slideIndex)
}
e.preventDefault()
})
}
$(document)
.on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
.on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
$(window).on('load', function () {
$('[data-ride="carousel"]').each(function () {
var $carousel = $(this)
$carousel.carousel($carousel.data())
Plugin.call($carousel, $carousel.data())
})
})

View File

@ -1,8 +1,8 @@
/* ========================================================================
* Bootstrap: collapse.js v3.1.0
* Bootstrap: collapse.js v3.3.4
* http://getbootstrap.com/javascript/#collapse
* ========================================================================
* Copyright 2011-2014 Twitter, Inc.
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@ -16,12 +16,23 @@
var Collapse = function (element, options) {
this.$element = $(element)
this.options = $.extend({}, Collapse.DEFAULTS, options)
this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
'[data-toggle="collapse"][data-target="#' + element.id + '"]')
this.transitioning = null
if (this.options.parent) this.$parent = $(this.options.parent)
if (this.options.parent) {
this.$parent = this.getParent()
} else {
this.addAriaAndCollapsedClass(this.$element, this.$trigger)
}
if (this.options.toggle) this.toggle()
}
Collapse.VERSION = '3.3.4'
Collapse.TRANSITION_DURATION = 350
Collapse.DEFAULTS = {
toggle: true
}
@ -34,35 +45,43 @@
Collapse.prototype.show = function () {
if (this.transitioning || this.$element.hasClass('in')) return
var activesData
var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
if (actives && actives.length) {
activesData = actives.data('bs.collapse')
if (activesData && activesData.transitioning) return
}
var startEvent = $.Event('show.bs.collapse')
this.$element.trigger(startEvent)
if (startEvent.isDefaultPrevented()) return
var actives = this.$parent && this.$parent.find('> .panel > .in')
if (actives && actives.length) {
var hasData = actives.data('bs.collapse')
if (hasData && hasData.transitioning) return
actives.collapse('hide')
hasData || actives.data('bs.collapse', null)
Plugin.call(actives, 'hide')
activesData || actives.data('bs.collapse', null)
}
var dimension = this.dimension()
this.$element
.removeClass('collapse')
.addClass('collapsing')
[dimension](0)
.addClass('collapsing')[dimension](0)
.attr('aria-expanded', true)
this.$trigger
.removeClass('collapsed')
.attr('aria-expanded', true)
this.transitioning = 1
var complete = function () {
this.$element
.removeClass('collapsing')
.addClass('collapse in')
[dimension]('auto')
.addClass('collapse in')[dimension]('')
this.transitioning = 0
this.$element.trigger('shown.bs.collapse')
this.$element
.trigger('shown.bs.collapse')
}
if (!$.support.transition) return complete.call(this)
@ -70,9 +89,8 @@
var scrollSize = $.camelCase(['scroll', dimension].join('-'))
this.$element
.one($.support.transition.end, $.proxy(complete, this))
.emulateTransitionEnd(350)
[dimension](this.$element[0][scrollSize])
.one('bsTransitionEnd', $.proxy(complete, this))
.emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
}
Collapse.prototype.hide = function () {
@ -84,55 +102,85 @@
var dimension = this.dimension()
this.$element
[dimension](this.$element[dimension]())
[0].offsetHeight
this.$element[dimension](this.$element[dimension]())[0].offsetHeight
this.$element
.addClass('collapsing')
.removeClass('collapse')
.removeClass('in')
.removeClass('collapse in')
.attr('aria-expanded', false)
this.$trigger
.addClass('collapsed')
.attr('aria-expanded', false)
this.transitioning = 1
var complete = function () {
this.transitioning = 0
this.$element
.trigger('hidden.bs.collapse')
.removeClass('collapsing')
.addClass('collapse')
.trigger('hidden.bs.collapse')
}
if (!$.support.transition) return complete.call(this)
this.$element
[dimension](0)
.one($.support.transition.end, $.proxy(complete, this))
.emulateTransitionEnd(350)
.one('bsTransitionEnd', $.proxy(complete, this))
.emulateTransitionEnd(Collapse.TRANSITION_DURATION)
}
Collapse.prototype.toggle = function () {
this[this.$element.hasClass('in') ? 'hide' : 'show']()
}
Collapse.prototype.getParent = function () {
return $(this.options.parent)
.find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
.each($.proxy(function (i, element) {
var $element = $(element)
this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
}, this))
.end()
}
Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
var isOpen = $element.hasClass('in')
$element.attr('aria-expanded', isOpen)
$trigger
.toggleClass('collapsed', !isOpen)
.attr('aria-expanded', isOpen)
}
function getTargetFromTrigger($trigger) {
var href
var target = $trigger.attr('data-target')
|| (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
return $(target)
}
// COLLAPSE PLUGIN DEFINITION
// ==========================
var old = $.fn.collapse
$.fn.collapse = function (option) {
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.collapse')
var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
if (!data && options.toggle && option == 'show') option = !option
if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
if (typeof option == 'string') data[option]()
})
}
var old = $.fn.collapse
$.fn.collapse = Plugin
$.fn.collapse.Constructor = Collapse
@ -148,23 +196,16 @@
// COLLAPSE DATA-API
// =================
$(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
var $this = $(this), href
var target = $this.attr('data-target')
|| e.preventDefault()
|| (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
var $target = $(target)
$(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
var $this = $(this)
if (!$this.attr('data-target')) e.preventDefault()
var $target = getTargetFromTrigger($this)
var data = $target.data('bs.collapse')
var option = data ? 'toggle' : $this.data()
var parent = $this.attr('data-parent')
var $parent = parent && $(parent)
if (!data || !data.transitioning) {
if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
$this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
}
$target.collapse(option)
Plugin.call($target, option)
})
}(jQuery);

View File

@ -1,8 +1,8 @@
/* ========================================================================
* Bootstrap: dropdown.js v3.1.0
* Bootstrap: dropdown.js v3.3.4
* http://getbootstrap.com/javascript/#dropdowns
* ========================================================================
* Copyright 2011-2014 Twitter, Inc.
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@ -14,11 +14,13 @@
// =========================
var backdrop = '.dropdown-backdrop'
var toggle = '[data-toggle=dropdown]'
var toggle = '[data-toggle="dropdown"]'
var Dropdown = function (element) {
$(element).on('click.bs.dropdown', this.toggle)
}
Dropdown.VERSION = '3.3.4'
Dropdown.prototype.toggle = function (e) {
var $this = $(this)
@ -40,18 +42,20 @@
if (e.isDefaultPrevented()) return
$this
.trigger('focus')
.attr('aria-expanded', 'true')
$parent
.toggleClass('open')
.trigger('shown.bs.dropdown', relatedTarget)
$this.focus()
}
return false
}
Dropdown.prototype.keydown = function (e) {
if (!/(38|40|27)/.test(e.keyCode)) return
if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
var $this = $(this)
@ -63,33 +67,40 @@
var $parent = getParent($this)
var isActive = $parent.hasClass('open')
if (!isActive || (isActive && e.keyCode == 27)) {
if (e.which == 27) $parent.find(toggle).focus()
return $this.click()
if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {
if (e.which == 27) $parent.find(toggle).trigger('focus')
return $this.trigger('click')
}
var desc = ' li:not(.divider):visible a'
var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc)
var desc = ' li:not(.disabled):visible a'
var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
if (!$items.length) return
var index = $items.index($items.filter(':focus'))
var index = $items.index(e.target)
if (e.keyCode == 38 && index > 0) index-- // up
if (e.keyCode == 40 && index < $items.length - 1) index++ // down
if (e.which == 38 && index > 0) index-- // up
if (e.which == 40 && index < $items.length - 1) index++ // down
if (!~index) index = 0
$items.eq(index).focus()
$items.eq(index).trigger('focus')
}
function clearMenus(e) {
if (e && e.which === 3) return
$(backdrop).remove()
$(toggle).each(function () {
var $parent = getParent($(this))
var $this = $(this)
var $parent = getParent($this)
var relatedTarget = { relatedTarget: this }
if (!$parent.hasClass('open')) return
$parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
if (e.isDefaultPrevented()) return
$this.attr('aria-expanded', 'false')
$parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
})
}
@ -99,7 +110,7 @@
if (!selector) {
selector = $this.attr('href')
selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
}
var $parent = selector && $(selector)
@ -111,9 +122,7 @@
// DROPDOWN PLUGIN DEFINITION
// ==========================
var old = $.fn.dropdown
$.fn.dropdown = function (option) {
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.dropdown')
@ -123,6 +132,9 @@
})
}
var old = $.fn.dropdown
$.fn.dropdown = Plugin
$.fn.dropdown.Constructor = Dropdown
@ -142,6 +154,8 @@
.on('click.bs.dropdown.data-api', clearMenus)
.on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
.on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
.on('keydown.bs.dropdown.data-api', toggle + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown)
.on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
.on('keydown.bs.dropdown.data-api', '[role="menu"]', Dropdown.prototype.keydown)
.on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown)
}(jQuery);

View File

@ -1,8 +1,8 @@
/* ========================================================================
* Bootstrap: modal.js v3.1.0
* Bootstrap: modal.js v3.3.4
* http://getbootstrap.com/javascript/#modals
* ========================================================================
* Copyright 2011-2014 Twitter, Inc.
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@ -14,10 +14,15 @@
// ======================
var Modal = function (element, options) {
this.options = options
this.$element = $(element)
this.$backdrop =
this.isShown = null
this.options = options
this.$body = $(document.body)
this.$element = $(element)
this.$dialog = this.$element.find('.modal-dialog')
this.$backdrop = null
this.isShown = null
this.originalBodyPad = null
this.scrollbarWidth = 0
this.ignoreBackdropClick = false
if (this.options.remote) {
this.$element
@ -28,6 +33,11 @@
}
}
Modal.VERSION = '3.3.4'
Modal.TRANSITION_DURATION = 300
Modal.BACKDROP_TRANSITION_DURATION = 150
Modal.DEFAULTS = {
backdrop: true,
keyboard: true,
@ -35,7 +45,7 @@
}
Modal.prototype.toggle = function (_relatedTarget) {
return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)
return this.isShown ? this.hide() : this.show(_relatedTarget)
}
Modal.prototype.show = function (_relatedTarget) {
@ -48,21 +58,34 @@
this.isShown = true
this.checkScrollbar()
this.setScrollbar()
this.$body.addClass('modal-open')
this.escape()
this.resize()
this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
this.$dialog.on('mousedown.dismiss.bs.modal', function () {
that.$element.one('mouseup.dismiss.bs.modal', function (e) {
if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
})
})
this.backdrop(function () {
var transition = $.support.transition && that.$element.hasClass('fade')
if (!that.$element.parent().length) {
that.$element.appendTo(document.body) // don't move modals dom position
that.$element.appendTo(that.$body) // don't move modals dom position
}
that.$element
.show()
.scrollTop(0)
that.adjustDialog()
if (transition) {
that.$element[0].offsetWidth // force reflow
}
@ -76,12 +99,12 @@
var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
transition ?
that.$element.find('.modal-dialog') // wait for modal to slide in
.one($.support.transition.end, function () {
that.$element.focus().trigger(e)
that.$dialog // wait for modal to slide in
.one('bsTransitionEnd', function () {
that.$element.trigger('focus').trigger(e)
})
.emulateTransitionEnd(300) :
that.$element.focus().trigger(e)
.emulateTransitionEnd(Modal.TRANSITION_DURATION) :
that.$element.trigger('focus').trigger(e)
})
}
@ -97,6 +120,7 @@
this.isShown = false
this.escape()
this.resize()
$(document).off('focusin.bs.modal')
@ -104,11 +128,14 @@
.removeClass('in')
.attr('aria-hidden', true)
.off('click.dismiss.bs.modal')
.off('mouseup.dismiss.bs.modal')
this.$dialog.off('mousedown.dismiss.bs.modal')
$.support.transition && this.$element.hasClass('fade') ?
this.$element
.one($.support.transition.end, $.proxy(this.hideModal, this))
.emulateTransitionEnd(300) :
.one('bsTransitionEnd', $.proxy(this.hideModal, this))
.emulateTransitionEnd(Modal.TRANSITION_DURATION) :
this.hideModal()
}
@ -117,18 +144,26 @@
.off('focusin.bs.modal') // guard against infinite focus loop
.on('focusin.bs.modal', $.proxy(function (e) {
if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
this.$element.focus()
this.$element.trigger('focus')
}
}, this))
}
Modal.prototype.escape = function () {
if (this.isShown && this.options.keyboard) {
this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
e.which == 27 && this.hide()
}, this))
} else if (!this.isShown) {
this.$element.off('keyup.dismiss.bs.modal')
this.$element.off('keydown.dismiss.bs.modal')
}
}
Modal.prototype.resize = function () {
if (this.isShown) {
$(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
} else {
$(window).off('resize.bs.modal')
}
}
@ -136,7 +171,9 @@
var that = this
this.$element.hide()
this.backdrop(function () {
that.removeBackdrop()
that.$body.removeClass('modal-open')
that.resetAdjustments()
that.resetScrollbar()
that.$element.trigger('hidden.bs.modal')
})
}
@ -147,19 +184,24 @@
}
Modal.prototype.backdrop = function (callback) {
var that = this
var animate = this.$element.hasClass('fade') ? 'fade' : ''
if (this.isShown && this.options.backdrop) {
var doAnimate = $.support.transition && animate
this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
.appendTo(document.body)
.appendTo(this.$body)
this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
if (this.ignoreBackdropClick) {
this.ignoreBackdropClick = false
return
}
if (e.target !== e.currentTarget) return
this.options.backdrop == 'static'
? this.$element[0].focus.call(this.$element[0])
: this.hide.call(this)
? this.$element[0].focus()
: this.hide()
}, this))
if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
@ -170,31 +212,84 @@
doAnimate ?
this.$backdrop
.one($.support.transition.end, callback)
.emulateTransitionEnd(150) :
.one('bsTransitionEnd', callback)
.emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
callback()
} else if (!this.isShown && this.$backdrop) {
this.$backdrop.removeClass('in')
var callbackRemove = function () {
that.removeBackdrop()
callback && callback()
}
$.support.transition && this.$element.hasClass('fade') ?
this.$backdrop
.one($.support.transition.end, callback)
.emulateTransitionEnd(150) :
callback()
.one('bsTransitionEnd', callbackRemove)
.emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
callbackRemove()
} else if (callback) {
callback()
}
}
// these following methods are used to handle overflowing modals
Modal.prototype.handleUpdate = function () {
this.adjustDialog()
}
Modal.prototype.adjustDialog = function () {
var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
this.$element.css({
paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
})
}
Modal.prototype.resetAdjustments = function () {
this.$element.css({
paddingLeft: '',
paddingRight: ''
})
}
Modal.prototype.checkScrollbar = function () {
var fullWindowWidth = window.innerWidth
if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
var documentElementRect = document.documentElement.getBoundingClientRect()
fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
}
this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
this.scrollbarWidth = this.measureScrollbar()
}
Modal.prototype.setScrollbar = function () {
var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
this.originalBodyPad = document.body.style.paddingRight || ''
if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
}
Modal.prototype.resetScrollbar = function () {
this.$body.css('padding-right', this.originalBodyPad)
}
Modal.prototype.measureScrollbar = function () { // thx walsh
var scrollDiv = document.createElement('div')
scrollDiv.className = 'modal-scrollbar-measure'
this.$body.append(scrollDiv)
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
this.$body[0].removeChild(scrollDiv)
return scrollbarWidth
}
// MODAL PLUGIN DEFINITION
// =======================
var old = $.fn.modal
$.fn.modal = function (option, _relatedTarget) {
function Plugin(option, _relatedTarget) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.modal')
@ -206,6 +301,9 @@
})
}
var old = $.fn.modal
$.fn.modal = Plugin
$.fn.modal.Constructor = Modal
@ -224,20 +322,18 @@
$(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
var $this = $(this)
var href = $this.attr('href')
var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
if ($this.is('a')) e.preventDefault()
$target
.modal(option, this)
.one('hide', function () {
$this.is(':visible') && $this.focus()
$target.one('show.bs.modal', function (showEvent) {
if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
$target.one('hidden.bs.modal', function () {
$this.is(':visible') && $this.trigger('focus')
})
})
Plugin.call($target, option, this)
})
$(document)
.on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })
.on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
}(jQuery);

View File

@ -1,8 +1,8 @@
/* ========================================================================
* Bootstrap: popover.js v3.1.0
* Bootstrap: popover.js v3.3.4
* http://getbootstrap.com/javascript/#popovers
* ========================================================================
* Copyright 2011-2014 Twitter, Inc.
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@ -19,11 +19,13 @@
if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
Popover.VERSION = '3.3.4'
Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
placement: 'right',
trigger: 'click',
content: '',
template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
})
@ -44,7 +46,7 @@
var content = this.getContent()
$tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
$tip.find('.popover-content')[ // we use append for html objects to maintain js events
$tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
](content)
@ -70,32 +72,28 @@
}
Popover.prototype.arrow = function () {
return this.$arrow = this.$arrow || this.tip().find('.arrow')
}
Popover.prototype.tip = function () {
if (!this.$tip) this.$tip = $(this.options.template)
return this.$tip
return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
}
// POPOVER PLUGIN DEFINITION
// =========================
var old = $.fn.popover
$.fn.popover = function (option) {
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.popover')
var options = typeof option == 'object' && option
if (!data && option == 'destroy') return
if (!data && /destroy|hide/.test(option)) return
if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
if (typeof option == 'string') data[option]()
})
}
var old = $.fn.popover
$.fn.popover = Plugin
$.fn.popover.Constructor = Popover

View File

@ -1,8 +1,8 @@
/* ========================================================================
* Bootstrap: scrollspy.js v3.1.0
* Bootstrap: scrollspy.js v3.3.4
* http://getbootstrap.com/javascript/#scrollspy
* ========================================================================
* Copyright 2011-2014 Twitter, Inc.
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@ -14,36 +14,45 @@
// ==========================
function ScrollSpy(element, options) {
var href
var process = $.proxy(this.process, this)
this.$element = $(element).is('body') ? $(window) : $(element)
this.$body = $('body')
this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
this.$body = $(document.body)
this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
this.selector = (this.options.target
|| ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
|| '') + ' .nav li > a'
this.offsets = $([])
this.targets = $([])
this.selector = (this.options.target || '') + ' .nav li > a'
this.offsets = []
this.targets = []
this.activeTarget = null
this.scrollHeight = 0
this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
this.refresh()
this.process()
}
ScrollSpy.VERSION = '3.3.4'
ScrollSpy.DEFAULTS = {
offset: 10
}
ScrollSpy.prototype.getScrollHeight = function () {
return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
}
ScrollSpy.prototype.refresh = function () {
var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
var that = this
var offsetMethod = 'offset'
var offsetBase = 0
this.offsets = $([])
this.targets = $([])
this.offsets = []
this.targets = []
this.scrollHeight = this.getScrollHeight()
var self = this
var $targets = this.$body
if (!$.isWindow(this.$scrollElement[0])) {
offsetMethod = 'position'
offsetBase = this.$scrollElement.scrollTop()
}
this.$body
.find(this.selector)
.map(function () {
var $el = $(this)
@ -53,50 +62,53 @@
return ($href
&& $href.length
&& $href.is(':visible')
&& [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
&& [[$href[offsetMethod]().top + offsetBase, href]]) || null
})
.sort(function (a, b) { return a[0] - b[0] })
.each(function () {
self.offsets.push(this[0])
self.targets.push(this[1])
that.offsets.push(this[0])
that.targets.push(this[1])
})
}
ScrollSpy.prototype.process = function () {
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
var maxScroll = scrollHeight - this.$scrollElement.height()
var scrollHeight = this.getScrollHeight()
var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
var offsets = this.offsets
var targets = this.targets
var activeTarget = this.activeTarget
var i
if (scrollTop >= maxScroll) {
return activeTarget != (i = targets.last()[0]) && this.activate(i)
if (this.scrollHeight != scrollHeight) {
this.refresh()
}
if (activeTarget && scrollTop <= offsets[0]) {
return activeTarget != (i = targets[0]) && this.activate(i)
if (scrollTop >= maxScroll) {
return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
}
if (activeTarget && scrollTop < offsets[0]) {
this.activeTarget = null
return this.clear()
}
for (i = offsets.length; i--;) {
activeTarget != targets[i]
&& scrollTop >= offsets[i]
&& (!offsets[i + 1] || scrollTop <= offsets[i + 1])
&& this.activate( targets[i] )
&& (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
&& this.activate(targets[i])
}
}
ScrollSpy.prototype.activate = function (target) {
this.activeTarget = target
$(this.selector)
.parentsUntil(this.options.target, '.active')
.removeClass('active')
this.clear()
var selector = this.selector +
'[data-target="' + target + '"],' +
this.selector + '[href="' + target + '"]'
'[data-target="' + target + '"],' +
this.selector + '[href="' + target + '"]'
var active = $(selector)
.parents('li')
@ -111,13 +123,17 @@
active.trigger('activate.bs.scrollspy')
}
ScrollSpy.prototype.clear = function () {
$(this.selector)
.parentsUntil(this.options.target, '.active')
.removeClass('active')
}
// SCROLLSPY PLUGIN DEFINITION
// ===========================
var old = $.fn.scrollspy
$.fn.scrollspy = function (option) {
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.scrollspy')
@ -128,6 +144,9 @@
})
}
var old = $.fn.scrollspy
$.fn.scrollspy = Plugin
$.fn.scrollspy.Constructor = ScrollSpy
@ -143,10 +162,10 @@
// SCROLLSPY DATA-API
// ==================
$(window).on('load', function () {
$(window).on('load.bs.scrollspy.data-api', function () {
$('[data-spy="scroll"]').each(function () {
var $spy = $(this)
$spy.scrollspy($spy.data())
Plugin.call($spy, $spy.data())
})
})

View File

@ -1,8 +1,8 @@
/* ========================================================================
* Bootstrap: tab.js v3.1.0
* Bootstrap: tab.js v3.3.4
* http://getbootstrap.com/javascript/#tabs
* ========================================================================
* Copyright 2011-2014 Twitter, Inc.
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@ -17,6 +17,10 @@
this.element = $(element)
}
Tab.VERSION = '3.3.4'
Tab.TRANSITION_DURATION = 150
Tab.prototype.show = function () {
var $this = this.element
var $ul = $this.closest('ul:not(.dropdown-menu)')
@ -24,27 +28,35 @@
if (!selector) {
selector = $this.attr('href')
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
}
if ($this.parent('li').hasClass('active')) return
var previous = $ul.find('.active:last a')[0]
var e = $.Event('show.bs.tab', {
relatedTarget: previous
var $previous = $ul.find('.active:last a')
var hideEvent = $.Event('hide.bs.tab', {
relatedTarget: $this[0]
})
var showEvent = $.Event('show.bs.tab', {
relatedTarget: $previous[0]
})
$this.trigger(e)
$previous.trigger(hideEvent)
$this.trigger(showEvent)
if (e.isDefaultPrevented()) return
if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
var $target = $(selector)
this.activate($this.parent('li'), $ul)
this.activate($this.closest('li'), $ul)
this.activate($target, $target.parent(), function () {
$previous.trigger({
type: 'hidden.bs.tab',
relatedTarget: $this[0]
})
$this.trigger({
type: 'shown.bs.tab',
relatedTarget: previous
relatedTarget: $previous[0]
})
})
}
@ -53,15 +65,21 @@
var $active = container.find('> .active')
var transition = callback
&& $.support.transition
&& $active.hasClass('fade')
&& (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)
function next() {
$active
.removeClass('active')
.find('> .dropdown-menu > .active')
.removeClass('active')
.removeClass('active')
.end()
.find('[data-toggle="tab"]')
.attr('aria-expanded', false)
element.addClass('active')
element
.addClass('active')
.find('[data-toggle="tab"]')
.attr('aria-expanded', true)
if (transition) {
element[0].offsetWidth // reflow for transition
@ -70,17 +88,22 @@
element.removeClass('fade')
}
if (element.parent('.dropdown-menu')) {
element.closest('li.dropdown').addClass('active')
if (element.parent('.dropdown-menu').length) {
element
.closest('li.dropdown')
.addClass('active')
.end()
.find('[data-toggle="tab"]')
.attr('aria-expanded', true)
}
callback && callback()
}
transition ?
$active.length && transition ?
$active
.one($.support.transition.end, next)
.emulateTransitionEnd(150) :
.one('bsTransitionEnd', next)
.emulateTransitionEnd(Tab.TRANSITION_DURATION) :
next()
$active.removeClass('in')
@ -90,9 +113,7 @@
// TAB PLUGIN DEFINITION
// =====================
var old = $.fn.tab
$.fn.tab = function ( option ) {
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.tab')
@ -102,6 +123,9 @@
})
}
var old = $.fn.tab
$.fn.tab = Plugin
$.fn.tab.Constructor = Tab
@ -117,9 +141,13 @@
// TAB DATA-API
// ============
$(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
var clickHandler = function (e) {
e.preventDefault()
$(this).tab('show')
})
Plugin.call($(this), 'show')
}
$(document)
.on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
.on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
}(jQuery);

View File

@ -1,9 +1,9 @@
/* ========================================================================
* Bootstrap: tooltip.js v3.1.0
* Bootstrap: tooltip.js v3.3.4
* http://getbootstrap.com/javascript/#tooltip
* Inspired by the original jQuery.tipsy by Jason Frame
* ========================================================================
* Copyright 2011-2014 Twitter, Inc.
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@ -15,33 +15,46 @@
// ===============================
var Tooltip = function (element, options) {
this.type =
this.options =
this.enabled =
this.timeout =
this.hoverState =
this.type = null
this.options = null
this.enabled = null
this.timeout = null
this.hoverState = null
this.$element = null
this.init('tooltip', element, options)
}
Tooltip.VERSION = '3.3.4'
Tooltip.TRANSITION_DURATION = 150
Tooltip.DEFAULTS = {
animation: true,
placement: 'top',
selector: false,
template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
trigger: 'hover focus',
title: '',
delay: 0,
html: false,
container: false
container: false,
viewport: {
selector: 'body',
padding: 0
}
}
Tooltip.prototype.init = function (type, element, options) {
this.enabled = true
this.type = type
this.$element = $(element)
this.options = this.getOptions(options)
this.enabled = true
this.type = type
this.$element = $(element)
this.options = this.getOptions(options)
this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)
if (this.$element[0] instanceof document.constructor && !this.options.selector) {
throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
}
var triggers = this.options.trigger.split(' ')
@ -94,7 +107,17 @@
Tooltip.prototype.enter = function (obj) {
var self = obj instanceof this.constructor ?
obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
obj : $(obj.currentTarget).data('bs.' + this.type)
if (self && self.$tip && self.$tip.is(':visible')) {
self.hoverState = 'in'
return
}
if (!self) {
self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
$(obj.currentTarget).data('bs.' + this.type, self)
}
clearTimeout(self.timeout)
@ -109,7 +132,12 @@
Tooltip.prototype.leave = function (obj) {
var self = obj instanceof this.constructor ?
obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
obj : $(obj.currentTarget).data('bs.' + this.type)
if (!self) {
self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
$(obj.currentTarget).data('bs.' + this.type, self)
}
clearTimeout(self.timeout)
@ -128,12 +156,17 @@
if (this.hasContent() && this.enabled) {
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
var that = this;
var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
if (e.isDefaultPrevented() || !inDom) return
var that = this
var $tip = this.tip()
var tipId = this.getUID(this.type)
this.setContent()
$tip.attr('id', tipId)
this.$element.attr('aria-describedby', tipId)
if (this.options.animation) $tip.addClass('fade')
@ -149,6 +182,7 @@
.detach()
.css({ top: 0, left: 0, display: 'block' })
.addClass(placement)
.data('bs.' + this.type, this)
this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
@ -157,18 +191,14 @@
var actualHeight = $tip[0].offsetHeight
if (autoPlace) {
var $parent = this.$element.parent()
var orgPlacement = placement
var docScroll = document.documentElement.scrollTop || document.body.scrollTop
var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth()
var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left
var $container = this.options.container ? $(this.options.container) : this.$element.parent()
var containerDim = this.getPosition($container)
placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' :
placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' :
placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' :
placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' :
placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top' :
placement == 'top' && pos.top - actualHeight < containerDim.top ? 'bottom' :
placement == 'right' && pos.right + actualWidth > containerDim.width ? 'left' :
placement == 'left' && pos.left - actualWidth < containerDim.left ? 'right' :
placement
$tip
@ -179,22 +209,24 @@
var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
this.applyPlacement(calculatedOffset, placement)
this.hoverState = null
var complete = function() {
var complete = function () {
var prevHoverState = that.hoverState
that.$element.trigger('shown.bs.' + that.type)
that.hoverState = null
if (prevHoverState == 'out') that.leave(that)
}
$.support.transition && this.$tip.hasClass('fade') ?
$tip
.one($.support.transition.end, complete)
.emulateTransitionEnd(150) :
.one('bsTransitionEnd', complete)
.emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
complete()
}
}
Tooltip.prototype.applyPlacement = function (offset, placement) {
var replace
var $tip = this.tip()
var width = $tip[0].offsetWidth
var height = $tip[0].offsetHeight
@ -228,33 +260,26 @@
var actualHeight = $tip[0].offsetHeight
if (placement == 'top' && actualHeight != height) {
replace = true
offset.top = offset.top + height - actualHeight
}
if (/bottom|top/.test(placement)) {
var delta = 0
var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
if (offset.left < 0) {
delta = offset.left * -2
offset.left = 0
if (delta.left) offset.left += delta.left
else offset.top += delta.top
$tip.offset(offset)
var isVertical = /top|bottom/.test(placement)
var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
actualWidth = $tip[0].offsetWidth
actualHeight = $tip[0].offsetHeight
}
this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
} else {
this.replaceArrow(actualHeight - height, actualHeight, 'top')
}
if (replace) $tip.offset(offset)
$tip.offset(offset)
this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
}
Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
this.arrow()
.css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
.css(isVertical ? 'top' : 'left', '')
}
Tooltip.prototype.setContent = function () {
@ -265,14 +290,17 @@
$tip.removeClass('fade in top bottom left right')
}
Tooltip.prototype.hide = function () {
Tooltip.prototype.hide = function (callback) {
var that = this
var $tip = this.tip()
var $tip = $(this.$tip)
var e = $.Event('hide.bs.' + this.type)
function complete() {
if (that.hoverState != 'in') $tip.detach()
that.$element.trigger('hidden.bs.' + that.type)
that.$element
.removeAttr('aria-describedby')
.trigger('hidden.bs.' + that.type)
callback && callback()
}
this.$element.trigger(e)
@ -281,10 +309,10 @@
$tip.removeClass('in')
$.support.transition && this.$tip.hasClass('fade') ?
$.support.transition && $tip.hasClass('fade') ?
$tip
.one($.support.transition.end, complete)
.emulateTransitionEnd(150) :
.one('bsTransitionEnd', complete)
.emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
complete()
this.hoverState = null
@ -294,7 +322,7 @@
Tooltip.prototype.fixTitle = function () {
var $e = this.$element
if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
$e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
}
}
@ -303,19 +331,58 @@
return this.getTitle()
}
Tooltip.prototype.getPosition = function () {
var el = this.$element[0]
return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
width: el.offsetWidth,
height: el.offsetHeight
}, this.$element.offset())
Tooltip.prototype.getPosition = function ($element) {
$element = $element || this.$element
var el = $element[0]
var isBody = el.tagName == 'BODY'
var elRect = el.getBoundingClientRect()
if (elRect.width == null) {
// width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
}
var elOffset = isBody ? { top: 0, left: 0 } : $element.offset()
var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
return $.extend({}, elRect, scroll, outerDims, elOffset)
}
Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
/* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
/* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
}
Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
var delta = { top: 0, left: 0 }
if (!this.$viewport) return delta
var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
var viewportDimensions = this.getPosition(this.$viewport)
if (/right|left/.test(placement)) {
var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
if (topEdgeOffset < viewportDimensions.top) { // top overflow
delta.top = viewportDimensions.top - topEdgeOffset
} else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
}
} else {
var leftEdgeOffset = pos.left - viewportPadding
var rightEdgeOffset = pos.left + viewportPadding + actualWidth
if (leftEdgeOffset < viewportDimensions.left) { // left overflow
delta.left = viewportDimensions.left - leftEdgeOffset
} else if (rightEdgeOffset > viewportDimensions.width) { // right overflow
delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
}
}
return delta
}
Tooltip.prototype.getTitle = function () {
@ -329,20 +396,18 @@
return title
}
Tooltip.prototype.getUID = function (prefix) {
do prefix += ~~(Math.random() * 1000000)
while (document.getElementById(prefix))
return prefix
}
Tooltip.prototype.tip = function () {
return this.$tip = this.$tip || $(this.options.template)
return (this.$tip = this.$tip || $(this.options.template))
}
Tooltip.prototype.arrow = function () {
return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
}
Tooltip.prototype.validate = function () {
if (!this.$element[0].parentNode) {
this.hide()
this.$element = null
this.options = null
}
return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
}
Tooltip.prototype.enable = function () {
@ -358,33 +423,45 @@
}
Tooltip.prototype.toggle = function (e) {
var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
var self = this
if (e) {
self = $(e.currentTarget).data('bs.' + this.type)
if (!self) {
self = new this.constructor(e.currentTarget, this.getDelegateOptions())
$(e.currentTarget).data('bs.' + this.type, self)
}
}
self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
}
Tooltip.prototype.destroy = function () {
var that = this
clearTimeout(this.timeout)
this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
this.hide(function () {
that.$element.off('.' + that.type).removeData('bs.' + that.type)
})
}
// TOOLTIP PLUGIN DEFINITION
// =========================
var old = $.fn.tooltip
$.fn.tooltip = function (option) {
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.tooltip')
var options = typeof option == 'object' && option
if (!data && option == 'destroy') return
if (!data && /destroy|hide/.test(option)) return
if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
if (typeof option == 'string') data[option]()
})
}
var old = $.fn.tooltip
$.fn.tooltip = Plugin
$.fn.tooltip.Constructor = Tooltip

View File

@ -1,8 +1,8 @@
/* ========================================================================
* Bootstrap: transition.js v3.1.0
* Bootstrap: transition.js v3.3.4
* http://getbootstrap.com/javascript/#transitions
* ========================================================================
* Copyright 2011-2014 Twitter, Inc.
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@ -17,10 +17,10 @@
var el = document.createElement('bootstrap')
var transEndEventNames = {
'WebkitTransition' : 'webkitTransitionEnd',
'MozTransition' : 'transitionend',
'OTransition' : 'oTransitionEnd otransitionend',
'transition' : 'transitionend'
WebkitTransition : 'webkitTransitionEnd',
MozTransition : 'transitionend',
OTransition : 'oTransitionEnd otransitionend',
transition : 'transitionend'
}
for (var name in transEndEventNames) {
@ -34,8 +34,9 @@
// http://blog.alexmaccaw.com/css-transitions
$.fn.emulateTransitionEnd = function (duration) {
var called = false, $el = this
$(this).one($.support.transition.end, function () { called = true })
var called = false
var $el = this
$(this).one('bsTransitionEnd', function () { called = true })
var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
setTimeout(callback, duration)
return this
@ -43,6 +44,16 @@
$(function () {
$.support.transition = transitionEnd()
if (!$.support.transition) return
$.event.special.bsTransitionEnd = {
bindType: $.support.transition.end,
delegateType: $.support.transition.end,
handle: function (e) {
if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
}
}
})
}(jQuery);

View File

@ -18,6 +18,7 @@
// 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;
@ -28,17 +29,19 @@
> ul {
margin-bottom: 0;
}
> p + p {
margin-top: 5px;
}
}
// Dismissable alerts
// Dismissible alerts
//
// Expand the right padding and account for the close button's positioning.
.alert-dismissable {
padding-right: (@alert-padding + 20);
.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.
.alert-dismissible {
padding-right: (@alert-padding + 20);
// Adjust close link position
.close {
@ -56,12 +59,15 @@
.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);
}

View File

@ -3,7 +3,7 @@
// --------------------------------------------------
// Base classes
// Base class
.badge {
display: inline-block;
min-width: 10px;
@ -28,28 +28,39 @@
position: relative;
top: -1px;
}
.btn-xs & {
.btn-xs &,
.btn-group-xs > .btn & {
top: 0;
padding: 1px 5px;
}
}
// Hover state, but only for links
a.badge {
&:hover,
&:focus {
color: @badge-link-hover-color;
text-decoration: none;
cursor: pointer;
// 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;
}
}
// Account for counters in navs
a.list-group-item.active > .badge,
.nav-pills > .active > a > .badge {
color: @badge-active-color;
background-color: @badge-active-bg;
}
.nav-pills > li > a > .badge {
margin-left: 3px;
}

View File

@ -2,9 +2,10 @@
@import "variables.less";
@import "mixins.less";
// Reset
// Reset and dependencies
@import "normalize.less";
@import "print.less";
@import "glyphicons.less";
// Core CSS
@import "scaffolding.less";
@ -17,7 +18,6 @@
// Components
@import "component-animations.less";
@import "glyphicons.less";
@import "dropdowns.less";
@import "button-groups.less";
@import "input-groups.less";
@ -35,6 +35,7 @@
@import "media.less";
@import "list-group.less";
@import "panels.less";
@import "responsive-embed.less";
@import "wells.less";
@import "close.less";

View File

@ -18,10 +18,6 @@
&.active {
z-index: 2;
}
&:focus {
// Remove focus outline when dropdown JS adds it after closing the menu
outline: none;
}
}
}
@ -75,13 +71,13 @@
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
border-radius: 0;
}
.btn-group > .btn-group:first-child {
.btn-group > .btn-group:first-child:not(:last-child) {
> .btn:last-child,
> .dropdown-toggle {
.border-right-radius(0);
}
}
.btn-group > .btn-group:last-child > .btn:first-child {
.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
.border-left-radius(0);
}
@ -96,9 +92,9 @@
//
// Remix the default button sizing classes into new ones for easier manipulation.
.btn-group-xs > .btn { .btn-xs(); }
.btn-group-sm > .btn { .btn-sm(); }
.btn-group-lg > .btn { .btn-lg(); }
.btn-group-xs > .btn { &:extend(.btn-xs); }
.btn-group-sm > .btn { &:extend(.btn-sm); }
.btn-group-lg > .btn { &:extend(.btn-lg); }
// Split button dropdowns
@ -198,7 +194,6 @@
}
// Justified button groups
// ----------------------
@ -216,11 +211,33 @@
> .btn-group .btn {
width: 100%;
}
> .btn-group .dropdown-menu {
left: auto;
}
}
// Checkbox and radio options
[data-toggle="buttons"] > .btn > input[type="radio"],
[data-toggle="buttons"] > .btn > input[type="checkbox"] {
display: none;
//
// 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;
}
}
}

View File

@ -12,6 +12,7 @@
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;
@ -19,12 +20,18 @@
.button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);
.user-select(none);
&:focus {
.tab-focus();
&,
&:active,
&.active {
&:focus,
&.focus {
.tab-focus();
}
}
&:hover,
&:focus {
&:focus,
&.focus {
color: @btn-default-color;
text-decoration: none;
}
@ -39,7 +46,7 @@
&.disabled,
&[disabled],
fieldset[disabled] & {
cursor: not-allowed;
cursor: @cursor-disabled;
pointer-events: none; // Future-proof disabling of clicks
.opacity(.65);
.box-shadow(none);
@ -81,11 +88,11 @@
.btn-link {
color: @link-color;
font-weight: normal;
cursor: pointer;
border-radius: 0;
&,
&:active,
&.active,
&[disabled],
fieldset[disabled] & {
background-color: transparent;
@ -100,7 +107,7 @@
&:hover,
&:focus {
color: @link-hover-color;
text-decoration: underline;
text-decoration: @link-hover-decoration;
background-color: transparent;
}
&[disabled],
@ -136,8 +143,6 @@
.btn-block {
display: block;
width: 100%;
padding-left: 0;
padding-right: 0;
}
// Vertically space out multiple block buttons

View File

@ -21,14 +21,40 @@
// Account for jankitude on images
> img,
> a > img {
.img-responsive();
&: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; }
> .prev {
display: block;
}
> .active {
left: 0;
@ -91,7 +117,7 @@
// Hover/focus state
&:hover,
&:focus {
outline: none;
outline: 0;
color: @carousel-control-color;
text-decoration: none;
.opacity(.9);
@ -110,20 +136,23 @@
.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;
margin-left: -10px;
line-height: 1;
font-family: serif;
}
.icon-prev {
&:before {
content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
@ -167,6 +196,7 @@
// 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.
@ -206,16 +236,23 @@
// Scale up the controls a smidge
.carousel-control {
.glyphicons-chevron-left,
.glyphicons-chevron-right,
.glyphicon-chevron-left,
.glyphicon-chevron-right,
.icon-prev,
.icon-next {
width: 30px;
height: 30px;
margin-top: -15px;
margin-left: -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

View File

@ -23,6 +23,7 @@
// 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;

View File

@ -17,7 +17,6 @@ code {
font-size: 90%;
color: @code-color;
background-color: @code-bg;
white-space: nowrap;
border-radius: @border-radius-base;
}
@ -29,6 +28,13 @@ kbd {
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

View File

@ -5,7 +5,7 @@
// 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/twitter/bootstrap/pull/3552.
// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.
.fade {
opacity: 0;
@ -17,13 +17,17 @@
.collapse {
display: none;
&.in {
display: block;
}
&.in { display: block; }
tr&.in { display: table-row; }
tbody&.in { display: table-row-group; }
}
.collapsing {
position: relative;
height: 0;
overflow: hidden;
.transition(height .35s ease);
.transition-property(~"height, visibility");
.transition-duration(.35s);
.transition-timing-function(ease);
}

View File

@ -10,12 +10,13 @@
height: 0;
margin-left: 2px;
vertical-align: middle;
border-top: @caret-width-base solid;
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;
}
@ -38,6 +39,7 @@
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;
@ -102,16 +104,15 @@
&:focus {
color: @dropdown-link-disabled-color;
}
}
// Nuke hover/focus effects
.dropdown-menu > .disabled > a {
// Nuke hover/focus effects
&:hover,
&:focus {
text-decoration: none;
background-color: transparent;
background-image: none; // Remove CSS gradient
.reset-filter();
cursor: not-allowed;
cursor: @cursor-disabled;
}
}
@ -154,6 +155,7 @@
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.
@ -189,7 +191,7 @@
.dropdown-menu {
top: auto;
bottom: 100%;
margin-bottom: 1px;
margin-bottom: 2px;
}
}
@ -210,4 +212,3 @@
}
}
}

View File

@ -11,7 +11,7 @@ fieldset {
padding: 0;
margin: 0;
border: 0;
// Chrome and Firefox set a `min-width: -webkit-min-content;` on fieldsets,
// 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;
@ -31,6 +31,7 @@ legend {
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;
}
@ -51,7 +52,7 @@ input[type="search"] {
input[type="radio"],
input[type="checkbox"] {
margin: 4px 0 0;
margin-top: 1px \9; /* IE8-9 */
margin-top: 1px \9; // IE8-9
line-height: normal;
}
@ -122,7 +123,7 @@ output {
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;
border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>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");
@ -133,15 +134,20 @@ output {
.placeholder();
// Disabled and read-only inputs
// Note: 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.
//
// 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] & {
cursor: not-allowed;
background-color: @input-bg-disabled;
opacity: 1; // iOS fix for unreadable disabled content
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
@ -150,12 +156,43 @@ output {
}
}
// Special styles for iOS date input
// Search inputs in iOS
//
// In Mobile Safari, date inputs require a pixel line-height that matches the
// given height of the input.
input[type="date"] {
line-height: @input-height-base;
// 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;
}
}
}
@ -165,7 +202,7 @@ input[type="date"] {
// horizontal forms, use the predefined grid classes.
.form-group {
margin-bottom: 15px;
margin-bottom: @form-group-margin-bottom;
}
@ -175,13 +212,15 @@ input[type="date"] {
.radio,
.checkbox {
position: relative;
display: block;
min-height: @line-height-computed; // clear the floating input if there is no label text
margin-top: 10px;
margin-bottom: 10px;
padding-left: 20px;
label {
display: inline;
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;
}
@ -190,9 +229,11 @@ input[type="date"] {
.radio-inline input[type="radio"],
.checkbox input[type="checkbox"],
.checkbox-inline input[type="checkbox"] {
float: left;
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
@ -201,6 +242,7 @@ input[type="date"] {
// Radios and checkboxes on same line
.radio-inline,
.checkbox-inline {
position: relative;
display: inline-block;
padding-left: 20px;
margin-bottom: 0;
@ -215,17 +257,54 @@ input[type="date"] {
}
// Apply same disabled cursor tweak as for inputs
// Some special care is needed because <label>s don't inherit their parent's `cursor`.
//
// Note: Neither radios nor checkboxes can be readonly.
input[type="radio"],
input[type="checkbox"],
.radio,
.radio-inline,
.checkbox,
.checkbox-inline {
input[type="checkbox"] {
&[disabled],
&.disabled,
fieldset[disabled] & {
cursor: not-allowed;
cursor: @cursor-disabled;
}
}
// These classes are used directly on <label>s
.radio-inline,
.checkbox-inline {
&.disabled,
fieldset[disabled] & {
cursor: @cursor-disabled;
}
}
// These classes are used on elements with <label> descendants
.radio,
.checkbox {
&.disabled,
fieldset[disabled] & {
label {
cursor: @cursor-disabled;
}
}
}
// Static form control text
//
// Apply class to a `p` element to make any string of text align with labels in
// a horizontal form layout.
.form-control-static {
// Size it appropriately next to real form controls
padding-top: (@padding-base-vertical + 1);
padding-bottom: (@padding-base-vertical + 1);
// Remove default margin from `p`
margin-bottom: 0;
min-height: (@line-height-computed + @font-size-base);
&.input-lg,
&.input-sm {
padding-left: 0;
padding-right: 0;
}
}
@ -234,13 +313,40 @@ input[type="checkbox"],
//
// Build on `.form-control` with modifier classes to decrease or increase the
// height and font-size of form controls.
//
// The `.form-group-* form-control` variations are sadly duplicated to avoid the
// issue documented in https://github.com/twbs/bootstrap/issues/15074.
.input-sm {
.input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);
.input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);
}
.form-group-sm {
.form-control {
.input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);
}
.form-control-static {
height: @input-height-small;
padding: @padding-small-vertical @padding-small-horizontal;
font-size: @font-size-small;
line-height: @line-height-small;
min-height: (@line-height-computed + @font-size-small);
}
}
.input-lg {
.input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);
.input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);
}
.form-group-lg {
.form-control {
.input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);
}
.form-control-static {
height: @input-height-large;
padding: @padding-large-vertical @padding-large-horizontal;
font-size: @font-size-large;
line-height: @line-height-large;
min-height: (@line-height-computed + @font-size-large);
}
}
@ -256,18 +362,29 @@ input[type="checkbox"],
.form-control {
padding-right: (@input-height-base * 1.25);
}
// Feedback icon (requires .glyphicon classes)
.form-control-feedback {
position: absolute;
top: (@line-height-computed + 5); // Height of the `label` and its margin
right: 0;
display: block;
width: @input-height-base;
height: @input-height-base;
line-height: @input-height-base;
text-align: center;
}
}
// Feedback icon (requires .glyphicon classes)
.form-control-feedback {
position: absolute;
top: 0;
right: 0;
z-index: 2; // Ensure icon is above input groups
display: block;
width: @input-height-base;
height: @input-height-base;
line-height: @input-height-base;
text-align: center;
pointer-events: none;
}
.input-lg + .form-control-feedback {
width: @input-height-large;
height: @input-height-large;
line-height: @input-height-large;
}
.input-sm + .form-control-feedback {
width: @input-height-small;
height: @input-height-small;
line-height: @input-height-small;
}
// Feedback states
@ -281,14 +398,15 @@ input[type="checkbox"],
.form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);
}
// Reposition feedback icon if input has visible label above
.has-feedback label {
// Static form control text
//
// Apply class to a `p` element to make any string of text align with labels in
// a horizontal form layout.
.form-control-static {
margin-bottom: 0; // Remove default margin from `p`
& ~ .form-control-feedback {
top: (@line-height-computed + 5); // Height of the `label` and its margin
}
&.sr-only ~ .form-control-feedback {
top: 0;
}
}
@ -305,7 +423,6 @@ input[type="checkbox"],
}
// Inline forms
//
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
@ -335,32 +452,52 @@ input[type="checkbox"],
vertical-align: middle;
}
// Make static controls behave like regular ones
.form-control-static {
display: inline-block;
}
.input-group {
display: inline-table;
vertical-align: middle;
.input-group-addon,
.input-group-btn,
.form-control {
width: auto;
}
}
// Input groups need that 100% width though
.input-group > .form-control {
width: 100%;
}
.control-label {
margin-bottom: 0;
vertical-align: middle;
}
// Remove default margin on radios/checkboxes that were used for stacking, and
// then undo the floating of radios and checkboxes to match (which also avoids
// a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).
// then undo the floating of radios and checkboxes to match.
.radio,
.checkbox {
display: inline-block;
margin-top: 0;
margin-bottom: 0;
padding-left: 0;
vertical-align: middle;
label {
padding-left: 0;
}
}
.radio input[type="radio"],
.checkbox input[type="checkbox"] {
float: none;
position: relative;
margin-left: 0;
}
// Validation states
//
// Reposition the icon because it's now within a grid column and columns have
// `position: relative;` on them. Also accounts for the grid gutter padding.
// Re-override the feedback icon.
.has-feedback .form-control-feedback {
top: 0;
}
@ -375,8 +512,9 @@ input[type="checkbox"],
.form-horizontal {
// Consistent vertical alignment of labels, radios, and checkboxes
.control-label,
// Consistent vertical alignment of radios and checkboxes
//
// Labels also get some reset styles, but that is scoped to a media query below.
.radio,
.checkbox,
.radio-inline,
@ -397,14 +535,13 @@ input[type="checkbox"],
.make-row();
}
.form-control-static {
padding-top: (@padding-base-vertical + 1);
}
// Only right align form labels here when the columns stop stacking
// Reset spacing and right align labels, but scope to media queries so that
// labels on narrow viewports stack the same as a default form example.
@media (min-width: @screen-sm-min) {
.control-label {
text-align: right;
margin-bottom: 0;
padding-top: (@padding-base-vertical + 1); // Default padding plus a border
}
}
@ -413,7 +550,25 @@ input[type="checkbox"],
// Reposition the icon because it's now within a grid column and columns have
// `position: relative;` on them. Also accounts for the grid gutter padding.
.has-feedback .form-control-feedback {
top: 0;
right: (@grid-gutter-width / 2);
}
// Form group sizes
//
// Quick utility class for applying `.input-lg` and `.input-sm` styles to the
// inputs and labels within a `.form-group`.
.form-group-lg {
@media (min-width: @screen-sm-min) {
.control-label {
padding-top: ((@padding-large-vertical * @line-height-large) + 1);
}
}
}
.form-group-sm {
@media (min-width: @screen-sm-min) {
.control-label {
padding-top: (@padding-small-vertical + 1);
}
}
}
}

View File

@ -10,11 +10,12 @@
// 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}.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')";
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
@ -33,7 +34,8 @@
// Individual icons
.glyphicon-asterisk { &:before { content: "\2a"; } }
.glyphicon-plus { &:before { content: "\2b"; } }
.glyphicon-euro { &:before { content: "\20ac"; } }
.glyphicon-euro,
.glyphicon-eur { &:before { content: "\20ac"; } }
.glyphicon-minus { &:before { content: "\2212"; } }
.glyphicon-cloud { &:before { content: "\2601"; } }
.glyphicon-envelope { &:before { content: "\2709"; } }
@ -231,3 +233,73 @@
.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"; } }

View File

@ -53,11 +53,7 @@
// Columns, offsets, pushes, and pulls for extra small devices like
// smartphones.
.make-grid-columns-float(xs);
.make-grid(@grid-columns, xs, width);
.make-grid(@grid-columns, xs, pull);
.make-grid(@grid-columns, xs, push);
.make-grid(@grid-columns, xs, offset);
.make-grid(xs);
// Small grid
@ -66,11 +62,7 @@
// to tablets.
@media (min-width: @screen-sm-min) {
.make-grid-columns-float(sm);
.make-grid(@grid-columns, sm, width);
.make-grid(@grid-columns, sm, pull);
.make-grid(@grid-columns, sm, push);
.make-grid(@grid-columns, sm, offset);
.make-grid(sm);
}
@ -79,11 +71,7 @@
// Columns, offsets, pushes, and pulls for the desktop device range.
@media (min-width: @screen-md-min) {
.make-grid-columns-float(md);
.make-grid(@grid-columns, md, width);
.make-grid(@grid-columns, md, pull);
.make-grid(@grid-columns, md, push);
.make-grid(@grid-columns, md, offset);
.make-grid(md);
}
@ -92,9 +80,5 @@
// Columns, offsets, pushes, and pulls for the large desktop device range.
@media (min-width: @screen-lg-min) {
.make-grid-columns-float(lg);
.make-grid(@grid-columns, lg, width);
.make-grid(@grid-columns, lg, pull);
.make-grid(@grid-columns, lg, push);
.make-grid(@grid-columns, lg, offset);
.make-grid(lg);
}

View File

@ -17,6 +17,11 @@
}
.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
@ -34,10 +39,14 @@
.input-group-lg > .form-control,
.input-group-lg > .input-group-addon,
.input-group-lg > .input-group-btn > .btn { .input-lg(); }
.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(); }
.input-group-sm > .input-group-btn > .btn {
.input-sm();
}
// Display as table-cell

View File

@ -4,7 +4,7 @@
.jumbotron {
padding: @jumbotron-padding;
padding: @jumbotron-padding (@jumbotron-padding / 2);
margin-bottom: @jumbotron-padding;
color: @jumbotron-color;
background-color: @jumbotron-bg;
@ -13,13 +13,19 @@
.h1 {
color: @jumbotron-heading-color;
}
p {
margin-bottom: (@jumbotron-padding / 2);
font-size: @jumbotron-font-size;
font-weight: 200;
}
.container & {
> 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
}
@ -28,10 +34,10 @@
}
@media screen and (min-width: @screen-sm-min) {
padding-top: (@jumbotron-padding * 1.6);
padding-bottom: (@jumbotron-padding * 1.6);
padding: (@jumbotron-padding * 1.6) 0;
.container & {
.container &,
.container-fluid & {
padding-left: (@jumbotron-padding * 2);
padding-right: (@jumbotron-padding * 2);
}

View File

@ -15,7 +15,7 @@
border-radius: .25em;
// Add hover effects, but only for links
&[href] {
a& {
&:hover,
&:focus {
color: @label-link-hover-color;

View File

@ -35,14 +35,6 @@
margin-bottom: 0;
.border-bottom-radius(@list-group-border-radius);
}
// Align badges within list items
> .badge {
float: right;
}
> .badge + .badge {
margin-right: 5px;
}
}
@ -62,8 +54,28 @@ a.list-group-item {
&:hover,
&:focus {
text-decoration: none;
color: @list-group-link-hover-color;
background-color: @list-group-hover-bg;
}
}
.list-group-item {
// Disabled state
&.disabled,
&.disabled:hover,
&.disabled:focus {
background-color: @list-group-disabled-bg;
color: @list-group-disabled-color;
cursor: @cursor-disabled;
// Force color to inherit for custom content
.list-group-item-heading {
color: inherit;
}
.list-group-item-text {
color: @list-group-disabled-text-color;
}
}
// Active class on item itself, not parent
&.active,
@ -75,7 +87,9 @@ a.list-group-item {
border-color: @list-group-active-border;
// Force color to inherit for custom content
.list-group-item-heading {
.list-group-item-heading,
.list-group-item-heading > small,
.list-group-item-heading > .small {
color: inherit;
}
.list-group-item-text {

View File

@ -1,54 +1,59 @@
// Media objects
// Source: http://stubbornella.org/content/?p=497
// --------------------------------------------------
.media {
// Proper spacing between instances of .media
margin-top: 15px;
&:first-child {
margin-top: 0;
}
}
// Common styles
// -------------------------
// Clear the floats
.media,
.media-body {
overflow: hidden;
zoom: 1;
overflow: hidden;
}
// Proper spacing between instances of .media
.media,
.media .media {
margin-top: 15px;
}
.media:first-child {
margin-top: 0;
.media-body {
width: 10000px;
}
// For images and videos, set to block
.media-object {
display: block;
}
.media-right,
.media > .pull-right {
padding-left: 10px;
}
.media-left,
.media > .pull-left {
padding-right: 10px;
}
.media-left,
.media-right,
.media-body {
display: table-cell;
vertical-align: top;
}
.media-middle {
vertical-align: middle;
}
.media-bottom {
vertical-align: bottom;
}
// Reset margins on headings for tighter default spacing
.media-heading {
margin: 0 0 5px;
margin-top: 0;
margin-bottom: 5px;
}
// Media image alignment
// -------------------------
.media {
> .pull-left {
margin-right: 10px;
}
> .pull-right {
margin-left: 10px;
}
}
// Media list variation
// -------------------------
//
// Undo default ul/ol styles
.media-list {
padding-left: 0;

View File

@ -1,926 +1,39 @@
//
// Mixins
// --------------------------------------------------
// Utilities
// -------------------------
// Clearfix
// Source: http://nicolasgallagher.com/micro-clearfix-hack/
//
// For modern browsers
// 1. The space content is one way to avoid an Opera bug when the
// contenteditable attribute is included anywhere else in the document.
// Otherwise it causes space to appear at the top and bottom of elements
// that are clearfixed.
// 2. The use of `table` rather than `block` is only necessary if using
// `:before` to contain the top-margins of child elements.
.clearfix() {
&:before,
&:after {
content: " "; // 1
display: table; // 2
}
&:after {
clear: both;
}
}
// WebKit-style focus
.tab-focus() {
// Default
outline: thin dotted;
// WebKit
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
// Center-align a block level element
.center-block() {
display: block;
margin-left: auto;
margin-right: auto;
}
// Sizing shortcuts
.size(@width; @height) {
width: @width;
height: @height;
}
.square(@size) {
.size(@size; @size);
}
// Placeholder text
.placeholder(@color: @input-color-placeholder) {
&:-moz-placeholder { color: @color; } // Firefox 4-18
&::-moz-placeholder { color: @color; // Firefox 19+
opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526
&:-ms-input-placeholder { color: @color; } // Internet Explorer 10+
&::-webkit-input-placeholder { color: @color; } // Safari and Chrome
}
// Text overflow
// Requires inline-block or block for proper styling
.text-overflow() {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
// CSS image replacement
//
// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for
// mixins being reused as classes with the same name, this doesn't hold up. As
// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. Note
// that we cannot chain the mixins together in Less, so they are repeated.
//
// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
// Deprecated as of v3.0.1 (will be removed in v4)
.hide-text() {
font: ~"0/0" a;
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
// New mixin to use as of v3.0.1
.text-hide() {
.hide-text();
}
// CSS3 PROPERTIES
// --------------------------------------------------
// Single side border-radius
.border-top-radius(@radius) {
border-top-right-radius: @radius;
border-top-left-radius: @radius;
}
.border-right-radius(@radius) {
border-bottom-right-radius: @radius;
border-top-right-radius: @radius;
}
.border-bottom-radius(@radius) {
border-bottom-right-radius: @radius;
border-bottom-left-radius: @radius;
}
.border-left-radius(@radius) {
border-bottom-left-radius: @radius;
border-top-left-radius: @radius;
}
// Drop shadows
//
// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's
// supported browsers that have box shadow capabilities now support the
// standard `box-shadow` property.
.box-shadow(@shadow) {
-webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1
box-shadow: @shadow;
}
// Transitions
.transition(@transition) {
-webkit-transition: @transition;
transition: @transition;
}
.transition-property(@transition-property) {
-webkit-transition-property: @transition-property;
transition-property: @transition-property;
}
.transition-delay(@transition-delay) {
-webkit-transition-delay: @transition-delay;
transition-delay: @transition-delay;
}
.transition-duration(@transition-duration) {
-webkit-transition-duration: @transition-duration;
transition-duration: @transition-duration;
}
.transition-transform(@transition) {
-webkit-transition: -webkit-transform @transition;
-moz-transition: -moz-transform @transition;
-o-transition: -o-transform @transition;
transition: transform @transition;
}
// Transformations
.rotate(@degrees) {
-webkit-transform: rotate(@degrees);
-ms-transform: rotate(@degrees); // IE9 only
transform: rotate(@degrees);
}
.scale(@ratio; @ratio-y...) {
-webkit-transform: scale(@ratio, @ratio-y);
-ms-transform: scale(@ratio, @ratio-y); // IE9 only
transform: scale(@ratio, @ratio-y);
}
.translate(@x; @y) {
-webkit-transform: translate(@x, @y);
-ms-transform: translate(@x, @y); // IE9 only
transform: translate(@x, @y);
}
.skew(@x; @y) {
-webkit-transform: skew(@x, @y);
-ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
transform: skew(@x, @y);
}
.translate3d(@x; @y; @z) {
-webkit-transform: translate3d(@x, @y, @z);
transform: translate3d(@x, @y, @z);
}
.rotateX(@degrees) {
-webkit-transform: rotateX(@degrees);
-ms-transform: rotateX(@degrees); // IE9 only
transform: rotateX(@degrees);
}
.rotateY(@degrees) {
-webkit-transform: rotateY(@degrees);
-ms-transform: rotateY(@degrees); // IE9 only
transform: rotateY(@degrees);
}
.perspective(@perspective) {
-webkit-perspective: @perspective;
-moz-perspective: @perspective;
perspective: @perspective;
}
.perspective-origin(@perspective) {
-webkit-perspective-origin: @perspective;
-moz-perspective-origin: @perspective;
perspective-origin: @perspective;
}
.transform-origin(@origin) {
-webkit-transform-origin: @origin;
-moz-transform-origin: @origin;
-ms-transform-origin: @origin; // IE9 only
transform-origin: @origin;
}
// Animations
.animation(@animation) {
-webkit-animation: @animation;
animation: @animation;
}
.animation-name(@name) {
-webkit-animation-name: @name;
animation-name: @name;
}
.animation-duration(@duration) {
-webkit-animation-duration: @duration;
animation-duration: @duration;
}
.animation-timing-function(@timing-function) {
-webkit-animation-timing-function: @timing-function;
animation-timing-function: @timing-function;
}
.animation-delay(@delay) {
-webkit-animation-delay: @delay;
animation-delay: @delay;
}
.animation-iteration-count(@iteration-count) {
-webkit-animation-iteration-count: @iteration-count;
animation-iteration-count: @iteration-count;
}
.animation-direction(@direction) {
-webkit-animation-direction: @direction;
animation-direction: @direction;
}
// Backface visibility
// Prevent browsers from flickering when using CSS 3D transforms.
// Default value is `visible`, but can be changed to `hidden`
.backface-visibility(@visibility){
-webkit-backface-visibility: @visibility;
-moz-backface-visibility: @visibility;
backface-visibility: @visibility;
}
// Box sizing
.box-sizing(@boxmodel) {
-webkit-box-sizing: @boxmodel;
-moz-box-sizing: @boxmodel;
box-sizing: @boxmodel;
}
// User select
// For selecting text on the page
.user-select(@select) {
-webkit-user-select: @select;
-moz-user-select: @select;
-ms-user-select: @select; // IE10+
-o-user-select: @select;
user-select: @select;
}
// Resize anything
.resizable(@direction) {
resize: @direction; // Options: horizontal, vertical, both
overflow: auto; // Safari fix
}
// CSS3 Content Columns
.content-columns(@column-count; @column-gap: @grid-gutter-width) {
-webkit-column-count: @column-count;
-moz-column-count: @column-count;
column-count: @column-count;
-webkit-column-gap: @column-gap;
-moz-column-gap: @column-gap;
column-gap: @column-gap;
}
// Optional hyphenation
.hyphens(@mode: auto) {
word-wrap: break-word;
-webkit-hyphens: @mode;
-moz-hyphens: @mode;
-ms-hyphens: @mode; // IE10+
-o-hyphens: @mode;
hyphens: @mode;
}
// Opacity
.opacity(@opacity) {
opacity: @opacity;
// IE8 filter
@opacity-ie: (@opacity * 100);
filter: ~"alpha(opacity=@{opacity-ie})";
}
// GRADIENTS
// --------------------------------------------------
#gradient {
// Horizontal gradient, from left to right
//
// Creates two color stops, start and end, by specifying a color and position for each color stop.
// Color stops are not available in IE9 and below.
.horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1-6, Chrome 10+
background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
background-repeat: repeat-x;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down
}
// Vertical gradient, from top to bottom
//
// Creates two color stops, start and end, by specifying a color and position for each color stop.
// Color stops are not available in IE9 and below.
.vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+
background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
background-repeat: repeat-x;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down
}
.directional(@start-color: #555; @end-color: #333; @deg: 45deg) {
background-repeat: repeat-x;
background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+
background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
}
.horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);
background-repeat: no-repeat;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
}
.vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);
background-repeat: no-repeat;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
}
.radial(@inner-color: #555; @outer-color: #333) {
background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);
background-image: radial-gradient(circle, @inner-color, @outer-color);
background-repeat: no-repeat;
}
.striped(@color: rgba(255,255,255,.15); @angle: 45deg) {
background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
}
}
// Reset filters for IE
//
// When you need to remove a gradient background, do not forget to use this to reset
// the IE filter for IE9 and below.
.reset-filter() {
filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
}
// Retina images
//
// Short retina mixin for setting background-image and -size
.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {
background-image: url("@{file-1x}");
@media
only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and ( min--moz-device-pixel-ratio: 2),
only screen and ( -o-min-device-pixel-ratio: 2/1),
only screen and ( min-device-pixel-ratio: 2),
only screen and ( min-resolution: 192dpi),
only screen and ( min-resolution: 2dppx) {
background-image: url("@{file-2x}");
background-size: @width-1x @height-1x;
}
}
// Responsive image
//
// Keep images from scaling beyond the width of their parents.
.img-responsive(@display: block) {
display: @display;
max-width: 100%; // Part 1: Set a maximum relative to the parent
height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
}
// COMPONENT MIXINS
// --------------------------------------------------
// Horizontal dividers
// -------------------------
// Dividers (basically an hr) within dropdowns and nav lists
.nav-divider(@color: #e5e5e5) {
height: 1px;
margin: ((@line-height-computed / 2) - 1) 0;
overflow: hidden;
background-color: @color;
}
// Panels
// -------------------------
.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {
border-color: @border;
& > .panel-heading {
color: @heading-text-color;
background-color: @heading-bg-color;
border-color: @heading-border;
+ .panel-collapse .panel-body {
border-top-color: @border;
}
}
& > .panel-footer {
+ .panel-collapse .panel-body {
border-bottom-color: @border;
}
}
}
// Alerts
// -------------------------
.alert-variant(@background; @border; @text-color) {
background-color: @background;
border-color: @border;
color: @text-color;
hr {
border-top-color: darken(@border, 5%);
}
.alert-link {
color: darken(@text-color, 10%);
}
}
// Tables
// -------------------------
.table-row-variant(@state; @background) {
// Exact selectors below required to override `.table-striped` and prevent
// inheritance to nested tables.
.table > thead > tr,
.table > tbody > tr,
.table > tfoot > tr {
> td.@{state},
> th.@{state},
&.@{state} > td,
&.@{state} > th {
background-color: @background;
}
}
// Hover states for `.table-hover`
// Note: this is not available for cells or rows within `thead` or `tfoot`.
.table-hover > tbody > tr {
> td.@{state}:hover,
> th.@{state}:hover,
&.@{state}:hover > td,
&.@{state}:hover > th {
background-color: darken(@background, 5%);
}
}
}
// List Groups
// -------------------------
.list-group-item-variant(@state; @background; @color) {
.list-group-item-@{state} {
color: @color;
background-color: @background;
a& {
color: @color;
.list-group-item-heading { color: inherit; }
&:hover,
&:focus {
color: @color;
background-color: darken(@background, 5%);
}
&.active,
&.active:hover,
&.active:focus {
color: #fff;
background-color: @color;
border-color: @color;
}
}
}
}
// Button variants
// -------------------------
// Easily pump out default styles, as well as :hover, :focus, :active,
// and disabled options for all buttons
.button-variant(@color; @background; @border) {
color: @color;
background-color: @background;
border-color: @border;
&:hover,
&:focus,
&:active,
&.active,
.open .dropdown-toggle& {
color: @color;
background-color: darken(@background, 8%);
border-color: darken(@border, 12%);
}
&:active,
&.active,
.open .dropdown-toggle& {
background-image: none;
}
&.disabled,
&[disabled],
fieldset[disabled] & {
&,
&:hover,
&:focus,
&:active,
&.active {
background-color: @background;
border-color: @border;
}
}
.badge {
color: @background;
background-color: @color;
}
}
// Button sizes
// -------------------------
.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
padding: @padding-vertical @padding-horizontal;
font-size: @font-size;
line-height: @line-height;
border-radius: @border-radius;
}
// Pagination
// -------------------------
.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {
> li {
> a,
> span {
padding: @padding-vertical @padding-horizontal;
font-size: @font-size;
}
&:first-child {
> a,
> span {
.border-left-radius(@border-radius);
}
}
&:last-child {
> a,
> span {
.border-right-radius(@border-radius);
}
}
}
}
// Labels
// -------------------------
.label-variant(@color) {
background-color: @color;
&[href] {
&:hover,
&:focus {
background-color: darken(@color, 10%);
}
}
}
// Contextual backgrounds
// -------------------------
.bg-variant(@color) {
background-color: @color;
a&:hover {
background-color: darken(@color, 10%);
}
}
// Typography
// -------------------------
.text-emphasis-variant(@color) {
color: @color;
a&:hover {
color: darken(@color, 10%);
}
}
// Navbar vertical align
// -------------------------
// Vertically center elements in the navbar.
// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
.navbar-vertical-align(@element-height) {
margin-top: ((@navbar-height - @element-height) / 2);
margin-bottom: ((@navbar-height - @element-height) / 2);
}
// Progress bars
// -------------------------
.progress-bar-variant(@color) {
background-color: @color;
.progress-striped & {
#gradient > .striped();
}
}
// Responsive utilities
// -------------------------
// More easily include all the states for responsive-utilities.less.
.responsive-visibility() {
display: block !important;
table& { display: table; }
tr& { display: table-row !important; }
th&,
td& { display: table-cell !important; }
}
.responsive-invisibility() {
&,
tr&,
th&,
td& { display: none !important; }
}
// Grid System
// -----------
// Centered container element
.container-fixed() {
margin-right: auto;
margin-left: auto;
padding-left: (@grid-gutter-width / 2);
padding-right: (@grid-gutter-width / 2);
&:extend(.clearfix all);
}
// Creates a wrapper for a series of columns
.make-row(@gutter: @grid-gutter-width) {
margin-left: (@gutter / -2);
margin-right: (@gutter / -2);
&:extend(.clearfix all);
}
// Generate the extra small columns
.make-xs-column(@columns; @gutter: @grid-gutter-width) {
position: relative;
float: left;
width: percentage((@columns / @grid-columns));
min-height: 1px;
padding-left: (@gutter / 2);
padding-right: (@gutter / 2);
}
.make-xs-column-offset(@columns) {
@media (min-width: @screen-xs-min) {
margin-left: percentage((@columns / @grid-columns));
}
}
.make-xs-column-push(@columns) {
@media (min-width: @screen-xs-min) {
left: percentage((@columns / @grid-columns));
}
}
.make-xs-column-pull(@columns) {
@media (min-width: @screen-xs-min) {
right: percentage((@columns / @grid-columns));
}
}
// Generate the small columns
.make-sm-column(@columns; @gutter: @grid-gutter-width) {
position: relative;
min-height: 1px;
padding-left: (@gutter / 2);
padding-right: (@gutter / 2);
@media (min-width: @screen-sm-min) {
float: left;
width: percentage((@columns / @grid-columns));
}
}
.make-sm-column-offset(@columns) {
@media (min-width: @screen-sm-min) {
margin-left: percentage((@columns / @grid-columns));
}
}
.make-sm-column-push(@columns) {
@media (min-width: @screen-sm-min) {
left: percentage((@columns / @grid-columns));
}
}
.make-sm-column-pull(@columns) {
@media (min-width: @screen-sm-min) {
right: percentage((@columns / @grid-columns));
}
}
// Generate the medium columns
.make-md-column(@columns; @gutter: @grid-gutter-width) {
position: relative;
min-height: 1px;
padding-left: (@gutter / 2);
padding-right: (@gutter / 2);
@media (min-width: @screen-md-min) {
float: left;
width: percentage((@columns / @grid-columns));
}
}
.make-md-column-offset(@columns) {
@media (min-width: @screen-md-min) {
margin-left: percentage((@columns / @grid-columns));
}
}
.make-md-column-push(@columns) {
@media (min-width: @screen-md-min) {
left: percentage((@columns / @grid-columns));
}
}
.make-md-column-pull(@columns) {
@media (min-width: @screen-md-min) {
right: percentage((@columns / @grid-columns));
}
}
// Generate the large columns
.make-lg-column(@columns; @gutter: @grid-gutter-width) {
position: relative;
min-height: 1px;
padding-left: (@gutter / 2);
padding-right: (@gutter / 2);
@media (min-width: @screen-lg-min) {
float: left;
width: percentage((@columns / @grid-columns));
}
}
.make-lg-column-offset(@columns) {
@media (min-width: @screen-lg-min) {
margin-left: percentage((@columns / @grid-columns));
}
}
.make-lg-column-push(@columns) {
@media (min-width: @screen-lg-min) {
left: percentage((@columns / @grid-columns));
}
}
.make-lg-column-pull(@columns) {
@media (min-width: @screen-lg-min) {
right: percentage((@columns / @grid-columns));
}
}
// Framework grid generation
//
// Used only by Bootstrap to generate the correct number of grid classes given
// any value of `@grid-columns`.
.make-grid-columns() {
// Common styles for all sizes of grid columns, widths 1-12
.col(@index) when (@index = 1) { // initial
@item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
.col((@index + 1), @item);
}
.col(@index, @list) when (@index =< @grid-columns) { // general; "=<" isn't a typo
@item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
.col((@index + 1), ~"@{list}, @{item}");
}
.col(@index, @list) when (@index > @grid-columns) { // terminal
@{list} {
position: relative;
// Prevent columns from collapsing when empty
min-height: 1px;
// Inner gutter via padding
padding-left: (@grid-gutter-width / 2);
padding-right: (@grid-gutter-width / 2);
}
}
.col(1); // kickstart it
}
.make-grid-columns-float(@class) {
.col(@index) when (@index = 1) { // initial
@item: ~".col-@{class}-@{index}";
.col((@index + 1), @item);
}
.col(@index, @list) when (@index =< @grid-columns) { // general
@item: ~".col-@{class}-@{index}";
.col((@index + 1), ~"@{list}, @{item}");
}
.col(@index, @list) when (@index > @grid-columns) { // terminal
@{list} {
float: left;
}
}
.col(1); // kickstart it
}
.calc-grid(@index, @class, @type) when (@type = width) and (@index > 0) {
.col-@{class}-@{index} {
width: percentage((@index / @grid-columns));
}
}
.calc-grid(@index, @class, @type) when (@type = push) {
.col-@{class}-push-@{index} {
left: percentage((@index / @grid-columns));
}
}
.calc-grid(@index, @class, @type) when (@type = pull) {
.col-@{class}-pull-@{index} {
right: percentage((@index / @grid-columns));
}
}
.calc-grid(@index, @class, @type) when (@type = offset) {
.col-@{class}-offset-@{index} {
margin-left: percentage((@index / @grid-columns));
}
}
// Basic looping in LESS
.make-grid(@index, @class, @type) when (@index >= 0) {
.calc-grid(@index, @class, @type);
// next iteration
.make-grid((@index - 1), @class, @type);
}
// Form validation states
//
// Used in forms.less to generate the form validation CSS for warnings, errors,
// and successes.
.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {
// Color the label and help text
.help-block,
.control-label,
.radio,
.checkbox,
.radio-inline,
.checkbox-inline {
color: @text-color;
}
// Set the border and box shadow on specific inputs to match
.form-control {
border-color: @border-color;
.box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
&:focus {
border-color: darken(@border-color, 10%);
@shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);
.box-shadow(@shadow);
}
}
// Set validation states also for addons
.input-group-addon {
color: @text-color;
border-color: @border-color;
background-color: @background-color;
}
// Optional feedback icon
.form-control-feedback {
color: @text-color;
}
}
// Form control focus state
//
// Generate a customized focus state and for any input with the specified color,
// which defaults to the `@input-focus-border` variable.
//
// We highly encourage you to not customize the default value, but instead use
// this to tweak colors on an as-needed basis. This aesthetic change is based on
// WebKit's default styles, but applicable to a wider range of browsers. Its
// usability and accessibility should be taken into account with any change.
//
// Example usage: change the default blue border and shadow to white for better
// contrast against a dark gray background.
.form-control-focus(@color: @input-border-focus) {
@color-rgba: rgba(red(@color), green(@color), blue(@color), .6);
&:focus {
border-color: @color;
outline: 0;
.box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}");
}
}
// Form control sizing
//
// Relative text size, padding, and border-radii changes for form controls. For
// horizontal sizing, wrap controls in the predefined grid classes. `<select>`
// element gets special love because it's special, and that's a fact!
.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
height: @input-height;
padding: @padding-vertical @padding-horizontal;
font-size: @font-size;
line-height: @line-height;
border-radius: @border-radius;
select& {
height: @input-height;
line-height: @input-height;
}
textarea&,
select[multiple]& {
height: auto;
}
}
@import "mixins/hide-text.less";
@import "mixins/opacity.less";
@import "mixins/image.less";
@import "mixins/labels.less";
@import "mixins/reset-filter.less";
@import "mixins/resize.less";
@import "mixins/responsive-visibility.less";
@import "mixins/size.less";
@import "mixins/tab-focus.less";
@import "mixins/text-emphasis.less";
@import "mixins/text-overflow.less";
@import "mixins/vendor-prefixes.less";
// Components
@import "mixins/alerts.less";
@import "mixins/buttons.less";
@import "mixins/panels.less";
@import "mixins/pagination.less";
@import "mixins/list-group.less";
@import "mixins/nav-divider.less";
@import "mixins/forms.less";
@import "mixins/progress-bar.less";
@import "mixins/table-row.less";
// Skins
@import "mixins/background-variant.less";
@import "mixins/border-radius.less";
@import "mixins/gradients.less";
// Layout
@import "mixins/clearfix.less";
@import "mixins/center-block.less";
@import "mixins/nav-vertical-align.less";
@import "mixins/grid-framework.less";
@import "mixins/grid.less";

Some files were not shown because too many files have changed in this diff Show More