├── .gitattributes ├── .gitignore ├── .npmignore ├── .prettierignore ├── CONTRIBUTING.md ├── Gruntfile.js ├── ISSUE_TEMPLATE ├── LICENSE ├── PULL_REQUEST_TEMPLATE ├── README.md ├── build ├── css │ ├── tempusdominus-bootstrap-4.css │ └── tempusdominus-bootstrap-4.min.css └── js │ ├── tempusdominus-bootstrap-4.js │ └── tempusdominus-bootstrap-4.min.js ├── composer.json ├── docs ├── ContributorsGuide │ └── index.html ├── Events │ └── index.html ├── Extras │ └── index.html ├── FAQ │ └── index.html ├── Functions │ └── index.html ├── Installing │ └── index.html ├── Options │ └── index.html ├── Usage │ └── index.html ├── android-chrome-192x192.png ├── android-chrome-256x256.png ├── apple-touch-icon.png ├── browserconfig.xml ├── css │ ├── base.css │ ├── tempusdominus-bootstrap-4.css │ └── tempusdominus-bootstrap.css ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── img │ ├── calendarWeeks.png │ ├── dpheader.png │ ├── sideBySide.png │ └── toolbarPlacement.png ├── index.html ├── js │ ├── base.js │ ├── tempusdominus-bootstrap-4.js │ └── tempusdominus-bootstrap.js ├── manifest.json ├── mstile-150x150.png ├── safari-pinned-tab.svg ├── search │ ├── lunr.js │ ├── main.js │ ├── search_index.json │ └── worker.js ├── sitemap.xml ├── sitemap.xml.gz └── theme │ ├── 404.html │ ├── android-chrome-192x192.png │ ├── android-chrome-256x256.png │ ├── apple-touch-icon.png │ ├── base.html │ ├── browserconfig.xml │ ├── content.html │ ├── css │ ├── base.css │ ├── tempusdominus-bootstrap-4.css │ └── tempusdominus-bootstrap.css │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── js │ ├── base.js │ ├── tempusdominus-bootstrap-4.js │ └── tempusdominus-bootstrap.js │ ├── main.html │ ├── manifest.json │ ├── mstile-150x150.png │ ├── nav.html │ ├── safari-pinned-tab.svg │ ├── search-modal.html │ └── toc.html ├── eslintrc.json ├── mkdocs.yml ├── package-lock.json ├── package.json ├── src ├── docs │ ├── ContributorsGuide.md │ ├── Events.md │ ├── Extras.md │ ├── FAQ.md │ ├── Functions.md │ ├── Installing.md │ ├── Options.md │ ├── Usage.md │ ├── img │ │ ├── calendarWeeks.png │ │ ├── dpheader.png │ │ ├── sideBySide.png │ │ └── toolbarPlacement.png │ ├── index.md │ └── theme │ │ ├── 404.html │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-256x256.png │ │ ├── apple-touch-icon.png │ │ ├── base.html │ │ ├── browserconfig.xml │ │ ├── content.html │ │ ├── css │ │ ├── base.css │ │ ├── tempusdominus-bootstrap-4.css │ │ └── tempusdominus-bootstrap.css │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon.ico │ │ ├── js │ │ ├── base.js │ │ ├── tempusdominus-bootstrap-4.js │ │ └── tempusdominus-bootstrap.js │ │ ├── main.html │ │ ├── manifest.json │ │ ├── mstile-150x150.png │ │ ├── nav.html │ │ ├── safari-pinned-tab.svg │ │ ├── search-modal.html │ │ └── toc.html ├── js │ └── tempusdominus-bootstrap-4.js └── sass │ ├── _tempusdominus-bootstrap-4.scss │ └── tempusdominus-bootstrap-4-build.scss └── tasks └── bump_version.js /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | bower_components 2 | node_modules 3 | .idea 4 | .vs 5 | obj 6 | bin 7 | site 8 | *.user 9 | *.csproj 10 | *.sln 11 | *.nupkg 12 | /index.html 13 | /test.html 14 | /npm-debug.log 15 | private_local_dir/** -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /assets 2 | /_includes 3 | /_layouts 4 | /.gitignore 5 | /node_modules 6 | /Makefile 7 | /test 8 | *.log 9 | *.swp 10 | *~ 11 | *.tgz 12 | /site 13 | *.user 14 | *.csproj 15 | *.sln 16 | *.nupkg -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | ** 2 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Submitting Issues 2 | ================= 3 | 4 | If you are submitting a bug, please test and/or fork [this JSFiddle](https://jsfiddle.net/nmocbjLf/1/) demonstrating the issue. 5 | In your Pull Request (PR), describe the use case and provide a link to your forked JSFiddle and possibly provide a code example in the PR itself. 6 | 7 | Issues that are submitted without a description (title only) will be closed with no further explanation. 8 | 9 | Contributing code 10 | ================= 11 | 12 | PRs are welcome. 13 | 14 | **Working on your first Pull Request?** You can learn how from this _free_ series [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github). 15 | 16 | To contribute, fork the library and install dependencies. You will need [node](http://nodejs.org/). 17 | You can use [nvm](https://github.com/nvm-sh/nvm) or [nenv](https://github.com/ryuone/nenv) to install it. 18 | 19 | Then, run the following commands: 20 | 21 | ```bash 22 | git clone https://github.com/tonix-tuft/tempusdominus-bootstrap.git 23 | cd tempusdominus-bootstrap 24 | npm install -g grunt-cli 25 | npm install 26 | npm run watch 27 | ``` 28 | 29 | Very important notes 30 | ==================== 31 | 32 | * **Please submit your pull requests to a new branch** (you may call it like you want, just choose a name that describes your feature/bugfix). 33 | * **You don't have to include the minified files in your pull request** (by running `npm run build-all`). Don't worry, we'll build them when we bump a new version. 34 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function (grunt) { 2 | grunt.initConfig({ 3 | pkg: grunt.file.readJSON('package.json'), 4 | banner: '/*!@preserve\n' + 5 | ' * Tempus Dominus Bootstrap4 v<%= pkg.version %> (<%= pkg.homepage %>)\n' + 6 | ' * Copyright 2016-<%= grunt.template.today("yyyy") %> <%= pkg.author %> and contributors\n' + 7 | ' * Licensed under MIT (https://github.com/tempusdominus/bootstrap-3/blob/master/LICENSE)\n' + 8 | ' */\n', 9 | jqueryCheck: 'if (typeof jQuery === \'undefined\') {\n' + 10 | ' throw new Error(\'Tempus Dominus Bootstrap4\\\'s requires jQuery. jQuery must be included before Tempus Dominus Bootstrap4\\\'s JavaScript.\');\n' + 11 | '}\n', 12 | jqueryVersionCheck: '+function ($) {\n' + 13 | ' var version = $.fn.jquery.split(\' \')[0].split(\'.\');\n' + 14 | ' if ((version[0] < 2 && version[1] < 9) || (version[0] === 1 && version[1] === 9 && version[2] < 1) || (version[0] >= 4)) {\n' + 15 | ' throw new Error(\'Tempus Dominus Bootstrap4\\\'s requires at least jQuery v3.0.0 but less than v4.0.0\');\n' + 16 | ' }\n' + 17 | '}(jQuery);\n\n', 18 | momentCheck: 'if (typeof moment === \'undefined\') {\n' + 19 | ' throw new Error(\'Tempus Dominus Bootstrap4\\\'s requires moment.js. Moment.js must be included before Tempus Dominus Bootstrap4\\\'s JavaScript.\');\n' + 20 | '}\n', 21 | momentVersionCheck: 'var version = moment.version.split(\'.\')\n' + 22 | 'if ((version[0] <= 2 && version[1] < 17) || (version[0] >= 3)) {\n' + 23 | ' throw new Error(\'Tempus Dominus Bootstrap4\\\'s requires at least moment.js v2.17.0 but less than v3.0.0\');\n' + 24 | '}\n', 25 | uglify: { 26 | target: { 27 | files: { 28 | 'build/js/<%= pkg.name %>.min.js': 'build/js/<%= pkg.name %>.js' 29 | } 30 | }, 31 | options: { 32 | mangle: true, 33 | compress: { 34 | dead_code: false // eslint-disable-line 35 | }, 36 | output: { 37 | ascii_only: true, // eslint-disable-line 38 | comments: 'some' 39 | }, 40 | report: 'min' 41 | } 42 | }, 43 | eslint: { 44 | options: { 45 | configFile: 'eslintrc.json' 46 | }, 47 | target: ['Gruntfile.js', 'src/js/*.js', 'test/*.js'] 48 | }, 49 | babel: { 50 | dev: { 51 | options: { 52 | sourceMap: false, 53 | compact: false 54 | }, 55 | files: { 56 | 'build/js/<%= pkg.name %>.js': 'src/js/<%= pkg.name %>.js' 57 | } 58 | }, 59 | dist: { 60 | options: { 61 | compact: false, 62 | 'presets': [ 63 | [ 64 | '@babel/preset-env', 65 | { 66 | 'modules': false, 67 | 'loose': true 68 | } 69 | ] 70 | ], 71 | 'plugins': [ 72 | 'transform-es2015-modules-strip' 73 | ] 74 | }, 75 | files: { 76 | 'build/js/<%= pkg.name %>.js': 'build/js/<%= pkg.name %>.js' 77 | } 78 | } 79 | }, 80 | concat: { 81 | options: { 82 | // Custom function to remove all export and import statements 83 | process: function (src) { 84 | return src.replace(/^(export|import).*/gm, ''); 85 | } 86 | }, 87 | bootstrap: { 88 | src: [ 89 | 'node_modules/tempusdominus/src/js/tempusdominus.js', 90 | 'src/js/<%= pkg.name %>.js' 91 | ], 92 | dest: 'build/js/<%= pkg.name %>.js' 93 | } 94 | }, 95 | 'dart-sass': { 96 | production: { 97 | options: { 98 | outputStyle: 'compressed' 99 | }, 100 | files: { 101 | 'build/css/<%= pkg.name %>.min.css': 'src/sass/<%= pkg.name %>-build.scss' 102 | } 103 | }, 104 | development: { 105 | options: { 106 | 107 | }, 108 | files: { 109 | 'build/css/<%= pkg.name %>.css': 'src/sass/<%= pkg.name %>-build.scss' 110 | } 111 | } 112 | }, 113 | stamp: { 114 | bootstrap: { 115 | options: { 116 | banner: '<%= banner %>\n<%= jqueryCheck %>\n<%= jqueryVersionCheck %>\n<%= momentCheck %>\n<%= momentVersionCheck %>\n+function () {\n', 117 | footer: '\n}();' 118 | }, 119 | files: { 120 | src: '<%= concat.bootstrap.dest %>' 121 | } 122 | }, 123 | css: { 124 | options: { 125 | banner: '<%= banner %>' 126 | }, 127 | files: { 128 | src: 'build/css/*.css' 129 | } 130 | } 131 | }, 132 | watch: { 133 | src: { 134 | files: '<%= concat.bootstrap.src %>', 135 | tasks: ['default'] 136 | } 137 | }, 138 | mkdocs: { 139 | dist: { 140 | src: '.', 141 | options: { 142 | clean: true 143 | } 144 | } 145 | }, 146 | postcss: { 147 | options: { 148 | map: false, 149 | processors: [ 150 | require('autoprefixer')({ 151 | // grid: true 152 | }) 153 | ] 154 | }, 155 | dist: { 156 | src: 'build/css/<%= pkg.name %>.css' 157 | } 158 | }, 159 | cssmin: { 160 | options: { 161 | specialComments: 'all' 162 | }, 163 | target: { 164 | files: [{ 165 | expand: true, 166 | cwd: 'build/css', 167 | src: ['*.css', '!*.min.css'], 168 | dest: 'build/css', 169 | ext: '.min.css' 170 | }] 171 | } 172 | } 173 | }); 174 | 175 | grunt.loadTasks('tasks'); 176 | grunt.loadNpmTasks('grunt-mkdocs'); 177 | grunt.loadNpmTasks('grunt-dart-sass'); 178 | grunt.loadNpmTasks('grunt-postcss') 179 | grunt.loadNpmTasks('grunt-contrib-cssmin') 180 | grunt.loadNpmTasks('grunt-contrib-uglify') 181 | grunt.loadNpmTasks('grunt-contrib-watch') 182 | 183 | require('load-grunt-tasks')(grunt); 184 | grunt.registerTask('default', 'build:js'); 185 | grunt.registerTask('build:travis', [ 186 | 'build:js', 'build:style'//, 187 | // tests 188 | //'env:paris', 'connect', 'jasmine' 189 | ]); 190 | 191 | // Task to be run when building 192 | grunt.registerTask('build', ['build:js', 'build:style']); 193 | 194 | grunt.registerTask('build:js', ['babel:dev', 'concat', 'eslint', 'babel:dist', 'stamp:bootstrap', 'uglify', 'copy']); 195 | 196 | grunt.registerTask('build:style', ['dart-sass', 'stamp:css', 'postcss', 'cssmin', 'copy']); 197 | 198 | grunt.registerTask('copy', 'Generate docs', function () { 199 | grunt.file.copy('build/js/tempusdominus-bootstrap-4.js', 'src/docs/theme/js/tempusdominus-bootstrap-4.js'); 200 | grunt.file.copy('build/css/tempusdominus-bootstrap-4.css', 'src/docs/theme/css/tempusdominus-bootstrap-4.css'); 201 | }); 202 | 203 | grunt.registerTask('docs', ['copy', 'mkdocs']); 204 | 205 | grunt.registerTask('release', function (version) { 206 | if (!version || version.split('.').length !== 3) { 207 | grunt.fail.fatal('malformed version. Use grunt release:1.2.3'); 208 | } 209 | 210 | grunt.task.run([ 211 | 'bump_version:' + version, 212 | 'build:travis', 213 | 'docs' 214 | ]); 215 | }); 216 | }; 217 | -------------------------------------------------------------------------------- /ISSUE_TEMPLATE: -------------------------------------------------------------------------------- 1 | Please read this [blog post](https://eonasdan.com/state-of-my-picker) 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Tempus Dominus 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PULL_REQUEST_TEMPLATE: -------------------------------------------------------------------------------- 1 | Please read this [blog post](https://eonasdan.com/state-of-my-picker) 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Tempus Dominus Bootstrap 4 2 | 3 | Version 5 was attempt to build a core module and build other modules like bootstrap 3/4 that handled rendering. Unfortunately, due to my health and other factors you can read about on [my blog](https://eonasdan.com/posts/state-of-my-picker.html) I was unable to maintain 3 extra projects. V6 is a work in progress and is come back under the [orginial repo which as been renamed as tempus-dominus](https://github.com/Eonasdan/tempus-dominus). 4 | -------------------------------------------------------------------------------- /build/css/tempusdominus-bootstrap-4.min.css: -------------------------------------------------------------------------------- 1 | /*!@preserve 2 | * Tempus Dominus Bootstrap4 v5.39.0 (https://tempusdominus.github.io/bootstrap-4/) 3 | * Copyright 2016-2020 Jonathan Peterson and contributors 4 | * Licensed under MIT (https://github.com/tempusdominus/bootstrap-3/blob/master/LICENSE) 5 | */.bootstrap-datetimepicker-widget .btn[data-action=clear]::after,.bootstrap-datetimepicker-widget .btn[data-action=decrementHours]::after,.bootstrap-datetimepicker-widget .btn[data-action=decrementMinutes]::after,.bootstrap-datetimepicker-widget .btn[data-action=incrementHours]::after,.bootstrap-datetimepicker-widget .btn[data-action=incrementMinutes]::after,.bootstrap-datetimepicker-widget .btn[data-action=showHours]::after,.bootstrap-datetimepicker-widget .btn[data-action=showMinutes]::after,.bootstrap-datetimepicker-widget .btn[data-action=today]::after,.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod]::after,.bootstrap-datetimepicker-widget .picker-switch::after,.bootstrap-datetimepicker-widget table th.next::after,.bootstrap-datetimepicker-widget table th.prev::after,.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}body.tempusdominus-bootstrap-datetimepicker-widget-day-click,body.tempusdominus-bootstrap-datetimepicker-widget-day-click *{cursor:pointer!important}body.tempusdominus-bootstrap-datetimepicker-widget-day-click{position:relative!important}.tempusdominus-bootstrap-datetimepicker-widget-day-click-glass-panel{position:absolute;z-index:999999999999;top:0;left:0;right:0;bottom:0;cursor:pointer!important}.bootstrap-datetimepicker-widget .datepicker-days tbody td{cursor:pointer}.bootstrap-datetimepicker-widget{list-style:none}.bootstrap-datetimepicker-widget.dropdown-menu{display:block;margin:2px 0;padding:4px;width:14rem}.bootstrap-datetimepicker-widget.dropdown-menu.tempusdominus-bootstrap-datetimepicker-widget-with-feather-icons{width:16rem}.bootstrap-datetimepicker-widget.dropdown-menu.tempusdominus-bootstrap-datetimepicker-widget-with-calendar-weeks{width:16rem}.bootstrap-datetimepicker-widget.dropdown-menu.tempusdominus-bootstrap-datetimepicker-widget-with-calendar-weeks.tempusdominus-bootstrap-datetimepicker-widget-with-feather-icons{width:17rem}@media (min-width:576px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:768px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:992px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}.bootstrap-datetimepicker-widget.dropdown-menu:after,.bootstrap-datetimepicker-widget.dropdown-menu:before{content:"";display:inline-block;position:absolute}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);top:-7px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:after{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;top:-6px;left:8px}.bootstrap-datetimepicker-widget.dropdown-menu.top:before{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ccc;border-top-color:rgba(0,0,0,.2);bottom:-7px;left:6px}.bootstrap-datetimepicker-widget.dropdown-menu.top:after{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #fff;bottom:-6px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.float-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.dropdown-menu.float-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget.dropdown-menu.wider{width:16rem}.bootstrap-datetimepicker-widget .list-unstyled{margin:0}.bootstrap-datetimepicker-widget a[data-action]{padding:6px 0}.bootstrap-datetimepicker-widget a[data-action]:active{box-shadow:none}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:54px;font-weight:700;font-size:1.2em;margin:0}.bootstrap-datetimepicker-widget button[data-action]{padding:6px}.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod]{text-align:center;font-family:Arial,sans-serif,-apple-system,system-ui,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";width:38px;height:38px}.bootstrap-datetimepicker-widget .btn[data-action=incrementHours]::after{content:"Increment Hours"}.bootstrap-datetimepicker-widget .btn[data-action=incrementMinutes]::after{content:"Increment Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=decrementHours]::after{content:"Decrement Hours"}.bootstrap-datetimepicker-widget .btn[data-action=decrementMinutes]::after{content:"Decrement Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=showHours]::after{content:"Show Hours"}.bootstrap-datetimepicker-widget .btn[data-action=showMinutes]::after{content:"Show Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod]::after{content:"Toggle AM/PM"}.bootstrap-datetimepicker-widget .btn[data-action=clear]::after{content:"Clear the picker"}.bootstrap-datetimepicker-widget .btn[data-action=today]::after{content:"Set the date to today"}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget .picker-switch::after{content:"Toggle Date and Time Screens"}.bootstrap-datetimepicker-widget .picker-switch td{padding:0;margin:0;height:auto;width:auto;line-height:inherit}.bootstrap-datetimepicker-widget .picker-switch td span{line-height:2.5;height:2.5em;width:100%}.bootstrap-datetimepicker-widget .picker-switch.picker-switch-with-feathers-icons td span{line-height:2.8;height:2.8em}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget table td,.bootstrap-datetimepicker-widget table th{text-align:center;border-radius:.25rem}.bootstrap-datetimepicker-widget table th{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table th.picker-switch{width:145px}.bootstrap-datetimepicker-widget table th.disabled,.bootstrap-datetimepicker-widget table th.disabled:hover{background:0 0;color:#6c757d;cursor:not-allowed}.bootstrap-datetimepicker-widget table th.prev::after{content:"Previous Month"}.bootstrap-datetimepicker-widget table th.next::after{content:"Next Month"}.bootstrap-datetimepicker-widget table thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#e9ecef}.bootstrap-datetimepicker-widget table td{height:54px;line-height:54px;width:54px}.bootstrap-datetimepicker-widget table td.cw{font-size:.8em;height:20px;line-height:20px;color:#6c757d;cursor:default}.bootstrap-datetimepicker-widget table td.day{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table td.day:hover,.bootstrap-datetimepicker-widget table td.hour:hover,.bootstrap-datetimepicker-widget table td.minute:hover,.bootstrap-datetimepicker-widget table td.second:hover{background:#e9ecef;cursor:pointer}.bootstrap-datetimepicker-widget table td.new,.bootstrap-datetimepicker-widget table td.old{color:#6c757d}.bootstrap-datetimepicker-widget table td.today{position:relative}.bootstrap-datetimepicker-widget table td.today:before{content:"";display:inline-block;border:solid transparent;border-width:0 0 7px 7px;border-bottom-color:#007bff;border-top-color:rgba(0,0,0,.2);position:absolute;bottom:4px;right:4px}.bootstrap-datetimepicker-widget table td.active,.bootstrap-datetimepicker-widget table td.active:hover{background-color:#007bff;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.bootstrap-datetimepicker-widget table td.active.today:before{border-bottom-color:#fff}.bootstrap-datetimepicker-widget table td.disabled,.bootstrap-datetimepicker-widget table td.disabled:hover{background:0 0;color:#6c757d;cursor:not-allowed}.bootstrap-datetimepicker-widget table td span{display:inline-block;width:54px;height:54px;line-height:54px;margin-top:2px;margin-bottom:2px;cursor:pointer;border-radius:.25rem}.bootstrap-datetimepicker-widget table td span:hover{background:#e9ecef}.bootstrap-datetimepicker-widget table td span.active{background-color:#007bff;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.bootstrap-datetimepicker-widget table td span.old{color:#6c757d}.bootstrap-datetimepicker-widget table td span.disabled,.bootstrap-datetimepicker-widget table td span.disabled:hover{background:0 0;color:#6c757d;cursor:not-allowed}.bootstrap-datetimepicker-widget.usetwentyfour td.hour{height:27px;line-height:27px}.bootstrap-datetimepicker-widget .timepicker .timepicker-picker a.btn{color:#007bff;color:var(--blue,#007bff)}.bootstrap-datetimepicker-widget .timepicker .timepicker-picker a.btn:hover{color:#0056b3}.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementHours],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementMinutes],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementSeconds],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementHours],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementMinutes],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementSeconds],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showHours],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showMinutes],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showSeconds],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=togglePeriod],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.day,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.hour,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.minute,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.second{pointer-events:none;cursor:default}.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementHours]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementMinutes]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementSeconds]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementHours]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementMinutes]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementSeconds]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showHours]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showMinutes]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showSeconds]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=togglePeriod]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.day:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.hour:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.minute:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.second:hover{background:0 0}.input-group [data-toggle=datetimepicker]{cursor:pointer} -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tempusdominus/bootstrap-4", 3 | "type": "component", 4 | "description": "A date/time picker component designed to work with Bootstrap 4 and Momentjs.", 5 | "version": "5.38.0", 6 | "keywords": [ 7 | "bootstrap", 8 | "datepicker", 9 | "datetimepicker", 10 | "timepicker", 11 | "moment" 12 | ], 13 | "homepage": "https://github.com/tempusdominus/bootstrap-4", 14 | "license": "MIT", 15 | "require": { 16 | "robloach/component-installer": "*", 17 | "components/jquery": ">=3.0.0", 18 | "moment/moment": ">=2.10.5", 19 | "tempusdominus/core": "5.0.*" 20 | }, 21 | "extra": { 22 | "component": { 23 | "scripts": [ 24 | "src/js/tempusdominus-bootstrap-4.js" 25 | ], 26 | "files": [ 27 | "build/js/tempusdominus-bootstrap-4.min.js", 28 | "build/css/tempusdominus-bootstrap-4.min.css" 29 | ] 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /docs/Events/index.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | Events - Tempus Dominus - Bootstrap 4 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 114 |
115 | Important! 116 | Please read this blog post.
117 | The Tempus Dominus projects are getting rolled back into the orginal repo. TD Bootsrap 3/4 are no longer supported. 118 |
119 | 120 | 121 |
122 |
123 |
124 |
135 |
136 |

Events

137 | 138 | 139 |

hide.datetimepicker

140 |

Fired when the widget is hidden.

141 |

Parameters:

142 |
e = {
143 |     date //the currently set date. Type: moment object (clone)
144 | }
145 | 
146 | 147 |

Emitted from:

148 |
    149 |
  • toggle()
  • 150 |
  • hide()
  • 151 |
  • disable()
  • 152 |
153 |
154 |

show.datetimepicker

155 |

Fired when the widget is shown.

156 |

Parameters:

157 |

No parameters are include, listen to change.datetimepicker instead

158 |

Emitted from:

159 |
    160 |
  • toggle()
  • 161 |
  • show()
  • 162 |
163 |
164 |

change.datetimepicker

165 |

Fired when the date is changed, including when changed to a non-date (e.g. When keepInvalid=true).

166 |

Parameters:

167 |
e = {
168 |     date, //date the picker changed to. Type: moment object (clone)
169 |     oldDate //previous date. Type: moment object (clone) or false in the event of a null
170 | }
171 | 
172 | 173 |

Emitted from:

174 |
    175 |
  • toggle() Note: Only fired when using useCurrent
  • 176 |
  • show() Note: Only fired when using useCurrent or when or the date is changed to comply with date rules (min/max etc)
  • 177 |
  • date(newDate)
  • 178 |
  • minDate(minDate)
  • 179 |
  • maxDate(maxDate)
  • 180 |
  • daysOfWeekDisabled()
  • 181 |
182 |
183 |

error.datetimepicker

184 |

Fired when a selected date fails to pass validation.

185 |

Parameters:

186 |
e = {
187 |     date //the invalid date. Type: moment object (clone)
188 |     oldDate //previous date. Type: moment object (clone) or false in the event of a null
189 | }
190 | 
191 | 192 |

Emmited from:

193 |
    194 |
  • minDate(minDate)
  • 195 |
  • maxDate(maxDate)
  • 196 |
  • daysOfWeekDisabled()
  • 197 |
  • setValue() private function
  • 198 |
199 |
200 |

update.datetimepicker

201 |

Fired (in most cases) when the viewDate changes. E.g. Next and Previous buttons, selecting a year.

202 |

Parameters:

203 |
e = {
204 |    change, //Change type as a momentjs format token. Type: string e.g. yyyy on year change
205 |    viewDate //new viewDate. Type: moment object
206 | }
207 | 
208 |
209 |
210 |
211 | 212 | 213 | 233 | 234 | -------------------------------------------------------------------------------- /docs/Extras/index.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | Extras - Tempus Dominus - Bootstrap 4 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 114 |
115 | Important! 116 | Please read this blog post.
117 | The Tempus Dominus projects are getting rolled back into the orginal repo. TD Bootsrap 3/4 are no longer supported. 118 |
119 | 120 | 121 |
122 |
123 |
124 |
131 |
132 |

Extras

133 | 134 | 135 |

Guides for making the picker work better with rails, IE, etc. Note: I have no idea if these guides still apply for v5 or not.

136 |

Rails 3

137 |

by dhulihan

138 |

You can easily override the default rails form helpers (date_select and datetime_select) with bootstrap-datetimepicker for a much nicer experience.

139 |
# Add to config/initializers/form.rb or the end of app/helpers/application_helper.rb
140 | module ActionView
141 |   module Helpers
142 |     class FormBuilder 
143 |       def date_select(method, options = {}, html_options = {})
144 |         existing_date = @object.send(method) 
145 |         formatted_date = existing_date.to_date.strftime("%F") if existing_date.present?
146 |         @template.content_tag(:div, :class => "input-group") do    
147 |           text_field(method, :value => formatted_date, :class => "form-control datepicker", :"data-date-format" => "YYYY-MM-DD") +
148 |           @template.content_tag(:span, @template.content_tag(:span, "", :class => "glyphicon glyphicon-calendar") ,:class => "input-group-addon")
149 |         end
150 |       end
151 | 
152 |       def datetime_select(method, options = {}, html_options = {})
153 |         existing_time = @object.send(method) 
154 |         formatted_time = existing_time.to_time.strftime("%F %I:%M %p") if existing_time.present?
155 |         @template.content_tag(:div, :class => "input-group") do    
156 |           text_field(method, :value => formatted_time, :class => "form-control datetimepicker", :"data-date-format" => "YYYY-MM-DD hh:mm A") +
157 |           @template.content_tag(:span, @template.content_tag(:span, "", :class => "glyphicon glyphicon-calendar") ,:class => "input-group-addon")
158 |         end
159 |       end
160 |     end
161 |   end
162 | end
163 | 
164 | 165 |

The time format used here is ActiveRecord-friendly, which means it will be parsed correctly when passed in through params to your record.

166 |

That's all there is to it! Now all of your forms that use datetime_select or date_select will be automatically updated:

167 |
<% form_for @post do |f| %>
168 |     <div class="form-group">
169 |         <label>Published At</label>
170 |         <%= f.datetime_select :published_at %>
171 |     </div>
172 | <% end %>
173 | 
174 |
175 |
176 |
177 | 178 | 179 | 199 | 200 | -------------------------------------------------------------------------------- /docs/FAQ/index.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | FAQs - Tempus Dominus - Bootstrap 4 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 114 |
115 | Important! 116 | Please read this blog post.
117 | The Tempus Dominus projects are getting rolled back into the orginal repo. TD Bootsrap 3/4 are no longer supported. 118 |
119 | 120 | 121 |
122 |
123 | 135 |
136 |

FAQs

137 | 138 | 139 |

How do I disable the date or time element

140 |

How do I format ...; How do I add seconds; etc.

141 |

The picker uses the format option to decide what components to show. Set format to LT, LTS or another valid MomentJs format string to display certain components

142 |

How do I change the language/locale

143 |

The picker uses MomentJs to determine the language string. You can use moment-with-locales or you can include whatever local file you need. Set the picker's locale option to de or whatever the locale string is.

144 |

How do I change the styles? The picker closes.

145 |

Set debug:true which will force the picker to stay open, even onBlur. You can hide the picker manually by calling hide()

146 |

How do I change the start of the week?

147 |

Start of the week is based on the locale provided. This is defined by moment's locales. If you want to change it, create your own locale file or override. See moment's docs.

148 |

How I use the picker as birthday picker?

149 |

Use the viewMode option to 'years'

150 |
151 |
152 |
153 | 154 | 155 | 175 | 176 | -------------------------------------------------------------------------------- /docs/Functions/index.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | Functions - Tempus Dominus - Bootstrap 4 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 114 |
115 | Important! 116 | Please read this blog post.
117 | The Tempus Dominus projects are getting rolled back into the orginal repo. TD Bootsrap 3/4 are no longer supported. 118 |
119 | 120 | 121 |
122 |
123 |
124 |
144 |
145 |

Functions

146 | 147 | 148 |
149 | Note 150 | All functions are accessed via the data attribute e.g. $('#datetimepicker').datetimepicker(FUNCTION) 151 |
152 | 153 |

destroy

154 |

Destroys the widget and removes all attached event listeners

155 |
156 |

toggle

157 |

Shows or hides the widget

158 |

Emits

159 |
    160 |
  • 161 |

    hide.datetimepicker - if the widget is hidden after the toggle call

    162 |
  • 163 |
  • 164 |

    show.datetimepicker - if the widget is show after the toggle call

    165 |
  • 166 |
  • 167 |

    change.datetimepicker - if the widget is opened for the first time and the input element is empty and options.useCurrent != false

    168 |
  • 169 |
170 |
171 |

show

172 |

Shows the widget

173 |

Emits

174 |
    175 |
  • 176 |

    show.datetimepicker - if the widget was hidden before that call

    177 |
  • 178 |
  • 179 |

    change.datetimepicker - if the widget is opened for the first time and the useCurrent is set to true or to a granularity value and the input element the component is attached to has an empty value

    180 |
  • 181 |
182 |
183 |

hide

184 |

Hides the widget

185 |

Emits

186 |
    187 |
  • hide.datetimepicker - if the widget was visible before that call
  • 188 |
189 |
190 |

disable

191 |

Disables the input element, the component is attached to, by adding a disabled="true" attribute to it. If the widget was visible before that call it is hidden.

192 |

Emits

193 |
    194 |
  • hide.datetimepicker - if the widget was visible before that call
  • 195 |
196 |
197 |

enable

198 |

Enables the input element, the component is attached to, by removing disabled attribute from it.

199 |
200 |

clear

201 |

Clears the date picker by setting the value to null

202 |
203 |

viewDate

204 |

viewDate

205 |

Returns a moment variable with the currently set options.viewDate option.

206 |

viewDate(viewDate)

207 |

Takes a string, moment or Date value.

208 |

This will change the viewDate without changing or setting the selected date.

209 |
210 |
211 |
212 | 213 | 214 | 234 | 235 | -------------------------------------------------------------------------------- /docs/Installing/index.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | Installing - Tempus Dominus - Bootstrap 4 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 114 |
115 | Important! 116 | Please read this blog post.
117 | The Tempus Dominus projects are getting rolled back into the orginal repo. TD Bootsrap 3/4 are no longer supported. 118 |
119 | 120 | 121 |
122 |
123 |
124 |
135 |
136 |

Installing

137 | 138 | 139 |

Minimal Requirements

140 |
    141 |
  1. jQuery
  2. 142 |
  3. Moment.js
  4. 143 |
  5. Locales: Moment's locale files are here
  6. 144 |
145 |

Installation Guides

146 | 153 |

CDN

154 |
<head>
155 | <script src="https://cdnjs.cloudflare.com/ajax/libs/tempusdominus-bootstrap-4/5.38.0/js/tempusdominus-bootstrap-4.min.js" crossorigin="anonymous"></script>
156 | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tempusdominus-bootstrap-4/5.38.0/css/tempusdominus-bootstrap-4.min.css" crossorigin="anonymous" />
157 | </head>
158 | 
159 | 160 |

Package Managers

161 |

Rails

162 |

Rails 5.1 Support - Bootstrap 4 Datetime Picker Rails

163 |
    164 |
  1. Add gem 'bootstrap4-datetime-picker-rails' to your Gemfile
  2. 165 |
  3. Execute bundle
  4. 166 |
  5. Add //= require tempusdominus-bootstrap-4.js to your application.js
  6. 167 |
  7. Add @import "tempusdominus-bootstrap-4.css" to your application.scss
  8. 168 |
169 |

Django

170 |

Python package for Django: Django Tempus Dominus

171 |
    172 |
  1. Install via pip: pip install django-tempus-dominus
  2. 173 |
  3. Widgets are provided for Date, DateTime, and Time.
  4. 174 |
  5. Full examples are available with Django Forms, Widgets, and Templates.
  6. 175 |
176 |

Angular Wrapper

177 |

Follow instructions at ngx-tempusdominus-bootstrap

178 |

Manual

179 |
    180 |
  1. Acquire jQuery
  2. 181 |
  3. Acquire Moment.js
  4. 182 |
  5. Acquire
  6. 183 |
184 |
<script type="text/javascript" src="/path/to/jquery.js"></script>
185 | <script type="text/javascript" src="/path/to/moment.js"></script>
186 | <script type="text/javascript" src="/path/to/tempusdominus-bootstrap-4.min.js"></script>
187 | <link rel="stylesheet" href="/path/to/tempusdominus-bootstrap-4.min.css"/>
188 | 
189 |
190 |
191 |
192 | 193 | 194 | 214 | 215 | -------------------------------------------------------------------------------- /docs/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/android-chrome-192x192.png -------------------------------------------------------------------------------- /docs/android-chrome-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/android-chrome-256x256.png -------------------------------------------------------------------------------- /docs/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/apple-touch-icon.png -------------------------------------------------------------------------------- /docs/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #2b5797 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/css/tempusdominus-bootstrap.css: -------------------------------------------------------------------------------- 1 | /*@preserve 2 | * Tempus Dominus Bootstrap4 v5.1.4 (https://tempusdominus.github.io/bootstrap-4/) 3 | * Copyright 2016-2020 Jonathan Peterson 4 | * Licensed under MIT (https://github.com/tempusdominus/bootstrap-3/blob/master/LICENSE) 5 | */ 6 | 7 | .sr-only, .bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after, .bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after, .bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after, .bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after, .bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after, .bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after, .bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after, .bootstrap-datetimepicker-widget .btn[data-action="clear"]::after, .bootstrap-datetimepicker-widget .btn[data-action="today"]::after, .bootstrap-datetimepicker-widget .picker-switch::after, .bootstrap-datetimepicker-widget table th.prev::after, .bootstrap-datetimepicker-widget table th.next::after { 8 | position: absolute; 9 | width: 1px; 10 | height: 1px; 11 | margin: -1px; 12 | padding: 0; 13 | overflow: hidden; 14 | clip: rect(0, 0, 0, 0); 15 | border: 0; } 16 | 17 | .bootstrap-datetimepicker-widget { 18 | list-style: none; } 19 | .bootstrap-datetimepicker-widget.dropdown-menu { 20 | display: block; 21 | margin: 2px 0; 22 | padding: 4px; 23 | width: 14rem; } 24 | @media (min-width: 576px) { 25 | .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { 26 | width: 38em; } } 27 | @media (min-width: 768px) { 28 | .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { 29 | width: 38em; } } 30 | @media (min-width: 992px) { 31 | .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { 32 | width: 38em; } } 33 | .bootstrap-datetimepicker-widget.dropdown-menu:before, .bootstrap-datetimepicker-widget.dropdown-menu:after { 34 | content: ''; 35 | display: inline-block; 36 | position: absolute; } 37 | .bootstrap-datetimepicker-widget.dropdown-menu.bottom:before { 38 | border-left: 7px solid transparent; 39 | border-right: 7px solid transparent; 40 | border-bottom: 7px solid #ccc; 41 | border-bottom-color: rgba(0, 0, 0, 0.2); 42 | top: -7px; 43 | left: 7px; } 44 | .bootstrap-datetimepicker-widget.dropdown-menu.bottom:after { 45 | border-left: 6px solid transparent; 46 | border-right: 6px solid transparent; 47 | border-bottom: 6px solid white; 48 | top: -6px; 49 | left: 8px; } 50 | .bootstrap-datetimepicker-widget.dropdown-menu.top:before { 51 | border-left: 7px solid transparent; 52 | border-right: 7px solid transparent; 53 | border-top: 7px solid #ccc; 54 | border-top-color: rgba(0, 0, 0, 0.2); 55 | bottom: -7px; 56 | left: 6px; } 57 | .bootstrap-datetimepicker-widget.dropdown-menu.top:after { 58 | border-left: 6px solid transparent; 59 | border-right: 6px solid transparent; 60 | border-top: 6px solid white; 61 | bottom: -6px; 62 | left: 7px; } 63 | .bootstrap-datetimepicker-widget.dropdown-menu.float-right:before { 64 | left: auto; 65 | right: 6px; } 66 | .bootstrap-datetimepicker-widget.dropdown-menu.float-right:after { 67 | left: auto; 68 | right: 7px; } 69 | .bootstrap-datetimepicker-widget.dropdown-menu.wider { 70 | width: 16rem; } 71 | .bootstrap-datetimepicker-widget .list-unstyled { 72 | margin: 0; } 73 | .bootstrap-datetimepicker-widget a[data-action] { 74 | padding: 6px 0; } 75 | .bootstrap-datetimepicker-widget a[data-action]:active { 76 | box-shadow: none; } 77 | .bootstrap-datetimepicker-widget .timepicker-hour, .bootstrap-datetimepicker-widget .timepicker-minute, .bootstrap-datetimepicker-widget .timepicker-second { 78 | width: 54px; 79 | font-weight: bold; 80 | font-size: 1.2em; 81 | margin: 0; } 82 | .bootstrap-datetimepicker-widget button[data-action] { 83 | padding: 6px; } 84 | .bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after { 85 | content: "Increment Hours"; } 86 | .bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after { 87 | content: "Increment Minutes"; } 88 | .bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after { 89 | content: "Decrement Hours"; } 90 | .bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after { 91 | content: "Decrement Minutes"; } 92 | .bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after { 93 | content: "Show Hours"; } 94 | .bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after { 95 | content: "Show Minutes"; } 96 | .bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after { 97 | content: "Toggle AM/PM"; } 98 | .bootstrap-datetimepicker-widget .btn[data-action="clear"]::after { 99 | content: "Clear the picker"; } 100 | .bootstrap-datetimepicker-widget .btn[data-action="today"]::after { 101 | content: "Set the date to today"; } 102 | .bootstrap-datetimepicker-widget .picker-switch { 103 | text-align: center; } 104 | .bootstrap-datetimepicker-widget .picker-switch::after { 105 | content: "Toggle Date and Time Screens"; } 106 | .bootstrap-datetimepicker-widget .picker-switch td { 107 | padding: 0; 108 | margin: 0; 109 | height: auto; 110 | width: auto; 111 | line-height: inherit; } 112 | .bootstrap-datetimepicker-widget .picker-switch td span { 113 | line-height: 2.5; 114 | height: 2.5em; 115 | width: 100%; } 116 | .bootstrap-datetimepicker-widget table { 117 | width: 100%; 118 | margin: 0; } 119 | .bootstrap-datetimepicker-widget table td, 120 | .bootstrap-datetimepicker-widget table th { 121 | text-align: center; 122 | border-radius: 0.25rem; } 123 | .bootstrap-datetimepicker-widget table th { 124 | height: 20px; 125 | line-height: 20px; 126 | width: 20px; } 127 | .bootstrap-datetimepicker-widget table th.picker-switch { 128 | width: 145px; } 129 | .bootstrap-datetimepicker-widget table th.disabled, .bootstrap-datetimepicker-widget table th.disabled:hover { 130 | background: none; 131 | color: #6c757d; 132 | cursor: not-allowed; } 133 | .bootstrap-datetimepicker-widget table th.prev::after { 134 | content: "Previous Month"; } 135 | .bootstrap-datetimepicker-widget table th.next::after { 136 | content: "Next Month"; } 137 | .bootstrap-datetimepicker-widget table thead tr:first-child th { 138 | cursor: pointer; } 139 | .bootstrap-datetimepicker-widget table thead tr:first-child th:hover { 140 | background: #e9ecef; } 141 | .bootstrap-datetimepicker-widget table td { 142 | height: 54px; 143 | line-height: 54px; 144 | width: 54px; } 145 | .bootstrap-datetimepicker-widget table td.cw { 146 | font-size: .8em; 147 | height: 20px; 148 | line-height: 20px; 149 | color: #6c757d; } 150 | .bootstrap-datetimepicker-widget table td.day { 151 | height: 20px; 152 | line-height: 20px; 153 | width: 20px; } 154 | .bootstrap-datetimepicker-widget table td.day:hover, .bootstrap-datetimepicker-widget table td.hour:hover, .bootstrap-datetimepicker-widget table td.minute:hover, .bootstrap-datetimepicker-widget table td.second:hover { 155 | background: #e9ecef; 156 | cursor: pointer; } 157 | .bootstrap-datetimepicker-widget table td.old, .bootstrap-datetimepicker-widget table td.new { 158 | color: #6c757d; } 159 | .bootstrap-datetimepicker-widget table td.today { 160 | position: relative; } 161 | .bootstrap-datetimepicker-widget table td.today:before { 162 | content: ''; 163 | display: inline-block; 164 | border: solid transparent; 165 | border-width: 0 0 7px 7px; 166 | border-bottom-color: #007bff; 167 | border-top-color: rgba(0, 0, 0, 0.2); 168 | position: absolute; 169 | bottom: 4px; 170 | right: 4px; } 171 | .bootstrap-datetimepicker-widget table td.active, .bootstrap-datetimepicker-widget table td.active:hover { 172 | background-color: #007bff; 173 | color: #fff; 174 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } 175 | .bootstrap-datetimepicker-widget table td.active.today:before { 176 | border-bottom-color: #fff; } 177 | .bootstrap-datetimepicker-widget table td.disabled, .bootstrap-datetimepicker-widget table td.disabled:hover { 178 | background: none; 179 | color: #6c757d; 180 | cursor: not-allowed; } 181 | .bootstrap-datetimepicker-widget table td span { 182 | display: inline-block; 183 | width: 54px; 184 | height: 54px; 185 | line-height: 54px; 186 | margin: 2px 1.5px; 187 | cursor: pointer; 188 | border-radius: 0.25rem; } 189 | .bootstrap-datetimepicker-widget table td span:hover { 190 | background: #e9ecef; } 191 | .bootstrap-datetimepicker-widget table td span.active { 192 | background-color: #007bff; 193 | color: #fff; 194 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } 195 | .bootstrap-datetimepicker-widget table td span.old { 196 | color: #6c757d; } 197 | .bootstrap-datetimepicker-widget table td span.disabled, .bootstrap-datetimepicker-widget table td span.disabled:hover { 198 | background: none; 199 | color: #6c757d; 200 | cursor: not-allowed; } 201 | .bootstrap-datetimepicker-widget.usetwentyfour td.hour { 202 | height: 27px; 203 | line-height: 27px; } 204 | 205 | .input-group [data-toggle="datetimepicker"] { 206 | cursor: pointer; } 207 | -------------------------------------------------------------------------------- /docs/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/favicon-16x16.png -------------------------------------------------------------------------------- /docs/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/favicon-32x32.png -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/favicon.ico -------------------------------------------------------------------------------- /docs/img/calendarWeeks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/img/calendarWeeks.png -------------------------------------------------------------------------------- /docs/img/dpheader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/img/dpheader.png -------------------------------------------------------------------------------- /docs/img/sideBySide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/img/sideBySide.png -------------------------------------------------------------------------------- /docs/img/toolbarPlacement.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/img/toolbarPlacement.png -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | Tempus Dominus - Bootstrap 4 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 115 |
116 | Important! 117 | Please read this blog post.
118 | The Tempus Dominus projects are getting rolled back into the orginal repo. TD Bootsrap 3/4 are no longer supported. 119 |
120 | 121 | 122 | 123 |
124 |
125 |
126 |
127 | 128 |
129 |
130 |

Tempus Dominus

131 |

132 | Tempus Dominus is the successor to the very popular Eonasdan/bootstrap-datetimepicker. 133 | The plugin provide a robust date and time picker designed to integrate into your Bootstrap project. 134 |

135 |
136 | Get started 137 | Download 138 |
139 |

140 | Currently v5.1.3 141 | 142 |

143 |
144 |
145 |
146 |
147 | 148 |
149 |
150 |

Get awesome Dashboard Templates

151 |

Looking for a template with the datepicker ready to go? Then get check out these templates from our partners.

152 |
153 |
154 |
155 |

Creative Tim

156 |
157 | 163 | 169 | 175 |
176 |
177 |
178 |

Flatlogic

179 |
180 | 186 | 192 | 198 |
199 |
200 | 201 |


202 |

203 |
204 | 205 |

Installation

206 |

Include Tempus Dominus's source Sass and JavaScript files via npm

207 |
208 | 
209 | npm i tempusdominus-bootstrap-4
210 | 
211 |         
212 |
213 | Read installation docs 214 |
215 |
216 | 217 |

CDNJS

218 |

When you only need to include Tempus Dominus's compiled CSS or JS, you can use CDNJS.

219 |
220 | 
221 | <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
222 | <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.0/moment.min.js"></script>
223 | <script src="https://cdnjs.cloudflare.com/ajax/libs/tempusdominus-bootstrap-4/5.38.0/js/tempusdominus-bootstrap-4.min.js" crossorigin="anonymous"></script>
224 | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tempusdominus-bootstrap-4/5.38.0/css/tempusdominus-bootstrap-4.min.css" crossorigin="anonymous" />
225 | 
226 |         
227 |
228 | Explore the docs 229 |
230 |

231 | 232 | 233 | 253 | 254 | -------------------------------------------------------------------------------- /docs/js/base.js: -------------------------------------------------------------------------------- 1 | function getSearchTerm() 2 | { 3 | var sPageURL = window.location.search.substring(1); 4 | var sURLVariables = sPageURL.split('&'); 5 | for (var i = 0; i < sURLVariables.length; i++) 6 | { 7 | var sParameterName = sURLVariables[i].split('='); 8 | if (sParameterName[0] == 'q') 9 | { 10 | return sParameterName[1]; 11 | } 12 | } 13 | } 14 | 15 | $(function() { 16 | 17 | var search_term = getSearchTerm(), 18 | $search_modal = $('#mkdocs_search_modal'); 19 | 20 | if(search_term){ 21 | $search_modal.modal(); 22 | } 23 | 24 | // make sure search input gets autofocus everytime modal opens. 25 | $search_modal.on('shown.bs.modal', function () { 26 | $search_modal.find('#mkdocs-search-query').focus(); 27 | }); 28 | 29 | // Highlight.js 30 | $('pre code').each(function (i, block) { 31 | hljs.highlightBlock(block); 32 | }); 33 | $('table').addClass('table table-striped table-hover'); 34 | 35 | // Improve the scrollspy behaviour when users click on a TOC item. 36 | $(".bs-sidenav a").on("click", function() { 37 | var clicked = this; 38 | setTimeout(function() { 39 | var active = $('.nav li.active a'); 40 | active = active[active.length - 1]; 41 | if (clicked !== active) { 42 | $(active).parent().removeClass("active"); 43 | $(clicked).parent().addClass("active"); 44 | } 45 | }, 50); 46 | }); 47 | 48 | $('body').scrollspy({ 49 | target: '.bs-sidebar', 50 | }); 51 | 52 | /* Toggle the `clicky` class on the body when clicking links to let us 53 | retrigger CSS animations. See ../css/base.css for more details. */ 54 | $('a').click(function (e) { 55 | $('body').toggleClass('clicky'); 56 | }); 57 | 58 | /* Prevent disabled links from causing a page reload */ 59 | $("li.disabled a").click(function () { 60 | event.preventDefault(); 61 | }); 62 | }); -------------------------------------------------------------------------------- /docs/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "icons": [ 4 | { 5 | "src": "/android-chrome-192x192.png", 6 | "sizes": "192x192", 7 | "type": "image/png" 8 | }, 9 | { 10 | "src": "/android-chrome-256x256.png", 11 | "sizes": "256x256", 12 | "type": "image/png" 13 | } 14 | ], 15 | "theme_color": "#ffffff", 16 | "background_color": "#ffffff", 17 | "display": "standalone" 18 | } -------------------------------------------------------------------------------- /docs/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/mstile-150x150.png -------------------------------------------------------------------------------- /docs/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.11, written by Peter Selinger 2001-2013 9 | 10 | 12 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /docs/search/main.js: -------------------------------------------------------------------------------- 1 | function getSearchTermFromLocation() { 2 | var sPageURL = window.location.search.substring(1); 3 | var sURLVariables = sPageURL.split('&'); 4 | for (var i = 0; i < sURLVariables.length; i++) { 5 | var sParameterName = sURLVariables[i].split('='); 6 | if (sParameterName[0] == 'q') { 7 | return decodeURIComponent(sParameterName[1].replace(/\+/g, '%20')); 8 | } 9 | } 10 | } 11 | 12 | function joinUrl (base, path) { 13 | if (path.substring(0, 1) === "/") { 14 | // path starts with `/`. Thus it is absolute. 15 | return path; 16 | } 17 | if (base.substring(base.length-1) === "/") { 18 | // base ends with `/` 19 | return base + path; 20 | } 21 | return base + "/" + path; 22 | } 23 | 24 | function formatResult (location, title, summary) { 25 | return '

'+ title + '

' + summary +'

'; 26 | } 27 | 28 | function displayResults (results) { 29 | var search_results = document.getElementById("mkdocs-search-results"); 30 | while (search_results.firstChild) { 31 | search_results.removeChild(search_results.firstChild); 32 | } 33 | if (results.length > 0){ 34 | for (var i=0; i < results.length; i++){ 35 | var result = results[i]; 36 | var html = formatResult(result.location, result.title, result.summary); 37 | search_results.insertAdjacentHTML('beforeend', html); 38 | } 39 | } else { 40 | search_results.insertAdjacentHTML('beforeend', "

No results found

"); 41 | } 42 | } 43 | 44 | function doSearch () { 45 | var query = document.getElementById('mkdocs-search-query').value; 46 | if (query.length > min_search_length) { 47 | if (!window.Worker) { 48 | displayResults(search(query)); 49 | } else { 50 | searchWorker.postMessage({query: query}); 51 | } 52 | } else { 53 | // Clear results for short queries 54 | displayResults([]); 55 | } 56 | } 57 | 58 | function initSearch () { 59 | var search_input = document.getElementById('mkdocs-search-query'); 60 | if (search_input) { 61 | search_input.addEventListener("keyup", doSearch); 62 | } 63 | var term = getSearchTermFromLocation(); 64 | if (term) { 65 | search_input.value = term; 66 | doSearch(); 67 | } 68 | } 69 | 70 | function onWorkerMessage (e) { 71 | if (e.data.allowSearch) { 72 | initSearch(); 73 | } else if (e.data.results) { 74 | var results = e.data.results; 75 | displayResults(results); 76 | } else if (e.data.config) { 77 | min_search_length = e.data.config.min_search_length-1; 78 | } 79 | } 80 | 81 | if (!window.Worker) { 82 | console.log('Web Worker API not supported'); 83 | // load index in main thread 84 | $.getScript(joinUrl(base_url, "search/worker.js")).done(function () { 85 | console.log('Loaded worker'); 86 | init(); 87 | window.postMessage = function (msg) { 88 | onWorkerMessage({data: msg}); 89 | }; 90 | }).fail(function (jqxhr, settings, exception) { 91 | console.error('Could not load worker.js'); 92 | }); 93 | } else { 94 | // Wrap search in a web worker 95 | var searchWorker = new Worker(joinUrl(base_url, "search/worker.js")); 96 | searchWorker.postMessage({init: true}); 97 | searchWorker.onmessage = onWorkerMessage; 98 | } 99 | -------------------------------------------------------------------------------- /docs/search/worker.js: -------------------------------------------------------------------------------- 1 | var base_path = 'function' === typeof importScripts ? '.' : '/search/'; 2 | var allowSearch = false; 3 | var index; 4 | var documents = {}; 5 | var lang = ['en']; 6 | var data; 7 | 8 | function getScript(script, callback) { 9 | console.log('Loading script: ' + script); 10 | $.getScript(base_path + script).done(function () { 11 | callback(); 12 | }).fail(function (jqxhr, settings, exception) { 13 | console.log('Error: ' + exception); 14 | }); 15 | } 16 | 17 | function getScriptsInOrder(scripts, callback) { 18 | if (scripts.length === 0) { 19 | callback(); 20 | return; 21 | } 22 | getScript(scripts[0], function() { 23 | getScriptsInOrder(scripts.slice(1), callback); 24 | }); 25 | } 26 | 27 | function loadScripts(urls, callback) { 28 | if( 'function' === typeof importScripts ) { 29 | importScripts.apply(null, urls); 30 | callback(); 31 | } else { 32 | getScriptsInOrder(urls, callback); 33 | } 34 | } 35 | 36 | function onJSONLoaded () { 37 | data = JSON.parse(this.responseText); 38 | var scriptsToLoad = ['lunr.js']; 39 | if (data.config && data.config.lang && data.config.lang.length) { 40 | lang = data.config.lang; 41 | } 42 | if (lang.length > 1 || lang[0] !== "en") { 43 | scriptsToLoad.push('lunr.stemmer.support.js'); 44 | if (lang.length > 1) { 45 | scriptsToLoad.push('lunr.multi.js'); 46 | } 47 | for (var i=0; i < lang.length; i++) { 48 | if (lang[i] != 'en') { 49 | scriptsToLoad.push(['lunr', lang[i], 'js'].join('.')); 50 | } 51 | } 52 | } 53 | loadScripts(scriptsToLoad, onScriptsLoaded); 54 | } 55 | 56 | function onScriptsLoaded () { 57 | console.log('All search scripts loaded, building Lunr index...'); 58 | if (data.config && data.config.separator && data.config.separator.length) { 59 | lunr.tokenizer.separator = new RegExp(data.config.separator); 60 | } 61 | 62 | if (data.index) { 63 | index = lunr.Index.load(data.index); 64 | data.docs.forEach(function (doc) { 65 | documents[doc.location] = doc; 66 | }); 67 | console.log('Lunr pre-built index loaded, search ready'); 68 | } else { 69 | index = lunr(function () { 70 | if (lang.length === 1 && lang[0] !== "en" && lunr[lang[0]]) { 71 | this.use(lunr[lang[0]]); 72 | } else if (lang.length > 1) { 73 | this.use(lunr.multiLanguage.apply(null, lang)); // spread operator not supported in all browsers: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator#Browser_compatibility 74 | } 75 | this.field('title'); 76 | this.field('text'); 77 | this.ref('location'); 78 | 79 | for (var i=0; i < data.docs.length; i++) { 80 | var doc = data.docs[i]; 81 | this.add(doc); 82 | documents[doc.location] = doc; 83 | } 84 | }); 85 | console.log('Lunr index built, search ready'); 86 | } 87 | allowSearch = true; 88 | postMessage({config: data.config}); 89 | postMessage({allowSearch: allowSearch}); 90 | } 91 | 92 | function init () { 93 | var oReq = new XMLHttpRequest(); 94 | oReq.addEventListener("load", onJSONLoaded); 95 | var index_path = base_path + '/search_index.json'; 96 | if( 'function' === typeof importScripts ){ 97 | index_path = 'search_index.json'; 98 | } 99 | oReq.open("GET", index_path); 100 | oReq.send(); 101 | } 102 | 103 | function search (query) { 104 | if (!allowSearch) { 105 | console.error('Assets for search still loading'); 106 | return; 107 | } 108 | 109 | var resultDocuments = []; 110 | var results = index.search(query); 111 | for (var i=0; i < results.length; i++){ 112 | var result = results[i]; 113 | doc = documents[result.ref]; 114 | doc.summary = doc.text.substring(0, 200); 115 | resultDocuments.push(doc); 116 | } 117 | return resultDocuments; 118 | } 119 | 120 | if( 'function' === typeof importScripts ) { 121 | onmessage = function (e) { 122 | if (e.data.init) { 123 | init(); 124 | } else if (e.data.query) { 125 | postMessage({ results: search(e.data.query) }); 126 | } else { 127 | console.error("Worker - Unrecognized message: " + e); 128 | } 129 | }; 130 | } 131 | -------------------------------------------------------------------------------- /docs/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | None 4 | 2020-11-14 5 | daily 6 | 7 | None 8 | 2020-11-14 9 | daily 10 | 11 | None 12 | 2020-11-14 13 | daily 14 | 15 | None 16 | 2020-11-14 17 | daily 18 | 19 | None 20 | 2020-11-14 21 | daily 22 | 23 | None 24 | 2020-11-14 25 | daily 26 | 27 | None 28 | 2020-11-14 29 | daily 30 | 31 | None 32 | 2020-11-14 33 | daily 34 | 35 | None 36 | 2020-11-14 37 | daily 38 | 39 | -------------------------------------------------------------------------------- /docs/sitemap.xml.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/sitemap.xml.gz -------------------------------------------------------------------------------- /docs/theme/404.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 |
7 |

404

8 |

Page not found

9 |
10 |
11 | 12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /docs/theme/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/theme/android-chrome-192x192.png -------------------------------------------------------------------------------- /docs/theme/android-chrome-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/theme/android-chrome-256x256.png -------------------------------------------------------------------------------- /docs/theme/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/theme/apple-touch-icon.png -------------------------------------------------------------------------------- /docs/theme/base.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | {%- block site_meta %} 5 | 6 | 7 | 8 | {% if page and page.is_homepage %} 9 | {% endif %} 10 | {% if config.site_author %} 11 | {% endif %} 12 | {% if page and page.canonical_url %} 13 | {% endif %} 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | {%- endblock %} 22 | 23 | {%- block htmltitle %} 24 | {% if page and page.title and not page.is_homepage %}{{ page.title }} - {% endif %}{{ config.site_name }} 25 | {%- endblock %} 26 | 27 | {%- block styles %} 28 | 29 | 30 | {%- for path in extra_css %} 31 | 32 | {%- endfor %} 33 | {%- endblock %} 34 | 35 | {%- block libs %} 36 | 37 | 38 | 39 | 40 | 41 | {%- endblock %} 42 | {%- block scripts %} 43 | 44 | {%- for path in extra_javascript %} 45 | {% if 'search' in path %} 46 | {% else %} 47 | 48 | {% endif %} 49 | {%- endfor %} 50 | {%- endblock %} 51 | 52 | {%- block extrahead %} {% endblock %} 53 | 54 | 55 | 56 | {% include "nav.html" %} 57 |
58 | Important! 59 | Please read this blog post.
60 | The Tempus Dominus projects are getting rolled back into the orginal repo. TD Bootsrap 3/4 are no longer supported. 61 |
62 | 63 | {% if not page.is_homepage %} 64 |
65 |
66 | {%- block content %} 67 |
{% include "toc.html" %}
68 |
69 |

{{page.title}}

70 | {% if page and page.meta.lead %} 71 |

72 | {{page.meta.lead[0]}} 73 |

74 | {% endif %} 75 | {% include "content.html" %} 76 |
77 | {%- endblock %} 78 |
79 |
80 | {% else %} 81 | {% include "content.html" %} 82 | {% endif %} 83 | 84 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /docs/theme/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #2b5797 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/theme/content.html: -------------------------------------------------------------------------------- 1 | {% if page.meta.source %} 2 | 7 | {% endif %} 8 | {{ page.content }} -------------------------------------------------------------------------------- /docs/theme/css/tempusdominus-bootstrap.css: -------------------------------------------------------------------------------- 1 | /*@preserve 2 | * Tempus Dominus Bootstrap4 v5.1.4 (https://tempusdominus.github.io/bootstrap-4/) 3 | * Copyright 2016-2020 Jonathan Peterson 4 | * Licensed under MIT (https://github.com/tempusdominus/bootstrap-3/blob/master/LICENSE) 5 | */ 6 | 7 | .sr-only, .bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after, .bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after, .bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after, .bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after, .bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after, .bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after, .bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after, .bootstrap-datetimepicker-widget .btn[data-action="clear"]::after, .bootstrap-datetimepicker-widget .btn[data-action="today"]::after, .bootstrap-datetimepicker-widget .picker-switch::after, .bootstrap-datetimepicker-widget table th.prev::after, .bootstrap-datetimepicker-widget table th.next::after { 8 | position: absolute; 9 | width: 1px; 10 | height: 1px; 11 | margin: -1px; 12 | padding: 0; 13 | overflow: hidden; 14 | clip: rect(0, 0, 0, 0); 15 | border: 0; } 16 | 17 | .bootstrap-datetimepicker-widget { 18 | list-style: none; } 19 | .bootstrap-datetimepicker-widget.dropdown-menu { 20 | display: block; 21 | margin: 2px 0; 22 | padding: 4px; 23 | width: 14rem; } 24 | @media (min-width: 576px) { 25 | .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { 26 | width: 38em; } } 27 | @media (min-width: 768px) { 28 | .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { 29 | width: 38em; } } 30 | @media (min-width: 992px) { 31 | .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { 32 | width: 38em; } } 33 | .bootstrap-datetimepicker-widget.dropdown-menu:before, .bootstrap-datetimepicker-widget.dropdown-menu:after { 34 | content: ''; 35 | display: inline-block; 36 | position: absolute; } 37 | .bootstrap-datetimepicker-widget.dropdown-menu.bottom:before { 38 | border-left: 7px solid transparent; 39 | border-right: 7px solid transparent; 40 | border-bottom: 7px solid #ccc; 41 | border-bottom-color: rgba(0, 0, 0, 0.2); 42 | top: -7px; 43 | left: 7px; } 44 | .bootstrap-datetimepicker-widget.dropdown-menu.bottom:after { 45 | border-left: 6px solid transparent; 46 | border-right: 6px solid transparent; 47 | border-bottom: 6px solid white; 48 | top: -6px; 49 | left: 8px; } 50 | .bootstrap-datetimepicker-widget.dropdown-menu.top:before { 51 | border-left: 7px solid transparent; 52 | border-right: 7px solid transparent; 53 | border-top: 7px solid #ccc; 54 | border-top-color: rgba(0, 0, 0, 0.2); 55 | bottom: -7px; 56 | left: 6px; } 57 | .bootstrap-datetimepicker-widget.dropdown-menu.top:after { 58 | border-left: 6px solid transparent; 59 | border-right: 6px solid transparent; 60 | border-top: 6px solid white; 61 | bottom: -6px; 62 | left: 7px; } 63 | .bootstrap-datetimepicker-widget.dropdown-menu.float-right:before { 64 | left: auto; 65 | right: 6px; } 66 | .bootstrap-datetimepicker-widget.dropdown-menu.float-right:after { 67 | left: auto; 68 | right: 7px; } 69 | .bootstrap-datetimepicker-widget.dropdown-menu.wider { 70 | width: 16rem; } 71 | .bootstrap-datetimepicker-widget .list-unstyled { 72 | margin: 0; } 73 | .bootstrap-datetimepicker-widget a[data-action] { 74 | padding: 6px 0; } 75 | .bootstrap-datetimepicker-widget a[data-action]:active { 76 | box-shadow: none; } 77 | .bootstrap-datetimepicker-widget .timepicker-hour, .bootstrap-datetimepicker-widget .timepicker-minute, .bootstrap-datetimepicker-widget .timepicker-second { 78 | width: 54px; 79 | font-weight: bold; 80 | font-size: 1.2em; 81 | margin: 0; } 82 | .bootstrap-datetimepicker-widget button[data-action] { 83 | padding: 6px; } 84 | .bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after { 85 | content: "Increment Hours"; } 86 | .bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after { 87 | content: "Increment Minutes"; } 88 | .bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after { 89 | content: "Decrement Hours"; } 90 | .bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after { 91 | content: "Decrement Minutes"; } 92 | .bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after { 93 | content: "Show Hours"; } 94 | .bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after { 95 | content: "Show Minutes"; } 96 | .bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after { 97 | content: "Toggle AM/PM"; } 98 | .bootstrap-datetimepicker-widget .btn[data-action="clear"]::after { 99 | content: "Clear the picker"; } 100 | .bootstrap-datetimepicker-widget .btn[data-action="today"]::after { 101 | content: "Set the date to today"; } 102 | .bootstrap-datetimepicker-widget .picker-switch { 103 | text-align: center; } 104 | .bootstrap-datetimepicker-widget .picker-switch::after { 105 | content: "Toggle Date and Time Screens"; } 106 | .bootstrap-datetimepicker-widget .picker-switch td { 107 | padding: 0; 108 | margin: 0; 109 | height: auto; 110 | width: auto; 111 | line-height: inherit; } 112 | .bootstrap-datetimepicker-widget .picker-switch td span { 113 | line-height: 2.5; 114 | height: 2.5em; 115 | width: 100%; } 116 | .bootstrap-datetimepicker-widget table { 117 | width: 100%; 118 | margin: 0; } 119 | .bootstrap-datetimepicker-widget table td, 120 | .bootstrap-datetimepicker-widget table th { 121 | text-align: center; 122 | border-radius: 0.25rem; } 123 | .bootstrap-datetimepicker-widget table th { 124 | height: 20px; 125 | line-height: 20px; 126 | width: 20px; } 127 | .bootstrap-datetimepicker-widget table th.picker-switch { 128 | width: 145px; } 129 | .bootstrap-datetimepicker-widget table th.disabled, .bootstrap-datetimepicker-widget table th.disabled:hover { 130 | background: none; 131 | color: #6c757d; 132 | cursor: not-allowed; } 133 | .bootstrap-datetimepicker-widget table th.prev::after { 134 | content: "Previous Month"; } 135 | .bootstrap-datetimepicker-widget table th.next::after { 136 | content: "Next Month"; } 137 | .bootstrap-datetimepicker-widget table thead tr:first-child th { 138 | cursor: pointer; } 139 | .bootstrap-datetimepicker-widget table thead tr:first-child th:hover { 140 | background: #e9ecef; } 141 | .bootstrap-datetimepicker-widget table td { 142 | height: 54px; 143 | line-height: 54px; 144 | width: 54px; } 145 | .bootstrap-datetimepicker-widget table td.cw { 146 | font-size: .8em; 147 | height: 20px; 148 | line-height: 20px; 149 | color: #6c757d; } 150 | .bootstrap-datetimepicker-widget table td.day { 151 | height: 20px; 152 | line-height: 20px; 153 | width: 20px; } 154 | .bootstrap-datetimepicker-widget table td.day:hover, .bootstrap-datetimepicker-widget table td.hour:hover, .bootstrap-datetimepicker-widget table td.minute:hover, .bootstrap-datetimepicker-widget table td.second:hover { 155 | background: #e9ecef; 156 | cursor: pointer; } 157 | .bootstrap-datetimepicker-widget table td.old, .bootstrap-datetimepicker-widget table td.new { 158 | color: #6c757d; } 159 | .bootstrap-datetimepicker-widget table td.today { 160 | position: relative; } 161 | .bootstrap-datetimepicker-widget table td.today:before { 162 | content: ''; 163 | display: inline-block; 164 | border: solid transparent; 165 | border-width: 0 0 7px 7px; 166 | border-bottom-color: #007bff; 167 | border-top-color: rgba(0, 0, 0, 0.2); 168 | position: absolute; 169 | bottom: 4px; 170 | right: 4px; } 171 | .bootstrap-datetimepicker-widget table td.active, .bootstrap-datetimepicker-widget table td.active:hover { 172 | background-color: #007bff; 173 | color: #fff; 174 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } 175 | .bootstrap-datetimepicker-widget table td.active.today:before { 176 | border-bottom-color: #fff; } 177 | .bootstrap-datetimepicker-widget table td.disabled, .bootstrap-datetimepicker-widget table td.disabled:hover { 178 | background: none; 179 | color: #6c757d; 180 | cursor: not-allowed; } 181 | .bootstrap-datetimepicker-widget table td span { 182 | display: inline-block; 183 | width: 54px; 184 | height: 54px; 185 | line-height: 54px; 186 | margin: 2px 1.5px; 187 | cursor: pointer; 188 | border-radius: 0.25rem; } 189 | .bootstrap-datetimepicker-widget table td span:hover { 190 | background: #e9ecef; } 191 | .bootstrap-datetimepicker-widget table td span.active { 192 | background-color: #007bff; 193 | color: #fff; 194 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } 195 | .bootstrap-datetimepicker-widget table td span.old { 196 | color: #6c757d; } 197 | .bootstrap-datetimepicker-widget table td span.disabled, .bootstrap-datetimepicker-widget table td span.disabled:hover { 198 | background: none; 199 | color: #6c757d; 200 | cursor: not-allowed; } 201 | .bootstrap-datetimepicker-widget.usetwentyfour td.hour { 202 | height: 27px; 203 | line-height: 27px; } 204 | 205 | .input-group [data-toggle="datetimepicker"] { 206 | cursor: pointer; } 207 | -------------------------------------------------------------------------------- /docs/theme/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/theme/favicon-16x16.png -------------------------------------------------------------------------------- /docs/theme/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/theme/favicon-32x32.png -------------------------------------------------------------------------------- /docs/theme/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/theme/favicon.ico -------------------------------------------------------------------------------- /docs/theme/js/base.js: -------------------------------------------------------------------------------- 1 | function getSearchTerm() 2 | { 3 | var sPageURL = window.location.search.substring(1); 4 | var sURLVariables = sPageURL.split('&'); 5 | for (var i = 0; i < sURLVariables.length; i++) 6 | { 7 | var sParameterName = sURLVariables[i].split('='); 8 | if (sParameterName[0] == 'q') 9 | { 10 | return sParameterName[1]; 11 | } 12 | } 13 | } 14 | 15 | $(function() { 16 | 17 | var search_term = getSearchTerm(), 18 | $search_modal = $('#mkdocs_search_modal'); 19 | 20 | if(search_term){ 21 | $search_modal.modal(); 22 | } 23 | 24 | // make sure search input gets autofocus everytime modal opens. 25 | $search_modal.on('shown.bs.modal', function () { 26 | $search_modal.find('#mkdocs-search-query').focus(); 27 | }); 28 | 29 | // Highlight.js 30 | $('pre code').each(function (i, block) { 31 | hljs.highlightBlock(block); 32 | }); 33 | $('table').addClass('table table-striped table-hover'); 34 | 35 | // Improve the scrollspy behaviour when users click on a TOC item. 36 | $(".bs-sidenav a").on("click", function() { 37 | var clicked = this; 38 | setTimeout(function() { 39 | var active = $('.nav li.active a'); 40 | active = active[active.length - 1]; 41 | if (clicked !== active) { 42 | $(active).parent().removeClass("active"); 43 | $(clicked).parent().addClass("active"); 44 | } 45 | }, 50); 46 | }); 47 | 48 | $('body').scrollspy({ 49 | target: '.bs-sidebar', 50 | }); 51 | 52 | /* Toggle the `clicky` class on the body when clicking links to let us 53 | retrigger CSS animations. See ../css/base.css for more details. */ 54 | $('a').click(function (e) { 55 | $('body').toggleClass('clicky'); 56 | }); 57 | 58 | /* Prevent disabled links from causing a page reload */ 59 | $("li.disabled a").click(function () { 60 | event.preventDefault(); 61 | }); 62 | }); -------------------------------------------------------------------------------- /docs/theme/main.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} -------------------------------------------------------------------------------- /docs/theme/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "icons": [ 4 | { 5 | "src": "/android-chrome-192x192.png", 6 | "sizes": "192x192", 7 | "type": "image/png" 8 | }, 9 | { 10 | "src": "/android-chrome-256x256.png", 11 | "sizes": "256x256", 12 | "type": "image/png" 13 | } 14 | ], 15 | "theme_color": "#ffffff", 16 | "background_color": "#ffffff", 17 | "display": "standalone" 18 | } -------------------------------------------------------------------------------- /docs/theme/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/docs/theme/mstile-150x150.png -------------------------------------------------------------------------------- /docs/theme/nav.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/theme/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.11, written by Peter Selinger 2001-2013 9 | 10 | 12 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /docs/theme/search-modal.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/theme/toc.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "parserOptions": { 3 | "ecmaVersion": 6, 4 | "sourceType": "module" 5 | }, 6 | "env": { 7 | "browser": true, 8 | "jquery": true, 9 | "node": true 10 | }, 11 | "globals": { 12 | "define": false, 13 | "moment": false, 14 | "jasmine": false, 15 | "describe": false, 16 | "xdescribe": false, 17 | "expect": false, 18 | "it": false, 19 | "xit": false, 20 | "spyOn": false, 21 | "beforeEach": false, 22 | "afterEach": false 23 | }, 24 | "rules": { 25 | "no-cond-assign": 0, 26 | "curly": [ 27 | 2, 28 | "all" 29 | ], 30 | "no-debugger": 0, 31 | "eqeqeq": 2, 32 | "no-bitwise": 2, 33 | "no-eq-null": 2, 34 | "no-eval": 0, 35 | "guard-for-in": 2, 36 | "wrap-iife": 2, 37 | "linebreak-style": 0, 38 | "new-cap": 2, 39 | "no-caller": 2, 40 | "no-empty": [ 41 | 2, 42 | { 43 | "allowEmptyCatch": true 44 | } 45 | ], 46 | "no-new": 0, 47 | "no-plusplus": 0, 48 | "no-undef": 2, 49 | "dot-notation": 0, 50 | "strict": [ 51 | 2, 52 | "function" 53 | ], 54 | "no-unused-vars": 2, 55 | "camelcase": [ 56 | 2, 57 | { 58 | "properties": "always" 59 | } 60 | ], 61 | "quotes": [ 62 | 2, 63 | "single" 64 | ], 65 | "keyword-spacing": [ 66 | 2, 67 | {} 68 | ], 69 | "space-before-blocks": [ 70 | 2, 71 | "always" 72 | ], 73 | "space-before-function-paren": [ 74 | 2, 75 | { 76 | "anonymous": "ignore", 77 | "named": "never" 78 | } 79 | ], 80 | "one-var": [ 81 | 2, 82 | "always" 83 | ], 84 | "padded-blocks": [ 85 | 2, 86 | "never" 87 | ], 88 | "array-bracket-spacing": [ 89 | 2, 90 | "never", 91 | {} 92 | ], 93 | "space-in-parens": [ 94 | 2, 95 | "never" 96 | ], 97 | "comma-style": [ 98 | 2, 99 | "last" 100 | ], 101 | "space-unary-ops": [ 102 | 2, 103 | { 104 | "words": false, 105 | "nonwords": false 106 | } 107 | ], 108 | "space-infix-ops": 2, 109 | "no-with": 2, 110 | "no-multi-str": 2, 111 | "indent": "off", 112 | "no-trailing-spaces": 2, 113 | "comma-dangle": [ 114 | 2, 115 | "never" 116 | ], 117 | "eol-last": 2 118 | } 119 | } -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: Tempus Dominus - Bootstrap 4 2 | repo_url: https://github.com/tempusdominus/bootstrap-4-datetimepicker 3 | edit_uri: edit/master/src/docs/ 4 | extra_javascript: ['theme\js\base.js','//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/highlight.min.js','theme\js\tempusdominus-bootstrap-4.js'] 5 | extra_css: ['theme\css\base.css','//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/styles/github.min.css','theme\css\tempusdominus-bootstrap-4.css'] 6 | docs_dir: src/docs 7 | site_dir: docs 8 | theme: 9 | name: null 10 | custom_dir: src/docs/theme 11 | nav: 12 | - Tempus Dominus Bootstrap 4: 'index.md' 13 | - Usage: 'Usage.md' 14 | - Installing: 'Installing.md' 15 | - Functions: 'Functions.md' 16 | - Options: 'Options.md' 17 | - Events: 'Events.md' 18 | - Dev Guide: 'ContributorsGuide.md' 19 | - Extras: 'Extras.md' 20 | - FAQs: 'FAQ.md' -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "license": "MIT", 3 | "main": "build/js/tempusdominus-bootstrap-4.js", 4 | "name": "tempusdominus-bootstrap-4", 5 | "author": "Jonathan Peterson", 6 | "contributors": [ 7 | "Anton Bagdatyev (Tonix)" 8 | ], 9 | "bugs": { 10 | "url": "https://github.com/tempusdominus/bootstrap-4/issues" 11 | }, 12 | "dependencies": { 13 | "bootstrap": "^4.6.1", 14 | "jquery": "^3.6.0", 15 | "moment": "^2.29.2", 16 | "moment-timezone": "^0.5.34", 17 | "popper.js": "^1.16.1" 18 | }, 19 | "peerDependencies": { 20 | "bootstrap": ">=4.5.2", 21 | "jquery": "^3.5.1", 22 | "popper.js": "^1.16.1", 23 | "moment": "^2.29.0", 24 | "moment-timezone": "^0.5.31", 25 | "tempusdominus-core": "5.19.3" 26 | }, 27 | "scripts": { 28 | "change-version": "node grunt/change-version.js", 29 | "clean-css": "cleancss --skip-advanced --source-map --output dist/css/bootstrap.min.css dist/css/bootstrap.css && cleancss --skip-advanced --source-map --output dist/css/bootstrap-grid.min.css dist/css/bootstrap-grid.css && cleancss --skip-advanced --source-map --output dist/css/bootstrap-reboot.min.css dist/css/bootstrap-reboot.css", 30 | "clean-css-docs": "cleancss --skip-advanced --source-map --output docs/assets/css/docs.min.css docs/assets/css/docs.min.css", 31 | "eslint": "eslint --ignore-path .eslintignore js && eslint --config js/tests/.eslintrc.json --env node grunt Gruntfile.js && eslint --config js/tests/.eslintrc.json docs/assets/js/src docs/assets/js/ie-emulation-modes-warning.js docs/assets/js/ie10-viewport-bug-workaround.js", 32 | "htmlhint": "htmlhint --config docs/.htmlhintrc _gh_pages/", 33 | "postcss": "postcss --config grunt/postcss.js --replace dist/css/*.css", 34 | "postcss-docs": "postcss --config grunt/postcss.js --no-map --replace docs/assets/css/docs.min.css && postcss --config grunt/postcss.js --no-map --replace docs/examples/**/*.css", 35 | "scss-lint": "bundle exec scss-lint --config scss/.scss-lint.yml --exclude scss/_normalize.scss scss/*.scss", 36 | "scss-lint-docs": "bundle exec scss-lint --config scss/.scss-lint.yml --exclude docs/assets/scss/docs.scss docs/assets/scss/*.scss", 37 | "uglify": "uglifyjs --compress warnings=false --mangle --output build/js/tempusdominus-bootstrap-3.min.js build/js/tempusdominus-bootstrap-3.js", 38 | "uglify-docs": "uglifyjs --compress warnings=false --mangle --comments '/^!/' --output docs/assets/js/docs.min.js docs/assets/js/vendor/*.js docs/assets/js/src/application.js", 39 | "update-shrinkwrap": "npm shrinkwrap --dev && shx mv ./npm-shrinkwrap.json ./grunt/npm-shrinkwrap.json", 40 | "test": "npm run eslint && grunt test", 41 | "watch": "./node_modules/.bin/onchange './src/js/**' './src/sass/**' -- npm run build", 42 | "build": "grunt build:travis", 43 | "build-all": "npm run build", 44 | "git-add-cm": "git add . && git commit -am", 45 | "publish-patch": "npm version patch && npm run build && ((npm run git-add-cm -- \"Next patch version\" 2>/dev/null) || echo) && npm publish && git push && git push --tags", 46 | "publish-minor": "npm version minor && npm run build && ((npm run git-add-cm -- \"Next minor version\" 2>/dev/null) || echo) && npm publish && git push && git push --tags", 47 | "publish-major": "npm version major && npm run build && ((npm run git-add-cm -- \"Next major version\" 2>/dev/null) || echo) && npm publish && git push && git push --tags" 48 | }, 49 | "description": "A date/time picker component designed to work with Bootstrap 4 and Momentjs.", 50 | "devDependencies": { 51 | "@babel/core": "^7.17.9", 52 | "@babel/preset-env": "^7.16.11", 53 | "autoprefixer": "^9.8.8", 54 | "babel-plugin-transform-es2015-modules-strip": "^0.1.2", 55 | "grunt": "^1.5.0", 56 | "grunt-babel": "^8.0.0", 57 | "grunt-contrib-concat": "^1.0.1", 58 | "grunt-contrib-cssmin": "^3.0.0", 59 | "grunt-contrib-uglify": "^4.0.1", 60 | "grunt-contrib-watch": "^1.1.0", 61 | "grunt-dart-sass": "^1.1.3", 62 | "grunt-eslint": "^22.0.0", 63 | "grunt-mkdocs": "^1.0.1", 64 | "grunt-postcss": "^0.9.0", 65 | "grunt-stamp": "^0.3.0", 66 | "grunt-string-replace": "^1.3.1", 67 | "load-grunt-tasks": "^5.1.0", 68 | "moment-timezone": "^0.5.34", 69 | "onchange": "^7.1.0", 70 | "tempusdominus": "^5.16.0", 71 | "uglify-js": "^3.15.4" 72 | }, 73 | "homepage": "https://tempusdominus.github.io/bootstrap-4/", 74 | "keywords": [ 75 | "bootstrap", 76 | "datepicker", 77 | "datetimepicker", 78 | "timepicker", 79 | "moment" 80 | ], 81 | "repository": { 82 | "type": "git", 83 | "url": "https://github.com/tempusdominus/bootstrap-4.git" 84 | }, 85 | "version": "5.39.2", 86 | "files": [ 87 | "build", 88 | "src/js/**/*.js", 89 | "src/sass/**/*.scss", 90 | "Gruntfile.js" 91 | ], 92 | "browserslist": [ 93 | "> .05%" 94 | ] 95 | } 96 | -------------------------------------------------------------------------------- /src/docs/ContributorsGuide.md: -------------------------------------------------------------------------------- 1 | This guide is aimed to contributors wishing to understand the internals of the code in order to change/evolve the component. 2 | 3 | **Note:** this guide refers to **version 5** which is currently in alpha and will be updated as we progress 4 | 5 | ## Introduction 6 | This component consists actually of 2 subcomponent UI widgets one for the date and one for the time selection process. The developers can configure which of those are needed and also the granularity that the component will allow the users to select a date/time. Developers also choose the format that the selected date/time will be displayed in the input field. 7 | The component uses on `jQuery`, `moment.js` libraries. 8 | 9 | ## Code 10 | ### Private variables 11 | 12 | * `element` - Holds the DOM element this instance is attached to 13 | 14 | * `options` - Holds an object with the currently set options for the specific instance of the component. Don't directly change the properties of that object use the public API methods instead. DO NOT expose this object or its properties outside of the component. 15 | 16 | * `date` - Holds the moment object for the model value of the component. **DON'T** directly change this variable unless you **REALLY** know what you are doing. Use `setValue()` function to set it. It handles all component logic for updating the model value and emitting all the appropriate events 17 | 18 | * `viewDate` - Holds the currently selected value that the user has selected through the widget. This is not the model value this is the view value. Changing this usually requires a subsequent call to `update()` function 19 | 20 | * `unset` - A `boolean` variable that holds whether the components model value is set or not. Model's value starts as `unset = true` and if is either set by the user or programmatically through the api to a valid value then it is set to `false`. If subsequent events lead to an invalid value then this variable is set to `true` again. Setting this variable usually takes place in the `setValue()` function. 21 | 22 | * `input` - Hold the DOM input element this instance is attached to 23 | 24 | * `component` - Holds a reference to the .input-group DOM element that the widget is attached or false if it is attached directly on an input field 25 | 26 | * `widget` - Holds a reference to the DOM element containing the widget or `false` if the widget is hidden 27 | 28 | * `use24hours` - Holds whether the component uses 24 hours format or not. This is initialized on the `format()` function 29 | 30 | * `minViewModeNumber` - Holds the Numeric equivalent of the options.minViewMode parameter 31 | 32 | * `format` - Holds the current format string that is used for formatting the date model value. Note this is not the same thing as the `options.format` as the second could be set to `false` in which case the first takes the locale's `L` or `LT` value 33 | 34 | * `currentViewMode` - Hold the state of the current viewMode for the DatePicker subcomponent 35 | 36 | * `datePickerModes` - An array of objects with configuration parameters for the different views of the DatePicker subcomponent 37 | 38 | * `viewModes` - An array of strings containing all the possible strings that `options.viewMode` can take through `viewMode()` public api function 39 | 40 | * `directionModes` - An array of strings containing all the possible strings that `options.direction` can take through `direction()` public api function 41 | 42 | * `orientationModes` - An array of strings containing all the possible strings that `options.orientation` can take through `orientation()` public api function 43 | 44 | ### Private functions 45 | 46 | 47 | #### Events related 48 | 49 | * `notifyEvent(e)` - Use this function when you want to send en event to listener this could be used as a filter later 50 | 51 | * `stopEvent(e)` - Shortcut for stopping propagation of events 52 | 53 | * `keydown(e)` - Function to trap 54 | 55 | * `change(e)` - Listener function to track change events occurring on the `input` dom element the component is attached to 56 | 57 | * `attachDatePickerElementEvents()` - Attaches listeners to the existing DOM elements the component is attached to. Called upon construction of each datetimepicker instance 58 | 59 | * `detachDatePickerElementEvents()` - Detaches listeners from the DOM element the component is attached to. Called on `destroy()` 60 | 61 | * `attachDatePickerWidgetEvents()` - Attaches listeners on the components widget. Called on `show()` 62 | 63 | * `detachDatePickerWidgetEvents()` - Detaches listeners on the components widget. Called on `hide()` 64 | 65 | #### Model related 66 | 67 | * `setValue(targetMoment)` - Sets the model value of the component takes a moment object. An `error` event will be emmited if the `targetMoment` does not pass the configured validations. Otherwise the `date` variable will be set and the relevant events will be fired. 68 | 69 | * `isValid(targetMoment, granularity)` - returns `true` if the `targetMoment` moment object is valid according to the components set validation rules (`min/maxDates`, `disabled/enabledDates` and `daysOfWeekDisabled`). You may pass a second variable to check only up the the specific granularity `year, month, day, hour, minute, second` 70 | 71 | #### Utilities 72 | 73 | * `indexGivenDates (givenDatesArray)` - Function that takes the array from `enabledDates()` and `disabledDates()` public functions and stores them as object keys to enable quick lookup 74 | 75 | * `isInEnableDates(date)` - Checks whether if the given moment object exists in the `options.enabledDates` object 76 | 77 | * `isInDisableDates(date)` - Checks whether if the given moment object exists in the `options.disabledDates` array 78 | 79 | * `dataToOptions()` - Parses `data-date-*` options set on the input dom element the component is attached to and returns an object with them 80 | 81 | * `isInFixed()` - Checks if the dom element or its parents has a fixed position css rule. 82 | 83 | * `parseInputDate(date)` - Parses a date parameter with moment using the component's `options.format` and `options.useStrict`. It returns a `moment` object or false if `parsedMoment#isValid()` returns `false`. Use this to parse date inputs from outside the component (public API calls). 84 | 85 | * `init()` - Initializes the component. Called when the component instance is created 86 | -------------------------------------------------------------------------------- /src/docs/Events.md: -------------------------------------------------------------------------------- 1 | ### hide.datetimepicker 2 | 3 | Fired when the widget is hidden. 4 | 5 | Parameters: 6 | 7 | ``` 8 | e = { 9 | date //the currently set date. Type: moment object (clone) 10 | } 11 | ``` 12 | 13 | Emitted from: 14 | 15 | * toggle() 16 | * hide() 17 | * disable() 18 | 19 | ---------------------- 20 | 21 | ### show.datetimepicker 22 | 23 | Fired when the widget is shown. 24 | 25 | Parameters: 26 | 27 | No parameters are include, listen to `change.datetimepicker` instead 28 | 29 | Emitted from: 30 | 31 | * toggle() 32 | * show() 33 | 34 | ---------------------- 35 | 36 | ### change.datetimepicker 37 | 38 | Fired when the date is changed, including when changed to a non-date (e.g. When keepInvalid=true). 39 | 40 | Parameters: 41 | 42 | ``` 43 | e = { 44 | date, //date the picker changed to. Type: moment object (clone) 45 | oldDate //previous date. Type: moment object (clone) or false in the event of a null 46 | } 47 | ``` 48 | 49 | Emitted from: 50 | 51 | * toggle() **Note**: Only fired when using `useCurrent` 52 | * show() **Note**: Only fired when using `useCurrent` or when or the date is changed to comply with date rules (min/max etc) 53 | * date(newDate) 54 | * minDate(minDate) 55 | * maxDate(maxDate) 56 | * daysOfWeekDisabled() 57 | 58 | ---------------------- 59 | 60 | ### error.datetimepicker 61 | 62 | Fired when a selected date fails to pass validation. 63 | 64 | Parameters: 65 | 66 | ``` 67 | e = { 68 | date //the invalid date. Type: moment object (clone) 69 | oldDate //previous date. Type: moment object (clone) or false in the event of a null 70 | } 71 | ``` 72 | 73 | Emmited from: 74 | 75 | * minDate(minDate) 76 | * maxDate(maxDate) 77 | * daysOfWeekDisabled() 78 | * setValue() *private function* 79 | 80 | ---------------------- 81 | 82 | ### update.datetimepicker 83 | 84 | Fired (in most cases) when the `viewDate` changes. E.g. Next and Previous buttons, selecting a year. 85 | 86 | Parameters: 87 | 88 | ``` 89 | e = { 90 | change, //Change type as a momentjs format token. Type: string e.g. yyyy on year change 91 | viewDate //new viewDate. Type: moment object 92 | } 93 | ``` -------------------------------------------------------------------------------- /src/docs/Extras.md: -------------------------------------------------------------------------------- 1 | Guides for making the picker work better with rails, IE, etc. **Note:** I have no idea if these guides still apply for v5 or not. 2 | 3 | ## Rails 3 4 | 5 | by [dhulihan](https://github.com/dhulihan) 6 | 7 | You can easily override the default rails form helpers (`date_select` and `datetime_select`) with bootstrap-datetimepicker for a much nicer experience. 8 | 9 | ```rb 10 | # Add to config/initializers/form.rb or the end of app/helpers/application_helper.rb 11 | module ActionView 12 | module Helpers 13 | class FormBuilder 14 | def date_select(method, options = {}, html_options = {}) 15 | existing_date = @object.send(method) 16 | formatted_date = existing_date.to_date.strftime("%F") if existing_date.present? 17 | @template.content_tag(:div, :class => "input-group") do 18 | text_field(method, :value => formatted_date, :class => "form-control datepicker", :"data-date-format" => "YYYY-MM-DD") + 19 | @template.content_tag(:span, @template.content_tag(:span, "", :class => "glyphicon glyphicon-calendar") ,:class => "input-group-addon") 20 | end 21 | end 22 | 23 | def datetime_select(method, options = {}, html_options = {}) 24 | existing_time = @object.send(method) 25 | formatted_time = existing_time.to_time.strftime("%F %I:%M %p") if existing_time.present? 26 | @template.content_tag(:div, :class => "input-group") do 27 | text_field(method, :value => formatted_time, :class => "form-control datetimepicker", :"data-date-format" => "YYYY-MM-DD hh:mm A") + 28 | @template.content_tag(:span, @template.content_tag(:span, "", :class => "glyphicon glyphicon-calendar") ,:class => "input-group-addon") 29 | end 30 | end 31 | end 32 | end 33 | end 34 | ``` 35 | 36 | The time format used here is ActiveRecord-friendly, which means it will be parsed correctly when passed in through `params` to your record. 37 | 38 | That's all there is to it! Now all of your forms that use `datetime_select` or `date_select` will be automatically updated: 39 | 40 | ```erb 41 | <% form_for @post do |f| %> 42 |
43 | 44 | <%= f.datetime_select :published_at %> 45 |
46 | <% end %> 47 | ``` -------------------------------------------------------------------------------- /src/docs/FAQ.md: -------------------------------------------------------------------------------- 1 | # How do I disable the date or time element 2 | How do I format ...; How do I add seconds; etc. 3 | 4 | The picker uses the `format` option to decide what components to show. Set `format` to `LT`, `LTS` or another valid [MomentJs format string](http://momentjs.com/docs/#/displaying/format/) to display certain components 5 | 6 | # How do I change the language/locale 7 | 8 | The picker uses MomentJs to determine the language string. You can use `moment-with-locales` or you can include whatever local file you need. Set the picker's `locale` option to `de` or whatever the locale string is. 9 | 10 | # How do I change the styles? The picker closes. 11 | 12 | Set `debug:true` which will force the picker to stay open, even `onBlur`. You can hide the picker manually by calling `hide()` 13 | 14 | # How do I change the start of the week? 15 | 16 | Start of the week is based on the [`locale` provided](Options.md#locale). This is defined by moment's locales. If you want to change it, create your own locale file or override. [See moment's docs](http://momentjs.com/docs/#/i18n/). 17 | 18 | # How I use the picker as birthday picker? 19 | 20 | Use the [`viewMode`](Options.md#viewmode) option to `'years'` -------------------------------------------------------------------------------- /src/docs/Functions.md: -------------------------------------------------------------------------------- 1 |
2 | Note 3 | All functions are accessed via the data attribute e.g. $('#datetimepicker').datetimepicker(FUNCTION) 4 |
5 | 6 | ### destroy 7 | 8 | Destroys the widget and removes all attached event listeners 9 | 10 | ---------------------- 11 | 12 | ### toggle 13 | 14 | Shows or hides the widget 15 | 16 | #### Emits 17 | 18 | * `hide.datetimepicker` - if the widget is hidden after the toggle call 19 | 20 | * `show.datetimepicker` - if the widget is show after the toggle call 21 | 22 | * `change.datetimepicker` - if the widget is opened for the first time and the input element is empty and `options.useCurrent != false` 23 | 24 | ---------------------- 25 | 26 | ### show 27 | 28 | Shows the widget 29 | 30 | #### Emits 31 | 32 | * `show.datetimepicker` - if the widget was hidden before that call 33 | 34 | * `change.datetimepicker` - if the widget is opened for the first time and the `useCurrent` is set to true or to a granularity value and the input element the component is attached to has an empty value 35 | 36 | ---------------------- 37 | 38 | ### hide 39 | 40 | Hides the widget 41 | 42 | #### Emits 43 | 44 | * `hide.datetimepicker` - if the widget was visible before that call 45 | 46 | ---------------------- 47 | 48 | ### disable 49 | 50 | Disables the input element, the component is attached to, by adding a `disabled="true"` attribute to it. If the widget was visible before that call it is hidden. 51 | 52 | #### Emits 53 | 54 | * `hide.datetimepicker` - if the widget was visible before that call 55 | 56 | ---------------------- 57 | 58 | ### enable 59 | 60 | Enables the input element, the component is attached to, by removing `disabled` attribute from it. 61 | 62 | ---------------------- 63 | 64 | ### clear 65 | 66 | Clears the date picker by setting the value to `null` 67 | 68 | ---------------------- 69 | 70 | ### viewDate 71 | 72 | #### viewDate 73 | 74 | Returns a `moment` variable with the currently set `options.viewDate` option. 75 | 76 | #### viewDate(viewDate) 77 | 78 | Takes a `string, moment or Date` value. 79 | 80 | This will change the `viewDate` without changing or setting the selected date. -------------------------------------------------------------------------------- /src/docs/Installing.md: -------------------------------------------------------------------------------- 1 | # Minimal Requirements 2 | 3 | 1. jQuery 4 | 2. Moment.js 5 | 3. Locales: Moment's locale files are [here](https://github.com/moment/moment/tree/master/locale) 6 | 7 | # Installation Guides 8 | * [CDN](#cdn) 9 | * [Rails](#rails) 10 | * [Django](#django) 11 | * [Angular](#angular-wrapper) 12 | * [Manual](#manual) 13 | 14 | ## CDN 15 | ```html 16 | 17 | 18 | 19 | 20 | ``` 21 | 22 | ## Package Managers 23 | 24 | ### Rails 25 | 26 | Rails 5.1 Support - [Bootstrap 4 Datetime Picker Rails](https://github.com/Bialogs/bootstrap4-datetime-picker-rails) 27 | 28 | 1. Add `gem 'bootstrap4-datetime-picker-rails'` to your `Gemfile` 29 | 2. Execute `bundle` 30 | 3. Add `//= require tempusdominus-bootstrap-4.js` to your `application.js` 31 | 4. Add `@import "tempusdominus-bootstrap-4.css"` to your `application.scss` 32 | 33 | ### Django 34 | 35 | Python package for Django: [Django Tempus Dominus](https://pypi.org/project/django-tempus-dominus/) 36 | 37 | 1. Install via pip: `pip install django-tempus-dominus` 38 | 2. Widgets are provided for Date, DateTime, and Time. 39 | 3. [Full examples are available with Django Forms, Widgets, and Templates](https://pypi.org/project/django-tempus-dominus/). 40 | 41 | ### Angular Wrapper 42 | 43 | Follow instructions at [ngx-tempusdominus-bootstrap](https://github.com/fetrarij/ngx-tempusdominus-bootstrap) 44 | 45 | ## Manual 46 | 47 | 1. Acquire [jQuery](https://jquery.com) 48 | 2. Acquire [Moment.js](https://github.com/moment/moment) 49 | 3. Acquire [Tempus Dominus - Bootstrap 4](https://github.com/tempusdominus/bootstrap-4) 50 | ```html 51 | 52 | 53 | 54 | 55 | ``` -------------------------------------------------------------------------------- /src/docs/img/calendarWeeks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/src/docs/img/calendarWeeks.png -------------------------------------------------------------------------------- /src/docs/img/dpheader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/src/docs/img/dpheader.png -------------------------------------------------------------------------------- /src/docs/img/sideBySide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/src/docs/img/sideBySide.png -------------------------------------------------------------------------------- /src/docs/img/toolbarPlacement.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/src/docs/img/toolbarPlacement.png -------------------------------------------------------------------------------- /src/docs/index.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | 6 |
7 |
8 |

Tempus Dominus

9 |

10 | Tempus Dominus is the successor to the very popular Eonasdan/bootstrap-datetimepicker. 11 | The plugin provide a robust date and time picker designed to integrate into your Bootstrap project. 12 |

13 |
14 | Get started 15 | Download 16 |
17 |

18 | Currently v5.1.3 19 | 20 |

21 |
22 |
23 |
24 |
25 |
26 |
27 |

Get awesome Dashboard Templates

28 |

Looking for a template with the datepicker ready to go? Then get check out these templates from our partners.

29 |
30 |
31 |
32 |

Creative Tim

33 |
34 | 40 | 46 | 52 |
53 | 76 |
77 |
78 |
79 |
80 | 81 |

Installation

82 |

Include Tempus Dominus's source Sass and JavaScript files via npm

83 |
 84 | 
 85 | npm i tempusdominus-bootstrap-4
 86 | 
 87 | 		
88 |
89 | Read installation docs 90 |
91 |
92 | 93 |

CDNJS

94 |

When you only need to include Tempus Dominus's compiled CSS or JS, you can use CDNJS.

95 |
 96 | 
 97 | <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
 98 | <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.0/moment.min.js"></script>
 99 | <script src="https://cdnjs.cloudflare.com/ajax/libs/tempusdominus-bootstrap-4/5.38.0/js/tempusdominus-bootstrap-4.min.js" crossorigin="anonymous"></script>
100 | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tempusdominus-bootstrap-4/5.38.0/css/tempusdominus-bootstrap-4.min.css" crossorigin="anonymous" />
101 | 
102 | 		
103 |
104 | Explore the docs 105 |
106 |
-------------------------------------------------------------------------------- /src/docs/theme/404.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 |
7 |

404

8 |

Page not found

9 |
10 |
11 | 12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /src/docs/theme/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/src/docs/theme/android-chrome-192x192.png -------------------------------------------------------------------------------- /src/docs/theme/android-chrome-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/src/docs/theme/android-chrome-256x256.png -------------------------------------------------------------------------------- /src/docs/theme/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/src/docs/theme/apple-touch-icon.png -------------------------------------------------------------------------------- /src/docs/theme/base.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | {%- block site_meta %} 5 | 6 | 7 | 8 | {% if page and page.is_homepage %} 9 | {% endif %} 10 | {% if config.site_author %} 11 | {% endif %} 12 | {% if page and page.canonical_url %} 13 | {% endif %} 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | {%- endblock %} 22 | 23 | {%- block htmltitle %} 24 | {% if page and page.title and not page.is_homepage %}{{ page.title }} - {% endif %}{{ config.site_name }} 25 | {%- endblock %} 26 | 27 | {%- block styles %} 28 | 29 | 30 | {%- for path in extra_css %} 31 | 32 | {%- endfor %} 33 | {%- endblock %} 34 | 35 | {%- block libs %} 36 | 37 | 38 | 39 | 40 | 41 | {%- endblock %} 42 | {%- block scripts %} 43 | 44 | {%- for path in extra_javascript %} 45 | {% if 'search' in path %} 46 | {% else %} 47 | 48 | {% endif %} 49 | {%- endfor %} 50 | {%- endblock %} 51 | 52 | {%- block extrahead %} {% endblock %} 53 | 54 | 55 | 56 | {% include "nav.html" %} 57 |
58 | Important! 59 | Please read this blog post.
60 | The Tempus Dominus projects are getting rolled back into the orginal repo. TD Bootsrap 3/4 are no longer supported. 61 |
62 | 63 | {% if not page.is_homepage %} 64 |
65 |
66 | {%- block content %} 67 |
{% include "toc.html" %}
68 |
69 |

{{page.title}}

70 | {% if page and page.meta.lead %} 71 |

72 | {{page.meta.lead[0]}} 73 |

74 | {% endif %} 75 | {% include "content.html" %} 76 |
77 | {%- endblock %} 78 |
79 |
80 | {% else %} 81 | {% include "content.html" %} 82 | {% endif %} 83 | 84 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /src/docs/theme/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #2b5797 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/docs/theme/content.html: -------------------------------------------------------------------------------- 1 | {% if page.meta.source %} 2 | 7 | {% endif %} 8 | {{ page.content }} -------------------------------------------------------------------------------- /src/docs/theme/css/tempusdominus-bootstrap.css: -------------------------------------------------------------------------------- 1 | /*@preserve 2 | * Tempus Dominus Bootstrap4 v5.1.4 (https://tempusdominus.github.io/bootstrap-4/) 3 | * Copyright 2016-2020 Jonathan Peterson 4 | * Licensed under MIT (https://github.com/tempusdominus/bootstrap-3/blob/master/LICENSE) 5 | */ 6 | 7 | .sr-only, .bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after, .bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after, .bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after, .bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after, .bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after, .bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after, .bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after, .bootstrap-datetimepicker-widget .btn[data-action="clear"]::after, .bootstrap-datetimepicker-widget .btn[data-action="today"]::after, .bootstrap-datetimepicker-widget .picker-switch::after, .bootstrap-datetimepicker-widget table th.prev::after, .bootstrap-datetimepicker-widget table th.next::after { 8 | position: absolute; 9 | width: 1px; 10 | height: 1px; 11 | margin: -1px; 12 | padding: 0; 13 | overflow: hidden; 14 | clip: rect(0, 0, 0, 0); 15 | border: 0; } 16 | 17 | .bootstrap-datetimepicker-widget { 18 | list-style: none; } 19 | .bootstrap-datetimepicker-widget.dropdown-menu { 20 | display: block; 21 | margin: 2px 0; 22 | padding: 4px; 23 | width: 14rem; } 24 | @media (min-width: 576px) { 25 | .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { 26 | width: 38em; } } 27 | @media (min-width: 768px) { 28 | .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { 29 | width: 38em; } } 30 | @media (min-width: 992px) { 31 | .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { 32 | width: 38em; } } 33 | .bootstrap-datetimepicker-widget.dropdown-menu:before, .bootstrap-datetimepicker-widget.dropdown-menu:after { 34 | content: ''; 35 | display: inline-block; 36 | position: absolute; } 37 | .bootstrap-datetimepicker-widget.dropdown-menu.bottom:before { 38 | border-left: 7px solid transparent; 39 | border-right: 7px solid transparent; 40 | border-bottom: 7px solid #ccc; 41 | border-bottom-color: rgba(0, 0, 0, 0.2); 42 | top: -7px; 43 | left: 7px; } 44 | .bootstrap-datetimepicker-widget.dropdown-menu.bottom:after { 45 | border-left: 6px solid transparent; 46 | border-right: 6px solid transparent; 47 | border-bottom: 6px solid white; 48 | top: -6px; 49 | left: 8px; } 50 | .bootstrap-datetimepicker-widget.dropdown-menu.top:before { 51 | border-left: 7px solid transparent; 52 | border-right: 7px solid transparent; 53 | border-top: 7px solid #ccc; 54 | border-top-color: rgba(0, 0, 0, 0.2); 55 | bottom: -7px; 56 | left: 6px; } 57 | .bootstrap-datetimepicker-widget.dropdown-menu.top:after { 58 | border-left: 6px solid transparent; 59 | border-right: 6px solid transparent; 60 | border-top: 6px solid white; 61 | bottom: -6px; 62 | left: 7px; } 63 | .bootstrap-datetimepicker-widget.dropdown-menu.float-right:before { 64 | left: auto; 65 | right: 6px; } 66 | .bootstrap-datetimepicker-widget.dropdown-menu.float-right:after { 67 | left: auto; 68 | right: 7px; } 69 | .bootstrap-datetimepicker-widget.dropdown-menu.wider { 70 | width: 16rem; } 71 | .bootstrap-datetimepicker-widget .list-unstyled { 72 | margin: 0; } 73 | .bootstrap-datetimepicker-widget a[data-action] { 74 | padding: 6px 0; } 75 | .bootstrap-datetimepicker-widget a[data-action]:active { 76 | box-shadow: none; } 77 | .bootstrap-datetimepicker-widget .timepicker-hour, .bootstrap-datetimepicker-widget .timepicker-minute, .bootstrap-datetimepicker-widget .timepicker-second { 78 | width: 54px; 79 | font-weight: bold; 80 | font-size: 1.2em; 81 | margin: 0; } 82 | .bootstrap-datetimepicker-widget button[data-action] { 83 | padding: 6px; } 84 | .bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after { 85 | content: "Increment Hours"; } 86 | .bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after { 87 | content: "Increment Minutes"; } 88 | .bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after { 89 | content: "Decrement Hours"; } 90 | .bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after { 91 | content: "Decrement Minutes"; } 92 | .bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after { 93 | content: "Show Hours"; } 94 | .bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after { 95 | content: "Show Minutes"; } 96 | .bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after { 97 | content: "Toggle AM/PM"; } 98 | .bootstrap-datetimepicker-widget .btn[data-action="clear"]::after { 99 | content: "Clear the picker"; } 100 | .bootstrap-datetimepicker-widget .btn[data-action="today"]::after { 101 | content: "Set the date to today"; } 102 | .bootstrap-datetimepicker-widget .picker-switch { 103 | text-align: center; } 104 | .bootstrap-datetimepicker-widget .picker-switch::after { 105 | content: "Toggle Date and Time Screens"; } 106 | .bootstrap-datetimepicker-widget .picker-switch td { 107 | padding: 0; 108 | margin: 0; 109 | height: auto; 110 | width: auto; 111 | line-height: inherit; } 112 | .bootstrap-datetimepicker-widget .picker-switch td span { 113 | line-height: 2.5; 114 | height: 2.5em; 115 | width: 100%; } 116 | .bootstrap-datetimepicker-widget table { 117 | width: 100%; 118 | margin: 0; } 119 | .bootstrap-datetimepicker-widget table td, 120 | .bootstrap-datetimepicker-widget table th { 121 | text-align: center; 122 | border-radius: 0.25rem; } 123 | .bootstrap-datetimepicker-widget table th { 124 | height: 20px; 125 | line-height: 20px; 126 | width: 20px; } 127 | .bootstrap-datetimepicker-widget table th.picker-switch { 128 | width: 145px; } 129 | .bootstrap-datetimepicker-widget table th.disabled, .bootstrap-datetimepicker-widget table th.disabled:hover { 130 | background: none; 131 | color: #6c757d; 132 | cursor: not-allowed; } 133 | .bootstrap-datetimepicker-widget table th.prev::after { 134 | content: "Previous Month"; } 135 | .bootstrap-datetimepicker-widget table th.next::after { 136 | content: "Next Month"; } 137 | .bootstrap-datetimepicker-widget table thead tr:first-child th { 138 | cursor: pointer; } 139 | .bootstrap-datetimepicker-widget table thead tr:first-child th:hover { 140 | background: #e9ecef; } 141 | .bootstrap-datetimepicker-widget table td { 142 | height: 54px; 143 | line-height: 54px; 144 | width: 54px; } 145 | .bootstrap-datetimepicker-widget table td.cw { 146 | font-size: .8em; 147 | height: 20px; 148 | line-height: 20px; 149 | color: #6c757d; } 150 | .bootstrap-datetimepicker-widget table td.day { 151 | height: 20px; 152 | line-height: 20px; 153 | width: 20px; } 154 | .bootstrap-datetimepicker-widget table td.day:hover, .bootstrap-datetimepicker-widget table td.hour:hover, .bootstrap-datetimepicker-widget table td.minute:hover, .bootstrap-datetimepicker-widget table td.second:hover { 155 | background: #e9ecef; 156 | cursor: pointer; } 157 | .bootstrap-datetimepicker-widget table td.old, .bootstrap-datetimepicker-widget table td.new { 158 | color: #6c757d; } 159 | .bootstrap-datetimepicker-widget table td.today { 160 | position: relative; } 161 | .bootstrap-datetimepicker-widget table td.today:before { 162 | content: ''; 163 | display: inline-block; 164 | border: solid transparent; 165 | border-width: 0 0 7px 7px; 166 | border-bottom-color: #007bff; 167 | border-top-color: rgba(0, 0, 0, 0.2); 168 | position: absolute; 169 | bottom: 4px; 170 | right: 4px; } 171 | .bootstrap-datetimepicker-widget table td.active, .bootstrap-datetimepicker-widget table td.active:hover { 172 | background-color: #007bff; 173 | color: #fff; 174 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } 175 | .bootstrap-datetimepicker-widget table td.active.today:before { 176 | border-bottom-color: #fff; } 177 | .bootstrap-datetimepicker-widget table td.disabled, .bootstrap-datetimepicker-widget table td.disabled:hover { 178 | background: none; 179 | color: #6c757d; 180 | cursor: not-allowed; } 181 | .bootstrap-datetimepicker-widget table td span { 182 | display: inline-block; 183 | width: 54px; 184 | height: 54px; 185 | line-height: 54px; 186 | margin: 2px 1.5px; 187 | cursor: pointer; 188 | border-radius: 0.25rem; } 189 | .bootstrap-datetimepicker-widget table td span:hover { 190 | background: #e9ecef; } 191 | .bootstrap-datetimepicker-widget table td span.active { 192 | background-color: #007bff; 193 | color: #fff; 194 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } 195 | .bootstrap-datetimepicker-widget table td span.old { 196 | color: #6c757d; } 197 | .bootstrap-datetimepicker-widget table td span.disabled, .bootstrap-datetimepicker-widget table td span.disabled:hover { 198 | background: none; 199 | color: #6c757d; 200 | cursor: not-allowed; } 201 | .bootstrap-datetimepicker-widget.usetwentyfour td.hour { 202 | height: 27px; 203 | line-height: 27px; } 204 | 205 | .input-group [data-toggle="datetimepicker"] { 206 | cursor: pointer; } 207 | -------------------------------------------------------------------------------- /src/docs/theme/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/src/docs/theme/favicon-16x16.png -------------------------------------------------------------------------------- /src/docs/theme/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/src/docs/theme/favicon-32x32.png -------------------------------------------------------------------------------- /src/docs/theme/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/src/docs/theme/favicon.ico -------------------------------------------------------------------------------- /src/docs/theme/js/base.js: -------------------------------------------------------------------------------- 1 | function getSearchTerm() 2 | { 3 | var sPageURL = window.location.search.substring(1); 4 | var sURLVariables = sPageURL.split('&'); 5 | for (var i = 0; i < sURLVariables.length; i++) 6 | { 7 | var sParameterName = sURLVariables[i].split('='); 8 | if (sParameterName[0] == 'q') 9 | { 10 | return sParameterName[1]; 11 | } 12 | } 13 | } 14 | 15 | $(function() { 16 | 17 | var search_term = getSearchTerm(), 18 | $search_modal = $('#mkdocs_search_modal'); 19 | 20 | if(search_term){ 21 | $search_modal.modal(); 22 | } 23 | 24 | // make sure search input gets autofocus everytime modal opens. 25 | $search_modal.on('shown.bs.modal', function () { 26 | $search_modal.find('#mkdocs-search-query').focus(); 27 | }); 28 | 29 | // Highlight.js 30 | $('pre code').each(function (i, block) { 31 | hljs.highlightBlock(block); 32 | }); 33 | $('table').addClass('table table-striped table-hover'); 34 | 35 | // Improve the scrollspy behaviour when users click on a TOC item. 36 | $(".bs-sidenav a").on("click", function() { 37 | var clicked = this; 38 | setTimeout(function() { 39 | var active = $('.nav li.active a'); 40 | active = active[active.length - 1]; 41 | if (clicked !== active) { 42 | $(active).parent().removeClass("active"); 43 | $(clicked).parent().addClass("active"); 44 | } 45 | }, 50); 46 | }); 47 | 48 | $('body').scrollspy({ 49 | target: '.bs-sidebar', 50 | }); 51 | 52 | /* Toggle the `clicky` class on the body when clicking links to let us 53 | retrigger CSS animations. See ../css/base.css for more details. */ 54 | $('a').click(function (e) { 55 | $('body').toggleClass('clicky'); 56 | }); 57 | 58 | /* Prevent disabled links from causing a page reload */ 59 | $("li.disabled a").click(function () { 60 | event.preventDefault(); 61 | }); 62 | }); -------------------------------------------------------------------------------- /src/docs/theme/main.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} -------------------------------------------------------------------------------- /src/docs/theme/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "icons": [ 4 | { 5 | "src": "/android-chrome-192x192.png", 6 | "sizes": "192x192", 7 | "type": "image/png" 8 | }, 9 | { 10 | "src": "/android-chrome-256x256.png", 11 | "sizes": "256x256", 12 | "type": "image/png" 13 | } 14 | ], 15 | "theme_color": "#ffffff", 16 | "background_color": "#ffffff", 17 | "display": "standalone" 18 | } -------------------------------------------------------------------------------- /src/docs/theme/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tempusdominus/bootstrap-4/a5384ddddd65857efde2aff47a4a1e017fcf81ed/src/docs/theme/mstile-150x150.png -------------------------------------------------------------------------------- /src/docs/theme/nav.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/docs/theme/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.11, written by Peter Selinger 2001-2013 9 | 10 | 12 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/docs/theme/search-modal.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/docs/theme/toc.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/sass/_tempusdominus-bootstrap-4.scss: -------------------------------------------------------------------------------- 1 | $bs-datetimepicker-timepicker-font-size: 1.2em !default; 2 | $bs-datetimepicker-active-bg: $blue !default; 3 | $bs-datetimepicker-active-color: $white !default; 4 | $bs-datetimepicker-border-radius: $border-radius !default; 5 | $bs-datetimepicker-btn-hover-bg: $gray-200 !default; 6 | $bs-datetimepicker-disabled-color: $gray-600 !default; 7 | $bs-datetimepicker-alternate-color: $gray-600 !default; 8 | $bs-datetimepicker-secondary-border-color: #ccc !default; 9 | $bs-datetimepicker-secondary-border-color-rgba: rgba(0, 0, 0, 0.2) !default; 10 | $bs-datetimepicker-primary-border-color: white !default; 11 | $bs-datetimepicker-text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25) !default; 12 | $bs-datetimepicker-buttons-color: #007bff; 13 | $bs-datetimepicker-buttons-color-dark: #0056b3; 14 | 15 | body.tempusdominus-bootstrap-datetimepicker-widget-day-click, 16 | body.tempusdominus-bootstrap-datetimepicker-widget-day-click * { 17 | cursor: pointer !important; 18 | } 19 | 20 | body.tempusdominus-bootstrap-datetimepicker-widget-day-click { 21 | position: relative !important; 22 | } 23 | 24 | .tempusdominus-bootstrap-datetimepicker-widget-day-click-glass-panel { 25 | position: absolute; 26 | z-index: 999999999999; 27 | top: 0; 28 | left: 0; 29 | right: 0; 30 | bottom: 0; 31 | cursor: pointer !important; 32 | } 33 | 34 | .bootstrap-datetimepicker-widget .datepicker-days { 35 | tbody td { 36 | cursor: pointer; 37 | } 38 | } 39 | 40 | .bootstrap-datetimepicker-widget { 41 | list-style: none; 42 | 43 | &.dropdown-menu { 44 | display: block; 45 | margin: 2px 0; 46 | padding: 4px; 47 | width: 14rem; 48 | 49 | &.tempusdominus-bootstrap-datetimepicker-widget-with-feather-icons { 50 | width: 16rem; 51 | } 52 | 53 | &.tempusdominus-bootstrap-datetimepicker-widget-with-calendar-weeks { 54 | width: 16rem; 55 | 56 | &.tempusdominus-bootstrap-datetimepicker-widget-with-feather-icons { 57 | width: 17rem; 58 | } 59 | } 60 | 61 | &.timepicker-sbs { 62 | @media (min-width: map-get($grid-breakpoints, 'sm')) { 63 | width: 38em; 64 | } 65 | 66 | @media (min-width: map-get($grid-breakpoints, 'md')) { 67 | width: 38em; 68 | } 69 | 70 | @media (min-width: map-get($grid-breakpoints, 'lg')) { 71 | width: 38em; 72 | } 73 | } 74 | 75 | &:before, &:after { 76 | content: ''; 77 | display: inline-block; 78 | position: absolute; 79 | } 80 | 81 | &.bottom { 82 | &:before { 83 | border-left: 7px solid transparent; 84 | border-right: 7px solid transparent; 85 | border-bottom: 7px solid $bs-datetimepicker-secondary-border-color; 86 | border-bottom-color: $bs-datetimepicker-secondary-border-color-rgba; 87 | top: -7px; 88 | left: 7px; 89 | } 90 | 91 | &:after { 92 | border-left: 6px solid transparent; 93 | border-right: 6px solid transparent; 94 | border-bottom: 6px solid $bs-datetimepicker-primary-border-color; 95 | top: -6px; 96 | left: 8px; 97 | } 98 | } 99 | 100 | &.top { 101 | &:before { 102 | border-left: 7px solid transparent; 103 | border-right: 7px solid transparent; 104 | border-top: 7px solid $bs-datetimepicker-secondary-border-color; 105 | border-top-color: $bs-datetimepicker-secondary-border-color-rgba; 106 | bottom: -7px; 107 | left: 6px; 108 | } 109 | 110 | &:after { 111 | border-left: 6px solid transparent; 112 | border-right: 6px solid transparent; 113 | border-top: 6px solid $bs-datetimepicker-primary-border-color; 114 | bottom: -6px; 115 | left: 7px; 116 | } 117 | } 118 | 119 | &.float-right { 120 | &:before { 121 | left: auto; 122 | right: 6px; 123 | } 124 | 125 | &:after { 126 | left: auto; 127 | right: 7px; 128 | } 129 | } 130 | 131 | &.wider { 132 | width: 16rem; 133 | } 134 | } 135 | 136 | .list-unstyled { 137 | margin: 0; 138 | } 139 | 140 | a[data-action] { 141 | padding: 6px 0; 142 | } 143 | 144 | a[data-action]:active { 145 | box-shadow: none; 146 | } 147 | 148 | .timepicker-hour, .timepicker-minute, .timepicker-second { 149 | width: 54px; 150 | font-weight: bold; 151 | font-size: $bs-datetimepicker-timepicker-font-size; 152 | margin: 0; 153 | } 154 | 155 | button[data-action] { 156 | padding: 6px; 157 | } 158 | 159 | .btn[data-action="togglePeriod"] { 160 | text-align: center; 161 | font-family: Arial, sans-serif, -apple-system, system-ui, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 162 | width: 38px; 163 | height: 38px; 164 | } 165 | 166 | .btn[data-action="incrementHours"]::after { 167 | @extend .sr-only; 168 | content: "Increment Hours"; 169 | } 170 | 171 | .btn[data-action="incrementMinutes"]::after { 172 | @extend .sr-only; 173 | content: "Increment Minutes"; 174 | } 175 | 176 | .btn[data-action="decrementHours"]::after { 177 | @extend .sr-only; 178 | content: "Decrement Hours"; 179 | } 180 | 181 | .btn[data-action="decrementMinutes"]::after { 182 | @extend .sr-only; 183 | content: "Decrement Minutes"; 184 | } 185 | 186 | .btn[data-action="showHours"]::after { 187 | @extend .sr-only; 188 | content: "Show Hours"; 189 | } 190 | 191 | .btn[data-action="showMinutes"]::after { 192 | @extend .sr-only; 193 | content: "Show Minutes"; 194 | } 195 | 196 | .btn[data-action="togglePeriod"]::after { 197 | @extend .sr-only; 198 | content: "Toggle AM/PM"; 199 | } 200 | 201 | .btn[data-action="clear"]::after { 202 | @extend .sr-only; 203 | content: "Clear the picker"; 204 | } 205 | 206 | .btn[data-action="today"]::after { 207 | @extend .sr-only; 208 | content: "Set the date to today"; 209 | } 210 | 211 | .picker-switch { 212 | text-align: center; 213 | 214 | &::after { 215 | @extend .sr-only; 216 | content: "Toggle Date and Time Screens"; 217 | } 218 | 219 | td { 220 | padding: 0; 221 | margin: 0; 222 | height: auto; 223 | width: auto; 224 | line-height: inherit; 225 | 226 | span { 227 | line-height: 2.5; 228 | height: 2.5em; 229 | width: 100%; 230 | } 231 | } 232 | 233 | &.picker-switch-with-feathers-icons { 234 | td { 235 | span { 236 | line-height: 2.8; 237 | height: 2.8em; 238 | } 239 | } 240 | } 241 | } 242 | 243 | table { 244 | width: 100%; 245 | margin: 0; 246 | 247 | 248 | & td, 249 | & th { 250 | text-align: center; 251 | border-radius: $bs-datetimepicker-border-radius; 252 | } 253 | 254 | & th { 255 | height: 20px; 256 | line-height: 20px; 257 | width: 20px; 258 | 259 | &.picker-switch { 260 | width: 145px; 261 | } 262 | 263 | &.disabled, 264 | &.disabled:hover { 265 | background: none; 266 | color: $bs-datetimepicker-disabled-color; 267 | cursor: not-allowed; 268 | } 269 | 270 | &.prev::after { 271 | @extend .sr-only; 272 | content: "Previous Month"; 273 | } 274 | 275 | &.next::after { 276 | @extend .sr-only; 277 | content: "Next Month"; 278 | } 279 | } 280 | 281 | & thead tr:first-child th { 282 | cursor: pointer; 283 | 284 | &:hover { 285 | background: $bs-datetimepicker-btn-hover-bg; 286 | } 287 | } 288 | 289 | & td { 290 | height: 54px; 291 | line-height: 54px; 292 | width: 54px; 293 | 294 | &.cw { 295 | font-size: .8em; 296 | height: 20px; 297 | line-height: 20px; 298 | color: $bs-datetimepicker-alternate-color; 299 | cursor: default; 300 | } 301 | 302 | &.day { 303 | height: 20px; 304 | line-height: 20px; 305 | width: 20px; 306 | } 307 | 308 | &.day:hover, 309 | &.hour:hover, 310 | &.minute:hover, 311 | &.second:hover { 312 | background: $bs-datetimepicker-btn-hover-bg; 313 | cursor: pointer; 314 | } 315 | 316 | &.old, 317 | &.new { 318 | color: $bs-datetimepicker-alternate-color; 319 | } 320 | 321 | &.today { 322 | position: relative; 323 | 324 | &:before { 325 | content: ''; 326 | display: inline-block; 327 | border: solid transparent; 328 | border-width: 0 0 7px 7px; 329 | border-bottom-color: $bs-datetimepicker-active-bg; 330 | border-top-color: $bs-datetimepicker-secondary-border-color-rgba; 331 | position: absolute; 332 | bottom: 4px; 333 | right: 4px; 334 | } 335 | } 336 | 337 | &.active, 338 | &.active:hover { 339 | background-color: $bs-datetimepicker-active-bg; 340 | color: $bs-datetimepicker-active-color; 341 | text-shadow: $bs-datetimepicker-text-shadow; 342 | } 343 | 344 | &.active.today:before { 345 | border-bottom-color: #fff; 346 | } 347 | 348 | &.disabled, 349 | &.disabled:hover { 350 | background: none; 351 | color: $bs-datetimepicker-disabled-color; 352 | cursor: not-allowed; 353 | } 354 | 355 | span { 356 | display: inline-block; 357 | width: 54px; 358 | height: 54px; 359 | line-height: 54px; 360 | margin-top: 2px; 361 | margin-bottom: 2px; 362 | cursor: pointer; 363 | border-radius: $bs-datetimepicker-border-radius; 364 | 365 | &:hover { 366 | background: $bs-datetimepicker-btn-hover-bg; 367 | } 368 | 369 | &.active { 370 | background-color: $bs-datetimepicker-active-bg; 371 | color: $bs-datetimepicker-active-color; 372 | text-shadow: $bs-datetimepicker-text-shadow; 373 | } 374 | 375 | &.old { 376 | color: $bs-datetimepicker-alternate-color; 377 | } 378 | 379 | &.disabled, 380 | &.disabled:hover { 381 | background: none; 382 | color: $bs-datetimepicker-disabled-color; 383 | cursor: not-allowed; 384 | } 385 | } 386 | } 387 | } 388 | 389 | &.usetwentyfour { 390 | td.hour { 391 | height: 27px; 392 | line-height: 27px; 393 | } 394 | } 395 | 396 | .timepicker .timepicker-picker a.btn { 397 | color: $bs-datetimepicker-buttons-color; 398 | color: var(--blue, #{$bs-datetimepicker-buttons-color}); 399 | } 400 | .timepicker .timepicker-picker a.btn:hover { 401 | color: $bs-datetimepicker-buttons-color-dark; 402 | } 403 | 404 | &.bootstrap-datetimepicker-widget-readonly { 405 | table td.day, table td.hour, table td.minute, table td.second, 406 | table td [data-action="incrementHours"], table td [data-action="incrementMinutes"], table td [data-action="incrementSeconds"], 407 | table td [data-action="decrementHours"], table td [data-action="decrementMinutes"], table td [data-action="decrementSeconds"], 408 | table td [data-action="showHours"], table td [data-action="showMinutes"], table td [data-action="showSeconds"], 409 | table td [data-action="togglePeriod"] { 410 | pointer-events: none; 411 | cursor: default; 412 | 413 | &:hover { 414 | background: none; 415 | } 416 | } 417 | } 418 | } 419 | 420 | .input-group [data-toggle="datetimepicker"] { 421 | cursor: pointer; 422 | } -------------------------------------------------------------------------------- /src/sass/tempusdominus-bootstrap-4-build.scss: -------------------------------------------------------------------------------- 1 | // Import bootstrap variables including default color palette and fonts 2 | @import "../../node_modules/bootstrap/scss/_functions.scss"; 3 | @import "../../node_modules/bootstrap/scss/_variables.scss"; 4 | 5 | .sr-only { 6 | position: absolute; 7 | width: 1px; 8 | height: 1px; 9 | margin: -1px; 10 | padding: 0; 11 | overflow: hidden; 12 | clip: rect(0,0,0,0); 13 | border: 0; 14 | } 15 | 16 | // Import datepicker component 17 | @import "_tempusdominus-bootstrap-4"; 18 | -------------------------------------------------------------------------------- /tasks/bump_version.js: -------------------------------------------------------------------------------- 1 | module.exports = function (grunt) { 2 | grunt.registerTask('bump_version', function (version) { 3 | if (!version || version.split('.').length !== 3) { 4 | grunt.fail.fatal('malformed version. Use\n\n grunt bump_version:1.2.3'); 5 | } 6 | 7 | grunt.config('string-replace.package-json', { 8 | files: { 'package.json': 'package.json' }, 9 | options: { 10 | replacements: [ 11 | { 12 | pattern: /"version": .*/, 13 | replacement: '"version": "' + version + '",' 14 | } 15 | ] 16 | } 17 | }); 18 | 19 | grunt.config('string-replace.package-json-lock', { 20 | files: { 'package-lock.json': 'package-lock.json' }, 21 | options: { 22 | replacements: [ 23 | { 24 | pattern: /"version": .*/, 25 | replacement: '"version": "' + version + '",' 26 | } 27 | ] 28 | } 29 | }); 30 | 31 | 32 | grunt.config('string-replace.bower-json', { 33 | files: { 'bower.json': 'bower.json' }, 34 | options: { 35 | replacements: [ 36 | { 37 | pattern: /"version": .*/, 38 | replacement: '"version": "' + version + '",' 39 | } 40 | ] 41 | } 42 | }); 43 | 44 | grunt.config('string-replace.component-json', { 45 | files: { 'component.json': 'component.json' }, 46 | options: { 47 | replacements: [ 48 | { 49 | pattern: /"version": .*/, 50 | replacement: '"version": "' + version + '",' 51 | } 52 | ] 53 | } 54 | }); 55 | 56 | grunt.config('string-replace.composer-json', { 57 | files: { 'composer.json': 'composer.json' }, 58 | options: { 59 | replacements: [ 60 | { 61 | pattern: /"version": .*/, 62 | replacement: '"version": "' + version + '",' 63 | } 64 | ] 65 | } 66 | }); 67 | 68 | grunt.task.run([ 69 | 'string-replace:package-json', 70 | 'string-replace:bower-json', 71 | 'string-replace:component-json', 72 | 'string-replace:composer-json' 73 | ]); 74 | }); 75 | }; 76 | --------------------------------------------------------------------------------