whisper.cat stuff

This commit is contained in:
[Harper Innes]
2023-10-05 23:28:32 +11:00
parent 2a6e28637c
commit f127b4fea8
5224 changed files with 919361 additions and 0 deletions

View File

@ -0,0 +1,148 @@
body.dark-theme {
background: #000;
}
.dark-theme * {color:#f6f6f6;}
.dark-theme .main-conteiner {
background: #111 ;
}
.dark-theme table.dataTable thead tr {
background: #222;
}
.dark-theme .dataTables_wrapper .bottom {background:#222;}
.dark-theme table.dataTable thead th .filter-btn i, .dark-theme table.dataTable tbody tr .filter-btn i {color:#eee;}
.dark-theme .dataTables_wrapper .bottom {
border-color: #444;
}
.dark-theme .table-select-input,
.dark-theme .popup-filter-input {
background: #111;
border: 1px solid #444;
}
.dark-theme .table-select-input .table-select-input-item {
color:#ddd;
}
.dark-theme .table-select-input .table-select-input-item:hover,
.dark-theme .table-select-input .table-select-input-item.selected {
background:#333;
}
.dark-theme .ui-select {
background: #333;
}
.dark-theme .ui-select:hover {
background:#444;
}
.dark-theme .dataTables_paginate .paginate_button a {
background: #333;
color:#ddd;
}
.dark-theme .dataTables_paginate .paginate_button a:hover {
background: #444;
}
.dark-theme .dataTables_paginate .paginate_button.current a {
background:#444;
}
.dark-theme .popup-filter-input .reset-btn {
background: #333;
}
.dark-theme .popup-filter-input .reset-btn:hover {background:#444;}
.dark-theme .popup-filter-input .reset-btn i {color:#ddd}
.dark-theme .popup-filter-input .lbl-range {color:#aaa}
.dark-theme .ui-widget-header {
background: #444;
}
.dark-theme .ui-widget-content {
background: #111;
}
.dark-theme .ui-state-default,
.dark-theme .ui-widget-content .ui-state-default,
.dark-theme .ui-widget-header .ui-state-default
{
background:#888;
outline:none;
}
.dark-theme header .inner {
background: #444;
border-bottom: 1px solid #777;
}
.dark-theme .popup-filter-input .lbl-range-from,.dark-theme .popup-filter-input .lbl-range-to {
background: inherit;
}
.dark-theme .ui-datepicker-calendar tr td a.ui-state-default {
background: inherit;
color: inherit;
}
.dark-theme .ui-datepicker-calendar tr td a.ui-state-default:hover {
background: #222;
}
.dark-theme .ui-datepicker-calendar tr td a.ui-state-default.ui-state-active {background:#333;}
.dark-theme .ui-datepicker-calendar tr td a.ui-state-default.ui-state-highlight {color:#aaf;}
.dark-theme table thead {
border-bottom: 1px solid #444;
}
.dark-theme table tbody tr {
border-color: #444;
}
.dark-theme table tbody tr:last-child {
border-color:transparent;
}
.dark-theme table.dataTable tbody tr:hover {
background: #333;
}
.dark-theme table.dataTable thead th:hover {
background: #444444;
}
.dark-theme .header .data-view button.active,
.dark-theme .header .data-view button:hover {
border-bottom: 2px solid #ffffff;
}
.dark-theme .swal2-modal {background:#222;}
.dark-theme .swal2-modal .swal2-title {color:#eee;}
.dark-theme .swal2-modal .swal2-text {color:#eee;}
.dark-theme .swal2-modal .swal2-content {color:#eee;}
.dark-theme button.swal2-confirm {background:#333;color:#eee;}
.dark-theme button.swal2-confirm:hover {background:#444;}
.dark-theme div.modal-share-info { }
.dark-theme div.modal-share-info div.modal-share-left { }
.dark-theme div.modal-share-info div.modal-share-left div.modal-share-line { }
.dark-theme div.modal-share-info div.modal-share-left div.modal-share-line label {color: #0b89c3;}
.dark-theme div.modal-share-info div.modal-share-left div.modal-share-line span { }
.dark-theme div.modal-share-info div.modal-share-right { }
.dark-theme div.modal-share-info div.modal-share-right img.share-img { filter:invert(); }
.dark-theme input.ui.input.filter-string-simple {
background:#222;
border-color:#000;
}
.dark-theme input.ui.input.filter-string-simple:focus {
border-color:#333;
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="assets/images/favicon/mstile-150x150.png"/>
<TileColor>#da532c</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@ -0,0 +1,17 @@
{
"name": "Stock Screener",
"icons": [
{
"src": "assets\/images\/favicon\/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image\/png"
},
{
"src": "assets\/images\/favicon\/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image\/png"
}
],
"theme_color": "#ffffff",
"display": "standalone"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1,36 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="626.000000pt" height="626.000000pt" viewBox="0 0 626.000000 626.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,626.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M5320 3315 l0 -2345 240 0 240 0 0 2345 0 2345 -240 0 -240 0 0
-2345z"/>
<path d="M2710 5239 c-275 -26 -531 -135 -720 -304 -66 -59 -150 -147 -169
-175 -9 -14 -30 -43 -46 -66 -79 -105 -170 -321 -202 -481 -24 -120 -23 -366
1 -483 34 -164 104 -333 193 -468 l36 -54 -108 -108 -107 -108 -82 -4 c-144
-8 -121 11 -698 -566 -570 -570 -556 -553 -566 -689 -7 -100 21 -174 94 -247
71 -73 140 -99 244 -94 139 7 127 -3 677 547 270 271 504 508 519 528 41 54
64 125 64 199 l0 65 108 111 109 110 54 -35 c147 -94 290 -154 449 -190 142
-31 396 -31 535 2 256 60 465 176 642 359 234 241 355 542 356 882 0 326 -107
611 -318 849 -263 296 -672 458 -1065 420z m370 -394 c335 -107 564 -357 636
-693 7 -37 14 -119 14 -183 0 -354 -200 -668 -524 -820 -439 -205 -972 -23
-1189 408 -40 78 -75 176 -87 244 -15 79 -14 275 0 347 31 152 101 294 203
412 143 165 311 264 527 310 25 5 110 8 190 6 125 -3 157 -7 230 -31z"/>
<path d="M4317 4893 c-4 -3 -7 -130 -7 -282 0 -243 3 -288 22 -381 31 -152 31
-391 0 -552 l-22 -117 0 -1296 0 -1295 240 0 240 0 0 1965 0 1965 -233 0
c-129 0 -237 -3 -240 -7z"/>
<path d="M3677 2679 c-81 -56 -247 -141 -339 -174 l-78 -28 0 -753 0 -754 240
0 240 0 0 875 c0 481 -1 875 -2 875 -2 0 -29 -19 -61 -41z"/>
<path d="M2170 1725 l0 -755 240 0 240 0 0 729 0 728 -52 7 c-28 4 -88 16
-132 27 -54 12 -117 19 -188 19 l-108 0 0 -755z"/>
<path d="M1243 1537 l-183 -184 0 -191 0 -192 240 0 240 0 0 375 0 375 -57 0
-58 0 -182 -183z"/>
<path d="M0 710 l0 -110 3130 0 3130 0 0 110 0 110 -3130 0 -3130 0 0 -110z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

10
weboasis/stocks/assets/js/modal.min.js vendored Normal file
View File

@ -0,0 +1,10 @@
/**
* Stock Screener
* --------------------
* Version 1.7.0, built on Tuesday, November 21, 2017
* Copyright (c) Financial Apps and Plugins <info@financialplugins.com>. All rights reserved.
* Demo: http://financialplugins.com/products/stock-screener/
* Purchase: https://codecanyon.net/item/stock-screener/18297488?ref=financialtechnology
* Like: https://www.facebook.com/financialplugins/
*/
function modal_show(o,a,d,t,n,l){return"undefined"==typeof n&&(n=!0),function(n,e){return modal='<div id="modal-box-'+n+'" class="remodal '+(l?"modal-fullscreen":"")+'" data-remodal-id="modal">\t<button data-remodal-action="close" class="remodal-close"></button>\t<h1>'+o+"</h1>\t<p>"+a+"\t</p>\t<br>"+("undefined"!=typeof d?'<button type="button" data-remodal-action="confirm" class="remodal-confirm">'+d+"</button>":"")+'<button type="button" data-remodal-action="cancel" class="remodal-cancel">'+("undefined"==typeof d?"OK":"Cancel")+"</button></div>",modal=$(modal),$("body").append(modal),modal_inst=modal.remodal({closeOnConfirm:!1}),modal_inst.open(),modal.on("closed",function(){$(this).remove()}),$("#modal-box-"+n+" #modal_ok").on("click",function(){t(modal,modal_inst),e&&modal_inst.close()}),modal}(modal_cntr++,n)}var modal_cntr=0;

11
weboasis/stocks/assets/js/script.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,33 @@
var modal_cntr=0;
function modal_show(title,content,btn_ok_label,callback_ok,close_on_ok,is_full_screen){
if(typeof(close_on_ok)=='undefined')close_on_ok=true;
return (function(x,close_on_ok){
modal='<div id="modal-box-'+x+'" class="remodal '+(is_full_screen?'modal-fullscreen':'')+'" data-remodal-id="modal">'+
' <button data-remodal-action="close" class="remodal-close"></button>'+
' <h1>'+title+'</h1>'+
' <p>'+
content +
' </p>'+
' <br>'+
(typeof(btn_ok_label)!='undefined'?'<button type="button" data-remodal-action="confirm" class="remodal-confirm">'+btn_ok_label+'</button>':'')+
'<button type="button" data-remodal-action="cancel" class="remodal-cancel">'+(typeof(btn_ok_label)=='undefined'?'OK':'Cancel')+'</button>'+
'</div>';
modal=$(modal);
$('body').append(modal);
modal_inst=modal.remodal({closeOnConfirm:false});
modal_inst.open();
modal.on('closed',function(){$(this).remove();});
$('#modal-box-'+x+' #modal_ok').on('click',function(){
callback_ok(modal,modal_inst);
if(close_on_ok)
modal_inst.close();
});
return modal;
})(modal_cntr++,close_on_ok);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2016 Timofey Marochkin
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,112 @@
# Air Datepicker
Lightweight customizable cross-browser jQuery datepicker, built with es5 and css-flexbox. Works in all modern desktop and mobile browsers (tested on Android 4.4+ and iOS8+).
![air datepicker image](https://github.com/t1m0n/air-datepicker/raw/master/docs/img/promo-img-time.png)
## Install
### bower
```
bower i --save air-datepicker
```
### npm
```
npm i --save air-datepicker
```
## Usage
```javascript
$('.my-datepicker').datepicker([options])
```
## Demo and docs
* [In English](http://t1m0n.name/air-datepicker/docs/)
* [In Russian](http://t1m0n.name/air-datepicker/docs/index-ru.html)
## Change log
### v2.2.3
* fixed min,max dates in decade mode
### v2.2.2
* fixed min,max dates handling
### v2.2.1
* changed RegExp for recognizing date parts
* changed jquery version dependency
### v2.2.0
* added `onlyTimepicker` option
* added `onShow` and `onHide` callbacks
* added `VERSION` field to plugin's prototype
* now for selecting same date in `range` mode, you should set `{toggleSelected: false}`
* fixed `dateFormat` method (fixed wrong month name in Hungarian language)
* fixed second call of `onRenderCallback`
* fixed `_getCell()` throwing exception
* new language:
- `sk` thanks to [RobiNN1](https://github.com/RobiNN1)
### v2.1.0
* added possibility to select single date when `{range: true}`
* added support of 12 hours mode in `altFieldDateFormat`
* improved work with minDate and maxDate when `{timepicker: true}`
* fixed wrong class adding when `{range: true}`
* new languages:
- `es` thanks to [MarioAraque](https://github.com/MarioAraque)
- `cs` thanks to [liborm85](https://github.com/liborm85)
- `hu` thanks to [gergo85](https://github.com/gergo85)
- `fi` thanks to [joonaskaskisolaphz](https://github.com/joonaskaskisolaphz)
- `pl` thanks to [xiio](https://github.com/xiio)
- `fr` thanks to [nicooprat](https://github.com/nicooprat)
### v2.0.2
* fixed dates array in `onSelect` callback
### v2.0.1
* fixed version for npm
### v2.0.0
* added timepicker (see [docs](http://t1m0n.name/air-datepicker/docs#timepicker) for more info)
* added possibility to set `Date` in `todayButton`
* global variable `Datepicker` has been removed, now all placed in `$.fn.datepicker`
* improved `selectDate` method, now one can pass an array of dates to select
* added `npm` package
* fixed issue caused by `placeholder` on `readonly` inputs in IE
* fixed issue when `range` is true and first selected date is bigger than second
* added new languages:
- `da` thanks to [bjarnef](https://github.com/bjarnef)
- `nl` thanks to [JaZo](https://github.com/JaZo)
- `pt` thanks to [cmpscabral](https://github.com/cmpscabral)
- `pt-BR` thanks to [dowglaz](https://github.com/dowglaz)
- `ro` thanks to [tourniquet](https://github.com/tourniquet)
### v1.2.4
* fixed '$ is not defined' problem.
### v1.2.3
* fixed `dateFormat` method.
* fixed typo in Russian docs, add ids in docs headers.
### v1.2.2
* fixed typo in `monthsField`
* added German language (thanks to [Ichag](https://github.com/Ichag))
### v1.2.1
* tests added
* added Chinese language (thanks to [think2011](https://github.com/think2011))
* fixed if '0' is passed to `firstDay`
* fixed `showOtherYears` option
* fixed `onSelect` event, when `range` is true
* fixed case when `range` and `multipleDates` both set to true
### v1.2.0
* add `range` feature
* improve keyboard navigation (fixed two focused cells)
### v1.1.0
* add keyboard navigation
* add `classes` option to add custom classes
* add `altField` option
* bug fixes

View File

@ -0,0 +1,35 @@
{
"name": "air-datepicker",
"version": "2.2.3",
"authors": [
"t1m0n <t1m0n.tr@gmail.com>"
],
"description": "A lightweight, customizable, powerful jQuery datepicker",
"main": [
"dist/js/datepicker.js",
"dist/css/datepicker.css"
],
"keywords": [
"datepicker",
"timepicker",
"plugin",
"customizable",
"powerful"
],
"license": "MIT",
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"tasks",
"docs",
"page",
"package.json",
"gulpfile.js",
"test",
"tests"
],
"dependencies": {
"jquery": ">=2.0.0 <4.0.0"
}
}

View File

@ -0,0 +1,622 @@
.datepicker--cell-day.-other-month-, .datepicker--cell-year.-other-decade- {
color: #dedede; }
.datepicker--cell-day.-other-month-:hover, .datepicker--cell-year.-other-decade-:hover {
color: #c5c5c5; }
.-disabled-.-focus-.datepicker--cell-day.-other-month-, .-disabled-.-focus-.datepicker--cell-year.-other-decade- {
color: #dedede; }
.-selected-.datepicker--cell-day.-other-month-, .-selected-.datepicker--cell-year.-other-decade- {
color: #fff;
background: #a2ddf6; }
.-selected-.-focus-.datepicker--cell-day.-other-month-, .-selected-.-focus-.datepicker--cell-year.-other-decade- {
background: #8ad5f4; }
.-in-range-.datepicker--cell-day.-other-month-, .-in-range-.datepicker--cell-year.-other-decade- {
background-color: rgba(92, 196, 239, 0.1);
color: #cccccc; }
.-in-range-.-focus-.datepicker--cell-day.-other-month-, .-in-range-.-focus-.datepicker--cell-year.-other-decade- {
background-color: rgba(92, 196, 239, 0.2); }
.datepicker--cell-day.-other-month-:empty, .datepicker--cell-year.-other-decade-:empty {
background: none;
border: none; }
/* -------------------------------------------------
Datepicker cells
------------------------------------------------- */
.datepicker--cells {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap; }
.datepicker--cell {
border-radius: 4px;
box-sizing: border-box;
cursor: pointer;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
position: relative;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
height: 32px;
z-index: 1; }
.datepicker--cell.-focus- {
background: #f0f0f0; }
.datepicker--cell.-current- {
color: #4EB5E6; }
.datepicker--cell.-current-.-focus- {
color: #4a4a4a; }
.datepicker--cell.-current-.-in-range- {
color: #4EB5E6; }
.datepicker--cell.-in-range- {
background: rgba(92, 196, 239, 0.1);
color: #4a4a4a;
border-radius: 0; }
.datepicker--cell.-in-range-.-focus- {
background-color: rgba(92, 196, 239, 0.2); }
.datepicker--cell.-disabled- {
cursor: default;
color: #aeaeae; }
.datepicker--cell.-disabled-.-focus- {
color: #aeaeae; }
.datepicker--cell.-disabled-.-in-range- {
color: #a1a1a1; }
.datepicker--cell.-disabled-.-current-.-focus- {
color: #aeaeae; }
.datepicker--cell.-range-from- {
border: 1px solid rgba(92, 196, 239, 0.5);
background-color: rgba(92, 196, 239, 0.1);
border-radius: 4px 0 0 4px; }
.datepicker--cell.-range-to- {
border: 1px solid rgba(92, 196, 239, 0.5);
background-color: rgba(92, 196, 239, 0.1);
border-radius: 0 4px 4px 0; }
.datepicker--cell.-range-from-.-range-to- {
border-radius: 4px; }
.datepicker--cell.-selected- {
color: #fff;
border: none;
background: #5cc4ef; }
.datepicker--cell.-selected-.-current- {
color: #fff;
background: #5cc4ef; }
.datepicker--cell.-selected-.-focus- {
background: #45bced; }
.datepicker--cell:empty {
cursor: default; }
.datepicker--days-names {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
margin: 8px 0 3px; }
.datepicker--day-name {
color: #FF9A19;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
text-align: center;
text-transform: uppercase;
font-size: .8em; }
.datepicker--cell-day {
width: 14.28571%; }
.datepicker--cells-months {
height: 170px; }
.datepicker--cell-month {
width: 33.33%;
height: 25%; }
.datepicker--years {
height: 170px; }
.datepicker--cells-years {
height: 170px; }
.datepicker--cell-year {
width: 25%;
height: 33.33%; }
.datepicker--cell-day.-other-month-, .datepicker--cell-year.-other-decade- {
color: #dedede; }
.datepicker--cell-day.-other-month-:hover, .datepicker--cell-year.-other-decade-:hover {
color: #c5c5c5; }
.-disabled-.-focus-.datepicker--cell-day.-other-month-, .-disabled-.-focus-.datepicker--cell-year.-other-decade- {
color: #dedede; }
.-selected-.datepicker--cell-day.-other-month-, .-selected-.datepicker--cell-year.-other-decade- {
color: #fff;
background: #a2ddf6; }
.-selected-.-focus-.datepicker--cell-day.-other-month-, .-selected-.-focus-.datepicker--cell-year.-other-decade- {
background: #8ad5f4; }
.-in-range-.datepicker--cell-day.-other-month-, .-in-range-.datepicker--cell-year.-other-decade- {
background-color: rgba(92, 196, 239, 0.1);
color: #cccccc; }
.-in-range-.-focus-.datepicker--cell-day.-other-month-, .-in-range-.-focus-.datepicker--cell-year.-other-decade- {
background-color: rgba(92, 196, 239, 0.2); }
.datepicker--cell-day.-other-month-:empty, .datepicker--cell-year.-other-decade-:empty {
background: none;
border: none; }
/* -------------------------------------------------
Datepicker
------------------------------------------------- */
.datepickers-container {
position: absolute;
left: 0;
top: 0; }
@media print {
.datepickers-container {
display: none; } }
.datepicker {
background: #fff;
border: 1px solid #dbdbdb;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
border-radius: 4px;
box-sizing: content-box;
font-family: Tahoma, sans-serif;
font-size: 14px;
color: #4a4a4a;
width: 250px;
position: absolute;
left: -100000px;
opacity: 0;
transition: opacity 0.3s ease, left 0s 0.3s, -webkit-transform 0.3s ease;
transition: opacity 0.3s ease, transform 0.3s ease, left 0s 0.3s;
transition: opacity 0.3s ease, transform 0.3s ease, left 0s 0.3s, -webkit-transform 0.3s ease;
z-index: 100; }
.datepicker.-from-top- {
-webkit-transform: translateY(-8px);
transform: translateY(-8px); }
.datepicker.-from-right- {
-webkit-transform: translateX(8px);
transform: translateX(8px); }
.datepicker.-from-bottom- {
-webkit-transform: translateY(8px);
transform: translateY(8px); }
.datepicker.-from-left- {
-webkit-transform: translateX(-8px);
transform: translateX(-8px); }
.datepicker.active {
opacity: 1;
-webkit-transform: translate(0);
transform: translate(0);
transition: opacity 0.3s ease, left 0s 0s, -webkit-transform 0.3s ease;
transition: opacity 0.3s ease, transform 0.3s ease, left 0s 0s;
transition: opacity 0.3s ease, transform 0.3s ease, left 0s 0s, -webkit-transform 0.3s ease; }
.datepicker-inline .datepicker {
border-color: #d7d7d7;
box-shadow: none;
position: static;
left: auto;
right: auto;
opacity: 1;
-webkit-transform: none;
transform: none; }
.datepicker-inline .datepicker--pointer {
display: none; }
.datepicker--content {
box-sizing: content-box;
padding: 4px; }
.-only-timepicker- .datepicker--content {
display: none; }
.datepicker--pointer {
position: absolute;
background: #fff;
border-top: 1px solid #dbdbdb;
border-right: 1px solid #dbdbdb;
width: 10px;
height: 10px;
z-index: -1; }
.-top-left- .datepicker--pointer, .-top-center- .datepicker--pointer, .-top-right- .datepicker--pointer {
top: calc(100% - 4px);
-webkit-transform: rotate(135deg);
transform: rotate(135deg); }
.-right-top- .datepicker--pointer, .-right-center- .datepicker--pointer, .-right-bottom- .datepicker--pointer {
right: calc(100% - 4px);
-webkit-transform: rotate(225deg);
transform: rotate(225deg); }
.-bottom-left- .datepicker--pointer, .-bottom-center- .datepicker--pointer, .-bottom-right- .datepicker--pointer {
bottom: calc(100% - 4px);
-webkit-transform: rotate(315deg);
transform: rotate(315deg); }
.-left-top- .datepicker--pointer, .-left-center- .datepicker--pointer, .-left-bottom- .datepicker--pointer {
left: calc(100% - 4px);
-webkit-transform: rotate(45deg);
transform: rotate(45deg); }
.-top-left- .datepicker--pointer, .-bottom-left- .datepicker--pointer {
left: 10px; }
.-top-right- .datepicker--pointer, .-bottom-right- .datepicker--pointer {
right: 10px; }
.-top-center- .datepicker--pointer, .-bottom-center- .datepicker--pointer {
left: calc(50% - 10px / 2); }
.-left-top- .datepicker--pointer, .-right-top- .datepicker--pointer {
top: 10px; }
.-left-bottom- .datepicker--pointer, .-right-bottom- .datepicker--pointer {
bottom: 10px; }
.-left-center- .datepicker--pointer, .-right-center- .datepicker--pointer {
top: calc(50% - 10px / 2); }
.datepicker--body {
display: none; }
.datepicker--body.active {
display: block; }
.datepicker--cell-day.-other-month-, .datepicker--cell-year.-other-decade- {
color: #dedede; }
.datepicker--cell-day.-other-month-:hover, .datepicker--cell-year.-other-decade-:hover {
color: #c5c5c5; }
.-disabled-.-focus-.datepicker--cell-day.-other-month-, .-disabled-.-focus-.datepicker--cell-year.-other-decade- {
color: #dedede; }
.-selected-.datepicker--cell-day.-other-month-, .-selected-.datepicker--cell-year.-other-decade- {
color: #fff;
background: #a2ddf6; }
.-selected-.-focus-.datepicker--cell-day.-other-month-, .-selected-.-focus-.datepicker--cell-year.-other-decade- {
background: #8ad5f4; }
.-in-range-.datepicker--cell-day.-other-month-, .-in-range-.datepicker--cell-year.-other-decade- {
background-color: rgba(92, 196, 239, 0.1);
color: #cccccc; }
.-in-range-.-focus-.datepicker--cell-day.-other-month-, .-in-range-.-focus-.datepicker--cell-year.-other-decade- {
background-color: rgba(92, 196, 239, 0.2); }
.datepicker--cell-day.-other-month-:empty, .datepicker--cell-year.-other-decade-:empty {
background: none;
border: none; }
/* -------------------------------------------------
Navigation
------------------------------------------------- */
.datepicker--nav {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
border-bottom: 1px solid #efefef;
min-height: 32px;
padding: 4px; }
.-only-timepicker- .datepicker--nav {
display: none; }
.datepicker--nav-title,
.datepicker--nav-action {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
cursor: pointer;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center; }
.datepicker--nav-action {
width: 32px;
border-radius: 4px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none; }
.datepicker--nav-action:hover {
background: #f0f0f0; }
.datepicker--nav-action.-disabled- {
visibility: hidden; }
.datepicker--nav-action svg {
width: 32px;
height: 32px; }
.datepicker--nav-action path {
fill: none;
stroke: #9c9c9c;
stroke-width: 2px; }
.datepicker--nav-title {
border-radius: 4px;
padding: 0 8px; }
.datepicker--nav-title i {
font-style: normal;
color: #9c9c9c;
margin-left: 5px; }
.datepicker--nav-title:hover {
background: #f0f0f0; }
.datepicker--nav-title.-disabled- {
cursor: default;
background: none; }
.datepicker--buttons {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
padding: 4px;
border-top: 1px solid #efefef; }
.datepicker--button {
color: #4EB5E6;
cursor: pointer;
border-radius: 4px;
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
display: -webkit-inline-flex;
display: -ms-inline-flexbox;
display: inline-flex;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
height: 32px; }
.datepicker--button:hover {
color: #4a4a4a;
background: #f0f0f0; }
.datepicker--cell-day.-other-month-, .datepicker--cell-year.-other-decade- {
color: #dedede; }
.datepicker--cell-day.-other-month-:hover, .datepicker--cell-year.-other-decade-:hover {
color: #c5c5c5; }
.-disabled-.-focus-.datepicker--cell-day.-other-month-, .-disabled-.-focus-.datepicker--cell-year.-other-decade- {
color: #dedede; }
.-selected-.datepicker--cell-day.-other-month-, .-selected-.datepicker--cell-year.-other-decade- {
color: #fff;
background: #a2ddf6; }
.-selected-.-focus-.datepicker--cell-day.-other-month-, .-selected-.-focus-.datepicker--cell-year.-other-decade- {
background: #8ad5f4; }
.-in-range-.datepicker--cell-day.-other-month-, .-in-range-.datepicker--cell-year.-other-decade- {
background-color: rgba(92, 196, 239, 0.1);
color: #cccccc; }
.-in-range-.-focus-.datepicker--cell-day.-other-month-, .-in-range-.-focus-.datepicker--cell-year.-other-decade- {
background-color: rgba(92, 196, 239, 0.2); }
.datepicker--cell-day.-other-month-:empty, .datepicker--cell-year.-other-decade-:empty {
background: none;
border: none; }
/* -------------------------------------------------
Timepicker
------------------------------------------------- */
.datepicker--time {
border-top: 1px solid #efefef;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
padding: 4px;
position: relative; }
.datepicker--time.-am-pm- .datepicker--time-sliders {
-webkit-flex: 0 1 138px;
-ms-flex: 0 1 138px;
flex: 0 1 138px;
max-width: 138px; }
.-only-timepicker- .datepicker--time {
border-top: none; }
.datepicker--time-sliders {
-webkit-flex: 0 1 153px;
-ms-flex: 0 1 153px;
flex: 0 1 153px;
margin-right: 10px;
max-width: 153px; }
.datepicker--time-label {
display: none;
font-size: 12px; }
.datepicker--time-current {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
font-size: 14px;
text-align: center;
margin: 0 0 0 10px; }
.datepicker--time-current-colon {
margin: 0 2px 3px;
line-height: 1; }
.datepicker--time-current-hours,
.datepicker--time-current-minutes {
line-height: 1;
font-size: 19px;
font-family: "Century Gothic", CenturyGothic, AppleGothic, sans-serif;
position: relative;
z-index: 1; }
.datepicker--time-current-hours:after,
.datepicker--time-current-minutes:after {
content: '';
background: #f0f0f0;
border-radius: 4px;
position: absolute;
left: -2px;
top: -3px;
right: -2px;
bottom: -2px;
z-index: -1;
opacity: 0; }
.datepicker--time-current-hours.-focus-:after,
.datepicker--time-current-minutes.-focus-:after {
opacity: 1; }
.datepicker--time-current-ampm {
text-transform: uppercase;
-webkit-align-self: flex-end;
-ms-flex-item-align: end;
align-self: flex-end;
color: #9c9c9c;
margin-left: 6px;
font-size: 11px;
margin-bottom: 1px; }
.datepicker--time-row {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
font-size: 11px;
height: 17px;
background: linear-gradient(to right, #dedede, #dedede) left 50%/100% 1px no-repeat; }
.datepicker--time-row:first-child {
margin-bottom: 4px; }
.datepicker--time-row input[type='range'] {
background: none;
cursor: pointer;
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
height: 100%;
padding: 0;
margin: 0;
-webkit-appearance: none; }
.datepicker--time-row input[type='range']::-webkit-slider-thumb {
-webkit-appearance: none; }
.datepicker--time-row input[type='range']::-ms-tooltip {
display: none; }
.datepicker--time-row input[type='range']:hover::-webkit-slider-thumb {
border-color: #b8b8b8; }
.datepicker--time-row input[type='range']:hover::-moz-range-thumb {
border-color: #b8b8b8; }
.datepicker--time-row input[type='range']:hover::-ms-thumb {
border-color: #b8b8b8; }
.datepicker--time-row input[type='range']:focus {
outline: none; }
.datepicker--time-row input[type='range']:focus::-webkit-slider-thumb {
background: #5cc4ef;
border-color: #5cc4ef; }
.datepicker--time-row input[type='range']:focus::-moz-range-thumb {
background: #5cc4ef;
border-color: #5cc4ef; }
.datepicker--time-row input[type='range']:focus::-ms-thumb {
background: #5cc4ef;
border-color: #5cc4ef; }
.datepicker--time-row input[type='range']::-webkit-slider-thumb {
box-sizing: border-box;
height: 12px;
width: 12px;
border-radius: 3px;
border: 1px solid #dedede;
background: #fff;
cursor: pointer;
transition: background .2s; }
.datepicker--time-row input[type='range']::-moz-range-thumb {
box-sizing: border-box;
height: 12px;
width: 12px;
border-radius: 3px;
border: 1px solid #dedede;
background: #fff;
cursor: pointer;
transition: background .2s; }
.datepicker--time-row input[type='range']::-ms-thumb {
box-sizing: border-box;
height: 12px;
width: 12px;
border-radius: 3px;
border: 1px solid #dedede;
background: #fff;
cursor: pointer;
transition: background .2s; }
.datepicker--time-row input[type='range']::-webkit-slider-thumb {
margin-top: -6px; }
.datepicker--time-row input[type='range']::-webkit-slider-runnable-track {
border: none;
height: 1px;
cursor: pointer;
color: transparent;
background: transparent; }
.datepicker--time-row input[type='range']::-moz-range-track {
border: none;
height: 1px;
cursor: pointer;
color: transparent;
background: transparent; }
.datepicker--time-row input[type='range']::-ms-track {
border: none;
height: 1px;
cursor: pointer;
color: transparent;
background: transparent; }
.datepicker--time-row input[type='range']::-ms-fill-lower {
background: transparent; }
.datepicker--time-row input[type='range']::-ms-fill-upper {
background: transparent; }
.datepicker--time-row span {
padding: 0 12px; }
.datepicker--time-icon {
color: #9c9c9c;
border: 1px solid;
border-radius: 50%;
font-size: 16px;
position: relative;
margin: 0 5px -1px 0;
width: 1em;
height: 1em; }
.datepicker--time-icon:after, .datepicker--time-icon:before {
content: '';
background: currentColor;
position: absolute; }
.datepicker--time-icon:after {
height: .4em;
width: 1px;
left: calc(50% - 1px);
top: calc(50% + 1px);
-webkit-transform: translateY(-100%);
transform: translateY(-100%); }
.datepicker--time-icon:before {
width: .4em;
height: 1px;
top: calc(50% + 1px);
left: calc(50% - 1px); }
.datepicker--cell-day.-other-month-, .datepicker--cell-year.-other-decade- {
color: #dedede; }
.datepicker--cell-day.-other-month-:hover, .datepicker--cell-year.-other-decade-:hover {
color: #c5c5c5; }
.-disabled-.-focus-.datepicker--cell-day.-other-month-, .-disabled-.-focus-.datepicker--cell-year.-other-decade- {
color: #dedede; }
.-selected-.datepicker--cell-day.-other-month-, .-selected-.datepicker--cell-year.-other-decade- {
color: #fff;
background: #a2ddf6; }
.-selected-.-focus-.datepicker--cell-day.-other-month-, .-selected-.-focus-.datepicker--cell-year.-other-decade- {
background: #8ad5f4; }
.-in-range-.datepicker--cell-day.-other-month-, .-in-range-.datepicker--cell-year.-other-decade- {
background-color: rgba(92, 196, 239, 0.1);
color: #cccccc; }
.-in-range-.-focus-.datepicker--cell-day.-other-month-, .-in-range-.-focus-.datepicker--cell-year.-other-decade- {
background-color: rgba(92, 196, 239, 0.2); }
.datepicker--cell-day.-other-month-:empty, .datepicker--cell-year.-other-decade-:empty {
background: none;
border: none; }

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,12 @@
;(function ($) { $.fn.datepicker.language['cs'] = {
days: ['Neděle', 'Pondělí', 'Úterý', 'Středa', 'Čtvrtek', 'Pátek', 'Sobota'],
daysShort: ['Ne', 'Po', 'Út', 'St', 'Čt', 'Pá', 'So'],
daysMin: ['Ne', 'Po', 'Út', 'St', 'Čt', 'Pá', 'So'],
months: ['Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec'],
monthsShort: ['Led', 'Úno', 'Bře', 'Dub', 'Kvě', 'Čvn', 'Čvc', 'Srp', 'Zář', 'Říj', 'Lis', 'Pro'],
today: 'Dnes',
clear: 'Vymazat',
dateFormat: 'dd.mm.yyyy',
timeFormat: 'hh:ii',
firstDay: 1
}; })(jQuery);

View File

@ -0,0 +1,12 @@
;(function ($) { $.fn.datepicker.language['da'] = {
days: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'],
daysShort: ['Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør'],
daysMin: ['Sø', 'Ma', 'Ti', 'On', 'To', 'Fr', 'Lø'],
months: ['Januar','Februar','Marts','April','Maj','Juni', 'Juli','August','September','Oktober','November','December'],
monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'],
today: 'I dag',
clear: 'Nulstil',
dateFormat: 'dd/mm/yyyy',
timeFormat: 'hh:ii',
firstDay: 1
}; })(jQuery);

View File

@ -0,0 +1,13 @@
;(function ($) { $.fn.datepicker.language['de'] = {
days: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
daysShort: ['Son', 'Mon', 'Die', 'Mit', 'Don', 'Fre', 'Sam'],
daysMin: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
months: ['Januar','Februar','März','April','Mai','Juni', 'Juli','August','September','Oktober','November','Dezember'],
monthsShort: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
today: 'Heute',
clear: 'Aufräumen',
dateFormat: 'dd.mm.yyyy',
timeFormat: 'hh:ii',
firstDay: 1
};
})(jQuery);

View File

@ -0,0 +1,12 @@
;(function ($) { $.fn.datepicker.language['en'] = {
days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
daysMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
months: ['January','February','March','April','May','June', 'July','August','September','October','November','December'],
monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
today: 'Today',
clear: 'Clear',
dateFormat: 'mm/dd/yyyy',
timeFormat: 'hh:ii aa',
firstDay: 0
}; })(jQuery);

View File

@ -0,0 +1,12 @@
;(function ($) { $.fn.datepicker.language['es'] = {
days: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],
daysShort: ['Dom', 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab'],
daysMin: ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa'],
months: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', 'Julio','Augosto','Septiembre','Octubre','Noviembre','Diciembre'],
monthsShort: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'],
today: 'Hoy',
clear: 'Limpiar',
dateFormat: 'dd/mm/yyyy',
timeFormat: 'hh:ii aa',
firstDay: 1
}; })(jQuery);

View File

@ -0,0 +1,13 @@
;(function ($) { $.fn.datepicker.language['fi'] = {
days: ['Sunnuntai', 'Maanantai', 'Tiistai', 'Keskiviikko', 'Torstai', 'Perjantai', 'Lauantai'],
daysShort: ['Su', 'Ma', 'Ti', 'Ke', 'To', 'Pe', 'La'],
daysMin: ['Su', 'Ma', 'Ti', 'Ke', 'To', 'Pe', 'La'],
months: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu', 'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
monthsShort: ['Tammi', 'Helmi', 'Maalis', 'Huhti', 'Touko', 'Kesä', 'Heinä', 'Elo', 'Syys', 'Loka', 'Marras', 'Joulu'],
today: 'Tänään',
clear: 'Tyhjennä',
dateFormat: 'dd.mm.yyyy',
timeFormat: 'hh:ii',
firstDay: 1
};
})(jQuery);

View File

@ -0,0 +1,12 @@
;(function ($) { $.fn.datepicker.language['fr'] = {
days: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
daysShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
daysMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],
months: ['Janvier','Février','Mars','Avril','Mai','Juin', 'Juillet','Août','Septembre','Octobre','Novembre','Decembre'],
monthsShort: ['Jan', 'Fév', 'Mars', 'Avr', 'Mai', 'Juin', 'Juil', 'Août', 'Sep', 'Oct', 'Nov', 'Dec'],
today: "Aujourd'hui",
clear: 'Effacer',
dateFormat: 'dd/mm/yyyy',
timeFormat: 'hh:ii',
firstDay: 1
}; })(jQuery);

View File

@ -0,0 +1,12 @@
;(function ($) { ;(function ($) { $.fn.datepicker.language['hu'] = {
days: ['Vasárnap', 'Hétfő', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
daysShort: ['Va', 'Hé', 'Ke', 'Sze', 'Cs', 'Pé', 'Szo'],
daysMin: ['V', 'H', 'K', 'Sz', 'Cs', 'P', 'Sz'],
months: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június', 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
monthsShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún', 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
today: 'Ma',
clear: 'Törlés',
dateFormat: 'yyyy-mm-dd',
timeFormat: 'hh:ii aa',
firstDay: 1
}; })(jQuery); })(jQuery);

View File

@ -0,0 +1,12 @@
;(function ($) { $.fn.datepicker.language['nl'] = {
days: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
daysShort: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
daysMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
months: ['Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December'],
monthsShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'],
today: 'Vandaag',
clear: 'Legen',
dateFormat: 'dd-MM-yy',
timeFormat: 'hh:ii',
firstDay: 0
}; })(jQuery);

View File

@ -0,0 +1,13 @@
;(function ($) { $.fn.datepicker.language['pl'] = {
days: ['Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota'],
daysShort: ['Nie', 'Pon', 'Wto', 'Śro', 'Czw', 'Pią', 'Sob'],
daysMin: ['Nd', 'Pn', 'Wt', 'Śr', 'Czw', 'Pt', 'So'],
months: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec', 'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
monthsShort: ['Sty', 'Lut', 'Mar', 'Kwi', 'Maj', 'Cze', 'Lip', 'Sie', 'Wrz', 'Paź', 'Lis', 'Gru'],
today: 'Dzisiaj',
clear: 'Wyczyść',
dateFormat: 'yyyy-mm-dd',
timeFormat: 'hh:ii:aa',
firstDay: 1
};
})(jQuery);

View File

@ -0,0 +1,12 @@
;(function ($) { $.fn.datepicker.language['pt-BR'] = {
days: ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'],
daysShort: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab'],
daysMin: ['Do', 'Se', 'Te', 'Qu', 'Qu', 'Se', 'Sa'],
months: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
monthsShort: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
today: 'Hoje',
clear: 'Limpar',
dateFormat: 'dd/mm/yyyy',
timeFormat: 'hh:ii',
firstDay: 0
}; })(jQuery);

View File

@ -0,0 +1,12 @@
;(function ($) { $.fn.datepicker.language['pt'] = {
days: ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'],
daysShort: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab'],
daysMin: ['Do', 'Se', 'Te', 'Qa', 'Qi', 'Sx', 'Sa'],
months: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
monthsShort: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
today: 'Hoje',
clear: 'Limpar',
dateFormat: 'dd/mm/yyyy',
timeFormat: 'hh:ii',
firstDay: 1
}; })(jQuery);

View File

@ -0,0 +1,13 @@
;(function ($) { $.fn.datepicker.language['ro'] = {
days: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'],
daysShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
daysMin: ['D', 'L', 'Ma', 'Mi', 'J', 'V', 'S'],
months: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie','Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
monthsShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun', 'Iul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'],
today: 'Azi',
clear: 'Şterge',
dateFormat: 'dd.mm.yyyy',
timeFormat: 'hh:ii',
firstDay: 1
};
})(jQuery);

View File

@ -0,0 +1,12 @@
;(function ($) { $.fn.datepicker.language['sk'] = {
days: ['Nedeľa', 'Pondelok', 'Utorok', 'Streda', 'Štvrtok', 'Piatok', 'Sobota'],
daysShort: ['Ned', 'Pon', 'Uto', 'Str', 'Štv', 'Pia', 'Sob'],
daysMin: ['Ne', 'Po', 'Ut', 'St', 'Št', 'Pi', 'So'],
months: ['Január','Február','Marec','Apríl','Máj','Jún', 'Júl','August','September','Október','November','December'],
monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Máj', 'Jún', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'],
today: 'Dnes',
clear: 'Vymazať',
dateFormat: 'dd.mm.yyyy',
timeFormat: 'hh:ii',
firstDay: 1
}; })(jQuery);

View File

@ -0,0 +1,12 @@
;(function ($) { $.fn.datepicker.language['zh'] = {
days: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
daysShort: ['日', '一', '二', '三', '四', '五', '六'],
daysMin: ['日', '一', '二', '三', '四', '五', '六'],
months: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
monthsShort: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
today: '今天',
clear: '清除',
dateFormat: 'yyyy-mm-dd',
timeFormat: 'hh:ii',
firstDay: 1
}; })(jQuery);

View File

@ -0,0 +1,218 @@
/**
* GitHub Gist Theme
* Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro
*/
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
-webkit-text-size-adjust: none;
}
.hljs-comment,
.bash .hljs-shebang,
.java .hljs-javadoc,
.javascript .hljs-javadoc,
.rust .hljs-preprocessor {
color: #969896;
}
.hljs-string,
.apache .hljs-sqbracket,
.coffeescript .hljs-subst,
.coffeescript .hljs-regexp,
.cpp .hljs-preprocessor,
.c .hljs-preprocessor,
.javascript .hljs-regexp,
.json .hljs-attribute,
.makefile .hljs-variable,
.markdown .hljs-value,
.markdown .hljs-link_label,
.markdown .hljs-strong,
.markdown .hljs-emphasis,
.markdown .hljs-blockquote,
.nginx .hljs-regexp,
.nginx .hljs-number,
.objectivec .hljs-preprocessor .hljs-title,
.perl .hljs-regexp,
.php .hljs-regexp,
.xml .hljs-value,
.less .hljs-built_in,
.scss .hljs-built_in {
color: #df5000;
}
.hljs-keyword,
.css .hljs-at_rule,
.css .hljs-important,
.http .hljs-request,
.ini .hljs-setting,
.haskell .hljs-type,
.java .hljs-javadoctag,
.javascript .hljs-tag,
.javascript .hljs-javadoctag,
.nginx .hljs-title,
.objectivec .hljs-preprocessor,
.php .hljs-phpdoc,
.sql .hljs-built_in,
.less .hljs-tag,
.less .hljs-at_rule,
.scss .hljs-tag,
.scss .hljs-at_rule,
.scss .hljs-important,
.stylus .hljs-at_rule,
.go .hljs-typename,
.swift .hljs-preprocessor {
color: #a71d5d;
}
.apache .hljs-common,
.apache .hljs-cbracket,
.apache .hljs-keyword,
.bash .hljs-literal,
.bash .hljs-built_in,
.coffeescript .hljs-literal,
.coffeescript .hljs-built_in,
.coffeescript .hljs-number,
.cpp .hljs-number,
.cpp .hljs-built_in,
.c .hljs-number,
.c .hljs-built_in,
.cs .hljs-number,
.cs .hljs-built_in,
.css .hljs-attribute,
.css .hljs-hexcolor,
.css .hljs-number,
.css .hljs-function,
.haskell .hljs-number,
.http .hljs-literal,
.http .hljs-attribute,
.java .hljs-number,
.javascript .hljs-built_in,
.javascript .hljs-literal,
.javascript .hljs-number,
.json .hljs-number,
.makefile .hljs-keyword,
.markdown .hljs-link_reference,
.nginx .hljs-built_in,
.objectivec .hljs-literal,
.objectivec .hljs-number,
.objectivec .hljs-built_in,
.php .hljs-literal,
.php .hljs-number,
.python .hljs-number,
.ruby .hljs-prompt,
.ruby .hljs-constant,
.ruby .hljs-number,
.ruby .hljs-subst .hljs-keyword,
.ruby .hljs-symbol,
.rust .hljs-number,
.sql .hljs-number,
.puppet .hljs-function,
.less .hljs-number,
.less .hljs-hexcolor,
.less .hljs-function,
.less .hljs-attribute,
.scss .hljs-preprocessor,
.scss .hljs-number,
.scss .hljs-hexcolor,
.scss .hljs-function,
.scss .hljs-attribute,
.stylus .hljs-number,
.stylus .hljs-hexcolor,
.stylus .hljs-attribute,
.stylus .hljs-params,
.go .hljs-built_in,
.go .hljs-constant,
.swift .hljs-built_in,
.swift .hljs-number {
color: #0086b3;
}
.apache .hljs-tag,
.cs .hljs-xmlDocTag,
.css .hljs-tag,
.xml .hljs-title,
.stylus .hljs-tag {
color: #63a35c;
}
.bash .hljs-variable,
.cs .hljs-preprocessor,
.cs .hljs-preprocessor .hljs-keyword,
.css .hljs-attr_selector,
.css .hljs-value,
.ini .hljs-value,
.ini .hljs-keyword,
.javascript .hljs-tag .hljs-title,
.makefile .hljs-constant,
.nginx .hljs-variable,
.xml .hljs-tag,
.scss .hljs-variable {
color: #333333;
}
.bash .hljs-title,
.coffeescript .hljs-title,
.cpp .hljs-title,
.c .hljs-title,
.cs .hljs-title,
.css .hljs-id,
.css .hljs-class,
.css .hljs-pseudo,
.ini .hljs-title,
.haskell .hljs-title,
.haskell .hljs-pragma,
.java .hljs-title,
.javascript .hljs-title,
.makefile .hljs-title,
.objectivec .hljs-title,
.perl .hljs-sub,
.php .hljs-title,
.python .hljs-decorator,
.python .hljs-title,
.ruby .hljs-parent,
.ruby .hljs-title,
.rust .hljs-title,
.xml .hljs-attribute,
.puppet .hljs-title,
.less .hljs-id,
.less .hljs-pseudo,
.less .hljs-class,
.scss .hljs-id,
.scss .hljs-pseudo,
.scss .hljs-class,
.stylus .hljs-class,
.stylus .hljs-id,
.stylus .hljs-pseudo,
.stylus .hljs-title,
.swift .hljs-title,
.diff .hljs-chunk {
color: #795da3;
}
.coffeescript .hljs-reserved,
.coffeescript .hljs-attribute {
color: #1d3e81;
}
.diff .hljs-chunk {
font-weight: bold;
}
.diff .hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.diff .hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.markdown .hljs-link_url {
text-decoration: underline;
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,41 @@
include mixins/example
include mixins/example-content
include mixins/example-code
include mixins/example-inline
include mixins/param
include mixins/param-header
doctype html
html
head
title Air Datepicker
meta(charset='UTF-8')
meta(name="viewport" content="width=device-width, initial-scale=1")
link(href='css/style.css', rel='stylesheet', type='text/css')
link(href='css/github-gist.css', rel='stylesheet', type='text/css')
link(href='../dist/css/datepicker.min.css', rel='stylesheet', type='text/css')
link(href='https://fonts.googleapis.com/css?family=Fira+Sans:400,300,500&subset=latin,cyrillic', rel='stylesheet', type='text/css')
script(src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js')
script(src='http://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.9.1/highlight.min.js')
script(src='http://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.3/jquery.easing.min.js')
script(src='../dist/js/datepicker.js')
script(src='../dist/js/i18n/datepicker.en.js')
script(src='js/logger.js')
body
div.wrapper
main.main(role='main')
.container
.buttons
a(aria-label="Star t1m0n/air-datepicker on GitHub" data-count-aria-label="# stargazers on GitHub" data-count-api="/repos/t1m0n/air-datepicker#stargazers_count" data-count-href="/t1m0n/air-datepicker/stargazers" data-icon="octicon-star" href="https://github.com/t1m0n/air-datepicker" class="github-button") Star
block content
script(src='js/navigation.js')
script.
var $code = $('code');
$code.each(function (i, el) {
hljs.highlightBlock(el);
})
navigation.init();
script(async defer id="github-bjs" src="https://buttons.github.io/buttons.js")

View File

@ -0,0 +1,4 @@
mixin example-code(cl)
pre.example-code
code(class=cl)
block

View File

@ -0,0 +1,3 @@
mixin example-content()
.example-content
block

View File

@ -0,0 +1,4 @@
mixin example-inline(content, type)
span.example-inline
code(class= type).
#{content}

View File

@ -0,0 +1,6 @@
mixin example()
-var label = 'Пример';
-if (lang == 'en') label = 'Example';
.example
.example--label= label
block

View File

@ -0,0 +1,18 @@
mixin param-header(name, type, defaults, id)
-var typeLabel = 'Тип';
-var defaultLabel = 'Значение по умолчанию';
-if (lang == 'en') {typeLabel = 'Type'; defaultLabel = 'Defaults'};
header.param-header
h3(id = id)= name
if type
p.param-header--row
span.param-header--label= typeLabel
+example-inline(type, 'js')
if (defaults || block)
p.param-header--row
span.param-header--label= defaultLabel
if defaults
+example-inline(defaults, 'js')
if block
block

View File

@ -0,0 +1,5 @@
mixin param(content, type)
span.param-inline
strong !{content}
if type
i= type

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,29 @@
var logger;
(function (window) {
logger = function (el, clearText) {
var $el = $(el);
addContent($el);
addClearButton(clearText, $el);
$('.logger--clear', $el).on('click', clear.bind('', $el));
return function(text) {
var count = $('p', $el).length,
$content = $('.logger--content', $el);
$content.append('<p><span>' + ++count + '.</span> ' + text + '</p>').scrollTop(100000)
}
};
function addClearButton (text, el) {
el.append('<span class="logger--clear">' + text + '</span>')
}
function addContent (el) {
el.html('<div class="logger--content"></div>')
}
function clear (el) {
$('.logger--content', el).html('');
}
})(window);

View File

@ -0,0 +1,123 @@
var navigation;
(function (window, $) {
var $sections = $('article'),
idCounter = 1,
idPrefix = 'sub-section-',
navTemplate = '<div class="nav-wrap"><nav class="nav" id="nav"></nav></div>',
$nav,
cache = {};
function init () {
updateCache();
createHtml();
$($nav).on('click', 'a', onClickNavItem);
}
function createHtml () {
var html = '',
section,
curSection,
subsection,
curSubSection;
$(navTemplate).appendTo('body');
$nav = $('#nav');
for (section in cache) {
curSection = cache[section];
html += '<div class="nav--section">' +
'<h2 class="nav--section-title">' +
'<a href="#' + section + '">' + curSection.title +'</a>' +
'</h2>';
if (curSection.subSections) {
html += '<div class="nav--subsection">';
for (subsection in curSection.subSections) {
curSubSection = curSection.subSections[subsection];
html += '' +
'<h3 class="nav--subsection-title">' +
'<a href="#' + subsection + '">' + curSubSection.title + '</a>' +
'</h3>'
}
html += '</div>';
}
html += '</div>';
}
$nav.html(html);
}
function updateCache () {
cache = {};
idCounter = 1;
var id,
title,
subTitles,
$subTitle,
$current;
$sections.each(function () {
$current = $(this);
title = $('h2', $current);
subTitles = $('h3', $current);
id = title.attr('id');
cache[id] = {
title: title.text(),
offset: title.offset().top,
subSections: ''
};
if (subTitles.length) {
cache[id].subSections = {};
subTitles.each(function () {
var $subTitle = $(this),
subId = $(this).attr('id');
if (!subId) {
subId = idPrefix + idCounter++;
$subTitle.attr('id', subId);
}
cache[id].subSections[subId] = {
title: $subTitle.text(),
offset: $subTitle.offset().top
}
})
}
})
}
function scrollTo (pos) {
$('body, html').animate({
scrollTop: pos
}, 700, 'easeInOutCubic')
}
function onClickNavItem (e) {
e.preventDefault();
var $link = $(e.target),
$section = $($link.attr('href'));
$section.addClass('-hilited-');
setTimeout(function () {
$section.removeClass('-hilited-');
}, 1400)
scrollTo($section.offset().top - 16)
}
navigation = {
init: init
}
})(window, jQuery);

View File

@ -0,0 +1,569 @@
/* -------------------------------------------------
Page styles
------------------------------------------------- */
$minWidthBreakPoint: 650px;
$fontFamily: Tahoma, sans-serif;
html {
color: #333;
font-family: $fontFamily;
font-size: 14px;
min-width: 320px;
}
p {
line-height: 1.3;
margin-bottom: 14px;
}
h1, h2, h3, h4 {
font-family: 'Fira Sans', sans-serif;
line-height: 1;
}
h2 {
font-weight: 100;
font-size: 32px;
margin: 48px 0 8px;
}
h3 {
font-weight: 500;
font-size: 18px;
margin: 24px 0 8px;
}
h4 {
font-weight: normal;
color: #939393;
font-size: 16px;
margin: 24px 0 0;
}
.row {
display: flex;
> * {
flex: 1;
}
}
article {
h2, h3 {
position: relative;
z-index: 1;
&:after {
content: '';
background: rgba(#439cff, .2);
border-radius: 4px;
opacity: 0;
left: -8px;
right: -8px;
top: -10px;
bottom: -4px;
position: absolute;
z-index: -1;
transition: all .4s .3s linear;
}
&.-hilited- {
&:after {
opacity: 1;
transition: all .4s .7s linear;
}
}
}
}
.container {
max-width: 960px;
margin: 0 auto;
padding: 1px 0;
position: relative;
article {
margin: 60px 0 30px;
}
@media all and (max-width: 1525px) {
margin-left: 270px;
}
@media all and (max-width: 1280px) {
margin-right: 20px;
}
@media all and (max-width: $minWidthBreakPoint) {
margin-right: 20px;
margin-left: 20px;
}
}
.list-inline {
display: flex;
margin: -8px -8px 0;
> * {
margin: 8px 8px 0;
}
}
.buttons {
position: absolute;
top: 19px;
}
.lang-link {
position: absolute;
display: inline-flex;
align-items: center;
right: 0;
top: 15px;
img {
margin-right: 5px;
}
@media all and (max-width: 650px) {
span {
display: none;
}
}
}
.-text-center- {
text-align: center;
}
input[type='text'] {
outline: none;
height: 32px;
border: 1px solid #b5b5b5;
padding: 0 8px;
margin: 0 0 14px;
color: #444;
font-family: $fontFamily;
transition: all .2s;
width: 250px;
&:focus {
border-color: #ffd75c;
}
}
ul {
margin: 0 0 16px;
li {
list-style: none;
margin-bottom: 8px;
}
}
/* Example
------------------------------------------------- */
%example-label {
background: #ececec;
border-radius: 0 0 4px 4px;
position: absolute;
padding: 4px 12px;
right: 8px;
top: 0;
}
$exampleBorderRadius: 4px;
.hljs {
font-family: Consolas, monospace;
line-height: 1.2;
tab-size: 4;
}
.example {
border: 1px solid #ececec;
border-radius: $exampleBorderRadius;
position: relative;
margin: 16px 0;
.example-code {
border: none;
border-radius: 0 0 $exampleBorderRadius $exampleBorderRadius;
border-top: 1px solid #ececec;
margin: 0;
}
}
.example-inline {
background: red;
display: inline-block;
vertical-align: middle;
margin: 0 4px;
.hljs {
padding: 0 4px;
}
}
.example--label {
@extend %example-label;
}
.example-content {
padding: 32px;
@media all and (max-width: $minWidthBreakPoint) {
padding-left: 4%;
padding-right: 4%;
}
h1, h2, h3 {
&:first-child {
margin-top: 0;
}
}
>*:last-child {
margin-bottom: 0 !important;
}
}
a {
color: #47A6EC;
&:hover {
color: #ff767e;
}
}
.example-code {
border: 1px solid #ddd;
border-radius: $exampleBorderRadius;
overflow: hidden;
margin: 16px 0;
font-size: 13px;
code {
padding: 16px 32px;
}
}
// Param
// -------------------------------------------------
.param-inline {
font-family: Consolas, monospace;
strong {
background: #efefef;
color: #333;
border-radius: $exampleBorderRadius;
font-weight: normal;
display: inline-block;
vertical-align: middle;
padding: 3px 6px 4px;
margin-right: 4px;
}
i {
color: #838383;
font-size: .95em;
font-style: normal;
font-weight: 100;
font-family: 'Fira Sans', sans-serif;
display: inline-block;
vertical-align: middle;
margin-right: 4px;
}
}
// Promo block
// -------------------------------------------------
.promo-header {
font-size: 48px;
font-weight: 100;
text-align: center;
margin-top: 54px;
span {
display: block;
font-size: .5em;
}
}
.datepicker-promo {
text-align: center;
.datepicker-inline {
display: inline-block;
}
}
// Range example
// -------------------------------------------------
.range-example {
input[type='text'] {
width: 150px;
}
span {
display: inline-block;
margin: 0 8px;
}
}
// Param header
// -------------------------------------------------
.param-header {
margin-bottom: 8px;
h3 {
margin-bottom: 2px;
}
p {
margin: 0;
font-size: 13px;
}
}
.param-header--row {
}
.param {
margin-bottom: 32px;
}
.param-header--label {
color: #707070;
display: inline-block;
vertical-align: middle;
}
// Navigation
// -------------------------------------------------
.nav-wrap {
background: #fff;
position: fixed;
overflow: hidden;
width: 250px;
top: 0;
left: 0;
bottom: 0;
box-shadow: 0 0 4px rgba(0, 0, 0, .3);
@media all and (max-width: $minWidthBreakPoint) {
display: none;
}
&:after, &:before {
content: '';
pointer-events: none;
position: absolute;
left: 0;
right: 0;
height: 28px;
}
&:after {
background: linear-gradient(to top, #fff, rgba(255, 255, 255, 0));
bottom: 0;
}
}
.nav {
position: absolute;
padding: 18px;
right: 0;
top: 0;
left: 0;
bottom: 0;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
.nav--section {
margin-bottom: 20px;
}
.nav--section-title {
line-height: 1;
font-size: 22px;
margin: 0 0 8px;
a {
color: #000;
text-decoration: none;
&:hover {
color: #ff767e;
}
}
}
.nav--subsection {
margin-left: 2px;
}
.nav--subsection-title {
font-size: 13px;
margin: 0 0 8px;
font-weight: normal;
font-family: Tahoma, sans-serif;
a {
color: #787878;
text-decoration: none;
&:hover {
color: #ff767e;
}
}
}
// Cell note
// -------------------------
.dp-note {
position: absolute;
background: #cccccc;
width: 4px;
height: 4px;
border-radius: 50%;
left: 50%;
bottom: 1px;
transform: translateX(-50%);
.-selected- & {
bottom: 2px;
background: #fff;
opacity: .5;
}
}
// Visual tests
// -------------------------------------------------
.visual-tests {
padding-top: 12px;
padding-bottom: 120px;
h1 {
color: #555;
font-size: 20px;
margin: 0;
padding-left: 16px;
}
.row {
border-bottom: 1px solid #eee;
display: flex;
flex-wrap: wrap;
margin-bottom: 16px;
}
article:last-child {
.row {
border: none;
}
}
}
.vt-tile {
padding: 16px;
width: 284px;
input {
width: 100%;
}
h2 {
font-family: monospace;
font-size: 14px;
margin: 0 0 8px;
text-align: center;
}
}
.v-log {
position: fixed;
padding: 8px;
font-size: 12px;
font-family: monospace;
background: rgba(0, 0, 0, .7);
height: 100px;
width: 100%;
bottom: 0;
overflow: auto;
z-index: 10;
p {
margin: 0;
color: greenyellow;
}
span {
color: #ddd;
}
}
// Logger
// -------------------------------------------------
.logger {
background: rgba(0, 0, 0, .7);
border-radius: 4px;
font-size: 12px;
font-family: Monospace, monospace;
height: 150px;
overflow: auto;
position: relative;
}
.logger--content {
padding: 4px 8px;
height: 100%;
overflow: auto;
p {
margin: 0;
color: greenyellow;
}
span {
color: #ddd;
}
}
.logger--clear {
color: #333;
border-radius: 4px 4px 0 0;
cursor: pointer;
position: absolute;
height: 32px;
padding: 0 8px;
font-family: 'Tahoma', sans-serif;
font-size: 13px;
display: inline-flex;
justify-content: center;
align-items: center;
background: rgba(255, 255, 255, .5);
right: 24px;
bottom: 0;
&:hover {
background: rgba(255, 255, 255, .8);
}
&:active {
background: rgba(255, 255, 255, .3);
}
}

View File

@ -0,0 +1,82 @@
/* -------------------------------------------------
Reset
------------------------------------------------- */
applet, object, iframe, p,
blockquote, pre, a, abbr, acronym, address, big,
cite, code, del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, sub, sup, tt, var, u, i, center, dl,
dt, dd, ol, ul, li, fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed, figure, figcaption,
footer, header, menu, nav, output, ruby, section,
summary, time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font: inherit;
vertical-align: baseline;
}
body {
margin: 0;
}
html, body {
width: 100%;
height: 100%;
}
* {
box-sizing: border-box;
}
*:after, *:before {
box-sizing: border-box;
}
// HTML 5 roles for ie8/eie9
// -------------------------------------------------
article,
aside,
details,
figcaption,
figure,
footer,
header,
main,
menu,
nav,
section,
summary {
display: block;
}
// Default font weight
// -------------------------------------------------
b, strong {
font-weight: bold;
}
// Default font style
// -------------------------------------------------
i {
font-style: italic;
}
// Remove link outline
// -------------------------------------------------
a {
outline: none;
}
// Remove scroll in ie
// -------------------------------------------------
textarea {
overflow: auto;
}

View File

@ -0,0 +1,2 @@
@import "reset";
@import "docs";

View File

@ -0,0 +1,38 @@
var gulp = require('gulp'),
watch = require('gulp-watch'),
livereload = require('gulp-livereload');
gulp.task('css', require('./tasks/css'));
gulp.task('js', require('./tasks/js'));
gulp.task('i18n', require('./tasks/i18n'));
gulp.task('cssPage', require('./tasks/cssPage'));
gulp.task('jade-ru', require('./tasks/jade').ru);
gulp.task('jade-en', require('./tasks/jade').en);
gulp.task('gzip', require('./tasks/gzip'));
gulp.task('watch', function () {
livereload.listen();
gulp.watch('src/sass/*.scss', ['css']).on('change', function (file) {
livereload.changed(file)
});
gulp.watch('src/js/**/*.js', ['js']).on('change', function (file) {
livereload.changed(file)
});
gulp.watch('docs/sass/*.scss', ['cssPage']).on('change', function (file) {
livereload.changed(file)
});
gulp.watch('docs/jade/**/*.jade', ['jade-ru', 'jade-en']).on('change', function (file) {
livereload.changed(file)
});
});
gulp.task('dev', ['css','js','i18n', 'cssPage', 'jade-ru', 'jade-en', 'watch']);
gulp.task('build', ['css','js','i18n', 'jade-ru', 'jade-en']);

View File

@ -0,0 +1,53 @@
{
"name": "air-datepicker",
"version": "2.2.3",
"devDependencies": {
"autoprefixer": "^6.1.0",
"browserify": "^13.0.0",
"chai": "^3.4.1",
"gulp": "^3.9.0",
"gulp-clone": "^1.0.0",
"gulp-concat": "^2.6.0",
"gulp-gzip": "^1.2.0",
"gulp-jade": "^1.1.0",
"gulp-livereload": "^3.8.0",
"gulp-minify-css": "^1.2.1",
"gulp-plumber": "^1.0.1",
"gulp-postcss": "^6.0.1",
"gulp-rename": "^1.2.2",
"gulp-sass": "^2.0.4",
"gulp-uglify": "^1.2.0",
"gulp-watch": "^4.3.5",
"gulp-wrap": "^0.11.0",
"jade": "^1.11.0",
"mocha": "^2.3.4",
"node-static": "^0.7.7",
"vinyl-source-stream": "^1.1.0"
},
"dependencies": {
"jquery": ">=2.0.0 <4.0.0"
},
"description": "Lightweight customizable cross-browser jQuery datepicker, built with es5 and css-flexbox. Works in all modern desktop and mobile browsers (tested no Android 4.4+ and iOS8+)\r ![air datepicker image](https://github.com/t1m0n/air-datepicker/raw/master/docs/img/promo-img.png)",
"main": "src/js/air-datepicker.js",
"directories": {
"doc": "docs",
"test": "tests"
},
"repository": {
"type": "git",
"url": "git+https://github.com/t1m0n/air-datepicker.git"
},
"keywords": [
"datepicker",
"timepicker",
"plugin",
"customizable",
"powerful"
],
"author": "t1m0n <t1m0n.tr@gmail.com>",
"license": "MIT",
"bugs": {
"url": "https://github.com/t1m0n/air-datepicker/issues"
},
"homepage": "http://t1m0n.name/air-datepicker/docs/"
}

View File

@ -0,0 +1,4 @@
require('./datepicker');
require('./body');
require('./navigation');
require('./timepicker');

View File

@ -0,0 +1,311 @@
;(function () {
var templates = {
days:'' +
'<div class="datepicker--days datepicker--body">' +
'<div class="datepicker--days-names"></div>' +
'<div class="datepicker--cells datepicker--cells-days"></div>' +
'</div>',
months: '' +
'<div class="datepicker--months datepicker--body">' +
'<div class="datepicker--cells datepicker--cells-months"></div>' +
'</div>',
years: '' +
'<div class="datepicker--years datepicker--body">' +
'<div class="datepicker--cells datepicker--cells-years"></div>' +
'</div>'
},
datepicker = $.fn.datepicker,
dp = datepicker.Constructor;
datepicker.Body = function (d, type, opts) {
this.d = d;
this.type = type;
this.opts = opts;
this.$el = $('');
if (this.opts.onlyTimepicker) return;
this.init();
};
datepicker.Body.prototype = {
init: function () {
this._buildBaseHtml();
this._render();
this._bindEvents();
},
_bindEvents: function () {
this.$el.on('click', '.datepicker--cell', $.proxy(this._onClickCell, this));
},
_buildBaseHtml: function () {
this.$el = $(templates[this.type]).appendTo(this.d.$content);
this.$names = $('.datepicker--days-names', this.$el);
this.$cells = $('.datepicker--cells', this.$el);
},
_getDayNamesHtml: function (firstDay, curDay, html, i) {
curDay = curDay != undefined ? curDay : firstDay;
html = html ? html : '';
i = i != undefined ? i : 0;
if (i > 7) return html;
if (curDay == 7) return this._getDayNamesHtml(firstDay, 0, html, ++i);
html += '<div class="datepicker--day-name' + (this.d.isWeekend(curDay) ? " -weekend-" : "") + '">' + this.d.loc.daysMin[curDay] + '</div>';
return this._getDayNamesHtml(firstDay, ++curDay, html, ++i);
},
_getCellContents: function (date, type) {
var classes = "datepicker--cell datepicker--cell-" + type,
currentDate = new Date(),
parent = this.d,
minRange = dp.resetTime(parent.minRange),
maxRange = dp.resetTime(parent.maxRange),
opts = parent.opts,
d = dp.getParsedDate(date),
render = {},
html = d.date;
switch (type) {
case 'day':
if (parent.isWeekend(d.day)) classes += " -weekend-";
if (d.month != this.d.parsedDate.month) {
classes += " -other-month-";
if (!opts.selectOtherMonths) {
classes += " -disabled-";
}
if (!opts.showOtherMonths) html = '';
}
break;
case 'month':
html = parent.loc[parent.opts.monthsField][d.month];
break;
case 'year':
var decade = parent.curDecade;
html = d.year;
if (d.year < decade[0] || d.year > decade[1]) {
classes += ' -other-decade-';
if (!opts.selectOtherYears) {
classes += " -disabled-";
}
if (!opts.showOtherYears) html = '';
}
break;
}
if (opts.onRenderCell) {
render = opts.onRenderCell(date, type) || {};
html = render.html ? render.html : html;
classes += render.classes ? ' ' + render.classes : '';
}
if (opts.range) {
if (dp.isSame(minRange, date, type)) classes += ' -range-from-';
if (dp.isSame(maxRange, date, type)) classes += ' -range-to-';
if (parent.selectedDates.length == 1 && parent.focused) {
if (
(dp.bigger(minRange, date) && dp.less(parent.focused, date)) ||
(dp.less(maxRange, date) && dp.bigger(parent.focused, date)))
{
classes += ' -in-range-'
}
if (dp.less(maxRange, date) && dp.isSame(parent.focused, date)) {
classes += ' -range-from-'
}
if (dp.bigger(minRange, date) && dp.isSame(parent.focused, date)) {
classes += ' -range-to-'
}
} else if (parent.selectedDates.length == 2) {
if (dp.bigger(minRange, date) && dp.less(maxRange, date)) {
classes += ' -in-range-'
}
}
}
if (dp.isSame(currentDate, date, type)) classes += ' -current-';
if (parent.focused && dp.isSame(date, parent.focused, type)) classes += ' -focus-';
if (parent._isSelected(date, type)) classes += ' -selected-';
if (!parent._isInRange(date, type) || render.disabled) classes += ' -disabled-';
return {
html: html,
classes: classes
}
},
/**
* Calculates days number to render. Generates days html and returns it.
* @param {object} date - Date object
* @returns {string}
* @private
*/
_getDaysHtml: function (date) {
var totalMonthDays = dp.getDaysCount(date),
firstMonthDay = new Date(date.getFullYear(), date.getMonth(), 1).getDay(),
lastMonthDay = new Date(date.getFullYear(), date.getMonth(), totalMonthDays).getDay(),
daysFromPevMonth = firstMonthDay - this.d.loc.firstDay,
daysFromNextMonth = 6 - lastMonthDay + this.d.loc.firstDay;
daysFromPevMonth = daysFromPevMonth < 0 ? daysFromPevMonth + 7 : daysFromPevMonth;
daysFromNextMonth = daysFromNextMonth > 6 ? daysFromNextMonth - 7 : daysFromNextMonth;
var startDayIndex = -daysFromPevMonth + 1,
m, y,
html = '';
for (var i = startDayIndex, max = totalMonthDays + daysFromNextMonth; i <= max; i++) {
y = date.getFullYear();
m = date.getMonth();
html += this._getDayHtml(new Date(y, m, i))
}
return html;
},
_getDayHtml: function (date) {
var content = this._getCellContents(date, 'day');
return '<div class="' + content.classes + '" ' +
'data-date="' + date.getDate() + '" ' +
'data-month="' + date.getMonth() + '" ' +
'data-year="' + date.getFullYear() + '">' + content.html + '</div>';
},
/**
* Generates months html
* @param {object} date - date instance
* @returns {string}
* @private
*/
_getMonthsHtml: function (date) {
var html = '',
d = dp.getParsedDate(date),
i = 0;
while(i < 12) {
html += this._getMonthHtml(new Date(d.year, i));
i++
}
return html;
},
_getMonthHtml: function (date) {
var content = this._getCellContents(date, 'month');
return '<div class="' + content.classes + '" data-month="' + date.getMonth() + '">' + content.html + '</div>'
},
_getYearsHtml: function (date) {
var d = dp.getParsedDate(date),
decade = dp.getDecade(date),
firstYear = decade[0] - 1,
html = '',
i = firstYear;
for (i; i <= decade[1] + 1; i++) {
html += this._getYearHtml(new Date(i , 0));
}
return html;
},
_getYearHtml: function (date) {
var content = this._getCellContents(date, 'year');
return '<div class="' + content.classes + '" data-year="' + date.getFullYear() + '">' + content.html + '</div>'
},
_renderTypes: {
days: function () {
var dayNames = this._getDayNamesHtml(this.d.loc.firstDay),
days = this._getDaysHtml(this.d.currentDate);
this.$cells.html(days);
this.$names.html(dayNames)
},
months: function () {
var html = this._getMonthsHtml(this.d.currentDate);
this.$cells.html(html)
},
years: function () {
var html = this._getYearsHtml(this.d.currentDate);
this.$cells.html(html)
}
},
_render: function () {
if (this.opts.onlyTimepicker) return;
this._renderTypes[this.type].bind(this)();
},
_update: function () {
var $cells = $('.datepicker--cell', this.$cells),
_this = this,
classes,
$cell,
date;
$cells.each(function (cell, i) {
$cell = $(this);
date = _this.d._getDateFromCell($(this));
classes = _this._getCellContents(date, _this.d.cellType);
$cell.attr('class',classes.classes)
});
},
show: function () {
if (this.opts.onlyTimepicker) return;
this.$el.addClass('active');
this.acitve = true;
},
hide: function () {
this.$el.removeClass('active');
this.active = false;
},
// Events
// -------------------------------------------------
_handleClick: function (el) {
var date = el.data('date') || 1,
month = el.data('month') || 0,
year = el.data('year') || this.d.parsedDate.year,
dp = this.d;
// Change view if min view does not reach yet
if (dp.view != this.opts.minView) {
dp.down(new Date(year, month, date));
return;
}
// Select date if min view is reached
var selectedDate = new Date(year, month, date),
alreadySelected = this.d._isSelected(selectedDate, this.d.cellType);
if (!alreadySelected) {
dp._trigger('clickCell', selectedDate);
return;
}
dp._handleAlreadySelectedDates.bind(dp, alreadySelected, selectedDate)();
},
_onClickCell: function (e) {
var $el = $(e.target).closest('.datepicker--cell');
if ($el.hasClass('-disabled-')) return;
this._handleClick.bind(this)($el);
}
};
})();

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,12 @@
$.fn.datepicker.language['cs'] = {
days: ['Neděle', 'Pondělí', 'Úterý', 'Středa', 'Čtvrtek', 'Pátek', 'Sobota'],
daysShort: ['Ne', 'Po', 'Út', 'St', 'Čt', 'Pá', 'So'],
daysMin: ['Ne', 'Po', 'Út', 'St', 'Čt', 'Pá', 'So'],
months: ['Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec'],
monthsShort: ['Led', 'Úno', 'Bře', 'Dub', 'Kvě', 'Čvn', 'Čvc', 'Srp', 'Zář', 'Říj', 'Lis', 'Pro'],
today: 'Dnes',
clear: 'Vymazat',
dateFormat: 'dd.mm.yyyy',
timeFormat: 'hh:ii',
firstDay: 1
};

View File

@ -0,0 +1,12 @@
$.fn.datepicker.language['da'] = {
days: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'],
daysShort: ['Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør'],
daysMin: ['Sø', 'Ma', 'Ti', 'On', 'To', 'Fr', 'Lø'],
months: ['Januar','Februar','Marts','April','Maj','Juni', 'Juli','August','September','Oktober','November','December'],
monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'],
today: 'I dag',
clear: 'Nulstil',
dateFormat: 'dd/mm/yyyy',
timeFormat: 'hh:ii',
firstDay: 1
};

View File

@ -0,0 +1,12 @@
$.fn.datepicker.language['de'] = {
days: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
daysShort: ['Son', 'Mon', 'Die', 'Mit', 'Don', 'Fre', 'Sam'],
daysMin: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
months: ['Januar','Februar','März','April','Mai','Juni', 'Juli','August','September','Oktober','November','Dezember'],
monthsShort: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
today: 'Heute',
clear: 'Aufräumen',
dateFormat: 'dd.mm.yyyy',
timeFormat: 'hh:ii',
firstDay: 1
};

View File

@ -0,0 +1,12 @@
$.fn.datepicker.language['en'] = {
days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
daysMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
months: ['January','February','March','April','May','June', 'July','August','September','October','November','December'],
monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
today: 'Today',
clear: 'Clear',
dateFormat: 'mm/dd/yyyy',
timeFormat: 'hh:ii aa',
firstDay: 0
};

View File

@ -0,0 +1,12 @@
$.fn.datepicker.language['es'] = {
days: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],
daysShort: ['Dom', 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab'],
daysMin: ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa'],
months: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', 'Julio','Augosto','Septiembre','Octubre','Noviembre','Diciembre'],
monthsShort: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'],
today: 'Hoy',
clear: 'Limpiar',
dateFormat: 'dd/mm/yyyy',
timeFormat: 'hh:ii aa',
firstDay: 1
};

View File

@ -0,0 +1,12 @@
$.fn.datepicker.language['fi'] = {
days: ['Sunnuntai', 'Maanantai', 'Tiistai', 'Keskiviikko', 'Torstai', 'Perjantai', 'Lauantai'],
daysShort: ['Su', 'Ma', 'Ti', 'Ke', 'To', 'Pe', 'La'],
daysMin: ['Su', 'Ma', 'Ti', 'Ke', 'To', 'Pe', 'La'],
months: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu', 'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
monthsShort: ['Tammi', 'Helmi', 'Maalis', 'Huhti', 'Touko', 'Kesä', 'Heinä', 'Elo', 'Syys', 'Loka', 'Marras', 'Joulu'],
today: 'Tänään',
clear: 'Tyhjennä',
dateFormat: 'dd.mm.yyyy',
timeFormat: 'hh:ii',
firstDay: 1
};

View File

@ -0,0 +1,12 @@
$.fn.datepicker.language['fr'] = {
days: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
daysShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
daysMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],
months: ['Janvier','Février','Mars','Avril','Mai','Juin', 'Juillet','Août','Septembre','Octobre','Novembre','Decembre'],
monthsShort: ['Jan', 'Fév', 'Mars', 'Avr', 'Mai', 'Juin', 'Juil', 'Août', 'Sep', 'Oct', 'Nov', 'Dec'],
today: "Aujourd'hui",
clear: 'Effacer',
dateFormat: 'dd/mm/yyyy',
timeFormat: 'hh:ii',
firstDay: 1
};

View File

@ -0,0 +1,12 @@
;(function ($) { $.fn.datepicker.language['hu'] = {
days: ['Vasárnap', 'Hétfő', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
daysShort: ['Va', 'Hé', 'Ke', 'Sze', 'Cs', 'Pé', 'Szo'],
daysMin: ['V', 'H', 'K', 'Sz', 'Cs', 'P', 'Sz'],
months: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június', 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
monthsShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún', 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
today: 'Ma',
clear: 'Törlés',
dateFormat: 'yyyy-mm-dd',
timeFormat: 'hh:ii aa',
firstDay: 1
}; })(jQuery);

View File

@ -0,0 +1,12 @@
$.fn.datepicker.language['nl'] = {
days: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
daysShort: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
daysMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
months: ['Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December'],
monthsShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'],
today: 'Vandaag',
clear: 'Legen',
dateFormat: 'dd-MM-yy',
timeFormat: 'hh:ii',
firstDay: 0
};

View File

@ -0,0 +1,12 @@
$.fn.datepicker.language['pl'] = {
days: ['Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota'],
daysShort: ['Nie', 'Pon', 'Wto', 'Śro', 'Czw', 'Pią', 'Sob'],
daysMin: ['Nd', 'Pn', 'Wt', 'Śr', 'Czw', 'Pt', 'So'],
months: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec', 'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
monthsShort: ['Sty', 'Lut', 'Mar', 'Kwi', 'Maj', 'Cze', 'Lip', 'Sie', 'Wrz', 'Paź', 'Lis', 'Gru'],
today: 'Dzisiaj',
clear: 'Wyczyść',
dateFormat: 'yyyy-mm-dd',
timeFormat: 'hh:ii:aa',
firstDay: 1
};

View File

@ -0,0 +1,12 @@
$.fn.datepicker.language['pt-BR'] = {
days: ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'],
daysShort: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab'],
daysMin: ['Do', 'Se', 'Te', 'Qu', 'Qu', 'Se', 'Sa'],
months: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
monthsShort: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
today: 'Hoje',
clear: 'Limpar',
dateFormat: 'dd/mm/yyyy',
timeFormat: 'hh:ii',
firstDay: 0
};

View File

@ -0,0 +1,12 @@
$.fn.datepicker.language['pt'] = {
days: ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'],
daysShort: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab'],
daysMin: ['Do', 'Se', 'Te', 'Qa', 'Qi', 'Sx', 'Sa'],
months: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
monthsShort: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
today: 'Hoje',
clear: 'Limpar',
dateFormat: 'dd/mm/yyyy',
timeFormat: 'hh:ii',
firstDay: 1
};

View File

@ -0,0 +1,12 @@
$.fn.datepicker.language['ro'] = {
days: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'],
daysShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
daysMin: ['D', 'L', 'Ma', 'Mi', 'J', 'V', 'S'],
months: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie','Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
monthsShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun', 'Iul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'],
today: 'Azi',
clear: 'Şterge',
dateFormat: 'dd.mm.yyyy',
timeFormat: 'hh:ii',
firstDay: 1
};

View File

@ -0,0 +1,12 @@
$.fn.datepicker.language['sk'] = {
days: ['Nedeľa', 'Pondelok', 'Utorok', 'Streda', 'Štvrtok', 'Piatok', 'Sobota'],
daysShort: ['Ned', 'Pon', 'Uto', 'Str', 'Štv', 'Pia', 'Sob'],
daysMin: ['Ne', 'Po', 'Ut', 'St', 'Št', 'Pi', 'So'],
months: ['Január','Február','Marec','Apríl','Máj','Jún', 'Júl','August','September','Október','November','December'],
monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Máj', 'Jún', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'],
today: 'Dnes',
clear: 'Vymazať',
dateFormat: 'dd.mm.yyyy',
timeFormat: 'hh:ii',
firstDay: 1
};

View File

@ -0,0 +1,12 @@
$.fn.datepicker.language['zh'] = {
days: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
daysShort: ['日', '一', '二', '三', '四', '五', '六'],
daysMin: ['日', '一', '二', '三', '四', '五', '六'],
months: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
monthsShort: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
today: '今天',
clear: '清除',
dateFormat: 'yyyy-mm-dd',
timeFormat: 'hh:ii',
firstDay: 1
};

View File

@ -0,0 +1,145 @@
;(function () {
var template = '' +
'<div class="datepicker--nav-action" data-action="prev">#{prevHtml}</div>' +
'<div class="datepicker--nav-title">#{title}</div>' +
'<div class="datepicker--nav-action" data-action="next">#{nextHtml}</div>',
buttonsContainerTemplate = '<div class="datepicker--buttons"></div>',
button = '<span class="datepicker--button" data-action="#{action}">#{label}</span>',
datepicker = $.fn.datepicker,
dp = datepicker.Constructor;
datepicker.Navigation = function (d, opts) {
this.d = d;
this.opts = opts;
this.$buttonsContainer = '';
this.init();
};
datepicker.Navigation.prototype = {
init: function () {
this._buildBaseHtml();
this._bindEvents();
},
_bindEvents: function () {
this.d.$nav.on('click', '.datepicker--nav-action', $.proxy(this._onClickNavButton, this));
this.d.$nav.on('click', '.datepicker--nav-title', $.proxy(this._onClickNavTitle, this));
this.d.$datepicker.on('click', '.datepicker--button', $.proxy(this._onClickNavButton, this));
},
_buildBaseHtml: function () {
if (!this.opts.onlyTimepicker) {
this._render();
}
this._addButtonsIfNeed();
},
_addButtonsIfNeed: function () {
if (this.opts.todayButton) {
this._addButton('today')
}
if (this.opts.clearButton) {
this._addButton('clear')
}
},
_render: function () {
var title = this._getTitle(this.d.currentDate),
html = dp.template(template, $.extend({title: title}, this.opts));
this.d.$nav.html(html);
if (this.d.view == 'years') {
$('.datepicker--nav-title', this.d.$nav).addClass('-disabled-');
}
this.setNavStatus();
},
_getTitle: function (date) {
return this.d.formatDate(this.opts.navTitles[this.d.view], date)
},
_addButton: function (type) {
if (!this.$buttonsContainer.length) {
this._addButtonsContainer();
}
var data = {
action: type,
label: this.d.loc[type]
},
html = dp.template(button, data);
if ($('[data-action=' + type + ']', this.$buttonsContainer).length) return;
this.$buttonsContainer.append(html);
},
_addButtonsContainer: function () {
this.d.$datepicker.append(buttonsContainerTemplate);
this.$buttonsContainer = $('.datepicker--buttons', this.d.$datepicker);
},
setNavStatus: function () {
if (!(this.opts.minDate || this.opts.maxDate) || !this.opts.disableNavWhenOutOfRange) return;
var date = this.d.parsedDate,
m = date.month,
y = date.year,
d = date.date;
switch (this.d.view) {
case 'days':
if (!this.d._isInRange(new Date(y, m-1, 1), 'month')) {
this._disableNav('prev')
}
if (!this.d._isInRange(new Date(y, m+1, 1), 'month')) {
this._disableNav('next')
}
break;
case 'months':
if (!this.d._isInRange(new Date(y-1, m, d), 'year')) {
this._disableNav('prev')
}
if (!this.d._isInRange(new Date(y+1, m, d), 'year')) {
this._disableNav('next')
}
break;
case 'years':
var decade = dp.getDecade(this.d.date);
if (!this.d._isInRange(new Date(decade[0] - 1, 0, 1), 'year')) {
this._disableNav('prev')
}
if (!this.d._isInRange(new Date(decade[1] + 1, 0, 1), 'year')) {
this._disableNav('next')
}
break;
}
},
_disableNav: function (nav) {
$('[data-action="' + nav + '"]', this.d.$nav).addClass('-disabled-')
},
_activateNav: function (nav) {
$('[data-action="' + nav + '"]', this.d.$nav).removeClass('-disabled-')
},
_onClickNavButton: function (e) {
var $el = $(e.target).closest('[data-action]'),
action = $el.data('action');
this.d[action]();
},
_onClickNavTitle: function (e) {
if ($(e.target).hasClass('-disabled-')) return;
if (this.d.view == 'days') {
return this.d.view = 'months'
}
this.d.view = 'years';
}
}
})();

View File

@ -0,0 +1,283 @@
;(function () {
var template = '<div class="datepicker--time">' +
'<div class="datepicker--time-current">' +
' <span class="datepicker--time-current-hours">#{hourVisible}</span>' +
' <span class="datepicker--time-current-colon">:</span>' +
' <span class="datepicker--time-current-minutes">#{minValue}</span>' +
'</div>' +
'<div class="datepicker--time-sliders">' +
' <div class="datepicker--time-row">' +
' <input type="range" name="hours" value="#{hourValue}" min="#{hourMin}" max="#{hourMax}" step="#{hourStep}"/>' +
' </div>' +
' <div class="datepicker--time-row">' +
' <input type="range" name="minutes" value="#{minValue}" min="#{minMin}" max="#{minMax}" step="#{minStep}"/>' +
' </div>' +
'</div>' +
'</div>',
datepicker = $.fn.datepicker,
dp = datepicker.Constructor;
datepicker.Timepicker = function (inst, opts) {
this.d = inst;
this.opts = opts;
this.init();
};
datepicker.Timepicker.prototype = {
init: function () {
var input = 'input';
this._setTime(this.d.date);
this._buildHTML();
if (navigator.userAgent.match(/trident/gi)) {
input = 'change';
}
this.d.$el.on('selectDate', this._onSelectDate.bind(this));
this.$ranges.on(input, this._onChangeRange.bind(this));
this.$ranges.on('mouseup', this._onMouseUpRange.bind(this));
this.$ranges.on('mousemove focus ', this._onMouseEnterRange.bind(this));
this.$ranges.on('mouseout blur', this._onMouseOutRange.bind(this));
},
_setTime: function (date) {
var _date = dp.getParsedDate(date);
this._handleDate(date);
this.hours = _date.hours < this.minHours ? this.minHours : _date.hours;
this.minutes = _date.minutes < this.minMinutes ? this.minMinutes : _date.minutes;
},
/**
* Sets minHours and minMinutes from date (usually it's a minDate)
* Also changes minMinutes if current hours are bigger then @date hours
* @param date {Date}
* @private
*/
_setMinTimeFromDate: function (date) {
this.minHours = date.getHours();
this.minMinutes = date.getMinutes();
// If, for example, min hours are 10, and current hours are 12,
// update minMinutes to default value, to be able to choose whole range of values
if (this.d.lastSelectedDate) {
if (this.d.lastSelectedDate.getHours() > date.getHours()) {
this.minMinutes = this.opts.minMinutes;
}
}
},
_setMaxTimeFromDate: function (date) {
this.maxHours = date.getHours();
this.maxMinutes = date.getMinutes();
if (this.d.lastSelectedDate) {
if (this.d.lastSelectedDate.getHours() < date.getHours()) {
this.maxMinutes = this.opts.maxMinutes;
}
}
},
_setDefaultMinMaxTime: function () {
var maxHours = 23,
maxMinutes = 59,
opts = this.opts;
this.minHours = opts.minHours < 0 || opts.minHours > maxHours ? 0 : opts.minHours;
this.minMinutes = opts.minMinutes < 0 || opts.minMinutes > maxMinutes ? 0 : opts.minMinutes;
this.maxHours = opts.maxHours < 0 || opts.maxHours > maxHours ? maxHours : opts.maxHours;
this.maxMinutes = opts.maxMinutes < 0 || opts.maxMinutes > maxMinutes ? maxMinutes : opts.maxMinutes;
},
/**
* Looks for min/max hours/minutes and if current values
* are out of range sets valid values.
* @private
*/
_validateHoursMinutes: function (date) {
if (this.hours < this.minHours) {
this.hours = this.minHours;
} else if (this.hours > this.maxHours) {
this.hours = this.maxHours;
}
if (this.minutes < this.minMinutes) {
this.minutes = this.minMinutes;
} else if (this.minutes > this.maxMinutes) {
this.minutes = this.maxMinutes;
}
},
_buildHTML: function () {
var lz = dp.getLeadingZeroNum,
data = {
hourMin: this.minHours,
hourMax: lz(this.maxHours),
hourStep: this.opts.hoursStep,
hourValue: this.hours,
hourVisible: lz(this.displayHours),
minMin: this.minMinutes,
minMax: lz(this.maxMinutes),
minStep: this.opts.minutesStep,
minValue: lz(this.minutes)
},
_template = dp.template(template, data);
this.$timepicker = $(_template).appendTo(this.d.$datepicker);
this.$ranges = $('[type="range"]', this.$timepicker);
this.$hours = $('[name="hours"]', this.$timepicker);
this.$minutes = $('[name="minutes"]', this.$timepicker);
this.$hoursText = $('.datepicker--time-current-hours', this.$timepicker);
this.$minutesText = $('.datepicker--time-current-minutes', this.$timepicker);
if (this.d.ampm) {
this.$ampm = $('<span class="datepicker--time-current-ampm">')
.appendTo($('.datepicker--time-current', this.$timepicker))
.html(this.dayPeriod);
this.$timepicker.addClass('-am-pm-');
}
},
_updateCurrentTime: function () {
var h = dp.getLeadingZeroNum(this.displayHours),
m = dp.getLeadingZeroNum(this.minutes);
this.$hoursText.html(h);
this.$minutesText.html(m);
if (this.d.ampm) {
this.$ampm.html(this.dayPeriod);
}
},
_updateRanges: function () {
this.$hours.attr({
min: this.minHours,
max: this.maxHours
}).val(this.hours);
this.$minutes.attr({
min: this.minMinutes,
max: this.maxMinutes
}).val(this.minutes)
},
/**
* Sets minHours, minMinutes etc. from date. If date is not passed, than sets
* values from options
* @param [date] {object} - Date object, to get values from
* @private
*/
_handleDate: function (date) {
this._setDefaultMinMaxTime();
if (date) {
if (dp.isSame(date, this.d.opts.minDate)) {
this._setMinTimeFromDate(this.d.opts.minDate);
} else if (dp.isSame(date, this.d.opts.maxDate)) {
this._setMaxTimeFromDate(this.d.opts.maxDate);
}
}
this._validateHoursMinutes(date);
},
update: function () {
this._updateRanges();
this._updateCurrentTime();
},
/**
* Calculates valid hour value to display in text input and datepicker's body.
* @param date {Date|Number} - date or hours
* @param [ampm] {Boolean} - 12 hours mode
* @returns {{hours: *, dayPeriod: string}}
* @private
*/
_getValidHoursFromDate: function (date, ampm) {
var d = date,
hours = date;
if (date instanceof Date) {
d = dp.getParsedDate(date);
hours = d.hours;
}
var _ampm = ampm || this.d.ampm,
dayPeriod = 'am';
if (_ampm) {
switch(true) {
case hours == 0:
hours = 12;
break;
case hours == 12:
dayPeriod = 'pm';
break;
case hours > 11:
hours = hours - 12;
dayPeriod = 'pm';
break;
default:
break;
}
}
return {
hours: hours,
dayPeriod: dayPeriod
}
},
set hours (val) {
this._hours = val;
var displayHours = this._getValidHoursFromDate(val);
this.displayHours = displayHours.hours;
this.dayPeriod = displayHours.dayPeriod;
},
get hours() {
return this._hours;
},
// Events
// -------------------------------------------------
_onChangeRange: function (e) {
var $target = $(e.target),
name = $target.attr('name');
this.d.timepickerIsActive = true;
this[name] = $target.val();
this._updateCurrentTime();
this.d._trigger('timeChange', [this.hours, this.minutes]);
this._handleDate(this.d.lastSelectedDate);
this.update()
},
_onSelectDate: function (e, data) {
this._handleDate(data);
this.update();
},
_onMouseEnterRange: function (e) {
var name = $(e.target).attr('name');
$('.datepicker--time-current-' + name, this.$timepicker).addClass('-focus-');
},
_onMouseOutRange: function (e) {
var name = $(e.target).attr('name');
if (this.d.inFocus) return; // Prevent removing focus when mouse out of range slider
$('.datepicker--time-current-' + name, this.$timepicker).removeClass('-focus-');
},
_onMouseUpRange: function (e) {
this.d.timepickerIsActive = false;
}
};
})();

View File

@ -0,0 +1,84 @@
$datepickerDayCellSize: 32px !default;
$datepickerWidth: 250px !default;
$datepickerMinBodyHeight: 170px !default;
$datepickerBorderRadius: 4px !default;
$datepickerPadding: 4px !default;
$datepickerZIndex: 100 !default;
$datepickerFontFamily: Tahoma !default;
$datepickerFontSize: 14px !default;
$datepickerYearsPerRow: 4 !default;
$datepickerTextColor: (
button: #5cc4ef,
otherMonth: #dedede,
otherMonthInRange: #ccc,
disabled: #aeaeae,
currentDate: #4EB5E6,
common: #4a4a4a,
dayNames: #FF9A19,
navArrows: #9c9c9c
) !default;
$datepickerBG: (
selected: #5cc4ef,
selectedHover: darken(#5cc4ef, 5),
inRange: rgba(#5cc4ef, .1),
hover: #f0f0f0
) !default;
$datepickerBorderColor: (
nav: #efefef,
inline: #d7d7d7,
default: #dbdbdb
) !default;
$datepickerNavigationHeight: 32px !default;
$datepickerNavigationButtonsOffset: 2px !default;
$datepickerPointerSize: 10px !default;
$datepickerPointerOffset: 10px !default;
// Transitions
$datepickerTransitionSpeed: .3s !default;
$datepickerTransitionEase: ease !default;
$datepickerTransitionOffset: 8px !default;
// Objects
%otherMonth {
color: map_get($datepickerTextColor, otherMonth);
&:hover {
color: darken(map_get($datepickerTextColor, otherMonth), 10);
}
&.-disabled- {
&.-focus- {
color: map_get($datepickerTextColor, otherMonth);
}
}
&.-selected- {
color: #fff;
background: lighten(map_get($datepickerBG, selected), 15);
&.-focus- {
background: lighten(map_get($datepickerBG, selected), 10);
}
}
&.-in-range- {
background-color: map_get($datepickerBG, inRange);
color: darken(map_get($datepickerTextColor, otherMonth), 7);
&.-focus- {
background-color: rgba(map_get($datepickerBG, inRange), .2);
}
}
&:empty {
background: none;
border: none;
}
}

View File

@ -0,0 +1,173 @@
@import "datepicker-config";
/* -------------------------------------------------
Datepicker cells
------------------------------------------------- */
.datepicker--cells {
display: flex;
flex-wrap: wrap;
}
.datepicker--cell {
border-radius: $datepickerBorderRadius;
box-sizing: border-box;
cursor: pointer;
display: flex;
position: relative;
align-items: center;
justify-content: center;
height: $datepickerDayCellSize;
z-index: 1;
&.-focus- {
background: map_get($datepickerBG, hover);
}
&.-current- {
color: map_get($datepickerTextColor, currentDate);
&.-focus- {
color: map_get($datepickerTextColor, common);
}
&.-in-range- {
color: map_get($datepickerTextColor, currentDate);
}
}
&.-in-range- {
background: map_get($datepickerBG, inRange);
color: map_get($datepickerTextColor, common);
border-radius: 0;
&.-focus- {
background-color: rgba(map_get($datepickerBG, inRange), .2);
}
}
&.-disabled- {
cursor: default;
color: map_get($datepickerTextColor, disabled);
&.-focus- {
color: map_get($datepickerTextColor, disabled);
}
&.-in-range- {
color: darken(map_get($datepickerTextColor, disabled), 5);
}
&.-current- {
&.-focus- {
color: map_get($datepickerTextColor, disabled);
}
}
}
&.-range-from- {
border: 1px solid rgba(map_get($datepickerBG, selected), .5);
background-color: map_get($datepickerBG, inRange);
border-radius: $datepickerBorderRadius 0 0 $datepickerBorderRadius;
}
&.-range-to- {
border: 1px solid rgba(map_get($datepickerBG, selected), .5);
background-color: map_get($datepickerBG, inRange);
border-radius: 0 $datepickerBorderRadius $datepickerBorderRadius 0;
}
&.-range-from-.-range-to- {
border-radius: $datepickerBorderRadius;
}
&.-selected- {
color: #fff;
border: none;
background: map_get($datepickerBG, selected);
&.-current- {
color: #fff;
background: map_get($datepickerBG, selected);
}
&.-focus- {
background: map_get($datepickerBG, selectedHover);
}
}
&:empty {
cursor: default;
}
}
// Day names
// -------------------------------------------------
.datepicker--days-names {
display: flex;
flex-wrap: wrap;
margin: 8px 0 3px;
}
.datepicker--day-name {
color: map_get($datepickerTextColor, dayNames);
display: flex;
align-items: center;
justify-content: center;
flex: 1;
text-align: center;
text-transform: uppercase;
font-size: .8em;
}
// Day cell
// -------------------------------------------------
.datepicker--cell-day {
width: (100/7)#{'%'};
&.-other-month- {
@extend %otherMonth;
}
}
// Months
// -------------------------------------------------
.datepicker--months {}
.datepicker--cells-months {
height: $datepickerMinBodyHeight;
}
// Month cell
// -------------------------
.datepicker--cell-month {
width: 33.33%;
height: 25%;
}
// Years
// -------------------------------------------------
.datepicker--years {
height: $datepickerMinBodyHeight;
}
.datepicker--cells-years {
height: $datepickerMinBodyHeight;
}
// Year cell
// -------------------------
.datepicker--cell-year {
width: 100% / $datepickerYearsPerRow;
height: 33.33%;
&.-other-decade- {
@extend %otherMonth;
}
}

View File

@ -0,0 +1,149 @@
@import "datepicker-config";
/* -------------------------------------------------
Datepicker
------------------------------------------------- */
.datepickers-container {
position: absolute;
left: 0;
top: 0;
@media print {
display: none;
}
}
.datepicker {
background: #fff;
border: 1px solid map_get($datepickerBorderColor, default);
box-shadow: 0 4px 12px rgba(0, 0, 0, .15);
border-radius: $datepickerBorderRadius;
box-sizing: content-box;
font-family: $datepickerFontFamily, sans-serif;
font-size: $datepickerFontSize;
color: map_get($datepickerTextColor, common);
width: $datepickerWidth;
position: absolute;
left: -100000px;
opacity: 0;
transition: opacity $datepickerTransitionSpeed $datepickerTransitionEase, transform $datepickerTransitionSpeed $datepickerTransitionEase, left 0s $datepickerTransitionSpeed;
z-index: $datepickerZIndex;
&.-from-top- {
transform: translateY(-$datepickerTransitionOffset);
}
&.-from-right- {
transform: translateX($datepickerTransitionOffset);
}
&.-from-bottom- {
transform: translateY($datepickerTransitionOffset);
}
&.-from-left- {
transform: translateX(-$datepickerTransitionOffset);
}
&.active {
opacity: 1;
transform: translate(0);
transition: opacity $datepickerTransitionSpeed $datepickerTransitionEase, transform $datepickerTransitionSpeed $datepickerTransitionEase, left 0s 0s;
}
}
.datepicker-inline {
.datepicker {
border-color: map-get($datepickerBorderColor, inline);
box-shadow: none;
position: static;
left: auto;
right: auto;
opacity: 1;
transform: none;
}
.datepicker--pointer {
display: none;
}
}
.datepicker--content {
box-sizing: content-box;
padding: $datepickerPadding;
.-only-timepicker- & {
display: none;
}
}
// Pointer
// -------------------------------------------------
$pointerHalfSize: $datepickerPointerSize / 2 - 1;
.datepicker--pointer {
position: absolute;
background: #fff;
border-top: 1px solid map-get($datepickerBorderColor, default);
border-right: 1px solid map-get($datepickerBorderColor, default);
width: $datepickerPointerSize;
height: $datepickerPointerSize;
z-index: -1;
// Main axis
// -------------------------
.-top-left- &, .-top-center- &, .-top-right- & {
top: calc(100% - #{$pointerHalfSize});
transform: rotate(135deg);
}
.-right-top- &, .-right-center- &, .-right-bottom- & {
right: calc(100% - #{$pointerHalfSize});
transform: rotate(225deg);
}
.-bottom-left- &, .-bottom-center- &, .-bottom-right- & {
bottom: calc(100% - #{$pointerHalfSize});
transform: rotate(315deg);
}
.-left-top- &, .-left-center- &, .-left-bottom- & {
left: calc(100% - #{$pointerHalfSize});
transform: rotate(45deg);
}
// Secondary axis
// -------------------------
.-top-left- &, .-bottom-left- & {
left: $datepickerPointerOffset;
}
.-top-right- &, .-bottom-right- & {
right: $datepickerPointerOffset;
}
.-top-center- &, .-bottom-center- & {
left: calc(50% - #{$datepickerPointerSize} / 2);
}
.-left-top- &, .-right-top- & {
top: $datepickerPointerOffset;
}
.-left-bottom- &, .-right-bottom- & {
bottom: $datepickerPointerOffset;
}
.-left-center- &, .-right-center- & {
top: calc(50% - #{$datepickerPointerSize} / 2);
}
}
// Body
// -------------------------------------------------
.datepicker--body {
display: none;
&.active {
display: block;
}
}

View File

@ -0,0 +1,95 @@
@import "datepicker-config";
/* -------------------------------------------------
Navigation
------------------------------------------------- */
.datepicker--nav {
display: flex;
justify-content: space-between;
border-bottom: 1px solid map_get($datepickerBorderColor, nav);
min-height: $datepickerNavigationHeight;
padding: $datepickerPadding;
.-only-timepicker- & {
display: none;
}
}
.datepicker--nav-title,
.datepicker--nav-action {
display: flex;
cursor: pointer;
align-items: center;
justify-content: center;
}
.datepicker--nav-action {
width: $datepickerDayCellSize;
border-radius: $datepickerBorderRadius;
user-select: none;
&:hover {
background: map_get($datepickerBG, hover);
}
&.-disabled- {
visibility: hidden;
}
svg {
width: 32px;
height: 32px;
}
path {
fill: none;
stroke: map_get($datepickerTextColor, navArrows);
stroke-width: 2px;
}
}
.datepicker--nav-title {
border-radius: $datepickerBorderRadius;
padding: 0 8px;
i {
font-style: normal;
color: map_get($datepickerTextColor, navArrows);
margin-left: 5px;
}
&:hover {
background: map_get($datepickerBG, hover);
}
&.-disabled- {
cursor: default;
background: none;
}
}
// Buttons
// -------------------------------------------------
.datepicker--buttons {
display: flex;
padding: $datepickerPadding;
border-top: 1px solid map_get($datepickerBorderColor, nav);
}
.datepicker--button {
color: map_get($datepickerTextColor, currentDate);
cursor: pointer;
border-radius: $datepickerBorderRadius;
flex: 1;
display: inline-flex;
justify-content: center;
align-items: center;
height: 32px;
&:hover {
color: map_get($datepickerTextColor, common);
background: map_get($datepickerBG, hover);
}
}

View File

@ -0,0 +1,251 @@
@import "datepicker-config";
/* -------------------------------------------------
Timepicker
------------------------------------------------- */
$rangeTrackHeight: 1px;
$rangeTrackBg: #dedede;
$rangeThumbSize: 12px;
$rangeThumbBg: #dedede;
@mixin trackSelector {
&::-webkit-slider-runnable-track {
@content;
}
&::-moz-range-track {
@content;
}
&::-ms-track {
@content;
}
}
@mixin thumbSelector {
&::-webkit-slider-thumb {
@content;
}
&::-moz-range-thumb {
@content;
}
&::-ms-thumb {
@content;
}
}
@mixin thumb {
box-sizing: border-box;
height: $rangeThumbSize;
width: $rangeThumbSize;
border-radius: 3px;
border: 1px solid $rangeTrackBg;
background: #fff;
cursor: pointer;
transition: background .2s;
}
@mixin track {
border: none;
height: $rangeTrackHeight;
cursor: pointer;
color: transparent;
background: transparent;
}
.datepicker--time {
border-top: 1px solid map_get($datepickerBorderColor, nav);
display: flex;
align-items: center;
padding: $datepickerPadding;
position: relative;
&.-am-pm- {
.datepicker--time-sliders {
flex: 0 1 138px;
max-width: 138px;
}
}
.-only-timepicker- & {
border-top: none;
}
}
.datepicker--time-sliders {
flex: 0 1 153px;
margin-right: 10px;
max-width: 153px;
}
.datepicker--time-label {
display: none;
font-size: 12px;
}
.datepicker--time-current {
display: flex;
align-items: center;
flex: 1;
font-size: 14px;
text-align: center;
margin: 0 0 0 10px;
}
.datepicker--time-current-colon {
margin: 0 2px 3px;
line-height: 1;
}
.datepicker--time-current-hours,
.datepicker--time-current-minutes {
line-height: 1;
font-size: 19px;
font-family: "Century Gothic", CenturyGothic, AppleGothic, sans-serif;
position: relative;
z-index: 1;
&:after {
content: '';
background: map_get($datepickerBG, hover);
border-radius: $datepickerBorderRadius;
position: absolute;
left: -2px;
top: -3px;
right: -2px;
bottom: -2px;
z-index: -1;
opacity: 0;
}
&.-focus- {
&:after {
opacity: 1;
}
}
}
.datepicker--time-current-ampm {
text-transform: uppercase;
align-self: flex-end;
color: map_get($datepickerTextColor, navArrows);
margin-left: 6px;
font-size: 11px;
margin-bottom: 1px;
}
.datepicker--time-row {
display: flex;
align-items: center;
font-size: 11px;
height: 17px;
background: linear-gradient(to right,$rangeTrackBg, $rangeTrackBg) left 50%/100% $rangeTrackHeight no-repeat;
&:first-child {
margin-bottom: 4px;
}
input[type='range'] {
background: none;
cursor: pointer;
flex: 1;
height: 100%;
padding: 0;
margin: 0;
-webkit-appearance: none;
&::-webkit-slider-thumb {
-webkit-appearance: none;
}
&::-ms-tooltip {
display: none;
}
&:hover {
@include thumbSelector() {
border-color: darken($rangeTrackBg, 15);
}
}
&:focus {
outline: none;
@include thumbSelector() {
background: map_get($datepickerBG, selected);
border-color: map_get($datepickerBG, selected);
}
}
// Thumb
// -------------------------------------------------
@include thumbSelector() {
@include thumb;
}
&::-webkit-slider-thumb {
margin-top: -$rangeThumbSize/2;
}
// Track
// -------------------------------------------------
@include trackSelector() {
@include track;
}
&::-ms-fill-lower {
background: transparent;
}
&:focus::-ms-fill-lower {
}
&::-ms-fill-upper {
background: transparent;
}
&:focus::-ms-fill-upper {
}
}
span {
padding: 0 12px;
}
}
.datepicker--time-icon {
color: map_get($datepickerTextColor, navArrows);
border: 1px solid;
border-radius: 50%;
font-size: 16px;
position: relative;
margin: 0 5px -1px 0;
width: 1em;
height: 1em;
&:after, &:before {
content: '';
background: currentColor;
position: absolute;
}
&:after {
height: .4em;
width: 1px;
left: calc(50% - 1px);
top: calc(50% + 1px);
transform: translateY(-100%);
}
&:before {
width: .4em;
height: 1px;
top: calc(50% + 1px);
left: calc(50% - 1px);
}
}

View File

@ -0,0 +1,10 @@
var static = require('node-static'),
http = require('http');
var file = new static.Server('.');
http.createServer(function (request, response) {
request.addListener('end', function () {
file.serve(request, response);
}).resume();
}).listen(3000);

View File

@ -0,0 +1,24 @@
var gulp = require('gulp'),
rename = require('gulp-rename'),
sass = require('gulp-sass'),
postcss = require('gulp-postcss'),
autoprefixer = require('autoprefixer')({ browsers: ['last 2 versions'] }),
clone = require('gulp-clone'),
minify = require('gulp-minify-css'),
concat = require('gulp-concat');
module.exports = function () {
var stream = gulp.src('src/sass/*.scss')
.pipe(concat('datepicker.scss'))
.pipe(sass().on('error', sass.logError))
.pipe(postcss([autoprefixer]));
stream.pipe(clone())
.pipe(minify())
.pipe(rename('datepicker.min.css'))
.pipe(gulp.dest('dist/css'));
stream.pipe(clone())
.pipe(rename('datepicker.css'))
.pipe(gulp.dest('dist/css'))
};

View File

@ -0,0 +1,17 @@
var gulp = require('gulp'),
rename = require('gulp-rename'),
sass = require('gulp-sass'),
postcss = require('gulp-postcss'),
autoprefixer = require('autoprefixer')({ browsers: ['last 2 versions'] }),
clone = require('gulp-clone'),
minify = require('gulp-minify-css'),
concat = require('gulp-concat');
module.exports = function () {
gulp.src('docs/sass/init.scss')
.pipe(concat('style.css'))
.pipe(sass().on('error', sass.logError))
.pipe(postcss([autoprefixer]))
.pipe(minify())
.pipe(gulp.dest('docs/css'))
};

View File

@ -0,0 +1,9 @@
var gulp = require('gulp'),
gzip = require('gulp-gzip');
module.exports = function (cb) {
gulp.src('dist/js/datepicker.min.js')
.pipe(gzip())
.pipe(gulp.dest('dist/'))
};

View File

@ -0,0 +1,12 @@
var gulp = require('gulp'),
rename = require('gulp-rename'),
wrap = require('gulp-wrap'),
sass = require('gulp-sass'),
clone = require('gulp-clone'),
concat = require('gulp-concat');
module.exports = function () {
gulp.src('src/js/i18n/*.js')
.pipe(wrap(';(function ($) { <%=contents%> })(jQuery);'))
.pipe(gulp.dest('dist/js/i18n'))
};

View File

@ -0,0 +1,38 @@
var gulp = require('gulp'),
plumber = require('gulp-plumber'),
_jade = require('jade'),
jade = require('gulp-jade');
_jade.filters.code = function( block ) {
return block
.replace( /\&hellip;/g, '…' )
.replace( /&/g, '&amp;' )
.replace( /</g, '&lt;' )
.replace( />/g, '&gt;' )
.replace( /"/g, '&quot;' )
.replace( /#/g, '&#35;' )
.replace( /\\/g, '\\\\' );
};
module.exports = {
ru: function () {
gulp.src('docs/jade/pages/index-ru.jade')
.pipe(plumber())
.pipe(jade({
data: {
lang: 'ru'
}
}))
.pipe(gulp.dest('docs/'))
},
en: function () {
gulp.src('docs/jade/pages/index.jade')
.pipe(plumber())
.pipe(jade({
data: {
lang: 'en'
}
}))
.pipe(gulp.dest('docs/'))
}
};

View File

@ -0,0 +1,26 @@
var gulp = require('gulp'),
rename = require('gulp-rename'),
uglify = require('gulp-uglify'),
clone = require('gulp-clone'),
wrap = require('gulp-wrap'),
concat = require('gulp-concat');
module.exports = function () {
var stream = gulp.src([
'src/js/datepicker.js',
'src/js/body.js',
'src/js/navigation.js',
'src/js/timepicker.js'
])
.pipe(concat('datepicker.js'))
.pipe(wrap(';(function (window, $, undefined) { <%=contents%> })(window, jQuery);'));
stream.pipe(clone())
.pipe(gulp.dest('dist/js'));
stream.pipe(clone())
.pipe(uglify())
.pipe(rename('datepicker.min.js'))
.pipe(gulp.dest('dist/js'))
};

View File

@ -0,0 +1,37 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Air Datepicker tests</title>
<link rel="stylesheet" href="../dist/css/datepicker.min.css"/>
<link rel="stylesheet" href="../node_modules/mocha/mocha.css"/>
<script type="text/javascript" src="../bower_components/jquery/dist/jquery.min.js"></script>
<script type="text/javascript" src="../dist/js/datepicker.js"></script>
<script type="text/javascript" src="../dist/js/i18n/datepicker.en.js"></script>
<script type="text/javascript" src="../dist/js/i18n/datepicker.de.js"></script>
<script type="text/javascript" src="../node_modules/mocha/mocha.js"></script>
<script type="text/javascript" src="../node_modules/chai/chai.js"></script>
<script type="text/javascript">
mocha.setup('bdd');
</script>
<script type="text/javascript" src="specs/options.js"></script>
<script type="text/javascript" src="specs/events.js"></script>
<script type="text/javascript" src="specs/static-methods.js"></script>
<script type="text/javascript" src="specs/api.js"></script>
<style type="text/css">
/* Remove transitions to test position options*/
.datepicker {
transition-duration: 0s !important;
}
</style>
</head>
<body>
<div id="container"></div>
<div id="mocha"></div>
<script type="text/javascript">
mocha.run();
</script>
</body>
</html>

View File

@ -0,0 +1,65 @@
describe('API', function () {
var assert = chai.assert,
expect = chai.expect,
destroy = true,
$altInput,
$input, dp;
before(function () {
$input = $('<input>').appendTo('#container');
$altInput = $('<input class="alt-field">').appendTo('#container');
});
afterEach(function () {
if (dp && destroy) {
dp.destroy();
}
destroy = true;
});
after(function () {
$input.remove();
$altInput.remove();
});
describe('selectDate', function () {
it('should select passed date', function () {
dp = $input.datepicker().data('datepicker');
var date = new Date();
dp.selectDate(date);
expect(dp.selectedDates).to.have.length(1);
expect(dp.selectedDates[0]).to.be.equal(date)
});
it('should select multiple dates if {multipleDates: true}', function () {
dp = $input.datepicker({
multipleDates: true
}).data('datepicker');
var date = new Date(2016, 4, 16),
date2 = new Date(2016, 4, 18);
dp.selectDate(date);
dp.selectDate(date2);
expect(dp.selectedDates).to.have.length(2);
});
it('should swap dates if {range: true} and second date is smaller then first', function () {
dp = $input.datepicker({
range: true
}).data('datepicker');
var date = new Date(2016, 4, 18),
date2 = new Date(2016, 4, 16);
dp.selectDate(date);
dp.selectDate(date2);
expect(dp.selectedDates[0]).to.be.equal(date2);
})
});
});

View File

@ -0,0 +1,199 @@
describe('Events', function () {
var assert = chai.assert,
expect = chai.expect,
destroy = true,
$span,
$altInput,
$input, dp;
before(function () {
$input = $('<input>').appendTo('#container');
$span = $('<span>').appendTo('#container');
$altInput = $('<input class="alt-field">').appendTo('#container');
});
afterEach(function () {
if (dp && destroy) {
dp.destroy();
dp = '';
}
destroy = true;
});
after(function () {
$input.remove();
$span.remove();
$altInput.remove();
});
describe('onSelect', function () {
it('should add callback when user selects date', function () {
var date = new Date(2016,0,13);
dp = $input.datepicker({
onSelect: function (fd, d, inst) {
expect(fd).to.be.equal('13.01.2016');
expect(d).to.be.instanceof(Date);
expect(inst).to.be.instanceof($.fn.datepicker.Constructor);
}
}).data('datepicker');
dp.selectDate(date);
});
it('should receive array of dates when "multipleDates" set to true', function () {
var date = new Date(2016,0,22),
date2 = new Date(2016,0,23),
dates = [];
dp = $input.datepicker({
multipleDates: true,
onSelect: function (fd, d, inst) {
dates = d;
}
}).data('datepicker');
dp.selectDate(date);
dp.selectDate(date2);
expect(dates).to.have.length(2)
})
it('should receive array of dates when "range" set to true', function () {
var date = new Date(2016,0,22),
date2 = new Date(2016,0,23),
dates = [];
dp = $input.datepicker({
range: true,
onSelect: function (fd, d, inst) {
dates = d;
}
}).data('datepicker');
dp.selectDate(date);
dp.selectDate(date2);
expect(dates).to.have.length(2)
})
});
describe('onShow', function () {
it('should add callback when datepicker is showing', function () {
var test = '';
dp = $input.datepicker({
onShow: function (dp, completed) {
if (!completed) {
test = dp;
}
}
}).data('datepicker');
dp.show();
expect(test).to.be.equal(dp);
})
});
describe('onHide', function () {
it('should add callback when datepicker is hiding (after transition completed)', function () {
var test = '';
dp = $input.datepicker({
onHide: function (dp, completed) {
if (!completed) {
test = dp;
}
}
}).data('datepicker');
dp.show();
dp.hide();
expect(test).to.be.equal(dp);
});
});
describe('onRenderCell', function () {
it('should add callback when cell is rendered', function () {
dp = $input.datepicker({
onRenderCell: function (d, type) {
expect(d).to.be.instanceOf(Date);
expect(type).to.be.equal('day');
}
}).data('datepicker');
})
});
describe('onChangeView', function () {
it('should add callback when view is changed', function () {
var _view;
dp = $input.datepicker({
onChangeView: function (view) {
_view = view;
}
}).data('datepicker');
dp.view = 'months';
expect(_view).to.be.equal('months')
})
});
describe('onChangeMonth', function () {
it('should add callback when month is changed', function () {
var _month, _year;
dp = $input.datepicker({
startDate: new Date(2016, 0, 22),
onChangeMonth: function (month, year) {
_month = month;
_year = year;
}
}).data('datepicker');
$('.datepicker--nav-action[data-action="next"]',dp.$datepicker).click();
expect(_month).to.be.equal(1);
expect(_year).to.be.equal(2016)
})
});
describe('onChangeYear', function () {
it('should add callback when year is changed', function () {
var _year;
dp = $input.datepicker({
startDate: new Date(2016, 0, 22),
view: 'months',
onChangeYear: function (year) {
_year = year;
}
}).data('datepicker');
$('.datepicker--nav-action[data-action="next"]',dp.$datepicker).click();
expect(_year).to.be.equal(2017)
})
});
describe('onChangeDecade', function () {
it('should add callback when decade is changed', function () {
var _decade;
dp = $input.datepicker({
startDate: new Date(2016, 0, 22),
view: 'years',
onChangeDecade: function (decade) {
_decade = decade;
}
}).data('datepicker');
$('.datepicker--nav-action[data-action="next"]',dp.$datepicker).click();
expect(_decade).to.have.length(2);
expect(_decade[0]).to.be.equal(2020);
expect(_decade[1]).to.be.equal(2029);
})
});
});

View File

@ -0,0 +1,973 @@
describe('Options', function () {
var assert = chai.assert,
expect = chai.expect,
destroy = true,
$altInput,
$input, dp;
before(function () {
$input = $('<input>').appendTo('#container');
$altInput = $('<input class="alt-field">').appendTo('#container');
});
afterEach(function () {
if (dp && destroy) {
dp.destroy();
}
destroy = true;
});
after(function () {
$input.remove();
$altInput.remove();
});
describe('classes', function () {
it('should add extra classes to datepicker', function () {
dp = $input.datepicker({
classes: 'custom-class'
}).data('datepicker');
expect(dp.$datepicker.attr('class')).to.have.string('custom-class')
})
});
describe('inline', function () {
it('if true, should be always visible', function () {
dp = $input.datepicker({
inline: true
}).data('datepicker');
expect(dp.$datepicker.parent().attr('class')).to.have.string('datepicker-inline');
});
it('if false, should be hidden', function () {
dp = $input.datepicker({
inline: false
}).data('datepicker');
expect(dp.$datepicker.parent().attr('class')).to.have.string('datepickers-container');
})
});
describe('language', function () {
it('should change language to English if it `en`', function () {
dp = $input.datepicker({
language: 'en'
}).data('datepicker');
expect(dp.loc.days).to.eql($.fn.datepicker.language.en.days);
});
it('should change language to custom if object is passed', function () {
var daysMin = ['В','П','В','С','Ч','П','С'];
dp = $input.datepicker({
language: {
daysMin: daysMin
}
}).data('datepicker');
expect(dp.loc.daysMin).to.eql(daysMin);
expect(dp.loc.days).to.eql($.fn.datepicker.language.ru.days);
})
});
describe('startDate', function () {
it('should change initial viewing date', function () {
dp = $input.datepicker({
startDate: new Date(2014,11,12)
}).data('datepicker');
expect(dp.$nav.text()).to.have.string('Декабрь');
expect(dp.$nav.text()).to.have.string('2014');
})
});
describe('firstDay', function () {
it('should change first day of week', function () {
dp = $input.datepicker({
firstDay: 2
}).data('datepicker');
var firstCell = $('.datepicker--days-names .datepicker--day-name', dp.$datepicker).eq(0);
assert.equal(firstCell.text(),'Вт')
})
it('should change first day of week to `Воскресенье` if it `0`', function () {
dp = $input.datepicker({
firstDay: 0
}).data('datepicker');
var firstCell = $('.datepicker--days-names .datepicker--day-name', dp.$datepicker).eq(0);
assert.equal(firstCell.text(),'Вс')
})
});
describe('weekends', function () {
it('should change days, which should considered to be weekends', function () {
dp = $input.datepicker({
weekends: [0, 2],
firstDay: 0
}).data('datepicker');
var $cells = $('.datepicker--cell-day', dp.$datepicker);
expect($cells.eq(0).attr('class')).to.have.string('-weekend-')
expect($cells.eq(2).attr('class')).to.have.string('-weekend-')
})
});
describe('dateFormat', function () {
var date = new Date(2015, 6, 4, 11, 5),
formats = {
'@': date.getTime(),
'aa': 'am',
'AA': 'AM',
'h': 11,
'hh': 11,
'i': 5,
'ii': '05',
'dd': '04',
'd': 4,
'DD': 'Суббота',
'D': 'Суб',
'mm': '07',
'm': 7,
'MM': 'Июль',
'M': 'Июл',
'yyyy' : 2015,
'yy': 15,
'yyyy1': 2010,
'yyyy2': 2019
};
for (var format in formats) {
(function (format) {
it(format, function () {
dp = $input.datepicker({
dateFormat: 'Selected date: ' + format
}).data('datepicker');
dp.selectDate(date);
assert.equal(dp.$el.val(), 'Selected date: ' + formats[format]);
})
}(format))
}
it('should work with special characters', function () {
dp = $input.datepicker({
language: 'de',
dateFormat: 'Month is MM'
}).data('datepicker');
dp.selectDate(new Date(2016, 2, 1));
expect(dp.$el.val()).to.be.equal('Month is März');
})
});
describe('altField', function () {
it('should define `$altField` if selector or jQuery object is passed', function () {
dp = $input.datepicker({
altField: '.alt-field'
}).data('datepicker');
assert(dp.$altField.length);
})
})
describe('altFieldFormat', function () {
it('should define date format for alternative field', function () {
var date = new Date(2015, 11, 17);
dp = $input.datepicker({
altField: '.alt-field',
altFieldDateFormat: 'dd-mm-yyyy'
}).data('datepicker');
dp.selectDate(date);
assert.equal(dp.$altField.val(), '17-12-2015');
});
it('should support 24 hour mode, even if main date format is in 12', function () {
var date = new Date(2015, 11, 17, 22, 47);
dp = $input.datepicker({
timepicker: true,
timeFormat: 'hh:ii aa',
altField: '.alt-field',
altFieldDateFormat: 'dd-mm-yyyy hh:ii'
}).data('datepicker');
dp.selectDate(date);
assert.equal(dp.$altField.val(), '17-12-2015 22:47');
});
it('should support 12 hour mode', function () {
var date = new Date(2015, 11, 17, 22, 47);
dp = $input.datepicker({
timepicker: true,
timeFormat: 'hh:ii',
altField: '.alt-field',
altFieldDateFormat: 'dd-mm-yyyy hh:ii aa'
}).data('datepicker');
dp.selectDate(date);
assert.equal(dp.$altField.val(), '17-12-2015 10:47 pm');
})
});
describe('toggleSelected', function () {
it('when true, click on selected cells should remove selection', function () {
var date = new Date(2015, 11, 17);
dp = $input.datepicker().data('datepicker');
dp.selectDate(date);
dp._getCell(date, 'day').click();
expect(dp.selectedDates).to.have.length(0)
});
it('when false, click on selected cell must do nothing', function () {
var date = new Date(2015, 11, 17);
dp = $input.datepicker({
toggleSelected: false
}).data('datepicker');
dp.selectDate(date);
dp._getCell(date, 'day').click();
expect(dp.selectedDates).to.have.length(1)
})
});
describe('keyboardNav', function () {
var year = 2015,
month = 10,
day = 18,
date = new Date(year, month, day),
cases = [
{
it: '→: should focus next cell',
keys: [39],
validDate: new Date(year, month, day + 1)
},
{
it: '←: should focus previous cell',
keys: [37],
validDate: new Date(year, month, day - 1)
},
{
it: '↑: should focus +7 day cell',
keys: [40],
validDate: new Date(year, month, day + 7)
},
{
it: '↓: should focus -7 day cell',
keys: [38],
validDate: new Date(year, month, day - 7)
},
{
it: 'Ctrl + →: should focus next month',
keys: [17, 39],
validDate: new Date(year, month + 1, day)
},
{
it: 'Ctrl + ←: should focus previous month',
keys: [17, 37],
validDate: new Date(year, month - 1, day)
},
{
it: 'Shift + →: should focus next year',
keys: [16, 39],
validDate: new Date(year + 1, month, day)
},
{
it: 'Shift + ←: should focus previous year',
keys: [16, 37],
validDate: new Date(year - 1, month, day)
},
{
it: 'Alt + →: should focus on +10 year cell',
keys: [18, 39],
validDate: new Date(year + 10, month, day)
},
{
it: 'Alt + ←: should focus on -10 year cell',
keys: [18, 37],
validDate: new Date(year - 10, month, day)
},
{
it: 'Ctrl + Shift + ↑: should change view to months',
keys: [16, 17, 38],
view: 'months'
}
];
cases.forEach(function (currentCase) {
var keys = currentCase.keys,
valid = currentCase.validDate;
it(currentCase.it, function () {
dp = $input.datepicker().data('datepicker');
dp.selectDate(date);
keys.forEach(function (key) {
$input.trigger($.Event('keydown', {which: key}));
});
var focused = dp.focused;
if (currentCase.validDate) {
assert.equal(valid.getFullYear(), focused.getFullYear());
assert.equal(valid.getMonth(), focused.getMonth());
assert.equal(valid.getDate(), focused.getDate());
}
if (currentCase.view) {
assert.equal(currentCase.view, dp.view)
}
})
});
});
describe('position', function () {
var iDims, dpDims,
offset;
function prepare (position) {
dp = $input.datepicker({position: position}).data('datepicker');
$input.focus();
iDims = {
width: $input.outerWidth(),
height: $input.outerHeight(),
left: $input.offset().left,
top: $input.offset().top
};
dpDims = {
width: dp.$datepicker.outerWidth(),
height: dp.$datepicker.outerHeight(),
left: dp.$datepicker.offset().left,
top: dp.$datepicker.offset().top
};
offset = dp.opts.offset;
}
it('should set `bottom left` position', function () {
prepare('bottom left');
assert.equal(iDims.top + iDims.height + offset, dpDims.top);
assert.equal(iDims.left, dpDims.left);
});
it('should set `top right` position', function () {
prepare('top right');
assert.equal(iDims.top, dpDims.top + dpDims.height + offset);
assert.equal(iDims.left + iDims.width, dpDims.left + dpDims.width);
});
it('should set `right bottom` position', function () {
prepare('right bottom');
assert.equal(iDims.left + iDims.width + offset, dpDims.left);
assert.equal(iDims.top + iDims.height, dpDims.top + dpDims.height);
});
it('should set `left center` position', function () {
prepare('left center');
assert.equal(iDims.left - offset, dpDims.left + dpDims.width);
assert.equal(iDims.top + iDims.height/2, dpDims.top + dpDims.height/2);
});
it('should set `bottom center` position', function () {
prepare('bottom center');
assert.equal(iDims.top + iDims.height + offset, dpDims.top);
assert.equal(iDims.left + iDims.width/2, dpDims.left + dpDims.width/2);
})
});
describe('offset', function () {
var iDims, dpDims,
offset;
var i = 0;
while(i < 5) {
offset = Math.round(Math.random() * 50);
(function (offset) {
it('should set offset ' + offset + ' from main axis', function () {
dp = $input.datepicker({
offset: offset
}).data('datepicker');
$input.focus();
iDims = {
width: $input.outerWidth(),
height: $input.outerHeight(),
left: $input.offset().left,
top: $input.offset().top
};
dpDims = {
width: dp.$datepicker.outerWidth(),
height: dp.$datepicker.outerHeight(),
left: dp.$datepicker.offset().left,
top: dp.$datepicker.offset().top
};
assert.equal(iDims.top + iDims.height + offset, dpDims.top);
});
})(offset);
i++;
}
});
describe('view', function () {
it('should set initial datepicker view to `months`', function () {
dp = $input.datepicker({view: 'months'}).data('datepicker');
assert.equal('months', dp.view)
});
it('should set initial datepicker view to `years`', function () {
dp = $input.datepicker({view: 'years'}).data('datepicker');
assert.equal('years', dp.view)
})
});
describe('minView', function () {
it('should set minimum possible view', function () {
dp = $input.datepicker({
view: 'months',
minView: 'months'
}).data('datepicker');
$('.datepicker--cell-month', dp.$datepicker).eq(0).click();
assert.equal('months', dp.view)
});
});
describe('showOtherMonths', function () {
var date = new Date(2015, 11, 22);
it('if `true` should show days from other months', function () {
dp = $input.datepicker().data('datepicker');
dp.date = date;
var $cell = $('.datepicker--cell-day.-other-month-', dp.$datepicker).eq(0);
assert($cell.text(), 'must have text')
});
it('if `false` should hide days from other months', function () {
dp = $input.datepicker({showOtherMonths: false}).data('datepicker');
dp.date = date;
var $cell = $('.datepicker--cell-day.-other-month-', dp.$datepicker).eq(0);
expect($cell.text()).to.be.empty;
});
});
describe('selectOtherMonths', function () {
var date = new Date(2015, 11, 22);
it('if `true` you can select cells from other months', function () {
dp = $input.datepicker().data('datepicker');
dp.date = date;
var $cell = $('.datepicker--cell-day.-other-month-', dp.$datepicker).eq(0);
$cell.click();
expect(dp.selectedDates).to.have.length(1)
});
it('if `false` you can not select cells from other months ', function () {
dp = $input.datepicker({selectOtherMonths: false}).data('datepicker');
dp.date = date;
var $cell = $('.datepicker--cell-day.-other-month-', dp.$datepicker).eq(0);
$cell.click();
expect(dp.selectedDates).to.have.length(0)
});
});
describe('moveToOtherMonthsOnSelect', function () {
var date = new Date(2015, 11, 22);
it('if `true` datepicker will translate to other month if date from other month is selected', function () {
dp = $input.datepicker().data('datepicker');
dp.date = date;
var $cell = $('.datepicker--cell-day.-other-month-', dp.$datepicker).eq(0);
$cell.click();
assert.equal(dp.date.getMonth(), 10)
});
it('if `false` datepicker will stay on same month when selecting dates from other month', function () {
dp = $input.datepicker({moveToOtherMonthsOnSelect: false}).data('datepicker');
dp.date = date;
var $cell = $('.datepicker--cell-day.-other-month-', dp.$datepicker).eq(0);
$cell.click();
assert.equal(dp.date.getMonth(), 11)
});
});
describe('showOtherYears', function () {
var date = new Date(2015, 11, 22);
it('if `true` should show years from other decades', function () {
dp = $input.datepicker({
view: 'years'
}).data('datepicker');
dp.date = date;
var $cell = $('.datepicker--cell-year.-other-decade-', dp.$datepicker).eq(0);
assert($cell.text(), 'must have text')
});
it('if `false` should hide years from other decades', function () {
destroy = false;
dp = $input.datepicker({
view: 'years',
showOtherYears: false
}).data('datepicker');
dp.date = date;
var $cell = $('.datepicker--cell-year.-other-decade-', dp.$datepicker).eq(0);
expect($cell.text()).to.be.empty;
});
});
describe('selectOtherYears', function () {
var date = new Date(2015, 11, 22);
it('if `true` you can select cells from other decades', function () {
dp = $input.datepicker({
view: 'years',
minView: 'years',
selectOtherYears: true
}).data('datepicker');
dp.date = date;
var $cell = $('.datepicker--cell-year.-other-decade-', dp.$datepicker).eq(0);
$cell.click();
expect(dp.selectedDates).to.have.length(1)
});
it('if `false` you can not select cells from other months ', function () {
dp = $input.datepicker({
view: 'years',
minView: 'years',
selectOtherYears: false
}).data('datepicker');
dp.date = date;
var $cell = $('.datepicker--cell-year.-other-decade-', dp.$datepicker).eq(0);
$cell.click();
expect(dp.selectedDates).to.have.length(0)
});
});
describe('moveToOtherYearsOnSelect', function () {
var date = new Date(2015, 11, 22);
it('if `true` datepicker will translate to other decade if date from other decade is selected', function () {
dp = $input.datepicker({
view: 'years',
minView: 'years',
moveToOtherYearsOnSelect: true
}).data('datepicker');
dp.date = date;
var $cell = $('.datepicker--cell-year.-other-decade-', dp.$datepicker).eq(0);
$cell.click();
assert.equal(dp.date.getFullYear(), 2009)
});
it('if `false` datepicker will stay on same decade when selecting dates from other decade', function () {
dp = $input.datepicker({
view: 'years',
minView: 'years',
moveToOtherYearsOnSelect: false
}).data('datepicker');
dp.date = date;
var $cell = $('.datepicker--cell-year.-other-decade-', dp.$datepicker).eq(0);
$cell.click();
assert.equal(dp.date.getFullYear(), 2015)
});
});
describe('minDate', function () {
it('should set minimum possible date to choose', function () {
var date = new Date(2015, 11, 30);
dp = $input.datepicker({
minDate: date
}).data('datepicker');
dp.date = date;
var $cell = $('.datepicker--cell-day[data-year="2015"][data-month="11"][data-date="30"]', dp.$datepicker);
expect($cell.prev().attr('class')).to.have.string('-disabled-')
})
});
describe('maxDate', function () {
it('should set maximum possible date to choose', function () {
var date = new Date(2015, 11, 30);
dp = $input.datepicker({
maxDate: date
}).data('datepicker');
dp.date = date;
var $cell = $('.datepicker--cell-day[data-year="2015"][data-month="11"][data-date="30"]', dp.$datepicker);
expect($cell.next().attr('class')).to.have.string('-disabled-')
})
});
describe('disableNavWhenOutOfRange', function () {
it('if `true` then navigation buttons will be disabled if there is no more possible dates to select to in next or prev month', function () {
var date = new Date(2015, 11, 30);
dp = $input.datepicker({
minDate: date,
inline: true
}).data('datepicker');
dp.date = date;
var $prev = $('.datepicker--nav-action[data-action="prev"]', dp.$datepicker);
expect($prev.attr('class')).to.have.string('-disabled-')
})
});
describe('multipleDates', function () {
it('if `true` then one can select multiple dates', function () {
dp = $input.datepicker({
multipleDates: true
}).data('datepicker');
dp.selectDate(new Date(2016, 0, 7));
dp.selectDate(new Date(2016, 0, 8));
dp.selectDate(new Date(2016, 0, 9));
expect(dp.selectedDates).to.have.length(3)
});
it('if `number` should limit length of selected dates by its value', function () {
dp = $input.datepicker({
multipleDates: 3
}).data('datepicker');
dp.selectDate(new Date(2016, 0, 7));
dp.selectDate(new Date(2016, 0, 8));
dp.selectDate(new Date(2016, 0, 9));
dp.selectDate(new Date(2016, 0, 10));
dp.selectDate(new Date(2016, 0, 11));
expect(dp.selectedDates).to.have.length(3)
})
});
describe('multipleDatesSeparator', function () {
it('defines multiple dates separator sign', function () {
dp = $input.datepicker({
multipleDates: true,
multipleDatesSeparator: ' separator '
}).data('datepicker');
dp.selectDate(new Date(2016, 0, 12));
dp.selectDate(new Date(2016, 0, 13))
expect($input.val()).to.have.string(' separator ')
})
});
describe('todayButton', function () {
it('should add "today" button if true', function () {
dp = $input.datepicker({
todayButton: true
}).data('datepicker');
var $button = $('.datepicker--button', dp.$datepicker);
expect($button.length).to.be.equal(1);
expect($button.data('action')).to.be.equal('today');
})
});
describe('clearButton', function () {
it('should add "clear" button if true', function () {
dp = $input.datepicker({
clearButton: true
}).data('datepicker');
var $button = $('.datepicker--button', dp.$datepicker);
expect($button.length).to.be.equal(1);
expect($button.data('action')).to.be.equal('clear');
})
});
describe('showEvent', function () {
it('should define event type on which datepicker will be shown', function () {
dp = $input.datepicker({
showEvent: 'click'
}).data('datepicker');
$input.click();
expect(dp.visible).to.be.equal(true)
})
});
describe('autoClose', function () {
it('if true, when datepicker will close after date was selected', function () {
dp = $input.datepicker({
autoClose: true
}).data('datepicker');
dp.show();
dp.selectDate(new Date());
expect(dp.visible).to.be.equal(false)
});
it('if false, when datepicker will not close after date was selected', function () {
dp = $input.datepicker({
autoClose: false
}).data('datepicker');
dp.show();
dp.selectDate(new Date());
expect(dp.visible).to.be.equal(true)
})
});
describe('monthsField', function () {
it('defines which field from localization must be used as source for months name in "months view"', function () {
dp = $input.datepicker({
monthsField: 'months',
view: 'months'
}).data('datepicker');
var $cell = $('.datepicker--cell-month').eq(0);
expect($cell.text()).to.be.equal('Январь');
});
});
describe('prevHtml', function () {
it('defines html which should be used in "previous" button', function () {
dp = $input.datepicker({
prevHtml: 'previous'
}).data('datepicker');
var $prev = $('[data-action="prev"]', dp.$datepicker);
expect($prev.html()).to.be.equal('previous');
});
});
describe('nextHtml', function () {
it('defines html which should be used in "next" button', function () {
dp = $input.datepicker({
nextHtml: 'next'
}).data('datepicker');
var $next = $('[data-action="next"]', dp.$datepicker);
expect($next.html()).to.be.equal('next');
});
});
describe('navTitles', function () {
it('defines datepicker titles', function () {
dp = $input.datepicker({
navTitles: {
days: 'Days',
months: 'Months',
years: 'Years'
}
}).data('datepicker');
var $title = $('.datepicker--nav-title', dp.$datepicker);
expect($title.html()).to.have.string('Days');
dp.view = 'months';
$title = $('.datepicker--nav-title', dp.$datepicker);
expect($title.html()).to.have.string('Months');
dp.view = 'years';
$title = $('.datepicker--nav-title', dp.$datepicker);
expect($title.html()).to.have.string('Years');
});
});
describe('timepicker', function () {
it('should add timepicker to calendar', function () {
dp = $input.datepicker({
timepicker: true
}).data('datepicker');
var $time = $('.datepicker--time', dp.$datepicker);
expect($time).to.have.length(1)
})
});
describe('onlyTimepicker', function () {
it('only timepicker should be visible', function () {
dp = $input.datepicker({
timepicker: true,
onlyTimepicker: true
}).data('datepicker');
var $time = $('.datepicker--time', dp.$datepicker),
$cells = $('.datepicker--cells', dp.$datepicker),
$nav = $('.datepicker--nav-title', dp.$datepicker),
_class = dp.$datepicker.hasClass('-only-timepicker-');
expect($time).to.have.length(1);
expect($cells).to.have.length(0);
expect($nav).to.have.length(0);
expect(_class).to.be.equal(true);
})
});
describe('dateTimeSeparator', function () {
it('should define separator between date string and time', function () {
var date = new Date(2016,2,9,11,24);
dp = $input.datepicker({
timepicker: true,
onSelect: function (fd, d) {
expect(fd).to.be.equal('09.03.2016 time separator 11:24')
},
dateTimeSeparator: ' time separator '
}).data('datepicker');
dp.selectDate(date);
})
});
describe('timeFormat', function () {
it('should define time format', function () {
var date = new Date(2016,2,9,9,4);
dp = $input.datepicker({
timepicker: true,
timeFormat: 'h - ii',
onSelect: function (fd, d) {
expect(fd).to.be.equal('09.03.2016 9 - 04')
}
}).data('datepicker');
dp.selectDate(date);
})
});
describe('minHours', function () {
it('should set minimum hours value', function () {
var date = new Date();
date.setHours(9);
dp = $input.datepicker({
timepicker: true,
minHours: 10,
onSelect: function (fd, d) {
var hours = d.getHours();
expect(hours).to.be.equal(10)
}
}).data('datepicker');
dp.selectDate(date);
})
});
describe('minMinutes', function () {
it('should set minimum minutes value', function () {
var date = new Date();
date.setMinutes(20);
dp = $input.datepicker({
timepicker: true,
minMinutes: 30,
onSelect: function (fd, d) {
var minutes = d.getMinutes();
expect(minutes).to.be.equal(30)
}
}).data('datepicker');
dp.selectDate(date);
})
});
describe('maxHours', function () {
it('should set maximum hours value', function () {
var date = new Date();
date.setHours(20);
dp = $input.datepicker({
timepicker: true,
maxHours: 18,
onSelect: function (fd, d) {
var hours = d.getHours();
expect(hours).to.be.equal(18)
}
}).data('datepicker');
dp.selectDate(date);
})
});
describe('maxMinutes', function () {
it('should set maximum minutes value', function () {
var date = new Date();
date.setMinutes(50);
dp = $input.datepicker({
timepicker: true,
maxMinutes: 30,
onSelect: function (fd, d) {
var minutes = d.getMinutes();
expect(minutes).to.be.equal(30)
}
}).data('datepicker');
dp.selectDate(date);
})
})
});

View File

@ -0,0 +1,131 @@
var assert = chai.assert,
expect = chai.expect,
plugin = $.fn.datepicker.Constructor;
describe('Datepicker', function () {
describe('getDaysCount', function () {
it('should return 31 days in December', function () {
assert.equal(plugin.getDaysCount(new Date(2015, 11)), 31)
});
it('should return 30 days in September', function () {
assert.equal(plugin.getDaysCount(new Date(2015, 8)), 30)
});
it('should return 28 days in February', function () {
assert.equal(plugin.getDaysCount(new Date(2015, 1)), 28)
})
});
describe('getParsedDate', function () {
var currentDate = new Date(),
date = plugin.getParsedDate(currentDate);
it('should return object with detailed date fields', function () {
expect(date).to.have.all.keys(['year','month','fullMonth','date', 'fullDate', 'day','hours', 'fullHours', 'minutes', 'fullMinutes']);
});
describe('.year', function () {
it('`year` must be equal to current year', function () {
assert.equal(currentDate.getFullYear(), date.year);
})
});
describe('.month', function () {
it('`month` must be equal to current month', function () {
assert.equal(currentDate.getMonth(), date.month);
})
});
describe('.fullMonth', function () {
it('`fullMonth` must be equal to current month + 1 with leading zero', function () {
assert.equal(currentDate.getMonth() < 10 ? '0' + (currentDate.getMonth() + 1) : currentDate.getMonth() + 1 , date.fullMonth);
})
});
describe('.date', function () {
it('`date` must be equal to current date', function () {
assert.equal(currentDate.getDate() , date.date);
})
});
describe('.fullDate', function () {
it('`fullDate` must be equal to current date with leading zero', function () {
assert.equal(currentDate.getDate() < 10 ? '0' + currentDate.getDate() : currentDate.getDate() , date.fullDate);
})
});
describe('.day', function () {
it('`day` must be equal to current day', function () {
assert.equal(currentDate.getDay(), date.day);
})
});
describe('.hours', function () {
it('`hours` must be equal to current hours', function () {
assert.equal(currentDate.getHours(), date.hours);
})
});
describe('.fullHours', function () {
it('`fullHours` must be equal to current hours with leading zero', function () {
assert.equal(currentDate.getHours() < 10 ? '0' + currentDate.getHours() : currentDate.getHours(), date.hours);
})
});
describe('.minutes', function () {
it('`minutes` must be equal to current minutes', function () {
assert.equal(currentDate.getMinutes(), date.minutes);
})
});
describe('.fullMinutes', function () {
it('`fullMinutes` must be equal to current hours with leading zero', function () {
assert.equal(currentDate.getMinutes() < 10 ? '0' + currentDate.getMinutes() : currentDate.getMinutes(), date.fullMinutes);
})
})
});
describe('getDecade', function () {
it('should return array with first and last years in decade', function () {
var decade = plugin.getDecade(new Date(2015, 1));
expect(decade).to.be.an('array');
assert.equal(decade[0], 2010)
assert.equal(decade[1], 2019)
})
})
describe('template', function () {
it('should return string with replaced #{} signs', function () {
var template = 'Hello #{who}';
assert.equal(plugin.template(template, {who:'World!'}), 'Hello World!')
})
})
describe('isSame', function () {
var date1 = new Date(2015, 11, 14),
date2 = new Date(2015, 11, 14),
date3 = new Date(2015, 10, 14),
date4 = new Date(2016, 11, 14);
it('should return true if dates are equal', function () {
assert(plugin.isSame(date1,date2))
})
it('should return false when checking dates with different months', function () {
assert.isFalse(plugin.isSame(date1,date3))
})
it('should return false when checking dates with different years', function () {
assert.isFalse(plugin.isSame(date1,date4))
})
it('should return true when comparing months', function () {
assert(plugin.isSame(date1, date2,'month'))
})
it('should return false when comparing months from different years', function () {
assert.isFalse(plugin.isSame(date1, date4, 'month'))
})
it('should return true when comparing years', function () {
assert(plugin.isSame(date1, date2, 'year'))
})
})
describe('less(date1, date2)', function () {
it('should return true if date2 less then date1', function () {
assert(plugin.less(new Date(2015, 11, 14), new Date(2015, 11, 13)))
})
})
describe('bigger(date1, date2)', function () {
it('should return true if date2 bigger then date1', function () {
assert(plugin.bigger(new Date(2015, 11, 14), new Date(2015, 11, 15)))
})
})
});

View File

@ -0,0 +1,112 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Air datepicker visual tests</title>
<script type="text/javascript" src="bower_components/jquery/dist/jquery.min.js"></script>
<script type="text/javascript" src="dist/js/datepicker.js"></script>
<link rel="stylesheet" href="dist/css/datepicker.css"/>
<link rel="stylesheet" href="docs/css/style.css"/>
<script type="text/javascript">
var log;
function logger (el) {
var $el = $(el);
return function(text) {
var count = $('p', $el).length;
$el.append('<p><span>' + count++ + '.</span> ' + text + '</p>').scrollTop(100000)
}
}
$(function () {
log = logger('#v-log');
})
</script>
</head>
<body>
<div class="v-log" id="v-log"></div>
<div class="visual-tests">
<article>
<h1>Basic</h1>
<div class="row">
<div class="vt-tile">
<h2>Default</h2>
<div class="datepicker-here"></div>
</div>
</div>
</article>
<article>
<h1>Range</h1>
<div class="row">
<div class="vt-tile">
<h2>{range: true}</h2>
<div class="datepicker-here" data-range="true"></div>
</div>
<div class="vt-tile">
<h2>{range: true, onSelect: ...}</h2>
<div class="datepicker-here" id="dp-3" data-range="true"></div>
<script type="text/javascript">
$('#dp-3').datepicker({
onSelect: function (fd) {
log(fd)
}
})
</script>
</div>
<div class="vt-tile">
<h2>{range: true, onSelect: ...}</h2>
<input class="datepicker-here" id="dp-4" data-range="true"/>
<script type="text/javascript">
$('#dp-4').datepicker({
onSelect: function (fd) {
log(fd)
}
})
</script>
</div>
</div>
</article>
<article>
<h1>Timepicker</h1>
<div class="row">
<div class="vt-tile">
<h2>{timepicker: true}</h2>
<div class="datepicker-here" data-timepicker="true"></div>
</div>
<div class="vt-tile">
<h2>{onChange: ..., toggleSelected: false, range: true}</h2>
<input id="dp-5" class="datepicker-here" data-timepicker="true" />
<script type="text/javascript">
$('#dp-5').datepicker({
toggleSelected: false,
inline: true,
range: true,
onSelect: function (fd) {
log(fd)
}
})
</script>
</div>
<div class="vt-tile">
<h2>{timepicker: true}</h2>
<input class="datepicker-here" data-timepicker="true" />
</div>
<div class="vt-tile">
<h2>{timepicker: true, minDate: new Date()}</h2>
<input class="datepicker-here" id="dp-6"/>
<script type="text/javascript">
$('#dp-6').datepicker({
minDate: new Date(),
inline: true,
timepicker: true
})
</script>
</div>
</div>
</article>
</div>
</body>
</html>

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