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) * **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). - 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'], 'permissions' => ['backend.manage_branding'],
'order' => 500 'order' => 500
], ],
'editor' => [ 'myaccount' => [
'label' => 'backend::lang.editor.menu_label', 'label' => 'backend::lang.myaccount.menu_label',
'description' => 'backend::lang.editor.menu_description', 'description' => 'backend::lang.myaccount.menu_description',
'category' => SettingsManager::CATEGORY_MYSETTINGS, 'category' => SettingsManager::CATEGORY_MYSETTINGS,
'icon' => 'icon-code', 'icon' => 'icon-user',
'url' => Backend::URL('backend/editorpreferences'), 'url' => Backend::URL('backend/users/myaccount'),
'order' => 600, 'order' => 500,
'context' => 'mysettings' 'context' => 'mysettings',
'keywords' => 'backend::lang.myaccount.menu_keywords'
], ],
'backend_preferences' => [ 'backend_preferences' => [
'label' => 'backend::lang.backend_preferences.menu_label', 'label' => 'backend::lang.backend_preferences.menu_label',
@ -116,18 +117,17 @@ class ServiceProvider extends ModuleServiceProvider
'category' => SettingsManager::CATEGORY_MYSETTINGS, 'category' => SettingsManager::CATEGORY_MYSETTINGS,
'icon' => 'icon-laptop', 'icon' => 'icon-laptop',
'class' => 'Backend\Models\BackendPreferences', 'class' => 'Backend\Models\BackendPreferences',
'order' => 500, 'order' => 510,
'context' => 'mysettings' 'context' => 'mysettings'
], ],
'myaccount' => [ 'editor' => [
'label' => 'backend::lang.myaccount.menu_label', 'label' => 'backend::lang.editor.menu_label',
'description' => 'backend::lang.myaccount.menu_description', 'description' => 'backend::lang.editor.menu_description',
'category' => SettingsManager::CATEGORY_MYSETTINGS, 'category' => SettingsManager::CATEGORY_MYSETTINGS,
'icon' => 'icon-user', 'icon' => 'icon-code',
'url' => Backend::URL('backend/users/myaccount'), 'url' => Backend::URL('backend/editorpreferences'),
'order' => 400, 'order' => 520,
'context' => 'mysettings', 'context' => 'mysettings'
'keywords' => 'backend::lang.myaccount.menu_keywords'
], ],
'access_logs' => [ 'access_logs' => [
'label' => 'backend::lang.access_log.menu_label', 'label' => 'backend::lang.access_log.menu_label',
@ -136,7 +136,7 @@ class ServiceProvider extends ModuleServiceProvider
'icon' => 'icon-lock', 'icon' => 'icon-lock',
'url' => Backend::url('backend/accesslogs'), 'url' => Backend::url('backend/accesslogs'),
'permissions' => ['system.access_logs'], '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/datepicker/assets/js/build.js');
$combiner->registerBundle('~/modules/backend/formwidgets/richeditor/assets/less/richeditor.less'); $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/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 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.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{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 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 ul.nav{display:inline-block}
nav#layout-mainmenu.navbar .menu-toggle{display:none} 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:after{right:-12px}
nav#layout-mainmenu.navbar .toolbar-item.scroll-active-before:before{color:#ffffff} 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 .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.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: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} nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu ul{float:none;display:block}

View File

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

View File

@ -561,6 +561,12 @@ class RelationController extends ControllerBehavior
if ($config->recordUrl) { if ($config->recordUrl) {
$defaultOnClick = null; $defaultOnClick = null;
} }
elseif (
!$this->makeConfigForMode('manage', 'form', false) &&
!$this->makeConfigForMode('pivot', 'form', false)
) {
$defaultOnClick = null;
}
$config->recordOnClick = $this->getConfig('view[recordOnClick]', $defaultOnClick); $config->recordOnClick = $this->getConfig('view[recordOnClick]', $defaultOnClick);
@ -898,7 +904,7 @@ class RelationController extends ControllerBehavior
$saveData = $this->manageWidget->getSaveData(); $saveData = $this->manageWidget->getSaveData();
if ($this->viewMode == 'multi') { if ($this->viewMode == 'multi') {
$model = $this->relationObject->find($this->manageId); $model = $this->relationModel->find($this->manageId);
$model->save($saveData, $this->manageWidget->getSessionKey()); $model->save($saveData, $this->manageWidget->getSessionKey());
} }
elseif ($this->viewMode == 'single') { elseif ($this->viewMode == 'single') {
@ -1267,7 +1273,7 @@ class RelationController extends ControllerBehavior
* Returns the configuration for a mode (view, manage, pivot) for an * Returns the configuration for a mode (view, manage, pivot) for an
* expected type (list, form). Uses fallback configuration. * 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; $config = null;
@ -1293,12 +1299,16 @@ class RelationController extends ControllerBehavior
* - view.list => manage.list * - view.list => manage.list
*/ */
if (!$config) { if (!$config) {
if ($mode == 'manage' && $type == 'list') { if ($mode == 'manage' && $type == 'list') {
return $this->makeConfigForMode('view', $type); 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); 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; $.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 --> <!-- Passable fields -->
<input type="hidden" name="manage_id" value="<?= $relationManageId ?>" /> <input type="hidden" name="manage_id" value="<?= $relationManageId ?>" />
<input type="hidden" name="_relation_field" value="<?= $relationField ?>" /> <input type="hidden" name="_relation_field" value="<?= $relationField ?>" />
<input type="hidden" name="_relation_mode" value="form" /> <input type="hidden" name="_relation_mode" value="form" />
<input type="hidden" name="_relation_session_key" value="<?= $relationSessionKey ?>" /> <input type="hidden" name="_relation_session_key" value="<?= $relationSessionKey ?>" />
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="popup">&times;</button> <button type="button" class="close" data-dismiss="popup">&times;</button>
<h4 class="modal-title"> <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): ?> <?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: ?> <?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 ?> <?php endif ?>
</h4> </div>
</div>
<div class="modal-body"> <?= Form::close() ?>
<?= $relationManageWidget->render(['preview' => $this->readOnly]) ?>
</div>
<div class="modal-footer"> <?php else: ?>
<?php if ($this->readOnly): ?>
<button <?= Form::ajax('onRelationManageCreate', ['data-popup-load-indicator' => true, 'sessionKey' => $newSessionKey]) ?>
type="button"
class="btn btn-default" <!-- Passable fields -->
data-dismiss="popup"> <input type="hidden" name="_relation_field" value="<?= $relationField ?>" />
<?= e(trans('backend::lang.relation.close')) ?> <input type="hidden" name="_relation_mode" value="form" />
</button> <input type="hidden" name="_relation_session_key" value="<?= $relationSessionKey ?>" />
<?php else: ?>
<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 <button
type="submit" type="submit"
class="btn btn-primary"> class="btn btn-primary">
<?= e(trans('backend::lang.relation.update')) ?> <?= e(trans('backend::lang.relation.create')) ?>
</button> </button>
<button <button
type="button" type="button"
@ -43,43 +81,16 @@
data-dismiss="popup"> data-dismiss="popup">
<?= e(trans('backend::lang.relation.cancel')) ?> <?= e(trans('backend::lang.relation.cancel')) ?>
</button> </button>
<?php endif ?> </div>
</div> <?= Form::close() ?>
<?= Form::close() ?> <?php endif ?>
<?php else: ?> </div>
<?= Form::ajax('onRelationManageCreate', ['data-popup-load-indicator' => true, 'sessionKey' => $newSessionKey]) ?> <script>
$.oc.relationBehavior.bindToPopups('#<?= $relationManageWidget->getId("managePopup") ?>', {
<!-- Passable fields --> _relation_field: '<?= $relationField ?>',
<input type="hidden" name="_relation_field" value="<?= $relationField ?>" /> _relation_mode: 'form'
<input type="hidden" name="_relation_session_key" value="<?= $relationSessionKey ?>" /> })
</script>
<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 ?>

View File

@ -1,105 +1,21 @@
.field-codeeditor { .field-codeeditor{width:100%;position:relative;border:2px solid #e0e0e0;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}
width: 100%; .field-codeeditor textarea{opacity:0;filter:alpha(opacity=0)}
position: relative; .field-codeeditor.editor-focus{border:2px solid #808c8d}
border: 2px solid #e0e0e0; .field-codeeditor.size-tiny{min-height:50px}
-webkit-border-radius: 2px; .field-codeeditor.size-small{min-height:100px}
-moz-border-radius: 2px; .field-codeeditor.size-large{min-height:200px}
border-radius: 2px; .field-codeeditor.size-huge{min-height:250px}
} .field-codeeditor.size-giant{min-height:350px}
.field-codeeditor textarea { .field-codeeditor .ace_search{font-family:'Open Sans',Arial,sans-serif;font-size:14px;color:#333333;z-index:603}
opacity: 0; .field-codeeditor .editor-code{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}
filter: alpha(opacity=0); .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-focus { .field-codeeditor .editor-toolbar > ul > li{float:left}
border: 2px solid #808c8d; .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.size-tiny { .field-codeeditor .editor-toolbar > ul > li > a > i{opacity:0.4;filter:alpha(opacity=40);display:block}
min-height: 50px; .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.size-small { .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}
min-height: 100px; .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}
.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;
}

View File

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

View File

@ -11,7 +11,7 @@
aria-label="Remove" aria-label="Remove"
data-request="<?= $this->getEventHandler('onRemoveItem') ?>" data-request="<?= $this->getEventHandler('onRemoveItem') ?>"
data-request-data="'index': '<?= $indexValue ?>'" 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?"> data-request-confirm="Are you sure?">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </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:before{content:"\2014\00a0"}
.redactor-editor figure[data-type=quote] cite:empty:before{opacity:0.4;content:"\2014 Type to add citation (optional)"} .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 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: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 .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} .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} .field-richeditor.size-giant .redactor-editor{height:320px !important}
.redactor-box{margin-bottom:0} .redactor-box{margin-bottom:0}
.redactor-box iframe{border:none} .redactor-box iframe{border:none}
.redactor-box-fullscreen{z-index:415 !important} .redactor-box-fullscreen{z-index:715 !important}
.redactor-toolbar,.redactor-dropdown{z-index:410 !important} .redactor-toolbar,.redactor-dropdown{z-index:710 !important}
#redactor-modal-overlay,#redactor-modal-box,#redactor-modal{z-index:420 !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{background:#dddddd;-webkit-box-shadow:none;box-shadow:none}
.redactor-toolbar li.redactor-btn-right{float:right;margin-right:2px} .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} .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"; @import "../../../../assets/less/core/boot.less";
@richeditor-toolbar-size: 30px; @richeditor-toolbar-size: 30px;
@richeditor-zindex: 300; @richeditor-zindex: 600;
@richeditor-gutter: 20px; @richeditor-gutter: 20px;
@import "_redactor.less"; @import "_redactor.less";

View File

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

File diff suppressed because one or more lines are too long

View File

@ -256,7 +256,7 @@ return [
], ],
'mysettings' => [ 'mysettings' => [
'menu_label' => 'My Settings', 'menu_label' => 'My Settings',
'menu_description' => 'Settings relate to your administration account' 'menu_description' => 'Settings related to your administration account'
], ],
'myaccount' => [ 'myaccount' => [
'menu_label' => 'My account', 'menu_label' => 'My account',
@ -299,6 +299,6 @@ return [
'email' => 'Email' 'email' => 'Email'
], ],
'filter' => [ '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 [ return [
'auth' => [ 'auth' => [
'title' => 'Área de Administração' 'title' => 'Área Administrativa',
], ],
'field' => [ 'field' => [
'invalid_type' => 'Tipo de campo inválido utilizado :type.', 'invalid_type' => 'Tipo de campo inválido :type.',
'options_method_not_exists' => 'A classe do modelo :model deve definir um método :method() retornando opções pro campo ":field".', 'options_method_not_exists' => 'A classe :model deve definir um método :method() retornando opções para o campo ":field".',
], ],
'widget' => [ 'widget' => [
'not_registered' => "Uma classe de widget com o nome ':name' não foi definida", '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_bound' => 'Um widget da classe ":name" não foi ligado ao controlador',
], ],
'page' => [ 'page' => [
'untitled' => "Sem Título", 'untitled' => 'Sem Título',
'access_denied' => [ 'access_denied' => [
'label' => "Acesso negado", 'label' => 'Acesso negado',
'help' => "Você não tem as permissões necessárias para visualizar esta página.", 'help' => 'Você não tem as permissões necessárias para visualizar esta página.',
'cms_link' => "Voltar à área de administração", 'cms_link' => 'Retornar à área administrativa',
], ],
], ],
'partial' => [ 'partial' => [
'not_found_name' => "O bloco ':name' não foi encontrado.", 'not_found_name' => 'O bloco ":name" não foi encontrado.',
], ],
'account' => [ 'account' => [
'sign_out' => 'Sair', 'sign_out' => 'Sair',
@ -30,31 +30,31 @@ return [
'restore' => 'Restaurar', 'restore' => 'Restaurar',
'login_placeholder' => 'usuário', 'login_placeholder' => 'usuário',
'password_placeholder' => 'senha', 'password_placeholder' => 'senha',
'forgot_password' => "Esqueceu sua senha?", 'forgot_password' => 'Esqueceu sua senha?',
'enter_email' => "Digite seu email", 'enter_email' => 'Digite seu email',
'enter_login' => "Digite seu nome de usuário", 'enter_login' => 'Digite seu nome de usuário',
'email_placeholder' => "e-mail", 'email_placeholder' => 'e-mail',
'enter_new_password' => "Digite uma nova senha", 'enter_new_password' => 'Digite uma nova senha',
'password_reset' => "Redefinir sua senha", 'password_reset' => 'Redefinir sua senha',
'restore_success' => "Um email com instruções para redfinir sua senha foram enviados para o seu email.", '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", '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_success' => 'Sua senha foi redefinida com sucesso. Você já pode entrar novamente.',
'reset_error' => "Erro ao redefinir sua senha. Por favor, tente de novo.", 'reset_error' => 'A senha redefinida é inválida. Por favor, tente de novo!',
'reset_fail' => "Falha ao redefinir sua senha!", 'reset_fail' => 'Falha ao redefinir sua senha!',
'apply' => 'Aplicar', 'apply' => 'Aplicar',
'cancel' => 'Cancelar', 'cancel' => 'Cancelar',
'delete' => 'Excluir', 'delete' => 'Excluir',
'ok' => 'OK', 'ok' => 'Ok',
], ],
'dashboard' => [ 'dashboard' => [
'menu_label' => 'Painel', 'menu_label' => 'Painel',
'widget_label' => 'Widget', 'widget_label' => 'Widget',
'widget_width' => 'Largura', 'widget_width' => 'Largura',
'full_width' => 'Largura completa', 'full_width' => 'Largura total',
'add_widget' => 'Adicionar widget', 'add_widget' => 'Adicionar widget',
'widget_inspector_title' => 'Configurações do widget', 'widget_inspector_title' => 'Configurações do widget',
'widget_inspector_description' => 'Relatório de configurações do widget', 'widget_inspector_description' => 'Configurar widget de relatório',
'widget_columns_label' => 'Largura de :columns', 'widget_columns_label' => 'Largura :columns',
'widget_columns_description' => 'Largura do widget, um número entre 1 e 10.', '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.', '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', 'columns' => '{1} coluna|[2,Inf] colunas',
@ -63,11 +63,11 @@ return [
'widget_title_label' => 'Título do widget', 'widget_title_label' => 'Título do widget',
'widget_title_error' => 'O título do widget é necessário.', 'widget_title_error' => 'O título do widget é necessário.',
'status' => [ 'status' => [
'widget_title_default' => 'Condição do Sistema', 'widget_title_default' => 'Status do Sistema',
'online' => 'online', 'online' => 'online',
'maintenance' => 'em manutenção', 'maintenance' => 'em manutenção',
'update_available' => '{0} atualizações disponíveis!|{1} atualização disponível!|[2,Inf] atualizações disponíveis!', 'update_available' => '{0} atualizações disponíveis!|{1} atualização disponível!|[2,Inf] atualizações disponíveis!',
] ],
], ],
'user' => [ 'user' => [
'name' => 'Administrador', 'name' => 'Administrador',
@ -75,22 +75,22 @@ return [
'menu_description' => 'Gerenciar administradores, grupos e permissões.', 'menu_description' => 'Gerenciar administradores, grupos e permissões.',
'list_title' => 'Gerenciar administradores', 'list_title' => 'Gerenciar administradores',
'new' => 'Novo administrador', 'new' => 'Novo administrador',
'login' => "Usuário", 'login' => 'Usuário',
'first_name' => "Nome", 'first_name' => 'Nome',
'last_name' => "Sobrenome", 'last_name' => 'Sobrenome',
'full_name' => "Nome Completo", 'full_name' => 'Nome Completo',
'email' => "E-mail", 'email' => 'E-mail',
'groups' => "Grupos", 'groups' => 'Grupos',
'groups_comment' => "Defina a quais grupos essa pessoa pertence.", 'groups_comment' => 'Defina a quais grupos essa pessoa pertence.',
'avatar' => "Foto", 'avatar' => 'Foto',
'password' => "Senha", 'password' => 'Senha',
'password_confirmation' => "Confirme a senha", 'password_confirmation' => 'Confirme a senha',
'permissions' => 'Permissões', 'permissions' => 'Permissões',
'superuser' => "Super Usuário", 'superuser' => 'Super Usuário',
'superuser_comment' => "Marque essa caixa para liberar o acesso completo para este usuário.", 'superuser_comment' => 'Marque para liberar o acesso irrestrito para este usuário.',
'send_invite' => 'Enviar convite por e-mail', 'send_invite' => 'Enviar convite por e-mail',
'send_invite_comment' => 'Marque esta caixa para enviar um convite por e-mail', 'send_invite_comment' => 'Marque para enviar um convite por e-mail',
'delete_confirm' => 'Você realmente quer apagar este administrador?', 'delete_confirm' => 'Você realmente deseja apagar este administrador?',
'return' => 'Retornar à lista de administradores', 'return' => 'Retornar à lista de administradores',
'allow' => 'Permitir', 'allow' => 'Permitir',
'inherit' => 'Herdar', 'inherit' => 'Herdar',
@ -99,58 +99,58 @@ return [
'name' => 'Grupo', 'name' => 'Grupo',
'name_field' => 'Nome', 'name_field' => 'Nome',
'description_field' => 'Descrição', '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_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', 'menu_label' => 'Grupos',
'list_title' => 'Gerenciar grupos', 'list_title' => 'Gerenciar grupos',
'new' => 'Novo grupo administrador', 'new' => 'Novo grupo administrador',
'delete_confirm' => 'Você realmente deseja excluir este grupo de administradores?', 'delete_confirm' => 'Você realmente deseja excluir este grupo?',
'return' => 'Voltar para a lista de grupos de administradores', 'return' => 'Voltar para a lista de grupos',
], ],
'preferences' => [ 'preferences' => [
'not_authenticated' => 'Nenhum usuário autenticado pra carregar as preferências.' 'not_authenticated' => 'Nenhum usuário autenticado para carregar as preferências.',
] ],
], ],
'list' => [ 'list' => [
'default_title' => 'Lista', 'default_title' => 'Lista',
'search_prompt' => 'Buscar...', 'search_prompt' => 'Buscar...',
'no_records' => 'Nenhum registro encontrado.', '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_column' => 'Não existe definição de coluna para :columns.',
'missing_columns' => 'Lista utilizada em :class não possui colunas de lista definidas.', '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'.", 'missing_definition' => 'Lista não possui uma coluna para ":field".',
'behavior_not_ready' => 'Lista não foi inicializada. Confira se você chamou makeLists() no seu controlador.', '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 da referência de \$dates no modelo?", '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', 'pagination' => 'Registros exibidos: :from-:to de :total',
'prev_page' => 'Anterior', 'prev_page' => 'Anterior',
'next_page' => 'Próxima', 'next_page' => 'Próxima',
'loading' => 'Carregando...', 'loading' => 'Carregando...',
'setup_title' => 'Configuração da Lista', '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' => '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' => 'Deletar selecionado',
'delete_selected_empty' => 'Não há registros selecionados para excluir.', 'delete_selected_empty' => 'Não há registros selecionados para excluir.',
'delete_selected_confirm' => 'Excluir os registros selecionados?', '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' => [ 'fileupload' => [
'attachment' => 'Anexo', 'attachment' => 'Anexo',
'help' => 'Adicione um título e descrição a este anexo.', 'help' => 'Adicione um título e descrição a este anexo.',
'title_label' => 'Título', 'title_label' => 'Título',
'description_label' => 'Descrição' 'description_label' => 'Descrição',
], ],
'form' => [ 'form' => [
'create_title' => "Novo :name", 'create_title' => 'Novo :name',
'update_title' => "Editar :name", 'update_title' => 'Editar :name',
'preview_title' => "Visualizar :name", 'preview_title' => 'Visualizar :name',
'create_success' => ':name foi criado com sucesso', 'create_success' => ':name foi criado com sucesso',
'update_success' => ':name foi atualizado com sucesso', 'update_success' => ':name foi atualizado com sucesso',
'delete_success' => ':name foi apagado com sucesso', 'delete_success' => ':name foi apagado com sucesso',
'missing_id' => "ID do registro não especificado", 'missing_id' => 'O ID do registro não foi fornecido',
'missing_model' => 'Formulário utilizado na classe :class não tem um modelo definido.', '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'.", 'missing_definition' => 'Formulário não contém um campo ":field".',
'not_found' => 'Nenhum registro encontrado com o ID :id', 'not_found' => 'Nenhum registro encontrado com o ID :id',
'action_confirm' => 'Você tem certeza?', 'action_confirm' => 'Você tem certeza?',
'create' => 'Criar', 'create' => 'Criar',
@ -179,7 +179,7 @@ return [
'ok' => 'Ok', 'ok' => 'Ok',
'or' => 'ou', 'or' => 'ou',
'confirm_tab_close' => 'Tem certeza que deseja fechar essa aba? As alterações que não foram salvas serão perdidas', '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', 'preview_no_files_message' => 'Os arquivos não foram carregados',
'select' => 'Selecionar', 'select' => 'Selecionar',
'select_all' => 'todos', 'select_all' => 'todos',
@ -188,55 +188,55 @@ return [
'insert_row' => 'Inserir linha', 'insert_row' => 'Inserir linha',
'delete_row' => 'Excluir linha', 'delete_row' => 'Excluir linha',
'concurrency_file_changed_title' => 'O arquivo foi alterado', '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' => [ 'relation' => [
'missing_config' => "Comportamento de relação não tem qualquer configuração ':config'.", 'missing_config' => 'Comportamento relation não tem uma configuração para ":config".',
'missing_definition' => "Relacionamento não contém uma definição para ':field'.", 'missing_definition' => 'Comportamento relation não contém uma definição para ":field".',
'missing_model' => "Relacionamento utilizado na classe :class não possui um modelo definido.", '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_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.", 'invalid_action_multi' => 'Essa ação não pode ser realizada num relacionamento múltiplo.',
'help' => "Clique em um item para adicionar", 'help' => 'Clique em um item para adicionar',
'related_data' => "Dados do :name relacionados", 'related_data' => 'Dados de :name relacionado',
'add' => "Adicionar", 'add' => 'Adicionar',
'add_selected' => "Adicionar seleção", 'add_selected' => 'Adicionar seleção',
'add_a_new' => "Adicionar um(a) novo(a) :name", 'add_a_new' => 'Adicionar um(a) novo(a) :name',
'link_selected' => "Vincular selecionado", 'link_selected' => 'Vincular selecionado',
'link_a_new' => "Vincular um novo :name", 'link_a_new' => 'Vincular um novo :name',
'cancel' => "Cancelar", 'cancel' => 'Cancelar',
'close' => "Fechar", 'close' => 'Fechar',
'add_name' => "Adicionar :name", 'add_name' => 'Adicionar :name',
'create' => "Criar", 'create' => 'Criar',
'create_name' => "Criar :name", 'create_name' => 'Criar :name',
'update' => "Atualizar", 'update' => 'Atualizar',
'update_name' => "Atualizar :name", 'update_name' => 'Atualizar :name',
'preview' => "Visualizar", 'preview' => 'Visualizar',
'preview_name' => "Visualizar :name", 'preview_name' => 'Visualizar :name',
'remove' => "Remover", 'remove' => 'Remover',
'remove_name' => "Remover :name", 'remove_name' => 'Remover :name',
'delete' => "Excluir", 'delete' => 'Excluir',
'delete_name' => "Excluir :name", 'delete_name' => 'Excluir :name',
'delete_confirm' => "Você tem certeza?", 'delete_confirm' => 'Você tem certeza?',
'link' => "Vincular", 'link' => 'Vincular',
'link_name' => "Vincular :name", 'link_name' => 'Vincular :name',
'unlink' => "Desvincular", 'unlink' => 'Desvincular',
'unlink_name' => "Desvincular :name", 'unlink_name' => 'Desvincular :name',
'unlink_confirm' => "Você tem certeza?", 'unlink_confirm' => 'Você tem certeza?',
], ],
'model' => [ 'model' => [
'name' => "Modelo", 'name' => 'Model',
'not_found' => "Modelo ':class' com ID :id não foi encontrado", 'not_found' => 'Model ":class" com ID :id não foi encontrado',
'missing_id' => "ID do registro não especificado.", 'missing_id' => 'ID do registro não especificado.',
'missing_relation' => "Modelo ':class' não contém uma definição para o relacionamento ':relation'.", 'missing_relation' => 'Model ":class" não contém uma definição para o relacionamento ":relation".',
'missing_method' => "Modelo ':class' não contém o método ':method'.", 'missing_method' => 'Model ":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.", 'invalid_class' => 'Model :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'.", 'mass_assignment_failed' => 'Falha na atribuição em massa do atributo ":attribute" do Model.',
], ],
'warnings' => [ 'warnings' => [
'tips' => 'Dicas de configuração do sistema', '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.', 'tips_description' => 'Há itens que demandam atenção para 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.', '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 extenção PHP :name não está instalada. Por favor, instale esta biblioteca para ativar a extensão.' 'extension' => 'A extensão PHP :name não está instalada. Por favor, instale esta biblioteca para ativar a extensão.',
], ],
'editor' => [ 'editor' => [
'menu_label' => 'Definições do Editor', 'menu_label' => 'Definições do Editor',
@ -260,30 +260,30 @@ return [
], ],
'myaccount' => [ 'myaccount' => [
'menu_label' => 'Minha Conta', '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' 'menu_keywords' => 'login de segurança'
], ],
'branding' => [ 'branding' => [
'menu_label' => 'Personalize back-end', 'menu_label' => 'Personalização',
'menu_description' => 'Personalize a área de administração, tais como nome, cores e logo.', 'menu_description' => 'Personalizar detalhes da área administrativa, tais como título, cores e logo.',
'brand' => 'Marca', 'brand' => 'Marca',
'logo' => 'Logo', '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' => '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' => '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', 'colors' => 'Cores',
'primary_light' => 'Primária (Clara)', 'primary_light' => 'Primária (Clara)',
'primary_dark' => 'Primária (Escura)', 'primary_dark' => 'Primária (Escura)',
'secondary_light' => 'Secundária (Clara)', 'secondary_light' => 'Secundária (Clara)',
'secondary_dark' => 'Secundária (Escura)', 'secondary_dark' => 'Secundária (Escura)',
'styles' => 'Estilos', 'styles' => 'Estilos',
'custom_stylesheet' => 'Personalização do estilo CSS' 'custom_stylesheet' => 'CSS customizado',
], ],
'backend_preferences' => [ 'backend_preferences' => [
'menu_label' => 'Preferências da Administração', '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' => 'Idioma',
'locale_comment' => 'Selecione o idioma de sua preferência.', 'locale_comment' => 'Selecione o idioma de sua preferência.',
], ],
@ -294,11 +294,11 @@ return [
'created_at' => 'Data & Hora', 'created_at' => 'Data & Hora',
'login' => 'Login', 'login' => 'Login',
'ip_address' => 'Endereço IP', 'ip_address' => 'Endereço IP',
'first_name' => 'Primeiro Nome', 'first_name' => 'Nome',
'last_name' => 'Sobrenome', 'last_name' => 'Sobrenome',
'email' => 'E-mail', 'email' => 'E-mail',
], ],
'filter' => [ 'filter' => [
'all' => 'todos' 'all' => 'todos',
] ],
]; ];

View File

@ -56,6 +56,8 @@ class BackendPreferences extends Model
'tr' => [Lang::get('system::lang.locale.tr'), 'flag-tr'], 'tr' => [Lang::get('system::lang.locale.tr'), 'flag-tr'],
'pl' => [Lang::get('system::lang.locale.pl'), 'flag-pl'], 'pl' => [Lang::get('system::lang.locale.pl'), 'flag-pl'],
'sk' => [Lang::get('system::lang.locale.sk'), 'flag-sk'], '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 // Sort locales alphabetically

View File

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

View File

@ -361,25 +361,6 @@ class Lists extends WidgetBase
$joins[] = $column->relation; $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 * Add eager loads to the query
*/ */
@ -387,6 +368,39 @@ class Lists extends WidgetBase
$query->with(array_unique($withs)); $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 * 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 * Apply sorting
*/ */

View File

@ -13,6 +13,7 @@
this.options = options || {}; this.options = options || {};
this.bindDependants() this.bindDependants()
this.bindCheckboxlist()
this.toggleEmptyTabs() this.toggleEmptyTabs()
} }
@ -20,6 +21,28 @@
refreshHandler: null 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 * Bind dependant fields
*/ */

View File

@ -40,12 +40,12 @@
<!-- Quick selection --> <!-- Quick selection -->
<small> <small>
<?= e(trans('backend::lang.form.select')) ?>: <?= 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:;" data-field-checkboxlist-all><?= 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-none><?= e(trans('backend::lang.form.select_none')) ?></a>
</small> </small>
<!-- Scrollable Checkbox list --> <!-- Scrollable Checkbox list -->
<div class="field-checkboxlist-scrollable" id="<?= $field->getId('scrollable') ?>"> <div class="field-checkboxlist-scrollable">
<div class="control-scrollbar" data-control="scrollbar"> <div class="control-scrollbar" data-control="scrollbar">
<?php endif ?> <?php endif ?>
@ -93,4 +93,4 @@
<p><?= e(trans($field->placeholder)) ?></p> <p><?= e(trans($field->placeholder)) ?></p>
<?php endif ?> <?php endif ?>
<?php endif ?> <?php endif ?>

View File

@ -1,6 +1,6 @@
<?= Form::open([ <?= Form::open([
'data-request' => $this->getEventHandler('onAddWidget'), '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 'data-popup-load-indicator' => 1
]) ?> ]) ?>
<div class="modal-header"> <div class="modal-header">

View File

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

View File

@ -362,13 +362,13 @@ class CmsCompoundObject extends CmsObject
$objectComponentMap[$objectCode] = []; $objectComponentMap[$objectCode] = [];
} }
else { else {
foreach ($this->settings['components'] as $componentName => $componentSettings) { foreach ($this->settings['components'] as $name => $settings) {
$nameParts = explode(' ', $componentName); $nameParts = explode(' ', $name);
if (count($nameParts > 1)) { if (count($nameParts > 1)) {
$componentName = trim($nameParts[0]); $name = trim($nameParts[0]);
} }
$component = $this->getComponent($componentName); $component = $this->getComponent($name);
if (!$component) { if (!$component) {
continue; continue;
} }
@ -379,7 +379,7 @@ class CmsCompoundObject extends CmsObject
$componentProperties[$propertyName] = $component->property($propertyName); $componentProperties[$propertyName] = $component->property($propertyName);
} }
$objectComponentMap[$objectCode][$componentName] = $componentProperties; $objectComponentMap[$objectCode][$name] = $componentProperties;
} }
} }
@ -441,8 +441,9 @@ class CmsCompoundObject extends CmsObject
protected function fillViewBagArray() protected function fillViewBagArray()
{ {
$viewBag = $this->getViewBag(); $viewBag = $this->getViewBag();
foreach ($viewBag->getProperties() as $name=>$value) foreach ($viewBag->getProperties() as $name => $value) {
$this->viewBag[$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 ?>" class="btn btn-default empty oc-icon-trash-o <?php if (!$templatePath): ?>hide<?php endif ?>"
data-request="onDelete" data-request="onDelete"
data-request-confirm="<?= e(trans('cms::lang.content.delete_confirm_single')) ?>" 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> data-control="delete-button"></button>
</div> </div>

View File

@ -13,6 +13,6 @@
class="btn btn-default empty oc-icon-trash-o <?php if (!$templatePath): ?>hide<?php endif ?>" class="btn btn-default empty oc-icon-trash-o <?php if (!$templatePath): ?>hide<?php endif ?>"
data-request="onDelete" data-request="onDelete"
data-request-confirm="<?= e(trans('cms::lang.layout.delete_confirm_single')) ?>" 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> data-control="delete-button"></button>
</div> </div>

View File

@ -24,6 +24,6 @@
class="btn btn-default empty oc-icon-trash-o <?php if (!$templatePath): ?>hide<?php endif ?>" class="btn btn-default empty oc-icon-trash-o <?php if (!$templatePath): ?>hide<?php endif ?>"
data-request="onDelete" data-request="onDelete"
data-request-confirm="<?= e(trans('cms::lang.page.delete_confirm_single')) ?>" 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> data-control="delete-button"></button>
</div> </div>

View File

@ -13,6 +13,6 @@
class="btn btn-default empty oc-icon-trash-o <?php if (!$templatePath): ?>hide<?php endif ?>" class="btn btn-default empty oc-icon-trash-o <?php if (!$templatePath): ?>hide<?php endif ?>"
data-request="onDelete" data-request="onDelete"
data-request-confirm="<?= e(trans('cms::lang.partial.delete_confirm_single')) ?>" 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> data-control="delete-button"></button>
</div> </div>

View File

@ -60,7 +60,7 @@ return [
'export_button' => 'Export', 'export_button' => 'Export',
'export_title' => 'Export theme', 'export_title' => 'Export theme',
'export_folders_label' => 'Folders', '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_button' => 'Delete',
'delete_confirm' => 'Are you sure you want to delete this theme? It cannot be undone!', '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.', '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 [ return [
'cms_object' => [ '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', 'invalid_property' => 'A propriedade ":nome" não pode ser definida',
'file_already_exists' => 'Arquivo ":name" já existe.', 'file_already_exists' => 'Arquivo ":name" já existe.',
'error_saving' => 'Erro ao salvar arquivo ":name".', 'error_saving' => 'Erro ao salvar arquivo ":name". Verifique as permissões de escrita.',
'error_creating_directory' => 'Erro ao criar o diretório :name', 'error_creating_directory' => 'Erro ao criar o diretório :name. Verifique as permissões de escrita.',
'invalid_file_extension'=>'Extenção de arquivo inválido: :invalid. Extenções válidas: :allowed.', 'invalid_file_extension'=>'Extensão de arquivo inválida: :invalid. Extensões válidas: :allowed.',
'error_deleting' => 'Erro ao excluir o arquivo de modelo ":name".', 'error_deleting' => 'Erro ao excluir o arquivo de template ":name". Verifique as permissões de escrita.',
'delete_success' => 'Modelos apagados com sucesso: :count.', 'delete_success' => 'Templates apagados com sucesso: :count.',
'file_name_required' => 'O campo Nome do Arquivo é necessária.' 'file_name_required' => 'O campo de Nome do Arquivo é necessário.',
], ],
'theme' => [ 'theme' => [
'not_found_name' => 'O tema ":name" não foi encontrado.',
'active' => [ 'active' => [
'not_set' => "O tema ativo não foi definido.", 'not_set' => 'O tema ativo não foi definido.',
'not_found' => "O tema ativo não foi encontrado.", 'not_found' => 'O tema ativo não foi encontrado.',
], ],
'edit' => [ 'edit' => [
'not_set' => "O tema de edição não foi definido.", 'not_set' => 'O tema de edição não foi definido.',
'not_found' => "O tema de edição não foi encontrado.", '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_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' => 'Temas',
'settings_menu_description' => 'Veja a lista de temas instalados.', 'settings_menu_description' => 'Veja a lista de temas instalados e selecione o tema ativo.',
'find_more_themes' => 'Encontrar mais temas.', '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', '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' => [ 'page' => [
'not_found_name' => 'A página ":name" não foi encontrada',
'not_found' => [ 'not_found' => [
'label' => "Página não encontrada", 'label' => 'Página não encontrada',
'help' => "A página solicitada não pode ser encontrada.", 'help' => 'A página solicitada não pode ser encontrada.',
], ],
'custom_error' => [ 'custom_error' => [
'label' => "Erro na página", 'label' => 'Erro na página',
'help' => "Lamentamos, mas algo deu errado e que a página não pode ser exibida.", 'help' => 'Lamentamos, mas algo deu errado e que a página não pode ser exibida.',
], ],
'menu_label' => 'Páginas', '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', '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: _-[]:?|/+*^$', '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 quer excluir as páginas selecionadas?', 'delete_confirm_multiple' => 'Você realmente deseja excluir as páginas selecionadas?',
'delete_confirm_single' => 'Você realmente quer excluir esta página?', 'delete_confirm_single' => 'Você realmente deseja excluir esta página?',
'no_layout' => '-- sem layout --' 'no_layout' => '-- sem layout --',
], ],
'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', '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', 'new' => 'Novo layout',
'delete_confirm_multiple' => 'Você realmente deseja excluir os layouts selecionados?', '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' => [ 'partial' => [
'not_found_name' => "O bloco ':name' não foi encontrado.", 'not_found_name' => 'O bloco ":name" não foi encontrado.',
'invalid_name' => "Nome bloco inválido: :name.", 'invalid_name' => 'Nome de bloco inválido: :name.',
'menu_label' => 'Blocos', 'menu_label' => 'Blocos',
'no_list_records' => 'Nenhum bloco foi encontrado', 'unsaved_label' => 'Bloco(s) não salvo(s)',
'delete_confirm_multiple' => 'Você realmente quer apagar os blocos selecionados?', 'no_list_records' => 'Nenhum bloco encontrado',
'delete_confirm_single' => 'Você realmente quer apagar este bloco?', 'delete_confirm_multiple' => 'Você realmente deseja apagar os blocos selecionados?',
'new' => 'Novo bloco' 'delete_confirm_single' => 'Você realmente deseja apagar este bloco?',
'new' => 'Novo bloco',
], ],
'content' => [ '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', 'menu_label' => 'Conteúdo',
'no_list_records' => 'Nenhum arquivo de conteúdo foi encontrado', 'unsaved_label' => 'Conteúdo não salvo',
'delete_confirm_multiple' => 'Você realmente quer apagar arquivos de conteúdo selecionados ou diretórios?', 'no_list_records' => 'Nenhum arquivo de conteúdo encontrado',
'delete_confirm_single' => 'Você realmente quer apagar este arquivo de conteúdo?', 'delete_confirm_multiple' => 'Você realmente deseja apagar arquivos ou diretórios de conteúdo selecionados?',
'new' => 'Novo arquivo de conteúdo' 'delete_confirm_single' => 'Você realmente deseja apagar este arquivo de conteúdo?',
'new' => 'Novo arquivo de conteúdo',
], ],
'ajax_handler' => [ 'ajax_handler' => [
'invalid_name' => "O nome do Manipulador AJAX é inválido: :name.", 'invalid_name' => 'O nome do manipulador AJAX é inválido: :name.',
'not_found' => "Manipulador AJAX ':name' não foi encontrado.", 'not_found' => 'Manipulador AJAX ":name" não encontrado.',
], ],
'cms' => [ 'cms' => [
'menu_label' => "Design" 'menu_label' => 'CMS',
], ],
'sidebar' => [ 'sidebar' => [
'add' => 'Adicionar', 'add' => 'Adicionar',
'search' => 'Buscar...' 'search' => 'Buscar...',
], ],
'editor' => [ 'editor' => [
'settings' => 'Configurações', 'settings' => 'Configurações',
@ -89,7 +149,7 @@ return [
'filename' => 'Nome do Arquivo', 'filename' => 'Nome do Arquivo',
'layout' => 'Layout', 'layout' => 'Layout',
'description' => 'Descrição', 'description' => 'Descrição',
'preview' => 'Pré-visualização', 'preview' => 'Visualizar',
'meta' => 'Meta', 'meta' => 'Meta',
'meta_title' => 'Meta Título', 'meta_title' => 'Meta Título',
'meta_description' => 'Meta Descrição', 'meta_description' => 'Meta Descrição',
@ -99,10 +159,11 @@ return [
'hidden' => 'Oculta', 'hidden' => 'Oculta',
'hidden_comment' => 'Páginas ocultas são acessíveis somente para administradores.', 'hidden_comment' => 'Páginas ocultas são acessíveis somente para administradores.',
'enter_fullscreen' => 'Entrar no modo de tela cheia', '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' => [ 'asset' => [
'menu_label' => "Arquivos", 'menu_label' => 'Arquivos',
'unsaved_label' => 'Arquivo(s) não salvo(s)',
'drop_down_add_title' => 'Adicionar...', 'drop_down_add_title' => 'Adicionar...',
'drop_down_operation_title' => 'Ação...', 'drop_down_operation_title' => 'Ação...',
'upload_files' => 'Enviar arquivo(s)', 'upload_files' => 'Enviar arquivo(s)',
@ -117,54 +178,55 @@ return [
'new' => 'Novo arquivo', 'new' => 'Novo arquivo',
'rename_popup_title' => 'Renomear', 'rename_popup_title' => 'Renomear',
'rename_new_name' => 'Novo nome', '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_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_not_empty' => 'Erro ao excluir diretório :name. O diretório não está vazio.',
'error_deleting_dir' => 'Erro ao excluir diretório :name.', '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: ._-', 'invalid_name' => 'O nome pode conter apenas letras, números, espaços e os símbolos: ._-',
'original_not_found' => 'O arquivo original ou diretório não foi encontrado', 'original_not_found' => 'Arquivo ou diretório original não encontrado',
'already_exists' => 'Arquivo ou diretório com este nome já existe', 'already_exists' => 'Um arquivo ou diretório com este nome já existe',
'error_renaming' => 'Erro ao renomear o arquivo ou diretório', 'error_renaming' => 'Erro ao renomear o arquivo ou diretório',
'name_cant_be_empty' => 'O nome não pode ser vazio', 'name_cant_be_empty' => 'O nome não pode estar vazio',
'too_large' => 'O arquivo enviado é muito grande. O tamanho máximo de envio permitido é :max_size', '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', 'type_not_allowed' => 'Apenas os seguintes tipos de arquivos são permitidos: :allowed_types',
'file_not_valid' => 'O arquivo não é válido', 'file_not_valid' => 'O arquivo não é válido',
'error_uploading_file' => 'Erro ao enviar arquivo ":name": :error', 'error_uploading_file' => 'Error uploading file ":name": :error',
'move_please_select' => 'por favor, selecione', 'move_please_select' => 'por favor selecione',
'move_destination' => 'Diretório de destino', 'move_destination' => 'Diretório de destino',
'move_popup_title' => 'Mover arquivo', 'move_popup_title' => 'Mover arquivos',
'move_button' => 'Mover', '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', '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_file' => 'Erro ao mover arquivo :file',
'error_moving_directory' => 'Erro ao mover diretório :dir', 'error_moving_directory' => 'Erro ao mover diretório :dir',
'error_deleting_directory' => 'Erro ao excluir o diretório :dir', 'error_deleting_directory' => 'Erro ao excluir o diretório original :dir',
'path' => 'Caminho' 'path' => 'Caminho',
], ],
'component' => [ 'component' => [
'menu_label' => "Componentes", 'menu_label' => 'Componentes',
'unnamed' => "Não nomeado", 'unnamed' => 'Sem nome',
'no_description' => "Sem descrição fornecida", 'no_description' => 'Nenhuma descrição fornecida',
'alias' => "Pseudônimo", 'alias' => 'Alias',
'alias_description' => "Um nome exclusivo dado a este componente quando usá-lo na página ou layout de código.", '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 apenas símbolos latinos, dígitos e sublinhados. Os aliases deve começar com um símbolo Latina.", '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 modelo não pode ser salvo por causa de dados de componentes inválidos.", 'invalid_request' => 'O template não pode ser salvo devido a dados inválidos nos componentes.',
'no_records' => 'Nenhum dos componentes foi encontrado', 'no_records' => 'Nenhum componente encontrado',
'not_found' => "O componente ':name' não 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'.", 'method_not_found' => 'O componente ":name" não tem um método ":method".',
], ],
'template' => [ 'template' => [
'invalid_type' => "Tipo de modelo desconhecido.", 'invalid_type' => 'Tipo de template desconhecido.',
'not_found' => "O modelo solicitado não foi encontrado.", 'not_found' => 'O template solicitado não foi encontrado.',
'saved'=> "O modelo foi salvo com sucesso." 'saved'=> 'O modelo foi salvo com sucesso.',
], ],
'permissions' => [ 'permissions' => [
'name' => 'Cms',
'manage_content' => 'Gerenciar conteúdo', 'manage_content' => 'Gerenciar conteúdo',
'manage_assets' => 'Gerenciar arquivos', 'manage_assets' => 'Gerenciar arquivos',
'manage_pages' => 'Gerenciar páginas', 'manage_pages' => 'Gerenciar páginas',
'manage_layouts' => 'Gerenciar layouts', 'manage_layouts' => 'Gerenciar layouts',
'manage_partials' => 'Gerenciar blocos', 'manage_partials' => 'Gerenciar blocos',
'manage_themes' => 'Gerenciar temas' 'manage_themes' => 'Gerenciar temas',
] ],
]; ];

View File

@ -1,6 +1,6 @@
<?= Form::open([ <?= Form::open([
'data-request'=>$this->getEventHandler('onMove'), '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, 'data-stripe-load-indicator'=>1,
'id'=>'asset-move-popup-form' 'id'=>'asset-move-popup-form'
]) ?> ]) ?>

View File

@ -1,6 +1,6 @@
<?= Form::open([ <?= Form::open([
'data-request'=>$this->getEventHandler('onNewDirectory'), '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, 'data-stripe-load-indicator'=>1,
'id'=>'asset-new-dir-popup-form' 'id'=>'asset-new-dir-popup-form'
]) ?> ]) ?>

View File

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

View File

@ -7,14 +7,6 @@
margin: 0; margin: 0;
padding: 10px 0; padding: 10px 0;
overflow: hidden; 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 { .product-list li button {
position: absolute; position: absolute;
@ -25,6 +17,13 @@
opacity: 0; opacity: 0;
outline: none; 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 { .product-list li:hover button {
opacity: .3; opacity: .3;
} }

View File

@ -91,7 +91,7 @@ if (window.jQuery === undefined)
* Halt here if beforeUpdate() or data-request-before-update returns false * Halt here if beforeUpdate() or data-request-before-update returns false
*/ */
if (this.options.beforeUpdate.apply(this, [data, textStatus, jqXHR]) === false) return 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 * Trigger 'ajaxBeforeUpdate' on the form, halt if event.preventDefault() is called
@ -107,7 +107,7 @@ if (window.jQuery === undefined)
updatePromise.done(function(){ updatePromise.done(function(){
form.trigger('ajaxSuccess', [context, data, textStatus, jqXHR]) 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 return updatePromise
@ -154,7 +154,7 @@ if (window.jQuery === undefined)
/* /*
* Halt here if the data-request-error attribute returns false * 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 return
requestOptions.handleErrorMessage(errorMsg) requestOptions.handleErrorMessage(errorMsg)
@ -162,6 +162,10 @@ if (window.jQuery === undefined)
return updatePromise 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 * Custom function, display an error message to the user
@ -185,7 +189,7 @@ if (window.jQuery === undefined)
var updatePromise = $.Deferred().done(function(){ var updatePromise = $.Deferred().done(function(){
for (var partial in data) { 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. * 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 var selector = (options.update[partial]) ? options.update[partial] : partial
@ -258,6 +262,7 @@ if (window.jQuery === undefined)
*/ */
context.success = requestOptions.success context.success = requestOptions.success
context.error = requestOptions.error context.error = requestOptions.error
context.complete = requestOptions.complete
requestOptions = $.extend(requestOptions, options) requestOptions = $.extend(requestOptions, options)
requestOptions.data = data.join('&') requestOptions.data = data.join('&')
@ -290,7 +295,8 @@ if (window.jQuery === undefined)
beforeUpdate: function(data, textStatus, jqXHR) {}, beforeUpdate: function(data, textStatus, jqXHR) {},
evalBeforeUpdate: null, evalBeforeUpdate: null,
evalSuccess: null, evalSuccess: null,
evalError: null evalError: null,
evalComplete: null,
} }
/* /*
@ -318,6 +324,7 @@ if (window.jQuery === undefined)
evalBeforeUpdate: $this.data('request-before-update'), evalBeforeUpdate: $this.data('request-before-update'),
evalSuccess: $this.data('request-success'), evalSuccess: $this.data('request-success'),
evalError: $this.data('request-error'), evalError: $this.data('request-error'),
evalComplete: $this.data('request-complete'),
confirm: $this.data('request-confirm'), confirm: $this.data('request-confirm'),
redirect: $this.data('request-redirect'), redirect: $this.data('request-redirect'),
loading: $this.data('request-loading'), 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 var
$el = $(this), $el = $(this),
lastValue = $el.data('oc.lastvalue') lastValue = $el.data('oc.lastvalue')
@ -411,7 +418,7 @@ if (window.jQuery === undefined)
/* /*
* Invent our own event that unifies document.ready with window.ajaxUpdateComplete * Invent our own event that unifies document.ready with window.ajaxUpdateComplete
* *
* $(document).render(function() { }) * $(document).render(function() { })
* $(document).on('render', function(){ }) * $(document).on('render', function(){ })
*/ */

View File

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

View File

@ -49,7 +49,14 @@ class ErrorHandler extends ErrorHandlerBase
// Route to the CMS error page. // Route to the CMS error page.
$controller = new Controller($theme); $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-action="enable"
data-trigger=".control-list input[type=checkbox]" data-trigger=".control-list input[type=checkbox]"
data-trigger-condition="checked" data-trigger-condition="checked"
data-request-success="$el.prop('disabled', false)" data-request-success="$(this).prop('disabled', false)"
data-stripe-load-indicator> data-stripe-load-indicator>
<?= e(trans('backend::lang.list.delete_selected')) ?> <?= e(trans('backend::lang.list.delete_selected')) ?>
</button> </button>

View File

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

View File

@ -29,7 +29,7 @@
<h4 class="section-header"> <h4 class="section-header">
<a href="<?= Backend::url('cms/themes') ?>">Installed themes</a> <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> </h4>
<?php if (!count($installedThemes)): ?> <?php if (!count($installedThemes)): ?>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -20,7 +20,8 @@ return [
'ro' => 'Romanian', 'ro' => 'Romanian',
'ru' => 'Russian', 'ru' => 'Russian',
'se' => 'Swedish', 'se' => 'Swedish',
'tr' => 'Turkish' 'tr' => 'Turkish',
'nb-no' => 'Norwegian (Bokmål)'
], ],
'directory' => [ 'directory' => [
'create_fail' => "ディレクトリ':name'を作成できません。", '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', 'ro' => 'Roemeens',
'pt-br' => 'Braziliaans Portugees', 'pt-br' => 'Braziliaans Portugees',
'fa' => 'Persian', 'fa' => 'Persian',
'nb-no' => 'Noors (Bokmål)'
], ],
'directory' => [ 'directory' => [
'create_fail' => "Map aanmaken mislukt: :name", 'create_fail' => "Map aanmaken mislukt: :name",

View File

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

View File

@ -7,32 +7,39 @@ return [
], ],
'locale' => [ 'locale' => [
'en' => 'Inglês', 'en' => 'Inglês',
'nl' => 'Holandês',
'ja' => 'Japonês',
'se' => 'Sueco',
'tr' => 'Turco',
'de' => 'Alemão', 'de' => 'Alemão',
'ru' => 'Russo', 'es' => 'Espanhol',
'es-ar' => 'Espanhol da Argentina',
'fa' => 'Persa',
'fr' => 'Francês', 'fr' => 'Francês',
'hu' => 'Húngaro',
'id' => 'Indonésio',
'it' => 'Italiano', 'it' => 'Italiano',
'ro' => 'Romano', 'ja' => 'Japonês',
'nl' => 'Holandês ',
'pl' => 'Polonês',
'pt-br' => 'Português do Brasil', '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' => [ 'directory' => [
'create_fail' => "Não é possível criar o diretório: :name", 'create_fail' => 'Não é possível criar o diretório: :name',
], ],
'file' => [ 'file' => [
'create_fail' => "Não é possível criar o arquivo: :name", 'create_fail' => 'Não é possível criar o arquivo: :name',
], ],
'combiner' => [ 'combiner' => [
'not_found' => "O arquivo combinador ':name' não foi encontrado.", 'not_found' => 'O arquivo combinador ":name" não foi encontrado.',
], ],
'system' => [ 'system' => [
'name' => 'Sistema', 'name' => 'Sistema',
'menu_label' => 'Sistema', 'menu_label' => 'Sistema',
'categories' => [ 'categories' => [
'cms' => 'Temas', 'cms' => 'CMS',
'misc' => 'Diversos', 'misc' => 'Diversos',
'logs' => 'Registros', 'logs' => 'Registros',
'mail' => 'E-mail', 'mail' => 'E-mail',
@ -44,13 +51,13 @@ return [
'events' => 'Eventos', 'events' => 'Eventos',
'customers' => 'Clientes', 'customers' => 'Clientes',
'my_settings' => 'Configurações', 'my_settings' => 'Configurações',
], ]
], ],
'plugin' => [ 'plugin' => [
'unnamed' => 'Plugin não nomeado', 'unnamed' => 'Plugin sem nome',
'name' => [ 'name' => [
'label' => 'Nome do Plugin', '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' => [ 'plugins' => [
@ -63,13 +70,13 @@ return [
'disabled_help' => 'Plugins que estão desabilitados são ignorados pela aplicação.', 'disabled_help' => 'Plugins que estão desabilitados são ignorados pela aplicação.',
'selected_amount' => 'Plugins selecionados: :amount', 'selected_amount' => 'Plugins selecionados: :amount',
'remove_confirm' => 'Você tem certeza?', '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_confirm' => 'Você tem certeza?',
'refresh_success' => "Plugins atualizados com sucesso.", 'refresh_success' => 'Plugins atualizados com sucesso.',
'disable_confirm' => 'Você tem certeza?', 'disable_confirm' => 'Você tem certeza?',
'disable_success' => "Plugins desabilitados com sucesso.", 'disable_success' => 'Plugins desabilitados com sucesso.',
'enable_success' => "Plugins habilitados com sucesso.", 'enable_success' => 'Plugins habilitados com sucesso.',
'unknown_plugin' => "Plugin removido do sistema de arquivos.", 'unknown_plugin' => 'Plugin removido do sistema de arquivos.',
], ],
'project' => [ 'project' => [
'name' => 'Projeto', 'name' => 'Projeto',
@ -79,26 +86,29 @@ return [
'none' => 'Nenhum', 'none' => 'Nenhum',
'id' => [ 'id' => [
'label' => 'ID do Projeto', 'label' => 'ID do Projeto',
'help' => 'Como encontrar o ID do seu projeto?', 'help' => 'Como encontrar o ID do seu projeto',
'missing' => 'Por favor, especifique um ID de Projeto para usar.', '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.', 'unbind_success' => 'Projeto desanexado com sucesso.',
], ],
'settings' => [ 'settings' => [
'menu_label' => 'Configurações', '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.', 'update_success' => 'Configurações para :name foram atualizados com sucesso.',
'return' => 'Retornar para as configurações do sistema', 'return' => 'Retornar para as configurações do sistema',
'search' => 'Buscar' 'search' => 'Buscar',
], ],
'mail' => [ 'mail' => [
'log_file' => 'Arquivo de registro',
'menu_label' => 'Configurações de E-mail', 'menu_label' => 'Configurações de E-mail',
'menu_description' => 'Gerenciar configurações de e-mail.', 'menu_description' => 'Gerenciar configurações de e-mail.',
'general' => 'Geral', 'general' => 'Geral',
'method' => 'Método de Envio', 'method' => 'Método de Envio',
'sender_name' => 'Nome do Remetente', 'sender_name' => 'Nome do Remetente',
'sender_email' => 'E-mail do Remetente', 'sender_email' => 'E-mail do Remetente',
'php_mail' => 'PHP mail',
'smtp' => 'SMTP', 'smtp' => 'SMTP',
'smtp_address' => 'Endereço SMTP', 'smtp_address' => 'Endereço SMTP',
'smtp_authorization' => 'Autenticação SMTP obrigatória', 'smtp_authorization' => 'Autenticação SMTP obrigatória',
@ -110,21 +120,29 @@ return [
'sendmail' => 'Sendmail', 'sendmail' => 'Sendmail',
'sendmail_path' => 'Caminho do Sendmail', 'sendmail_path' => 'Caminho do Sendmail',
'sendmail_path_comment' => 'Por favor, especifique o caminho do programa 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' => [ 'mail_templates' => [
'menu_label' => 'Modelos de E-mail', 'menu_label' => 'Templates de E-mail',
'menu_description' => 'Modificar os modelos de e-mail que são enviados para usuários e administradores.', 'menu_description' => 'Modificar os templates dos e-mails que são enviados para usuários e administradores.',
'new_template' => 'Novo modelo', 'new_template' => 'Novo template',
'new_layout' => 'Novo layout', 'new_layout' => 'Novo layout',
'template' => 'Modelo', 'template' => 'Template',
'templates' => 'Modelos', 'templates' => 'Templates',
'menu_layouts_label' => 'Layouts de E-mail', 'menu_layouts_label' => 'Layouts de E-mail',
'layout' => 'Layout', 'layout' => 'Layout',
'layouts' => 'Layouts', 'layouts' => 'Layouts',
'name' => 'Nome', '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' => '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' => 'Assunto',
'subject_comment' => 'Assunto da mensagem', 'subject_comment' => 'Assunto da mensagem',
'description' => 'Descrição', 'description' => 'Descrição',
@ -133,13 +151,13 @@ return [
'content_text' => 'Texto Simples', 'content_text' => 'Texto Simples',
'test_send' => 'Enviar mensagem de teste', 'test_send' => 'Enviar mensagem de teste',
'test_success' => 'Mensagem de teste enviada com sucesso.', 'test_success' => 'Mensagem de teste enviada com sucesso.',
'return' => 'Retornar à lista de modelos' 'return' => 'Retornar à lista de templates'
], ],
'install' => [ 'install' => [
'project_label' => 'Anexar ao projeto', 'project_label' => 'Anexar ao projeto',
'plugin_label' => 'Instalar plugin', 'plugin_label' => 'Instalar plugin',
'missing_plugin_name' => 'Por favor, especifique um nome de plugin para instalar.', '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.', 'install_success' => 'O plugin foi instalado com sucesso.',
], ],
'updates' => [ 'updates' => [
@ -158,7 +176,9 @@ return [
'core_build_new' => 'Compilação :build', 'core_build_new' => 'Compilação :build',
'core_build_new_help' => 'Última versão está disponível.', 'core_build_new_help' => 'Última versão está disponível.',
'core_downloading' => 'Baixando arquivos do aplicativo', '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_downloading' => 'Baixando o plugin: :name',
'plugin_extracting' => 'Desempacotando o plugin: :name', 'plugin_extracting' => 'Desempacotando o plugin: :name',
'plugin_version_none' => 'Novo plugin', 'plugin_version_none' => 'Novo plugin',
@ -171,43 +191,43 @@ return [
'update_label' => 'Atualizar o software', 'update_label' => 'Atualizar o software',
'update_completing' => 'Finalizando processo de atualização', 'update_completing' => 'Finalizando processo de atualização',
'update_loading' => 'Carregando atualizações disponíveis...', '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', 'update_failed_label' => 'Falha na atualização',
'force_label' => 'Forçar atualização', 'force_label' => 'Forçar atualização',
'found' => [ 'found' => [
'label' => 'Encontrado novas atualizações!', 'label' => 'Atualizações encontradas!',
'help' => 'Clique Atualizar o software para iniciar o processo de atualização.', 'help' => 'Clique Atualizar o software para iniciar o processo de atualização.',
], ],
'none' => [ 'none' => [
'label' => 'Não há atualizações', 'label' => 'Nenhuma atualização',
'help' => 'Não há novas atualizações.', 'help' => 'Não há novas atualizações.',
], ],
], ],
'server' => [ '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_not_found' => 'O servidor de atualização não pôde ser encontrado.',
'response_invalid' => 'Resposta inválida do servidor.', '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_error' => 'Servidor não conseguiu entregar o pacote.',
'file_corrupt' => 'Arquivo do servidor está corrompido.', 'file_corrupt' => 'Arquivo do servidor está corrompido.',
], ],
'behavior' => [ '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' => [ '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.', 'required' => 'Configuração usada em :location deve fornecer um valor :property.',
], ],
'zip' => [ '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' => [ '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_label' => 'Registro de Eventos',
'menu_description' => 'Visualize as mensagens do sistema, com o tempo de registro e detalhes.', 'menu_description' => 'Visualize as mensagens do sistema, com horário e detalhes.',
'empty_link' => 'Registro de eventos vazio', 'empty_link' => 'Esvaziar registro de eventos',
'empty_loading' => 'Limpando registro de eventos...', 'empty_loading' => 'Esvaziando registro de eventos...',
'empty_success' => 'Registro de eventos limpo com sucesso.', 'empty_success' => 'Registro de eventos esvaziado com sucesso.',
'return_link' => 'Retornar ao registro de eventos', 'return_link' => 'Retornar ao registro de eventos',
'id' => 'ID', 'id' => 'ID',
'id_label' => 'ID do Evento', 'id_label' => 'ID do Evento',
@ -216,25 +236,27 @@ return [
'level' => 'Nível', 'level' => 'Nível',
], ],
'request_log' => [ '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_label' => 'Registro de Requisições',
'menu_description' => 'Visualize requisições com problema na aplicação, como Página não encontrada (404).', 'menu_description' => 'Visualize requisições malsucedidas na aplicação, como Página não encontrada (404).',
'empty_link' => 'Registro de requisições vazio.', 'empty_link' => 'Esvaziar registro de requisições.',
'empty_loading' => 'Limpando registro de requisições...', 'empty_loading' => 'Esvaziando registro de requisições...',
'empty_success' => 'Registro de requisições limpo com sucesso.', 'empty_success' => 'Registro de requisições esvaziado com sucesso.',
'return_link' => 'Retornar ao registro de requisições', 'return_link' => 'Retornar ao registro de requisições',
'id' => 'ID', 'id' => 'ID',
'id_label' => 'ID', 'id_label' => 'ID do registro',
'count' => 'Contador', 'count' => 'Contador',
'referer' => 'Referentes', 'referer' => 'Referers',
'url' => 'URL', 'url' => 'URL',
'status_code' => 'Código', 'status_code' => 'Status',
], ],
'permissions' => [ 'permissions' => [
'name' => 'System',
'manage_system_settings' => 'Gerenciar configurações do sistema', 'manage_system_settings' => 'Gerenciar configurações do sistema',
'manage_software_updates' => 'Gerenciar atualizações', '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', '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 <?php
return array( return [
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -13,61 +13,61 @@ return array(
| |
*/ */
"accepted" => "O :attribute deve ser aceito.", 'accepted' => ':attribute deve ser aceito.',
"active_url" => "O :attribute não é uma URL válida.", 'active_url' => ':attribute não é uma URL válida.',
"after" => "O :attribute deve ser uma data após :date.", 'after' => ':attribute deve ser uma data após :date.',
"alpha" => "O :attribute só pode conter letras.", 'alpha' => ':attribute só pode conter letras.',
"alpha_dash" => "O :attribute só pode conter letras, números e traços.", 'alpha_dash' => ':attribute só pode conter letras, números e traços.',
"alpha_num" => "O :attribute só pode conter letras e números.", 'alpha_num' => ':attribute só pode conter letras e números.',
"array" => "O :attribute deve ser uma matriz.", 'array' => ':attribute deve ser uma matriz.',
"before" => "O :attribute deve ser uma data antes :date.", 'before' => ':attribute deve ser uma data antes :date.',
"between" => array( 'between' => [
"numeric" => "O :attribute deve situar-se entre :min - :max.", 'numeric' => ':attribute deve situar-se entre :min e :max.',
"file" => "O :attribute deve situar-se entre :min - :max kilobytes.", 'file' => ':attribute deve ter entre :min e :max kilobytes.',
"string" => "O :attribute deve situar-se entre :min - :max carácteres.", 'string' => ':attribute deve ter entre :min e :max caracteres.',
"array" => "O :attribute tem de ter entre :min - :max itens.", 'array' => ':attribute deve ter entre :min e :max itens.',
), ],
"confirmed" => "O :attribute confirmação não corresponde.", 'confirmed' => 'A confirmação de :attribute não corresponde.',
"date" => "O :attribute não é uma data válida.", 'date' => ':attribute não é uma data válida.',
"date_format" => "O :attribute não coincide com o formato :format.", 'date_format' => ':attribute não coincide com o formato :format.',
"different" => "O :attribute e :other deve ser diferente.", 'different' => ':attribute e :other devem ser diferentes.',
"digits" => "O :attribute deve ser :digits dígitos.", 'digits' => ':attribute deve ser :digits dígitos.',
"digits_between" => "O :attribute deve situar-se entre :min e :max dígitos.", 'digits_between' => ':attribute deve ter entre :min e :max dígitos.',
"email" => "O :attribute formato é inválido.", 'email' => 'Formato de :attribute é inválido.',
"exists" => "O :attribute selecioado é inválido.", 'exists' => ':attribute selecionado é inválido.',
"image" => "O :attribute deve ser uma imagem.", 'image' => ':attribute deve ser uma imagem.',
"in" => "O :attribute selecioado é inválido.", 'in' => ':attribute selecionado é inválido.',
"integer" => "O :attribute deve ser um número inteiro.", 'integer' => ':attribute deve ser um número inteiro.',
"ip" => "O :attribute deve ser um endereço IP válido.", 'ip' => ':attribute deve ser um endereço IP válido.',
"max" => array( 'max' => [
"numeric" => "O :attribute não pode ser maior do que :max.", 'numeric' => ':attribute não pode ser maior do que :max.',
"file" => "O :attribute não pode ser maior do que :max kilobytes.", 'file' => ':attribute não pode ser maior do que :max kilobytes.',
"string" => "O :attribute não pode ser maior do que :max carácteres.", 'string' => ':attribute não pode ser maior do que :max caracteres.',
"array" => "O :attribute não podem ter mais do que :max itens.", 'array' => ':attribute não pode ter mais que :max itens.',
), ],
"mimes" => "O :attribute deve ser um arquivo do tipo: :values.", 'mimes' => ':attribute deve ser um arquivo do tipo: :values.',
"min" => array( 'min' => [
"numeric" => "O :attribute deve ser de pelo menos :min.", 'numeric' => ':attribute deve ser no mínimo :min.',
"file" => "O :attribute deve ser de pelo menos :min kilobytes.", 'file' => ':attribute deve ter pelo menos :min kilobytes.',
"string" => "O :attribute deve ser de pelo menos :min carácteres.", 'string' => ':attribute deve ter pelo menos :min caracteres.',
"array" => "O :attribute deve ter pelo menos :min itens.", 'array' => ':attribute deve ter pelo menos :min itens.',
), ],
"not_in" => "O :attribute selecionado é inválido.", 'not_in' => ':attribute selecionado é inválido.',
"numeric" => "O :attribute deve ser um número.", 'numeric' => ':attribute deve ser um número.',
"regex" => "O :attribute formato é inválido.", 'regex' => 'Formato de :attribute é inválido.',
"required" => "O campo :attribute é obrigatório.", 'required' => 'O campo :attribute é obrigatório.',
"required_if" => "O campo :attribute é obrigatório quando :other é :value.", 'required_if' => 'O campo :attribute é obrigatório quando :other é :value.',
"required_with" => "O campo :attribute é obrigatório quando :values está presente.", 'required_with' => 'O campo :attribute é obrigatório quando :values está presente.',
"required_without" => "O campo :attribute é obrigatório quando :values não está presente.", 'required_without' => 'O campo :attribute é obrigatório quando :values não está presente.',
"same" => "O campo :attribute e :other devem corresponder.", 'same' => 'O campo :attribute e :other devem corresponder.',
"size" => array( 'size' => [
"numeric" => "O :attribute deve ser :size.", 'numeric' => ':attribute deve ser :size.',
"file" => "O :attribute deve ser :size kilobytes.", 'file' => ':attribute deve ser :size kilobytes.',
"string" => "O :attribute deve ser :size carácteres.", 'string' => ':attribute deve ter :size caracteres.',
"array" => "O :attribute deve conter :size itens.", 'array' => ':attribute deve conter :size itens.',
), ],
"unique" => "O :attribute já foi utilizado.", 'unique' => ':attribute já está sendo utilizado.',
"url" => "O :attribute formato é inválido.", 'url' => 'Formato de :attribute é inválido.',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -75,12 +75,12 @@ return array(
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Here you may specify custom validation messages for attributes using the | 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. | 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 | The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead | 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', 'ro' => 'Romana',
'pt-br' => 'Portugheza (Brazilia)', 'pt-br' => 'Portugheza (Brazilia)',
'fa' => 'Persian', 'fa' => 'Persian',
'nb-no' => 'Norvegiană (Bokmål)'
], ],
'directory' => [ 'directory' => [
'create_fail' => "Nu se poate crea directorul: :name", 'create_fail' => "Nu se poate crea directorul: :name",

View File

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

View File

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

View File

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

View File

@ -24,7 +24,8 @@ return [
'se' => 'Swedish', 'se' => 'Swedish',
'sk' => 'Slovak (Slovakia)', 'sk' => 'Slovak (Slovakia)',
'tr' => 'Turkish', 'tr' => 'Turkish',
'zh-cn' => 'Chinese (China)' 'zh-cn' => 'Chinese (China)',
'nb-no' => 'Norwegian (Bokmål)'
], ],
'directory' => [ 'directory' => [
'create_fail' => '不能创建目录: :name' 'create_fail' => '不能创建目录: :name'
@ -226,8 +227,8 @@ return [
'hint' => '日志显示了程序中的潜在错误, 比如异常和调试信息.', 'hint' => '日志显示了程序中的潜在错误, 比如异常和调试信息.',
'menu_label' => '事件日志', 'menu_label' => '事件日志',
'menu_description' => '查看系统日志信息, 包括时间和详细信息.', 'menu_description' => '查看系统日志信息, 包括时间和详细信息.',
'empty_link' => '空事件日志', 'empty_link' => '空事件日志',
'empty_loading' => '空事件日志...', 'empty_loading' => '空事件日志...',
'empty_success' => '成功清空时间日志.', 'empty_success' => '成功清空时间日志.',
'return_link' => '返回时间日志', 'return_link' => '返回时间日志',
'id' => 'ID', 'id' => 'ID',
@ -240,8 +241,8 @@ return [
'hint' => '这个日志显示了需要注意的浏览器请求. 比如如果一个访问者打开一个没有的CMS页面, 一条返回状态404的记录被创建.', 'hint' => '这个日志显示了需要注意的浏览器请求. 比如如果一个访问者打开一个没有的CMS页面, 一条返回状态404的记录被创建.',
'menu_label' => '请求日志', 'menu_label' => '请求日志',
'menu_description' => '查看坏的或者重定向的请求, 比如页面找不到(404).', 'menu_description' => '查看坏的或者重定向的请求, 比如页面找不到(404).',
'empty_link' => '空请求日志', 'empty_link' => '空请求日志',
'empty_loading' => '空请求日志...', 'empty_loading' => '空请求日志...',
'empty_success' => '成功清空请求日志.', 'empty_success' => '成功清空请求日志.',
'return_link' => '返回请求日志', 'return_link' => '返回请求日志',
'id' => 'ID', '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 * 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) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */ * ======================================================================== */
@ -15,28 +15,54 @@
var Affix = function (element, options) { var Affix = function (element, options) {
this.options = $.extend({}, Affix.DEFAULTS, 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('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
.on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
this.$element = $(element) this.$element = $(element)
this.affixed = this.affixed = null
this.unpin = this.unpin = null
this.pinnedOffset = null this.pinnedOffset = null
this.checkPosition() this.checkPosition()
} }
Affix.RESET = 'affix affix-top affix-bottom' Affix.VERSION = '3.3.4'
Affix.RESET = 'affix affix-top affix-bottom'
Affix.DEFAULTS = { 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 () { Affix.prototype.getPinnedOffset = function () {
if (this.pinnedOffset) return this.pinnedOffset if (this.pinnedOffset) return this.pinnedOffset
this.$element.removeClass(Affix.RESET).addClass('affix') this.$element.removeClass(Affix.RESET).addClass('affix')
var scrollTop = this.$window.scrollTop() var scrollTop = this.$target.scrollTop()
var position = this.$element.offset() var position = this.$element.offset()
return (this.pinnedOffset = position.top - scrollTop) return (this.pinnedOffset = position.top - scrollTop)
} }
@ -48,43 +74,41 @@
Affix.prototype.checkPosition = function () { Affix.prototype.checkPosition = function () {
if (!this.$element.is(':visible')) return if (!this.$element.is(':visible')) return
var scrollHeight = $(document).height() var height = this.$element.height()
var scrollTop = this.$window.scrollTop()
var position = this.$element.offset()
var offset = this.options.offset var offset = this.options.offset
var offsetTop = offset.top var offsetTop = offset.top
var offsetBottom = offset.bottom var offsetBottom = offset.bottom
var scrollHeight = $(document.body).height()
if (this.affixed == 'top') position.top += scrollTop
if (typeof offset != 'object') offsetBottom = offsetTop = offset if (typeof offset != 'object') offsetBottom = offsetTop = offset
if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false : var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
if (this.affixed === affix) return if (this.affixed != affix) {
if (this.unpin) this.$element.css('top', '') if (this.unpin != null) this.$element.css('top', '')
var affixType = 'affix' + (affix ? '-' + affix : '') var affixType = 'affix' + (affix ? '-' + affix : '')
var e = $.Event(affixType + '.bs.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.affixed = affix
this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
this.$element this.$element
.removeClass(Affix.RESET) .removeClass(Affix.RESET)
.addClass(affixType) .addClass(affixType)
.trigger($.Event(affixType.replace('affix', 'affixed'))) .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
}
if (affix == 'bottom') { 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 // AFFIX PLUGIN DEFINITION
// ======================= // =======================
var old = $.fn.affix function Plugin(option) {
$.fn.affix = function (option) {
return this.each(function () { return this.each(function () {
var $this = $(this) var $this = $(this)
var data = $this.data('bs.affix') var data = $this.data('bs.affix')
@ -105,6 +127,9 @@
}) })
} }
var old = $.fn.affix
$.fn.affix = Plugin
$.fn.affix.Constructor = Affix $.fn.affix.Constructor = Affix
@ -127,10 +152,10 @@
data.offset = data.offset || {} data.offset = data.offset || {}
if (data.offsetBottom) data.offset.bottom = data.offsetBottom if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
if (data.offsetTop) data.offset.top = data.offsetTop 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 * 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) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */ * ======================================================================== */
@ -18,6 +18,10 @@
$(el).on('click', dismiss, this.close) $(el).on('click', dismiss, this.close)
} }
Alert.VERSION = '3.3.4'
Alert.TRANSITION_DURATION = 150
Alert.prototype.close = function (e) { Alert.prototype.close = function (e) {
var $this = $(this) var $this = $(this)
var selector = $this.attr('data-target') var selector = $this.attr('data-target')
@ -32,7 +36,7 @@
if (e) e.preventDefault() if (e) e.preventDefault()
if (!$parent.length) { if (!$parent.length) {
$parent = $this.hasClass('alert') ? $this : $this.parent() $parent = $this.closest('.alert')
} }
$parent.trigger(e = $.Event('close.bs.alert')) $parent.trigger(e = $.Event('close.bs.alert'))
@ -42,13 +46,14 @@
$parent.removeClass('in') $parent.removeClass('in')
function removeElement() { 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') ? $.support.transition && $parent.hasClass('fade') ?
$parent $parent
.one($.support.transition.end, removeElement) .one('bsTransitionEnd', removeElement)
.emulateTransitionEnd(150) : .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
removeElement() removeElement()
} }
@ -56,9 +61,7 @@
// ALERT PLUGIN DEFINITION // ALERT PLUGIN DEFINITION
// ======================= // =======================
var old = $.fn.alert function Plugin(option) {
$.fn.alert = function (option) {
return this.each(function () { return this.each(function () {
var $this = $(this) var $this = $(this)
var data = $this.data('bs.alert') var data = $this.data('bs.alert')
@ -68,6 +71,9 @@
}) })
} }
var old = $.fn.alert
$.fn.alert = Plugin
$.fn.alert.Constructor = Alert $.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 * 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) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */ * ======================================================================== */
@ -19,6 +19,8 @@
this.isLoading = false this.isLoading = false
} }
Button.VERSION = '3.3.4'
Button.DEFAULTS = { Button.DEFAULTS = {
loadingText: 'loading...' loadingText: 'loading...'
} }
@ -31,12 +33,12 @@
state = state + 'Text' state = state + 'Text'
if (!data.resetText) $el.data('resetText', $el[val]()) if (data.resetText == null) $el.data('resetText', $el[val]())
$el[val](data[state] || this.options[state])
// push to event loop to allow forms to submit // push to event loop to allow forms to submit
setTimeout($.proxy(function () { setTimeout($.proxy(function () {
$el[val](data[state] == null ? this.options[state] : data[state])
if (state == 'loadingText') { if (state == 'loadingText') {
this.isLoading = true this.isLoading = true
$el.addClass(d).attr(d, d) $el.addClass(d).attr(d, d)
@ -58,6 +60,8 @@
else $parent.find('.active').removeClass('active') else $parent.find('.active').removeClass('active')
} }
if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') 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') if (changed) this.$element.toggleClass('active')
@ -67,9 +71,7 @@
// BUTTON PLUGIN DEFINITION // BUTTON PLUGIN DEFINITION
// ======================== // ========================
var old = $.fn.button function Plugin(option) {
$.fn.button = function (option) {
return this.each(function () { return this.each(function () {
var $this = $(this) var $this = $(this)
var data = $this.data('bs.button') var data = $this.data('bs.button')
@ -82,6 +84,9 @@
}) })
} }
var old = $.fn.button
$.fn.button = Plugin
$.fn.button.Constructor = Button $.fn.button.Constructor = Button
@ -97,11 +102,15 @@
// BUTTON DATA-API // BUTTON DATA-API
// =============== // ===============
$(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { $(document)
var $btn = $(e.target) .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') var $btn = $(e.target)
$btn.button('toggle') if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
e.preventDefault() 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); }(jQuery);

View File

@ -1,8 +1,8 @@
/* ======================================================================== /* ========================================================================
* Bootstrap: carousel.js v3.1.0 * Bootstrap: carousel.js v3.3.4
* http://getbootstrap.com/javascript/#carousel * 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) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */ * ======================================================================== */
@ -17,24 +17,42 @@
this.$element = $(element) this.$element = $(element)
this.$indicators = this.$element.find('.carousel-indicators') this.$indicators = this.$element.find('.carousel-indicators')
this.options = options this.options = options
this.paused = this.paused = null
this.sliding = this.sliding = null
this.interval = this.interval = null
this.$active = this.$active = null
this.$items = null this.$items = null
this.options.pause == 'hover' && this.$element this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
.on('mouseenter', $.proxy(this.pause, this))
.on('mouseleave', $.proxy(this.cycle, 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 = { Carousel.DEFAULTS = {
interval: 5000, interval: 5000,
pause: 'hover', 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) e || (this.paused = false)
this.interval && clearInterval(this.interval) this.interval && clearInterval(this.interval)
@ -46,23 +64,31 @@
return this return this
} }
Carousel.prototype.getActiveIndex = function () { Carousel.prototype.getItemIndex = function (item) {
this.$active = this.$element.find('.item.active') this.$items = item.parent().children('.item')
this.$items = this.$active.parent().children() 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) { Carousel.prototype.to = function (pos) {
var that = this 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 (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() 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) { Carousel.prototype.pause = function (e) {
@ -90,22 +116,20 @@
Carousel.prototype.slide = function (type, next) { Carousel.prototype.slide = function (type, next) {
var $active = this.$element.find('.item.active') var $active = this.$element.find('.item.active')
var $next = next || $active[type]() var $next = next || this.getItemForDirection(type, $active)
var isCycling = this.interval var isCycling = this.interval
var direction = type == 'next' ? 'left' : 'right' var direction = type == 'next' ? 'left' : 'right'
var fallback = type == 'next' ? 'first' : 'last'
var that = this var that = this
if (!$next.length) { if ($next.hasClass('active')) return (this.sliding = false)
if (!this.options.wrap) return
$next = this.$element.find('.item')[fallback]()
}
if ($next.hasClass('active')) return this.sliding = false var relatedTarget = $next[0]
var slideEvent = $.Event('slide.bs.carousel', {
var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) relatedTarget: relatedTarget,
this.$element.trigger(e) direction: direction
if (e.isDefaultPrevented()) return })
this.$element.trigger(slideEvent)
if (slideEvent.isDefaultPrevented()) return
this.sliding = true this.sliding = true
@ -113,30 +137,31 @@
if (this.$indicators.length) { if (this.$indicators.length) {
this.$indicators.find('.active').removeClass('active') this.$indicators.find('.active').removeClass('active')
this.$element.one('slid.bs.carousel', function () { var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) $nextIndicator && $nextIndicator.addClass('active')
$nextIndicator && $nextIndicator.addClass('active')
})
} }
var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
if ($.support.transition && this.$element.hasClass('slide')) { if ($.support.transition && this.$element.hasClass('slide')) {
$next.addClass(type) $next.addClass(type)
$next[0].offsetWidth // force reflow $next[0].offsetWidth // force reflow
$active.addClass(direction) $active.addClass(direction)
$next.addClass(direction) $next.addClass(direction)
$active $active
.one($.support.transition.end, function () { .one('bsTransitionEnd', function () {
$next.removeClass([type, direction].join(' ')).addClass('active') $next.removeClass([type, direction].join(' ')).addClass('active')
$active.removeClass(['active', direction].join(' ')) $active.removeClass(['active', direction].join(' '))
that.sliding = false 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 { } else {
$active.removeClass('active') $active.removeClass('active')
$next.addClass('active') $next.addClass('active')
this.sliding = false this.sliding = false
this.$element.trigger('slid.bs.carousel') this.$element.trigger(slidEvent)
} }
isCycling && this.cycle() isCycling && this.cycle()
@ -148,9 +173,7 @@
// CAROUSEL PLUGIN DEFINITION // CAROUSEL PLUGIN DEFINITION
// ========================== // ==========================
var old = $.fn.carousel function Plugin(option) {
$.fn.carousel = function (option) {
return this.each(function () { return this.each(function () {
var $this = $(this) var $this = $(this)
var data = $this.data('bs.carousel') var data = $this.data('bs.carousel')
@ -164,6 +187,9 @@
}) })
} }
var old = $.fn.carousel
$.fn.carousel = Plugin
$.fn.carousel.Constructor = Carousel $.fn.carousel.Constructor = Carousel
@ -179,26 +205,32 @@
// CAROUSEL DATA-API // CAROUSEL DATA-API
// ================= // =================
$(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { var clickHandler = function (e) {
var $this = $(this), href var href
var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 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 options = $.extend({}, $target.data(), $this.data())
var slideIndex = $this.attr('data-slide-to') var slideIndex = $this.attr('data-slide-to')
if (slideIndex) options.interval = false 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) $target.data('bs.carousel').to(slideIndex)
} }
e.preventDefault() 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 () { $(window).on('load', function () {
$('[data-ride="carousel"]').each(function () { $('[data-ride="carousel"]').each(function () {
var $carousel = $(this) 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 * 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) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */ * ======================================================================== */
@ -16,12 +16,23 @@
var Collapse = function (element, options) { var Collapse = function (element, options) {
this.$element = $(element) this.$element = $(element)
this.options = $.extend({}, Collapse.DEFAULTS, options) this.options = $.extend({}, Collapse.DEFAULTS, options)
this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
'[data-toggle="collapse"][data-target="#' + element.id + '"]')
this.transitioning = null 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() if (this.options.toggle) this.toggle()
} }
Collapse.VERSION = '3.3.4'
Collapse.TRANSITION_DURATION = 350
Collapse.DEFAULTS = { Collapse.DEFAULTS = {
toggle: true toggle: true
} }
@ -34,35 +45,43 @@
Collapse.prototype.show = function () { Collapse.prototype.show = function () {
if (this.transitioning || this.$element.hasClass('in')) return 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') var startEvent = $.Event('show.bs.collapse')
this.$element.trigger(startEvent) this.$element.trigger(startEvent)
if (startEvent.isDefaultPrevented()) return if (startEvent.isDefaultPrevented()) return
var actives = this.$parent && this.$parent.find('> .panel > .in')
if (actives && actives.length) { if (actives && actives.length) {
var hasData = actives.data('bs.collapse') Plugin.call(actives, 'hide')
if (hasData && hasData.transitioning) return activesData || actives.data('bs.collapse', null)
actives.collapse('hide')
hasData || actives.data('bs.collapse', null)
} }
var dimension = this.dimension() var dimension = this.dimension()
this.$element this.$element
.removeClass('collapse') .removeClass('collapse')
.addClass('collapsing') .addClass('collapsing')[dimension](0)
[dimension](0) .attr('aria-expanded', true)
this.$trigger
.removeClass('collapsed')
.attr('aria-expanded', true)
this.transitioning = 1 this.transitioning = 1
var complete = function () { var complete = function () {
this.$element this.$element
.removeClass('collapsing') .removeClass('collapsing')
.addClass('collapse in') .addClass('collapse in')[dimension]('')
[dimension]('auto')
this.transitioning = 0 this.transitioning = 0
this.$element.trigger('shown.bs.collapse') this.$element
.trigger('shown.bs.collapse')
} }
if (!$.support.transition) return complete.call(this) if (!$.support.transition) return complete.call(this)
@ -70,9 +89,8 @@
var scrollSize = $.camelCase(['scroll', dimension].join('-')) var scrollSize = $.camelCase(['scroll', dimension].join('-'))
this.$element this.$element
.one($.support.transition.end, $.proxy(complete, this)) .one('bsTransitionEnd', $.proxy(complete, this))
.emulateTransitionEnd(350) .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
[dimension](this.$element[0][scrollSize])
} }
Collapse.prototype.hide = function () { Collapse.prototype.hide = function () {
@ -84,55 +102,85 @@
var dimension = this.dimension() var dimension = this.dimension()
this.$element this.$element[dimension](this.$element[dimension]())[0].offsetHeight
[dimension](this.$element[dimension]())
[0].offsetHeight
this.$element this.$element
.addClass('collapsing') .addClass('collapsing')
.removeClass('collapse') .removeClass('collapse in')
.removeClass('in') .attr('aria-expanded', false)
this.$trigger
.addClass('collapsed')
.attr('aria-expanded', false)
this.transitioning = 1 this.transitioning = 1
var complete = function () { var complete = function () {
this.transitioning = 0 this.transitioning = 0
this.$element this.$element
.trigger('hidden.bs.collapse')
.removeClass('collapsing') .removeClass('collapsing')
.addClass('collapse') .addClass('collapse')
.trigger('hidden.bs.collapse')
} }
if (!$.support.transition) return complete.call(this) if (!$.support.transition) return complete.call(this)
this.$element this.$element
[dimension](0) [dimension](0)
.one($.support.transition.end, $.proxy(complete, this)) .one('bsTransitionEnd', $.proxy(complete, this))
.emulateTransitionEnd(350) .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
} }
Collapse.prototype.toggle = function () { Collapse.prototype.toggle = function () {
this[this.$element.hasClass('in') ? 'hide' : 'show']() 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 // COLLAPSE PLUGIN DEFINITION
// ========================== // ==========================
var old = $.fn.collapse function Plugin(option) {
$.fn.collapse = function (option) {
return this.each(function () { return this.each(function () {
var $this = $(this) var $this = $(this)
var data = $this.data('bs.collapse') var data = $this.data('bs.collapse')
var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) 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 (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
if (typeof option == 'string') data[option]() if (typeof option == 'string') data[option]()
}) })
} }
var old = $.fn.collapse
$.fn.collapse = Plugin
$.fn.collapse.Constructor = Collapse $.fn.collapse.Constructor = Collapse
@ -148,23 +196,16 @@
// COLLAPSE DATA-API // COLLAPSE DATA-API
// ================= // =================
$(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
var $this = $(this), href var $this = $(this)
var target = $this.attr('data-target')
|| e.preventDefault() if (!$this.attr('data-target')) e.preventDefault()
|| (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
var $target = $(target) var $target = getTargetFromTrigger($this)
var data = $target.data('bs.collapse') var data = $target.data('bs.collapse')
var option = data ? 'toggle' : $this.data() var option = data ? 'toggle' : $this.data()
var parent = $this.attr('data-parent')
var $parent = parent && $(parent)
if (!data || !data.transitioning) { Plugin.call($target, option)
if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
$this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
}
$target.collapse(option)
}) })
}(jQuery); }(jQuery);

View File

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

View File

@ -1,8 +1,8 @@
/* ======================================================================== /* ========================================================================
* Bootstrap: modal.js v3.1.0 * Bootstrap: modal.js v3.3.4
* http://getbootstrap.com/javascript/#modals * 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) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */ * ======================================================================== */
@ -14,10 +14,15 @@
// ====================== // ======================
var Modal = function (element, options) { var Modal = function (element, options) {
this.options = options this.options = options
this.$element = $(element) this.$body = $(document.body)
this.$backdrop = this.$element = $(element)
this.isShown = null 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) { if (this.options.remote) {
this.$element this.$element
@ -28,6 +33,11 @@
} }
} }
Modal.VERSION = '3.3.4'
Modal.TRANSITION_DURATION = 300
Modal.BACKDROP_TRANSITION_DURATION = 150
Modal.DEFAULTS = { Modal.DEFAULTS = {
backdrop: true, backdrop: true,
keyboard: true, keyboard: true,
@ -35,7 +45,7 @@
} }
Modal.prototype.toggle = function (_relatedTarget) { 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) { Modal.prototype.show = function (_relatedTarget) {
@ -48,21 +58,34 @@
this.isShown = true this.isShown = true
this.checkScrollbar()
this.setScrollbar()
this.$body.addClass('modal-open')
this.escape() this.escape()
this.resize()
this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) 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 () { this.backdrop(function () {
var transition = $.support.transition && that.$element.hasClass('fade') var transition = $.support.transition && that.$element.hasClass('fade')
if (!that.$element.parent().length) { 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 that.$element
.show() .show()
.scrollTop(0) .scrollTop(0)
that.adjustDialog()
if (transition) { if (transition) {
that.$element[0].offsetWidth // force reflow that.$element[0].offsetWidth // force reflow
} }
@ -76,12 +99,12 @@
var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
transition ? transition ?
that.$element.find('.modal-dialog') // wait for modal to slide in that.$dialog // wait for modal to slide in
.one($.support.transition.end, function () { .one('bsTransitionEnd', function () {
that.$element.focus().trigger(e) that.$element.trigger('focus').trigger(e)
}) })
.emulateTransitionEnd(300) : .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
that.$element.focus().trigger(e) that.$element.trigger('focus').trigger(e)
}) })
} }
@ -97,6 +120,7 @@
this.isShown = false this.isShown = false
this.escape() this.escape()
this.resize()
$(document).off('focusin.bs.modal') $(document).off('focusin.bs.modal')
@ -104,11 +128,14 @@
.removeClass('in') .removeClass('in')
.attr('aria-hidden', true) .attr('aria-hidden', true)
.off('click.dismiss.bs.modal') .off('click.dismiss.bs.modal')
.off('mouseup.dismiss.bs.modal')
this.$dialog.off('mousedown.dismiss.bs.modal')
$.support.transition && this.$element.hasClass('fade') ? $.support.transition && this.$element.hasClass('fade') ?
this.$element this.$element
.one($.support.transition.end, $.proxy(this.hideModal, this)) .one('bsTransitionEnd', $.proxy(this.hideModal, this))
.emulateTransitionEnd(300) : .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
this.hideModal() this.hideModal()
} }
@ -117,18 +144,26 @@
.off('focusin.bs.modal') // guard against infinite focus loop .off('focusin.bs.modal') // guard against infinite focus loop
.on('focusin.bs.modal', $.proxy(function (e) { .on('focusin.bs.modal', $.proxy(function (e) {
if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
this.$element.focus() this.$element.trigger('focus')
} }
}, this)) }, this))
} }
Modal.prototype.escape = function () { Modal.prototype.escape = function () {
if (this.isShown && this.options.keyboard) { 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() e.which == 27 && this.hide()
}, this)) }, this))
} else if (!this.isShown) { } 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 var that = this
this.$element.hide() this.$element.hide()
this.backdrop(function () { this.backdrop(function () {
that.removeBackdrop() that.$body.removeClass('modal-open')
that.resetAdjustments()
that.resetScrollbar()
that.$element.trigger('hidden.bs.modal') that.$element.trigger('hidden.bs.modal')
}) })
} }
@ -147,19 +184,24 @@
} }
Modal.prototype.backdrop = function (callback) { Modal.prototype.backdrop = function (callback) {
var that = this
var animate = this.$element.hasClass('fade') ? 'fade' : '' var animate = this.$element.hasClass('fade') ? 'fade' : ''
if (this.isShown && this.options.backdrop) { if (this.isShown && this.options.backdrop) {
var doAnimate = $.support.transition && animate var doAnimate = $.support.transition && animate
this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
.appendTo(document.body) .appendTo(this.$body)
this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
if (this.ignoreBackdropClick) {
this.ignoreBackdropClick = false
return
}
if (e.target !== e.currentTarget) return if (e.target !== e.currentTarget) return
this.options.backdrop == 'static' this.options.backdrop == 'static'
? this.$element[0].focus.call(this.$element[0]) ? this.$element[0].focus()
: this.hide.call(this) : this.hide()
}, this)) }, this))
if (doAnimate) this.$backdrop[0].offsetWidth // force reflow if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
@ -170,31 +212,84 @@
doAnimate ? doAnimate ?
this.$backdrop this.$backdrop
.one($.support.transition.end, callback) .one('bsTransitionEnd', callback)
.emulateTransitionEnd(150) : .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
callback() callback()
} else if (!this.isShown && this.$backdrop) { } else if (!this.isShown && this.$backdrop) {
this.$backdrop.removeClass('in') this.$backdrop.removeClass('in')
var callbackRemove = function () {
that.removeBackdrop()
callback && callback()
}
$.support.transition && this.$element.hasClass('fade') ? $.support.transition && this.$element.hasClass('fade') ?
this.$backdrop this.$backdrop
.one($.support.transition.end, callback) .one('bsTransitionEnd', callbackRemove)
.emulateTransitionEnd(150) : .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
callback() callbackRemove()
} else if (callback) { } else if (callback) {
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 // MODAL PLUGIN DEFINITION
// ======================= // =======================
var old = $.fn.modal function Plugin(option, _relatedTarget) {
$.fn.modal = function (option, _relatedTarget) {
return this.each(function () { return this.each(function () {
var $this = $(this) var $this = $(this)
var data = $this.data('bs.modal') var data = $this.data('bs.modal')
@ -206,6 +301,9 @@
}) })
} }
var old = $.fn.modal
$.fn.modal = Plugin
$.fn.modal.Constructor = Modal $.fn.modal.Constructor = Modal
@ -224,20 +322,18 @@
$(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
var $this = $(this) var $this = $(this)
var href = $this.attr('href') 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()) var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
if ($this.is('a')) e.preventDefault() if ($this.is('a')) e.preventDefault()
$target $target.one('show.bs.modal', function (showEvent) {
.modal(option, this) if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
.one('hide', function () { $target.one('hidden.bs.modal', function () {
$this.is(':visible') && $this.focus() $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); }(jQuery);

View File

@ -1,8 +1,8 @@
/* ======================================================================== /* ========================================================================
* Bootstrap: popover.js v3.1.0 * Bootstrap: popover.js v3.3.4
* http://getbootstrap.com/javascript/#popovers * 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) * 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') if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
Popover.VERSION = '3.3.4'
Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
placement: 'right', placement: 'right',
trigger: 'click', trigger: 'click',
content: '', 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() var content = this.getContent()
$tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) $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' this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
](content) ](content)
@ -70,32 +72,28 @@
} }
Popover.prototype.arrow = function () { Popover.prototype.arrow = function () {
return this.$arrow = this.$arrow || this.tip().find('.arrow') return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
}
Popover.prototype.tip = function () {
if (!this.$tip) this.$tip = $(this.options.template)
return this.$tip
} }
// POPOVER PLUGIN DEFINITION // POPOVER PLUGIN DEFINITION
// ========================= // =========================
var old = $.fn.popover function Plugin(option) {
$.fn.popover = function (option) {
return this.each(function () { return this.each(function () {
var $this = $(this) var $this = $(this)
var data = $this.data('bs.popover') var data = $this.data('bs.popover')
var options = typeof option == 'object' && option 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 (!data) $this.data('bs.popover', (data = new Popover(this, options)))
if (typeof option == 'string') data[option]() if (typeof option == 'string') data[option]()
}) })
} }
var old = $.fn.popover
$.fn.popover = Plugin
$.fn.popover.Constructor = Popover $.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 * 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) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */ * ======================================================================== */
@ -14,36 +14,45 @@
// ========================== // ==========================
function ScrollSpy(element, options) { function ScrollSpy(element, options) {
var href this.$body = $(document.body)
var process = $.proxy(this.process, this) this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
this.$element = $(element).is('body') ? $(window) : $(element)
this.$body = $('body')
this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
this.options = $.extend({}, ScrollSpy.DEFAULTS, options) this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
this.selector = (this.options.target this.selector = (this.options.target || '') + ' .nav li > a'
|| ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 this.offsets = []
|| '') + ' .nav li > a' this.targets = []
this.offsets = $([])
this.targets = $([])
this.activeTarget = null this.activeTarget = null
this.scrollHeight = 0
this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
this.refresh() this.refresh()
this.process() this.process()
} }
ScrollSpy.VERSION = '3.3.4'
ScrollSpy.DEFAULTS = { ScrollSpy.DEFAULTS = {
offset: 10 offset: 10
} }
ScrollSpy.prototype.getScrollHeight = function () {
return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
}
ScrollSpy.prototype.refresh = function () { ScrollSpy.prototype.refresh = function () {
var offsetMethod = this.$element[0] == window ? 'offset' : 'position' var that = this
var offsetMethod = 'offset'
var offsetBase = 0
this.offsets = $([]) this.offsets = []
this.targets = $([]) this.targets = []
this.scrollHeight = this.getScrollHeight()
var self = this if (!$.isWindow(this.$scrollElement[0])) {
var $targets = this.$body offsetMethod = 'position'
offsetBase = this.$scrollElement.scrollTop()
}
this.$body
.find(this.selector) .find(this.selector)
.map(function () { .map(function () {
var $el = $(this) var $el = $(this)
@ -53,50 +62,53 @@
return ($href return ($href
&& $href.length && $href.length
&& $href.is(':visible') && $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] }) .sort(function (a, b) { return a[0] - b[0] })
.each(function () { .each(function () {
self.offsets.push(this[0]) that.offsets.push(this[0])
self.targets.push(this[1]) that.targets.push(this[1])
}) })
} }
ScrollSpy.prototype.process = function () { ScrollSpy.prototype.process = function () {
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight var scrollHeight = this.getScrollHeight()
var maxScroll = scrollHeight - this.$scrollElement.height() var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
var offsets = this.offsets var offsets = this.offsets
var targets = this.targets var targets = this.targets
var activeTarget = this.activeTarget var activeTarget = this.activeTarget
var i var i
if (scrollTop >= maxScroll) { if (this.scrollHeight != scrollHeight) {
return activeTarget != (i = targets.last()[0]) && this.activate(i) this.refresh()
} }
if (activeTarget && scrollTop <= offsets[0]) { if (scrollTop >= maxScroll) {
return activeTarget != (i = targets[0]) && this.activate(i) 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--;) { for (i = offsets.length; i--;) {
activeTarget != targets[i] activeTarget != targets[i]
&& scrollTop >= offsets[i] && scrollTop >= offsets[i]
&& (!offsets[i + 1] || scrollTop <= offsets[i + 1]) && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
&& this.activate( targets[i] ) && this.activate(targets[i])
} }
} }
ScrollSpy.prototype.activate = function (target) { ScrollSpy.prototype.activate = function (target) {
this.activeTarget = target this.activeTarget = target
$(this.selector) this.clear()
.parentsUntil(this.options.target, '.active')
.removeClass('active')
var selector = this.selector + var selector = this.selector +
'[data-target="' + target + '"],' + '[data-target="' + target + '"],' +
this.selector + '[href="' + target + '"]' this.selector + '[href="' + target + '"]'
var active = $(selector) var active = $(selector)
.parents('li') .parents('li')
@ -111,13 +123,17 @@
active.trigger('activate.bs.scrollspy') active.trigger('activate.bs.scrollspy')
} }
ScrollSpy.prototype.clear = function () {
$(this.selector)
.parentsUntil(this.options.target, '.active')
.removeClass('active')
}
// SCROLLSPY PLUGIN DEFINITION // SCROLLSPY PLUGIN DEFINITION
// =========================== // ===========================
var old = $.fn.scrollspy function Plugin(option) {
$.fn.scrollspy = function (option) {
return this.each(function () { return this.each(function () {
var $this = $(this) var $this = $(this)
var data = $this.data('bs.scrollspy') var data = $this.data('bs.scrollspy')
@ -128,6 +144,9 @@
}) })
} }
var old = $.fn.scrollspy
$.fn.scrollspy = Plugin
$.fn.scrollspy.Constructor = ScrollSpy $.fn.scrollspy.Constructor = ScrollSpy
@ -143,10 +162,10 @@
// SCROLLSPY DATA-API // SCROLLSPY DATA-API
// ================== // ==================
$(window).on('load', function () { $(window).on('load.bs.scrollspy.data-api', function () {
$('[data-spy="scroll"]').each(function () { $('[data-spy="scroll"]').each(function () {
var $spy = $(this) 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 * 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) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */ * ======================================================================== */
@ -17,6 +17,10 @@
this.element = $(element) this.element = $(element)
} }
Tab.VERSION = '3.3.4'
Tab.TRANSITION_DURATION = 150
Tab.prototype.show = function () { Tab.prototype.show = function () {
var $this = this.element var $this = this.element
var $ul = $this.closest('ul:not(.dropdown-menu)') var $ul = $this.closest('ul:not(.dropdown-menu)')
@ -24,27 +28,35 @@
if (!selector) { if (!selector) {
selector = $this.attr('href') 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 if ($this.parent('li').hasClass('active')) return
var previous = $ul.find('.active:last a')[0] var $previous = $ul.find('.active:last a')
var e = $.Event('show.bs.tab', { var hideEvent = $.Event('hide.bs.tab', {
relatedTarget: previous 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) var $target = $(selector)
this.activate($this.parent('li'), $ul) this.activate($this.closest('li'), $ul)
this.activate($target, $target.parent(), function () { this.activate($target, $target.parent(), function () {
$previous.trigger({
type: 'hidden.bs.tab',
relatedTarget: $this[0]
})
$this.trigger({ $this.trigger({
type: 'shown.bs.tab', type: 'shown.bs.tab',
relatedTarget: previous relatedTarget: $previous[0]
}) })
}) })
} }
@ -53,15 +65,21 @@
var $active = container.find('> .active') var $active = container.find('> .active')
var transition = callback var transition = callback
&& $.support.transition && $.support.transition
&& $active.hasClass('fade') && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)
function next() { function next() {
$active $active
.removeClass('active') .removeClass('active')
.find('> .dropdown-menu > .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) { if (transition) {
element[0].offsetWidth // reflow for transition element[0].offsetWidth // reflow for transition
@ -70,17 +88,22 @@
element.removeClass('fade') element.removeClass('fade')
} }
if (element.parent('.dropdown-menu')) { if (element.parent('.dropdown-menu').length) {
element.closest('li.dropdown').addClass('active') element
.closest('li.dropdown')
.addClass('active')
.end()
.find('[data-toggle="tab"]')
.attr('aria-expanded', true)
} }
callback && callback() callback && callback()
} }
transition ? $active.length && transition ?
$active $active
.one($.support.transition.end, next) .one('bsTransitionEnd', next)
.emulateTransitionEnd(150) : .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
next() next()
$active.removeClass('in') $active.removeClass('in')
@ -90,9 +113,7 @@
// TAB PLUGIN DEFINITION // TAB PLUGIN DEFINITION
// ===================== // =====================
var old = $.fn.tab function Plugin(option) {
$.fn.tab = function ( option ) {
return this.each(function () { return this.each(function () {
var $this = $(this) var $this = $(this)
var data = $this.data('bs.tab') var data = $this.data('bs.tab')
@ -102,6 +123,9 @@
}) })
} }
var old = $.fn.tab
$.fn.tab = Plugin
$.fn.tab.Constructor = Tab $.fn.tab.Constructor = Tab
@ -117,9 +141,13 @@
// TAB DATA-API // TAB DATA-API
// ============ // ============
$(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { var clickHandler = function (e) {
e.preventDefault() 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); }(jQuery);

View File

@ -1,9 +1,9 @@
/* ======================================================================== /* ========================================================================
* Bootstrap: tooltip.js v3.1.0 * Bootstrap: tooltip.js v3.3.4
* http://getbootstrap.com/javascript/#tooltip * http://getbootstrap.com/javascript/#tooltip
* Inspired by the original jQuery.tipsy by Jason Frame * 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) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */ * ======================================================================== */
@ -15,33 +15,46 @@
// =============================== // ===============================
var Tooltip = function (element, options) { var Tooltip = function (element, options) {
this.type = this.type = null
this.options = this.options = null
this.enabled = this.enabled = null
this.timeout = this.timeout = null
this.hoverState = this.hoverState = null
this.$element = null this.$element = null
this.init('tooltip', element, options) this.init('tooltip', element, options)
} }
Tooltip.VERSION = '3.3.4'
Tooltip.TRANSITION_DURATION = 150
Tooltip.DEFAULTS = { Tooltip.DEFAULTS = {
animation: true, animation: true,
placement: 'top', placement: 'top',
selector: false, 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', trigger: 'hover focus',
title: '', title: '',
delay: 0, delay: 0,
html: false, html: false,
container: false container: false,
viewport: {
selector: 'body',
padding: 0
}
} }
Tooltip.prototype.init = function (type, element, options) { Tooltip.prototype.init = function (type, element, options) {
this.enabled = true this.enabled = true
this.type = type this.type = type
this.$element = $(element) this.$element = $(element)
this.options = this.getOptions(options) 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(' ') var triggers = this.options.trigger.split(' ')
@ -94,7 +107,17 @@
Tooltip.prototype.enter = function (obj) { Tooltip.prototype.enter = function (obj) {
var self = obj instanceof this.constructor ? 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) clearTimeout(self.timeout)
@ -109,7 +132,12 @@
Tooltip.prototype.leave = function (obj) { Tooltip.prototype.leave = function (obj) {
var self = obj instanceof this.constructor ? 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) clearTimeout(self.timeout)
@ -128,12 +156,17 @@
if (this.hasContent() && this.enabled) { if (this.hasContent() && this.enabled) {
this.$element.trigger(e) this.$element.trigger(e)
if (e.isDefaultPrevented()) return var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
var that = this; if (e.isDefaultPrevented() || !inDom) return
var that = this
var $tip = this.tip() var $tip = this.tip()
var tipId = this.getUID(this.type)
this.setContent() this.setContent()
$tip.attr('id', tipId)
this.$element.attr('aria-describedby', tipId)
if (this.options.animation) $tip.addClass('fade') if (this.options.animation) $tip.addClass('fade')
@ -149,6 +182,7 @@
.detach() .detach()
.css({ top: 0, left: 0, display: 'block' }) .css({ top: 0, left: 0, display: 'block' })
.addClass(placement) .addClass(placement)
.data('bs.' + this.type, this)
this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
@ -157,18 +191,14 @@
var actualHeight = $tip[0].offsetHeight var actualHeight = $tip[0].offsetHeight
if (autoPlace) { if (autoPlace) {
var $parent = this.$element.parent()
var orgPlacement = placement var orgPlacement = placement
var docScroll = document.documentElement.scrollTop || document.body.scrollTop var $container = this.options.container ? $(this.options.container) : this.$element.parent()
var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth() var containerDim = this.getPosition($container)
var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left
placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' : placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top' :
placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' : placement == 'top' && pos.top - actualHeight < containerDim.top ? 'bottom' :
placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' : placement == 'right' && pos.right + actualWidth > containerDim.width ? 'left' :
placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' : placement == 'left' && pos.left - actualWidth < containerDim.left ? 'right' :
placement placement
$tip $tip
@ -179,22 +209,24 @@
var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
this.applyPlacement(calculatedOffset, placement) 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.$element.trigger('shown.bs.' + that.type)
that.hoverState = null
if (prevHoverState == 'out') that.leave(that)
} }
$.support.transition && this.$tip.hasClass('fade') ? $.support.transition && this.$tip.hasClass('fade') ?
$tip $tip
.one($.support.transition.end, complete) .one('bsTransitionEnd', complete)
.emulateTransitionEnd(150) : .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
complete() complete()
} }
} }
Tooltip.prototype.applyPlacement = function (offset, placement) { Tooltip.prototype.applyPlacement = function (offset, placement) {
var replace
var $tip = this.tip() var $tip = this.tip()
var width = $tip[0].offsetWidth var width = $tip[0].offsetWidth
var height = $tip[0].offsetHeight var height = $tip[0].offsetHeight
@ -228,33 +260,26 @@
var actualHeight = $tip[0].offsetHeight var actualHeight = $tip[0].offsetHeight
if (placement == 'top' && actualHeight != height) { if (placement == 'top' && actualHeight != height) {
replace = true
offset.top = offset.top + height - actualHeight offset.top = offset.top + height - actualHeight
} }
if (/bottom|top/.test(placement)) { var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
var delta = 0
if (offset.left < 0) { if (delta.left) offset.left += delta.left
delta = offset.left * -2 else offset.top += delta.top
offset.left = 0
$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 $tip.offset(offset)
actualHeight = $tip[0].offsetHeight this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
}
this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
} else {
this.replaceArrow(actualHeight - height, actualHeight, 'top')
}
if (replace) $tip.offset(offset)
} }
Tooltip.prototype.replaceArrow = function (delta, dimension, position) { Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '') this.arrow()
.css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
.css(isVertical ? 'top' : 'left', '')
} }
Tooltip.prototype.setContent = function () { Tooltip.prototype.setContent = function () {
@ -265,14 +290,17 @@
$tip.removeClass('fade in top bottom left right') $tip.removeClass('fade in top bottom left right')
} }
Tooltip.prototype.hide = function () { Tooltip.prototype.hide = function (callback) {
var that = this var that = this
var $tip = this.tip() var $tip = $(this.$tip)
var e = $.Event('hide.bs.' + this.type) var e = $.Event('hide.bs.' + this.type)
function complete() { function complete() {
if (that.hoverState != 'in') $tip.detach() 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) this.$element.trigger(e)
@ -281,10 +309,10 @@
$tip.removeClass('in') $tip.removeClass('in')
$.support.transition && this.$tip.hasClass('fade') ? $.support.transition && $tip.hasClass('fade') ?
$tip $tip
.one($.support.transition.end, complete) .one('bsTransitionEnd', complete)
.emulateTransitionEnd(150) : .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
complete() complete()
this.hoverState = null this.hoverState = null
@ -294,7 +322,7 @@
Tooltip.prototype.fixTitle = function () { Tooltip.prototype.fixTitle = function () {
var $e = this.$element 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', '') $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
} }
} }
@ -303,19 +331,58 @@
return this.getTitle() return this.getTitle()
} }
Tooltip.prototype.getPosition = function () { Tooltip.prototype.getPosition = function ($element) {
var el = this.$element[0] $element = $element || this.$element
return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
width: el.offsetWidth, var el = $element[0]
height: el.offsetHeight var isBody = el.tagName == 'BODY'
}, this.$element.offset())
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) { Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
return placement == 'bottom' ? { top: pos.top + pos.height, 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 == '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 == '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 () { Tooltip.prototype.getTitle = function () {
@ -329,20 +396,18 @@
return title return title
} }
Tooltip.prototype.getUID = function (prefix) {
do prefix += ~~(Math.random() * 1000000)
while (document.getElementById(prefix))
return prefix
}
Tooltip.prototype.tip = function () { Tooltip.prototype.tip = function () {
return this.$tip = this.$tip || $(this.options.template) return (this.$tip = this.$tip || $(this.options.template))
} }
Tooltip.prototype.arrow = function () { Tooltip.prototype.arrow = function () {
return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow') 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
}
} }
Tooltip.prototype.enable = function () { Tooltip.prototype.enable = function () {
@ -358,33 +423,45 @@
} }
Tooltip.prototype.toggle = function (e) { 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) self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
} }
Tooltip.prototype.destroy = function () { Tooltip.prototype.destroy = function () {
var that = this
clearTimeout(this.timeout) 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 // TOOLTIP PLUGIN DEFINITION
// ========================= // =========================
var old = $.fn.tooltip function Plugin(option) {
$.fn.tooltip = function (option) {
return this.each(function () { return this.each(function () {
var $this = $(this) var $this = $(this)
var data = $this.data('bs.tooltip') var data = $this.data('bs.tooltip')
var options = typeof option == 'object' && option 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 (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
if (typeof option == 'string') data[option]() if (typeof option == 'string') data[option]()
}) })
} }
var old = $.fn.tooltip
$.fn.tooltip = Plugin
$.fn.tooltip.Constructor = Tooltip $.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 * 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) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */ * ======================================================================== */
@ -17,10 +17,10 @@
var el = document.createElement('bootstrap') var el = document.createElement('bootstrap')
var transEndEventNames = { var transEndEventNames = {
'WebkitTransition' : 'webkitTransitionEnd', WebkitTransition : 'webkitTransitionEnd',
'MozTransition' : 'transitionend', MozTransition : 'transitionend',
'OTransition' : 'oTransitionEnd otransitionend', OTransition : 'oTransitionEnd otransitionend',
'transition' : 'transitionend' transition : 'transitionend'
} }
for (var name in transEndEventNames) { for (var name in transEndEventNames) {
@ -34,8 +34,9 @@
// http://blog.alexmaccaw.com/css-transitions // http://blog.alexmaccaw.com/css-transitions
$.fn.emulateTransitionEnd = function (duration) { $.fn.emulateTransitionEnd = function (duration) {
var called = false, $el = this var called = false
$(this).one($.support.transition.end, function () { called = true }) var $el = this
$(this).one('bsTransitionEnd', function () { called = true })
var callback = function () { if (!called) $($el).trigger($.support.transition.end) } var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
setTimeout(callback, duration) setTimeout(callback, duration)
return this return this
@ -43,6 +44,16 @@
$(function () { $(function () {
$.support.transition = transitionEnd() $.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); }(jQuery);

View File

@ -18,6 +18,7 @@
// Specified for the h4 to prevent conflicts of changing @headings-color // Specified for the h4 to prevent conflicts of changing @headings-color
color: inherit; color: inherit;
} }
// Provide class for links that match alerts // Provide class for links that match alerts
.alert-link { .alert-link {
font-weight: @alert-link-font-weight; font-weight: @alert-link-font-weight;
@ -28,17 +29,19 @@
> ul { > ul {
margin-bottom: 0; margin-bottom: 0;
} }
> p + p { > p + p {
margin-top: 5px; margin-top: 5px;
} }
} }
// Dismissable alerts // Dismissible alerts
// //
// Expand the right padding and account for the close button's positioning. // Expand the right padding and account for the close button's positioning.
.alert-dismissable { .alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.
padding-right: (@alert-padding + 20); .alert-dismissible {
padding-right: (@alert-padding + 20);
// Adjust close link position // Adjust close link position
.close { .close {
@ -56,12 +59,15 @@
.alert-success { .alert-success {
.alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);
} }
.alert-info { .alert-info {
.alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);
} }
.alert-warning { .alert-warning {
.alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);
} }
.alert-danger { .alert-danger {
.alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);
} }

View File

@ -3,7 +3,7 @@
// -------------------------------------------------- // --------------------------------------------------
// Base classes // Base class
.badge { .badge {
display: inline-block; display: inline-block;
min-width: 10px; min-width: 10px;
@ -28,28 +28,39 @@
position: relative; position: relative;
top: -1px; top: -1px;
} }
.btn-xs & {
.btn-xs &,
.btn-group-xs > .btn & {
top: 0; top: 0;
padding: 1px 5px; padding: 1px 5px;
} }
}
// Hover state, but only for links // Hover state, but only for links
a.badge { a& {
&:hover, &:hover,
&:focus { &:focus {
color: @badge-link-hover-color; color: @badge-link-hover-color;
text-decoration: none; text-decoration: none;
cursor: pointer; 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 "variables.less";
@import "mixins.less"; @import "mixins.less";
// Reset // Reset and dependencies
@import "normalize.less"; @import "normalize.less";
@import "print.less"; @import "print.less";
@import "glyphicons.less";
// Core CSS // Core CSS
@import "scaffolding.less"; @import "scaffolding.less";
@ -17,7 +18,6 @@
// Components // Components
@import "component-animations.less"; @import "component-animations.less";
@import "glyphicons.less";
@import "dropdowns.less"; @import "dropdowns.less";
@import "button-groups.less"; @import "button-groups.less";
@import "input-groups.less"; @import "input-groups.less";
@ -35,6 +35,7 @@
@import "media.less"; @import "media.less";
@import "list-group.less"; @import "list-group.less";
@import "panels.less"; @import "panels.less";
@import "responsive-embed.less";
@import "wells.less"; @import "wells.less";
@import "close.less"; @import "close.less";

View File

@ -18,10 +18,6 @@
&.active { &.active {
z-index: 2; 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 { .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
border-radius: 0; border-radius: 0;
} }
.btn-group > .btn-group:first-child { .btn-group > .btn-group:first-child:not(:last-child) {
> .btn:last-child, > .btn:last-child,
> .dropdown-toggle { > .dropdown-toggle {
.border-right-radius(0); .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); .border-left-radius(0);
} }
@ -96,9 +92,9 @@
// //
// Remix the default button sizing classes into new ones for easier manipulation. // Remix the default button sizing classes into new ones for easier manipulation.
.btn-group-xs > .btn { .btn-xs(); } .btn-group-xs > .btn { &:extend(.btn-xs); }
.btn-group-sm > .btn { .btn-sm(); } .btn-group-sm > .btn { &:extend(.btn-sm); }
.btn-group-lg > .btn { .btn-lg(); } .btn-group-lg > .btn { &:extend(.btn-lg); }
// Split button dropdowns // Split button dropdowns
@ -198,7 +194,6 @@
} }
// Justified button groups // Justified button groups
// ---------------------- // ----------------------
@ -216,11 +211,33 @@
> .btn-group .btn { > .btn-group .btn {
width: 100%; width: 100%;
} }
> .btn-group .dropdown-menu {
left: auto;
}
} }
// Checkbox and radio options // Checkbox and radio options
[data-toggle="buttons"] > .btn > input[type="radio"], //
[data-toggle="buttons"] > .btn > input[type="checkbox"] { // In order to support the browser's form validation feedback, powered by the
display: none; // `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; font-weight: @btn-font-weight;
text-align: center; text-align: center;
vertical-align: middle; vertical-align: middle;
touch-action: manipulation;
cursor: pointer; cursor: pointer;
background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
border: 1px solid transparent; 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); .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);
.user-select(none); .user-select(none);
&:focus { &,
.tab-focus(); &:active,
&.active {
&:focus,
&.focus {
.tab-focus();
}
} }
&:hover, &:hover,
&:focus { &:focus,
&.focus {
color: @btn-default-color; color: @btn-default-color;
text-decoration: none; text-decoration: none;
} }
@ -39,7 +46,7 @@
&.disabled, &.disabled,
&[disabled], &[disabled],
fieldset[disabled] & { fieldset[disabled] & {
cursor: not-allowed; cursor: @cursor-disabled;
pointer-events: none; // Future-proof disabling of clicks pointer-events: none; // Future-proof disabling of clicks
.opacity(.65); .opacity(.65);
.box-shadow(none); .box-shadow(none);
@ -81,11 +88,11 @@
.btn-link { .btn-link {
color: @link-color; color: @link-color;
font-weight: normal; font-weight: normal;
cursor: pointer;
border-radius: 0; border-radius: 0;
&, &,
&:active, &:active,
&.active,
&[disabled], &[disabled],
fieldset[disabled] & { fieldset[disabled] & {
background-color: transparent; background-color: transparent;
@ -100,7 +107,7 @@
&:hover, &:hover,
&:focus { &:focus {
color: @link-hover-color; color: @link-hover-color;
text-decoration: underline; text-decoration: @link-hover-decoration;
background-color: transparent; background-color: transparent;
} }
&[disabled], &[disabled],
@ -136,8 +143,6 @@
.btn-block { .btn-block {
display: block; display: block;
width: 100%; width: 100%;
padding-left: 0;
padding-right: 0;
} }
// Vertically space out multiple block buttons // Vertically space out multiple block buttons

View File

@ -21,14 +21,40 @@
// Account for jankitude on images // Account for jankitude on images
> img, > img,
> a > img { > a > img {
.img-responsive(); &:extend(.img-responsive);
line-height: 1; 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, > .active,
> .next, > .next,
> .prev { display: block; } > .prev {
display: block;
}
> .active { > .active {
left: 0; left: 0;
@ -91,7 +117,7 @@
// Hover/focus state // Hover/focus state
&:hover, &:hover,
&:focus { &:focus {
outline: none; outline: 0;
color: @carousel-control-color; color: @carousel-control-color;
text-decoration: none; text-decoration: none;
.opacity(.9); .opacity(.9);
@ -110,20 +136,23 @@
.icon-prev, .icon-prev,
.glyphicon-chevron-left { .glyphicon-chevron-left {
left: 50%; left: 50%;
margin-left: -10px;
} }
.icon-next, .icon-next,
.glyphicon-chevron-right { .glyphicon-chevron-right {
right: 50%; right: 50%;
margin-right: -10px;
} }
.icon-prev, .icon-prev,
.icon-next { .icon-next {
width: 20px; width: 20px;
height: 20px; height: 20px;
margin-top: -10px; margin-top: -10px;
margin-left: -10px; line-height: 1;
font-family: serif; font-family: serif;
} }
.icon-prev { .icon-prev {
&:before { &:before {
content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) 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 // 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`. We cannot use `filter` since that's not viewed as a
// background color by the browser. Thus, a hack is needed. // 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 // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
// set alpha transparency for the best results possible. // set alpha transparency for the best results possible.
@ -206,16 +236,23 @@
// Scale up the controls a smidge // Scale up the controls a smidge
.carousel-control { .carousel-control {
.glyphicons-chevron-left, .glyphicon-chevron-left,
.glyphicons-chevron-right, .glyphicon-chevron-right,
.icon-prev, .icon-prev,
.icon-next { .icon-next {
width: 30px; width: 30px;
height: 30px; height: 30px;
margin-top: -15px; margin-top: -15px;
margin-left: -15px;
font-size: 30px; 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 // Show and left align the captions

View File

@ -23,6 +23,7 @@
// Additional properties for button version // Additional properties for button version
// iOS requires the button element instead of an anchor tag. // iOS requires the button element instead of an anchor tag.
// If you want the anchor version, it requires `href="#"`. // If you want the anchor version, it requires `href="#"`.
// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
button& { button& {
padding: 0; padding: 0;
cursor: pointer; cursor: pointer;

View File

@ -17,7 +17,6 @@ code {
font-size: 90%; font-size: 90%;
color: @code-color; color: @code-color;
background-color: @code-bg; background-color: @code-bg;
white-space: nowrap;
border-radius: @border-radius-base; border-radius: @border-radius-base;
} }
@ -29,6 +28,13 @@ kbd {
background-color: @kbd-bg; background-color: @kbd-bg;
border-radius: @border-radius-small; border-radius: @border-radius-small;
box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); 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 // Blocks of code

View File

@ -5,7 +5,7 @@
// Heads up! // Heads up!
// //
// We don't use the `.opacity()` mixin here since it causes a bug with text // 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 { .fade {
opacity: 0; opacity: 0;
@ -17,13 +17,17 @@
.collapse { .collapse {
display: none; display: none;
&.in {
display: block; &.in { display: block; }
} tr&.in { display: table-row; }
tbody&.in { display: table-row-group; }
} }
.collapsing { .collapsing {
position: relative; position: relative;
height: 0; height: 0;
overflow: hidden; 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; height: 0;
margin-left: 2px; margin-left: 2px;
vertical-align: middle; vertical-align: middle;
border-top: @caret-width-base solid; border-top: @caret-width-base dashed;
border-right: @caret-width-base solid transparent; border-right: @caret-width-base solid transparent;
border-left: @caret-width-base solid transparent; border-left: @caret-width-base solid transparent;
} }
// The dropdown wrapper (div) // The dropdown wrapper (div)
.dropup,
.dropdown { .dropdown {
position: relative; position: relative;
} }
@ -38,6 +39,7 @@
margin: 2px 0 0; // override default ul margin: 2px 0 0; // override default ul
list-style: none; list-style: none;
font-size: @font-size-base; font-size: @font-size-base;
text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
background-color: @dropdown-bg; background-color: @dropdown-bg;
border: 1px solid @dropdown-fallback-border; // IE8 fallback border: 1px solid @dropdown-fallback-border; // IE8 fallback
border: 1px solid @dropdown-border; border: 1px solid @dropdown-border;
@ -102,16 +104,15 @@
&:focus { &:focus {
color: @dropdown-link-disabled-color; color: @dropdown-link-disabled-color;
} }
}
// Nuke hover/focus effects // Nuke hover/focus effects
.dropdown-menu > .disabled > a {
&:hover, &:hover,
&:focus { &:focus {
text-decoration: none; text-decoration: none;
background-color: transparent; background-color: transparent;
background-image: none; // Remove CSS gradient background-image: none; // Remove CSS gradient
.reset-filter(); .reset-filter();
cursor: not-allowed; cursor: @cursor-disabled;
} }
} }
@ -154,6 +155,7 @@
font-size: @font-size-small; font-size: @font-size-small;
line-height: @line-height-base; line-height: @line-height-base;
color: @dropdown-header-color; color: @dropdown-header-color;
white-space: nowrap; // as with > li > a
} }
// Backdrop to catch body clicks on mobile, etc. // Backdrop to catch body clicks on mobile, etc.
@ -189,7 +191,7 @@
.dropdown-menu { .dropdown-menu {
top: auto; top: auto;
bottom: 100%; bottom: 100%;
margin-bottom: 1px; margin-bottom: 2px;
} }
} }
@ -210,4 +212,3 @@
} }
} }
} }

View File

@ -11,7 +11,7 @@ fieldset {
padding: 0; padding: 0;
margin: 0; margin: 0;
border: 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. // so we reset that to ensure it behaves more like a standard block element.
// See https://github.com/twbs/bootstrap/issues/12359. // See https://github.com/twbs/bootstrap/issues/12359.
min-width: 0; min-width: 0;
@ -31,6 +31,7 @@ legend {
label { label {
display: inline-block; display: inline-block;
max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)
margin-bottom: 5px; margin-bottom: 5px;
font-weight: bold; font-weight: bold;
} }
@ -51,7 +52,7 @@ input[type="search"] {
input[type="radio"], input[type="radio"],
input[type="checkbox"] { input[type="checkbox"] {
margin: 4px 0 0; margin: 4px 0 0;
margin-top: 1px \9; /* IE8-9 */ margin-top: 1px \9; // IE8-9
line-height: normal; line-height: normal;
} }
@ -122,7 +123,7 @@ output {
background-color: @input-bg; background-color: @input-bg;
background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 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: 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)); .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
.transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s"); .transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s");
@ -133,15 +134,20 @@ output {
.placeholder(); .placeholder();
// Disabled and read-only inputs // 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, // HTML5 says that controls under a fieldset > legend:first-child won't be
// we don't honor that edge case; we style them as disabled anyway. // disabled if the fieldset is disabled. Due to implementation difficulty, we
// don't honor that edge case; we style them as disabled anyway.
&[disabled], &[disabled],
&[readonly], &[readonly],
fieldset[disabled] & { fieldset[disabled] & {
cursor: not-allowed;
background-color: @input-bg-disabled; 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 // 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 // This overrides the extra rounded corners on search inputs in iOS so that our
// given height of the input. // `.form-control` class can properly style them. Note that this cannot simply
input[type="date"] { // be added to `.form-control` as it's not specific enough. For details, see
line-height: @input-height-base; // 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. // horizontal forms, use the predefined grid classes.
.form-group { .form-group {
margin-bottom: 15px; margin-bottom: @form-group-margin-bottom;
} }
@ -175,13 +212,15 @@ input[type="date"] {
.radio, .radio,
.checkbox { .checkbox {
position: relative;
display: block; display: block;
min-height: @line-height-computed; // clear the floating input if there is no label text
margin-top: 10px; margin-top: 10px;
margin-bottom: 10px; margin-bottom: 10px;
padding-left: 20px;
label { 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; font-weight: normal;
cursor: pointer; cursor: pointer;
} }
@ -190,9 +229,11 @@ input[type="date"] {
.radio-inline input[type="radio"], .radio-inline input[type="radio"],
.checkbox input[type="checkbox"], .checkbox input[type="checkbox"],
.checkbox-inline input[type="checkbox"] { .checkbox-inline input[type="checkbox"] {
float: left; position: absolute;
margin-left: -20px; margin-left: -20px;
margin-top: 4px \9;
} }
.radio + .radio, .radio + .radio,
.checkbox + .checkbox { .checkbox + .checkbox {
margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing 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 // Radios and checkboxes on same line
.radio-inline, .radio-inline,
.checkbox-inline { .checkbox-inline {
position: relative;
display: inline-block; display: inline-block;
padding-left: 20px; padding-left: 20px;
margin-bottom: 0; margin-bottom: 0;
@ -215,17 +257,54 @@ input[type="date"] {
} }
// Apply same disabled cursor tweak as for inputs // 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. // Note: Neither radios nor checkboxes can be readonly.
input[type="radio"], input[type="radio"],
input[type="checkbox"], input[type="checkbox"] {
.radio,
.radio-inline,
.checkbox,
.checkbox-inline {
&[disabled], &[disabled],
&.disabled,
fieldset[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 // Build on `.form-control` with modifier classes to decrease or increase the
// height and font-size of form controls. // 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-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-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 { .form-control {
padding-right: (@input-height-base * 1.25); padding-right: (@input-height-base * 1.25);
} }
}
// Feedback icon (requires .glyphicon classes) // Feedback icon (requires .glyphicon classes)
.form-control-feedback { .form-control-feedback {
position: absolute; position: absolute;
top: (@line-height-computed + 5); // Height of the `label` and its margin top: 0;
right: 0; right: 0;
display: block; z-index: 2; // Ensure icon is above input groups
width: @input-height-base; display: block;
height: @input-height-base; width: @input-height-base;
line-height: @input-height-base; height: @input-height-base;
text-align: center; 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 // Feedback states
@ -281,14 +398,15 @@ input[type="checkbox"],
.form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg); .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 & ~ .form-control-feedback {
// top: (@line-height-computed + 5); // Height of the `label` and its margin
// Apply class to a `p` element to make any string of text align with labels in }
// a horizontal form layout. &.sr-only ~ .form-control-feedback {
top: 0;
.form-control-static { }
margin-bottom: 0; // Remove default margin from `p`
} }
@ -305,7 +423,6 @@ input[type="checkbox"],
} }
// Inline forms // Inline forms
// //
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline // Make forms appear inline(-block) by adding the `.form-inline` class. Inline
@ -335,32 +452,52 @@ input[type="checkbox"],
vertical-align: middle; 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 { .control-label {
margin-bottom: 0; margin-bottom: 0;
vertical-align: middle; vertical-align: middle;
} }
// Remove default margin on radios/checkboxes that were used for stacking, and // 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 // then undo the floating of radios and checkboxes to match.
// a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).
.radio, .radio,
.checkbox { .checkbox {
display: inline-block; display: inline-block;
margin-top: 0; margin-top: 0;
margin-bottom: 0; margin-bottom: 0;
padding-left: 0;
vertical-align: middle; vertical-align: middle;
label {
padding-left: 0;
}
} }
.radio input[type="radio"], .radio input[type="radio"],
.checkbox input[type="checkbox"] { .checkbox input[type="checkbox"] {
float: none; position: relative;
margin-left: 0; margin-left: 0;
} }
// Validation states // Re-override the feedback icon.
//
// 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 { .has-feedback .form-control-feedback {
top: 0; top: 0;
} }
@ -375,8 +512,9 @@ input[type="checkbox"],
.form-horizontal { .form-horizontal {
// Consistent vertical alignment of labels, radios, and checkboxes // Consistent vertical alignment of radios and checkboxes
.control-label, //
// Labels also get some reset styles, but that is scoped to a media query below.
.radio, .radio,
.checkbox, .checkbox,
.radio-inline, .radio-inline,
@ -397,14 +535,13 @@ input[type="checkbox"],
.make-row(); .make-row();
} }
.form-control-static { // Reset spacing and right align labels, but scope to media queries so that
padding-top: (@padding-base-vertical + 1); // labels on narrow viewports stack the same as a default form example.
}
// Only right align form labels here when the columns stop stacking
@media (min-width: @screen-sm-min) { @media (min-width: @screen-sm-min) {
.control-label { .control-label {
text-align: right; 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 // 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. // `position: relative;` on them. Also accounts for the grid gutter padding.
.has-feedback .form-control-feedback { .has-feedback .form-control-feedback {
top: 0;
right: (@grid-gutter-width / 2); 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 // Import the fonts
@font-face { @font-face {
font-family: 'Glyphicons Halflings'; font-family: 'Glyphicons Halflings';
src: ~"url('@{icon-font-path}@{icon-font-name}.eot')"; src: url('@{icon-font-path}@{icon-font-name}.eot');
src: ~"url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype')", 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}.woff2') format('woff2'),
~"url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype')", url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),
~"url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg')"; 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 // Catchall baseclass
@ -33,7 +34,8 @@
// Individual icons // Individual icons
.glyphicon-asterisk { &:before { content: "\2a"; } } .glyphicon-asterisk { &:before { content: "\2a"; } }
.glyphicon-plus { &:before { content: "\2b"; } } .glyphicon-plus { &:before { content: "\2b"; } }
.glyphicon-euro { &:before { content: "\20ac"; } } .glyphicon-euro,
.glyphicon-eur { &:before { content: "\20ac"; } }
.glyphicon-minus { &:before { content: "\2212"; } } .glyphicon-minus { &:before { content: "\2212"; } }
.glyphicon-cloud { &:before { content: "\2601"; } } .glyphicon-cloud { &:before { content: "\2601"; } }
.glyphicon-envelope { &:before { content: "\2709"; } } .glyphicon-envelope { &:before { content: "\2709"; } }
@ -231,3 +233,73 @@
.glyphicon-cloud-upload { &:before { content: "\e198"; } } .glyphicon-cloud-upload { &:before { content: "\e198"; } }
.glyphicon-tree-conifer { &:before { content: "\e199"; } } .glyphicon-tree-conifer { &:before { content: "\e199"; } }
.glyphicon-tree-deciduous { &:before { content: "\e200"; } } .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 // Columns, offsets, pushes, and pulls for extra small devices like
// smartphones. // smartphones.
.make-grid-columns-float(xs); .make-grid(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);
// Small grid // Small grid
@ -66,11 +62,7 @@
// to tablets. // to tablets.
@media (min-width: @screen-sm-min) { @media (min-width: @screen-sm-min) {
.make-grid-columns-float(sm); .make-grid(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);
} }
@ -79,11 +71,7 @@
// Columns, offsets, pushes, and pulls for the desktop device range. // Columns, offsets, pushes, and pulls for the desktop device range.
@media (min-width: @screen-md-min) { @media (min-width: @screen-md-min) {
.make-grid-columns-float(md); .make-grid(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);
} }
@ -92,9 +80,5 @@
// Columns, offsets, pushes, and pulls for the large desktop device range. // Columns, offsets, pushes, and pulls for the large desktop device range.
@media (min-width: @screen-lg-min) { @media (min-width: @screen-lg-min) {
.make-grid-columns-float(lg); .make-grid(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);
} }

View File

@ -17,6 +17,11 @@
} }
.form-control { .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 // 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: // select elements in input groups. To fix it, we float the input. Details:
// https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855 // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855
@ -34,10 +39,14 @@
.input-group-lg > .form-control, .input-group-lg > .form-control,
.input-group-lg > .input-group-addon, .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 > .form-control,
.input-group-sm > .input-group-addon, .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 // Display as table-cell

View File

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

View File

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

View File

@ -35,14 +35,6 @@
margin-bottom: 0; margin-bottom: 0;
.border-bottom-radius(@list-group-border-radius); .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, &:hover,
&:focus { &:focus {
text-decoration: none; text-decoration: none;
color: @list-group-link-hover-color;
background-color: @list-group-hover-bg; 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 class on item itself, not parent
&.active, &.active,
@ -75,7 +87,9 @@ a.list-group-item {
border-color: @list-group-active-border; border-color: @list-group-active-border;
// Force color to inherit for custom content // 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; color: inherit;
} }
.list-group-item-text { .list-group-item-text {

View File

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

View File

@ -1,926 +1,39 @@
//
// Mixins // Mixins
// -------------------------------------------------- // --------------------------------------------------
// Utilities // Utilities
// ------------------------- @import "mixins/hide-text.less";
@import "mixins/opacity.less";
// Clearfix @import "mixins/image.less";
// Source: http://nicolasgallagher.com/micro-clearfix-hack/ @import "mixins/labels.less";
// @import "mixins/reset-filter.less";
// For modern browsers @import "mixins/resize.less";
// 1. The space content is one way to avoid an Opera bug when the @import "mixins/responsive-visibility.less";
// contenteditable attribute is included anywhere else in the document. @import "mixins/size.less";
// Otherwise it causes space to appear at the top and bottom of elements @import "mixins/tab-focus.less";
// that are clearfixed. @import "mixins/text-emphasis.less";
// 2. The use of `table` rather than `block` is only necessary if using @import "mixins/text-overflow.less";
// `:before` to contain the top-margins of child elements. @import "mixins/vendor-prefixes.less";
.clearfix() {
&:before, // Components
&:after { @import "mixins/alerts.less";
content: " "; // 1 @import "mixins/buttons.less";
display: table; // 2 @import "mixins/panels.less";
} @import "mixins/pagination.less";
&:after { @import "mixins/list-group.less";
clear: both; @import "mixins/nav-divider.less";
} @import "mixins/forms.less";
} @import "mixins/progress-bar.less";
@import "mixins/table-row.less";
// WebKit-style focus
.tab-focus() { // Skins
// Default @import "mixins/background-variant.less";
outline: thin dotted; @import "mixins/border-radius.less";
// WebKit @import "mixins/gradients.less";
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px; // Layout
} @import "mixins/clearfix.less";
@import "mixins/center-block.less";
// Center-align a block level element @import "mixins/nav-vertical-align.less";
.center-block() { @import "mixins/grid-framework.less";
display: block; @import "mixins/grid.less";
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;
}
}

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