Showing preview only (789K chars total). Download the full file or copy to clipboard to get everything.
Repository: Eonasdan/tempus-dominus
Branch: master
Commit: 2b0dea1ae354
Files: 169
Total size: 743.2 KB
Directory structure:
gitextract_udtrmfag/
├── .eslintignore
├── .eslintrc.yml
├── .gitattributes
├── .github/
│ ├── CONTRIBUTING.md
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ └── config.yml
│ ├── PULL_REQUEST_TEMPLATE
│ └── workflows/
│ ├── base/
│ │ └── action.yaml
│ ├── build/
│ │ └── action.yaml
│ ├── codeql-analysis.yml
│ ├── docs/
│ │ └── action.yaml
│ ├── docs.yaml
│ ├── feature-branch.yaml
│ ├── nuget/
│ │ └── action.yaml
│ ├── nuget.yml
│ ├── pr.yml
│ ├── publish.yml
│ ├── release/
│ │ └── action.yaml
│ └── stale.yaml
├── .gitignore
├── .husky/
│ └── pre-commit
├── .npmignore
├── .prettierignore
├── .prettierrc
├── CNAME
├── LICENSE
├── README.md
├── build/
│ ├── banner.js
│ ├── change-version.js
│ ├── plugins.js
│ ├── rollup-plugin.config.js
│ ├── rollup.config.js
│ ├── serve.js
│ └── utilities.js
├── package.json
├── sonar-project.properties
├── src/
│ ├── docs/
│ │ ├── assets/
│ │ │ ├── no-styles.html
│ │ │ └── repl-data.json
│ │ ├── js/
│ │ │ ├── docs.js
│ │ │ └── migration.js
│ │ ├── make.js
│ │ ├── partials/
│ │ │ ├── change-log-archive.html
│ │ │ ├── change-log.html
│ │ │ ├── datetime.html
│ │ │ ├── examples/
│ │ │ │ ├── index.html
│ │ │ │ └── jquery.html
│ │ │ ├── functions/
│ │ │ │ ├── dates.html
│ │ │ │ ├── display.html
│ │ │ │ └── index.html
│ │ │ ├── functions.html
│ │ │ ├── index.html
│ │ │ ├── installing.html
│ │ │ ├── locale.html
│ │ │ ├── migration.html
│ │ │ ├── namespace/
│ │ │ │ ├── css.html
│ │ │ │ ├── errors.html
│ │ │ │ ├── events.html
│ │ │ │ ├── index.html
│ │ │ │ └── unit.html
│ │ │ ├── options/
│ │ │ │ ├── display.html
│ │ │ │ ├── index.html
│ │ │ │ ├── keyboard-navigation.html
│ │ │ │ ├── localization.html
│ │ │ │ └── restrictions.html
│ │ │ ├── options.html
│ │ │ ├── plugins/
│ │ │ │ ├── bi1.html
│ │ │ │ ├── customDateFormat.html
│ │ │ │ ├── fa5.html
│ │ │ │ ├── floating-ui.html
│ │ │ │ ├── index.html
│ │ │ │ ├── moment.html
│ │ │ │ └── paint.html
│ │ │ └── repl.html
│ │ ├── site-config.json
│ │ ├── styles/
│ │ │ ├── bs5_docs.scss
│ │ │ └── styles.scss
│ │ └── templates/
│ │ ├── 404.html
│ │ ├── index.html
│ │ ├── page-template.html
│ │ ├── post-loop.html
│ │ └── shell.html
│ ├── js/
│ │ ├── actions.ts
│ │ ├── dates.ts
│ │ ├── datetime.ts
│ │ ├── display/
│ │ │ ├── calendar/
│ │ │ │ ├── date-display.ts
│ │ │ │ ├── decade-display.ts
│ │ │ │ ├── month-display.ts
│ │ │ │ └── year-display.ts
│ │ │ ├── collapse.ts
│ │ │ ├── index.ts
│ │ │ └── time/
│ │ │ ├── hour-display.ts
│ │ │ ├── minute-display.ts
│ │ │ ├── second-display.ts
│ │ │ └── time-display.ts
│ │ ├── jQuery-provider.js
│ │ ├── locales/
│ │ │ ├── ar-SA.ts
│ │ │ ├── ar.ts
│ │ │ ├── ca.ts
│ │ │ ├── cs.ts
│ │ │ ├── de.ts
│ │ │ ├── es.ts
│ │ │ ├── fi.ts
│ │ │ ├── fr.ts
│ │ │ ├── hr.ts
│ │ │ ├── hy.ts
│ │ │ ├── it.ts
│ │ │ ├── nl.ts
│ │ │ ├── pl.ts
│ │ │ ├── pt-PT.ts
│ │ │ ├── ro.ts
│ │ │ ├── ru.ts
│ │ │ ├── sk.ts
│ │ │ ├── sl.ts
│ │ │ ├── sr-Latn.ts
│ │ │ ├── sr.ts
│ │ │ ├── tr.ts
│ │ │ ├── uk.ts
│ │ │ ├── zh-CN.ts
│ │ │ ├── zh-HK.ts
│ │ │ ├── zh-MO.ts
│ │ │ └── zh-TW.ts
│ │ ├── plugins/
│ │ │ ├── bi-one/
│ │ │ │ └── index.ts
│ │ │ ├── customDateFormat/
│ │ │ │ └── index.ts
│ │ │ ├── examples/
│ │ │ │ ├── custom-paint-job.ts
│ │ │ │ └── sample.ts
│ │ │ ├── fa-five/
│ │ │ │ └── index.ts
│ │ │ └── moment-parse/
│ │ │ └── index.ts
│ │ ├── tempus-dominus.ts
│ │ ├── utilities/
│ │ │ ├── action-types.ts
│ │ │ ├── calendar-modes.ts
│ │ │ ├── default-format-localization.ts
│ │ │ ├── default-options.ts
│ │ │ ├── errors.ts
│ │ │ ├── event-emitter.ts
│ │ │ ├── event-types.ts
│ │ │ ├── namespace.ts
│ │ │ ├── optionConverter.ts
│ │ │ ├── optionProcessor.ts
│ │ │ ├── options.ts
│ │ │ ├── optionsStore.ts
│ │ │ ├── service-locator.ts
│ │ │ ├── typeChecker.ts
│ │ │ └── view-mode.ts
│ │ └── validation.ts
│ ├── nuget/
│ │ ├── TempusDominus.nuspec
│ │ └── TempusDominus.scss.nuspec
│ └── scss/
│ ├── _variables.scss
│ └── tempus-dominus.scss
├── td logo.xcf
├── test/
│ ├── actions.test.ts
│ ├── dates.test.ts
│ ├── datetime.test.ts
│ ├── fixtures/
│ │ ├── dates.fixture.ts
│ │ ├── display.fixture.ts
│ │ ├── eventemitters.fixture.ts
│ │ ├── optionStore.fixture.ts
│ │ ├── serviceLocator.fixture.ts
│ │ └── validation.fixture.ts
│ ├── tempus-dominus.test.ts
│ ├── test-import.ts
│ ├── test-utilities.ts
│ ├── utilities/
│ │ ├── optionProccessor.test.ts
│ │ ├── optionStore.test.ts
│ │ ├── serviceLocator.test.ts
│ │ └── typeCechker.test.ts
│ └── validation.test.ts
├── tsconfig.json
└── vite.config.ts
================================================
FILE CONTENTS
================================================
================================================
FILE: .eslintignore
================================================
**/dist/
**/docs/
**/coverage/
**/.husky/
**/types/
**/build/
**/test/
================================================
FILE: .eslintrc.yml
================================================
env:
browser: true
es2021: true
extends:
- eslint:recommended
- plugin:@typescript-eslint/recommended
- prettier
overrides: []
parser: '@typescript-eslint/parser'
parserOptions:
ecmaVersion: latest
sourceType: module
plugins:
- '@typescript-eslint'
rules:
linebreak-style:
- error
- unix
================================================
FILE: .gitattributes
================================================
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
================================================
FILE: .github/CONTRIBUTING.md
================================================
# Submitting Issues
If you are submitting a bug, please test and/or fork [this StackBlitz](https://stackblitz.com/edit/tempus-dominus-v6-simple-setup) demonstrating the issue. Code issues and fringe case bugs that do not include a StackBlitz (or similar) will be closed.
Issues that are submitted without a description (title only) will be closed with no further explanation.
# Contributing code
To contribute, fork the library and run `npm install`. You need [node](http://nodejs.org/); use [nvm](https://github.com/creationix/nvm) or [nenv](https://github.com/ryuone/nenv) to install it.
```bash
git https://github.com/Eonasdan/tempus-dominus.git
cd tempus-dominus
npm i
git checkout development # all patches against development branch, please!
```
# Very important notes
**Pull requests to the `master` branch will be closed.** Please submit all pull requests to the `development` branch.
- **Do not include the minified files in your pull request.** Don't worry, we'll build them when we cut a release.
- Pull requests that do not include a description (title only) and the following will be closed:
- What the change does
- A use case (for new features or enhancements)
# NPM Scripts
| Script | Description |
|--------|------------|
| start | Launches browser sync and watches for files changes.|
| serve | Launches browser sync to serve the docs. |
| build | Creates compiled js, css and copies the extra files to the dist folder. |
| sass | Compiles just the sass files to css. |
| rollup | Compiles typescript and scss files. |
| rollup-watch | Same as above but watches for changes and compiles as needed. |
| build:declarations | Builds the typescript definition files. |
| prettier | Runs prettier to format the code. |
| docs | Builds the docs. |
| docs-watch | Watches for changes to the docs files. |
| release-version | Creates a new release version. |
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: eonasdan
ko_fi: eonasdan
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Report a bug
description: Tell us about your issue.
title: "Provide a general summary of the issue"
labels: ["Type: Bug", "State: Unsponsored"]
body:
- type: markdown
attributes:
value: "<h3>Note: I am no longer taking feature requests.
Beginning in 2024, tickets will be paid support only. Please see [this discussion](https://github.com/Eonasdan/tempus-dominus/discussions/2694).</h3>"
- type: checkboxes
attributes:
label: Prerequisites
description: Take a couple minutes to help our maintainers work faster.
options:
- label: I have [searched](https://github.com/Eonasdan/tempus-dominus/issues?q=is%3Aissue) for duplicate or closed issues.
required: true
- label: I have validated my setup against the latest version on [StackBlitz](https://stackblitz.com/edit/tempus-dominus-v6-simple-setup).
required: true
- label: I have read the [contributing guidelines](https://github.com/Eonasdan/tempus-dominus/blob/master/.github/CONTRIBUTING.md).
required: true
- label: I understand that only sponsored issues will be worked on and that if I wish to sponsor an issue, I will contact the owner FIRST.
required: true
- type: textarea
id: what-happened
attributes:
label: Describe the issue
description: Provide a summary of the issue and what you expected to happen, including specific steps to reproduce.
validations:
required: true
- type: markdown
attributes:
value: ""
- type: textarea
id: reduced-test-case
attributes:
label: StackBlitz fork
description: "You MUST provide an StackBlitz fork of one of the following examples: [HTML](https://stackblitz.com/edit/tempus-dominus-v6-simple-setup), [Typescript](https://stackblitz.com/edit/v6-typescript), [Using import](https://stackblitz.com/edit/tempus-dominus-v6-simple-setup-import), or [jQuery](https://stackblitz.com/edit/tempus-dominus-v6-simple-jquery-setup)."
validations:
required: true
- type: dropdown
id: os
attributes:
label: What operating system(s) are you seeing the problem on?
multiple: true
options:
- Windows
- macOS
- Android
- iOS
- Linux
validations:
required: true
- type: dropdown
id: browser
attributes:
label: What browser(s) are you seeing the problem on?
multiple: true
options:
- Chrome
- Safari
- Firefox
- Microsoft Edge
- Opera
- type: input
id: version
attributes:
label: What version of are you using? You can find this information from the sample StackBlitz.
placeholder: "e.g., v5.1.0 or v4.5.2"
validations:
required: true
- type: input
id: locale
attributes:
label: What your browser's locale? You can find this information from the sample StackBlitz.
placeholder: "e.g., 'en-US'"
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
contact_links:
- name: Ask a question
url: https://github.com/Eonasdan/tempus-dominus/discussions/new
about: Ask and discuss questions with other community members
================================================
FILE: .github/PULL_REQUEST_TEMPLATE
================================================
PRs relating to the v4 will be closed and locked.
* **Please check if the PR fulfills these requirements**
- [ ] Tests for the changes have been added (for bug fixes / features)
- [ ] Docs have been added / updated (for bug fixes / features)
* **What kind of change does this PR introduce?** (Bug fix, feature, docs update, ...). If this is a fix, please tag a bug.
* **What is the current behavior?** (You can also link to an open issue here)
* **What is the new behavior (if this is a feature change)?**
* **Does this PR introduce a breaking change?** (What changes might users need to make in their application due to this PR?)
* **Other information**:
================================================
FILE: .github/workflows/base/action.yaml
================================================
name: Setup Node
description: Setup node
inputs:
registry:
description: 'A Github PAT'
default: 'https://registry.npmjs.org'
runs:
using: composite
steps:
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: '18'
registry-url: ${{ inputs.registry }}
- name: Npm install
shell: bash
run: npm ci
================================================
FILE: .github/workflows/build/action.yaml
================================================
name: Build
description: Build
inputs:
GITHUB_TOKEN:
description: 'A Github PAT'
required: true
SONAR_TOKEN:
description: 'A Sonar token'
required: true
runs:
using: composite
steps:
- name: Unit tests
shell: bash
run: npm run test:coverage
- name: Build
shell: bash
run: npm run build
- name: Build docs
shell: bash
run: npm run docs
- name: SonarCloud Scan
uses: sonarsource/sonarcloud-github-action@master
env:
GITHUB_TOKEN: ${{ inputs.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ inputs.SONAR_TOKEN }}
================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ master ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
schedule:
- cron: '16 12 * * 1'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'javascript' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://git.io/codeql-language-support
steps:
- name: Checkout repository
uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
# ℹ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
================================================
FILE: .github/workflows/docs/action.yaml
================================================
name: Deploy Docs
inputs:
GITHUB_TOKEN:
description: 'A Github PAT'
required: true
runs:
using: composite
steps:
- name: Deploy Docs
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ inputs.GITHUB_TOKEN }}
publish_dir: ./docs
keep_files: true
================================================
FILE: .github/workflows/docs.yaml
================================================
name: Publish Docs
on:
workflow_dispatch:
jobs:
docs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup
uses: ./.github/workflows/base
- name: Build
uses: ./.github/workflows/build
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
- name: Deploy Docs
uses: ./.github/workflows/docs
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/feature-branch.yaml
================================================
name: Feature Branch Publish Package
on:
push:
branches:
- 'feature/*'
- 'bug/*'
- development
paths:
- src/js
jobs:
main:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup
uses: ./.github/workflows/base
- name: Set package version
id: set_version
run: |
# Get the branch name
BRANCH_NAME=${GITHUB_REF#refs/heads/}
# remove "feature/" prefix
BRANCH_NAME=${BRANCH_NAME#feature/}
# replace underscore with dashes (thanks semver)
BRANCH_NAME=${BRANCH_NAME//_/-}
BUILD_ID=$(echo $GITHUB_RUN_ID | cut -c1-7)
VERSION=$(node -p "const pkg = require('./package.json'); pkg.version")
NEW_VERSION="$VERSION-$BRANCH_NAME.$BUILD_ID"
#sed -i "s/\"version\": \".*\"/\"version\": \"$VERSION\"/g" ./package.json
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_OUTPUT
- name: Build
uses: ./.github/workflows/build
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
- name: Create Release
run: npm run release:version ${{steps.set_version.outputs.VERSION }} ${{steps.set_version.outputs.NEW_VERSION }}
- name: Create Tag
uses: actions/github-script@v6
with:
script: |
const {DIST_VERSION} = process.env
github.rest.git.createRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: `refs/tags/${{steps.set_version.outputs.NEW_VERSION }}`,
sha: context.sha
})
================================================
FILE: .github/workflows/nuget/action.yaml
================================================
name: Nuget Publish
description: Setup node
inputs:
NUGET_API_KEY:
description: 'A Nuget API Key'
required: true
runs:
using: composite
steps:
- name: Setup NuGet
uses: NuGet/setup-nuget@v2
- name: Pack NuGet
working-directory: ./src/nuget
shell: pwsh
run: |
nuget pack TempusDominus.nuspec -Verbosity detailed -NonInteractive -NoPackageAnalysis
nuget pack TempusDominus.scss.nuspec -Verbosity detailed -NonInteractive -NoPackageAnalysis
- name: Push Nuget
working-directory: ./src/nuget
shell: pwsh
run: |
nuget push TempusDominus.*.nupkg -Source https://api.nuget.org/v3/index.json -ApiKey ${{ inputs.NUGET_API_KEY }}
nuget push TempusDominus.scss.*.nupkg -Source https://api.nuget.org/v3/index.json -ApiKey ${{ inputs.NUGET_API_KEY }}
================================================
FILE: .github/workflows/nuget.yml
================================================
name: Publish Nuget
on:
workflow_dispatch:
jobs:
build:
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup
uses: ./.github/workflows/base
- name: Build
uses: ./.github/workflows/build
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
- name: Nuget
uses: ./.github/workflows/nuget
with:
NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}
================================================
FILE: .github/workflows/pr.yml
================================================
name: Pull Request
on:
push:
branches: [ development ]
pull_request:
branches: [ development ]
workflow_dispatch:
jobs:
pr:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Setup
uses: ./.github/workflows/base
- name: Build
uses: ./.github/workflows/build
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish Package
on:
release:
types: [ created ]
workflow_dispatch:
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup
uses: ./.github/workflows/base
- name: Release
uses: ./.github/workflows/release
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
VERSION: ${{ github.event.release.tag_name }}
- name: Deploy Docs
uses: ./.github/workflows/docs
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: npm publish --access=public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
#nuget on linux is broken
# - name: Nuget
# uses: ./.github/workflows/nuget
# with:
# NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}
================================================
FILE: .github/workflows/release/action.yaml
================================================
name: Release
description: Release
inputs:
GITHUB_TOKEN:
description: 'A Github PAT'
required: true
SONAR_TOKEN:
description: 'A Sonar token'
required: true
VERSION:
description: 'Version number'
required: true
runs:
using: composite
steps:
- name: Build
shell: bash
run: npm run release
- name: Create new release
shell: bash
run: npm run version ${{ inputs.VERSION }}
# - name: SonarCloud Scan
# uses: sonarsource/sonarcloud-github-action@master
# env:
# GITHUB_TOKEN: ${{ inputs.GITHUB_TOKEN }}
# SONAR_TOKEN: ${{ inputs.SONAR_TOKEN }}
================================================
FILE: .github/workflows/stale.yaml
================================================
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '30 1 * * *' #at 1:30 pm
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v7
with:
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
stale-pr-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
any-of-labels: 'State: Waiting feedback'
stale-issue-label: 'State: Stale'
stale-pr-label: 'State: Stale'
================================================
FILE: .gitignore
================================================
bower_components
node_modules
.idea
.vs
obj
bin
site
*.user
*.csproj
*.sln
*.nupkg
src/docs/partials/examples/test.html
src/docs/assets/carbon.css
src/docs/assets/site.webmanifest
/docs/
/dist/plugins/examples/
coverage
dist
types
.DS_Store
================================================
FILE: .husky/pre-commit
================================================
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx lint-staged
================================================
FILE: .npmignore
================================================
/assets
/_includes
/_layouts
/.gitignore
/node_modules
/test
*.log
*.swp
*~
*.tgz
/site
*.user
*.csproj
*.sln
*.nupkg
================================================
FILE: .prettierignore
================================================
dist
docs
node_modules
.github
coverage
================================================
FILE: .prettierrc
================================================
{
"singleQuote": true,
"tabWidth": 2,
"htmlWhitespaceSensitivity": "ignore",
"endOfLine": "lf"
}
================================================
FILE: CNAME
================================================
getdatepicker.com
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2021 Jonathan Peterson (@Eonasdan)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
[](https://ko-fi.com/R6R53OEFF)
# Paid support only
Please note that I'm moving on to other projects. New issues will need to be sponsored. This can be done via BountySource or my other donation links. Please reach out to me first so we can discuss the terms. Thank you for your years of support.
# Tempus Dominus Date/Time Picker v6.9.4
Tempus Dominus is a powerful and robust date time picker for javascript. Version 6 is another major rewrite over the previous version. V6 is written with modern browsers in mind and is written in typescript. Bootstrap, momentjs and jQuery are no longer required dependencies. Popper2 is all that is required for the picker to position correctly. If you still require jQuery (seriously, you should move off that asap) there's a jQuery provider that wraps the native js functions.
# Developers
## Building
Run `npm i` to install needed packages.
The docs folder contains the generated documentation site, don't modify this directly as it will be overwritten on build. The dist folder contains the built js/css files.
## Running
You can run `npm run serve` which will start a web server. Navigate to `http://localhost:3001/` to view the docs.
## Watching for changes
Do not run `npm run serve` at the same time.
Run `npm start`. This runs web server, the build and watchers for the docs, styles, and typescript.
## Where do you use this?
I'd love to know if your public site is using this plugin and list your logo on the documentation site. Leave [create a discussion](https://github.com/Eonasdan/tempus-dominus/discussions/categories/show-your-love) and let me know.
## Priority support is available at an hourly rate.
If you have an urgent request, bug or need installation help, please contact in the discord server.
================================================
FILE: build/banner.js
================================================
'use strict';
const pkg = require('../package.json');
const year = new Date().getFullYear();
function getBanner() {
return `/*!
* Tempus Dominus v${pkg.version} (${pkg.homepage})
* Copyright 2013-${year} ${pkg.author.name}
* Licensed under MIT (https://github.com/Eonasdan/tempus-dominus/blob/master/LICENSE)
*/`;
}
module.exports = getBanner;
================================================
FILE: build/change-version.js
================================================
const fs = require('fs');
const path = require('path');
const globby = require('globby');
// Function to update version in a file
function updateVersionInFile(filePath, oldVersion, newVersion) {
try {
const content = fs.readFileSync(filePath, 'utf8');
const updated = content.replace(
new RegExp(oldVersion.replace(/\./g, '\\.'), 'g'),
newVersion
);
if (content !== updated) {
fs.writeFileSync(filePath, updated, 'utf8');
console.log(`Updated version in ${filePath}`);
}
} catch (error) {
console.error(`Error processing ${filePath}:`, error);
}
}
async function updateVersions(newVersion) {
try {
// Read current version from package.json
const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8'));
const currentVersion = packageJson.version;
if (!currentVersion) {
throw new Error('Could not find version in package.json');
}
// Update package.json
packageJson.version = newVersion;
fs.writeFileSync(
'./package.json',
JSON.stringify(packageJson, null, 2) + '\n'
);
console.log('Updated version in package.json');
const GLOB = [
'**/*.{json,md,nuspec,properties}',
'src/js/tempus-dominus.ts',
'**/shell.html',
'**/installing.html',
'**/templates/index.html',
'!**/change-log*',
'!test/**/*',
];
const GLOBBY_OPTIONS = {
cwd: path.join(__dirname, '..'),
gitignore: true,
};
const files = await globby(GLOB, GLOBBY_OPTIONS);
//make sure that the dist folder is included
files.push(
...(await globby(['dist/**/*'], {
cwd: path.join(__dirname, '..'),
}))
);
// Update version in each file
for (const file of files) {
updateVersionInFile(file, currentVersion, newVersion);
}
} catch (error) {
console.error('Error:', error);
process.exit(1);
}
}
// Get new version from command line argument
const newVersion = process.argv[2];
if (!newVersion) {
console.error('Please provide a new version number as an argument');
console.error('Usage: node update-version.js <new-version>');
process.exit(1);
}
// Execute the update
updateVersions(newVersion);
================================================
FILE: build/plugins.js
================================================
const rollup = require('rollup');
const genericRollup = require('./rollup-plugin.config');
const fs = require('fs').promises;
const path = require('path');
const formatName = (n) => n.replace(/\.ts/, '').replace(/-/g, '_');
const localePath = path.join(__dirname, '../src/js/locales');
async function build(option) {
const bundle = await rollup.rollup(option.input);
await bundle.write(option.output);
}
async function locales() {
console.log('Building Locales...');
try {
/* eslint-disable no-restricted-syntax, no-await-in-loop */
// We use await-in-loop to make rollup run sequentially to save on RAM
const locales = await fs.readdir(localePath);
for (const l of locales.filter((x) => x.endsWith('.ts'))) {
// run builds sequentially to limit RAM usage
await build(
genericRollup({
input: `./src/js/locales/${l}`,
fileName: `./dist/locales/${l.replace('.ts', '.js')}`,
name: `tempusDominus.locales.${formatName(l)}`,
kind: 'locales',
})
);
}
} catch (e) {
console.error(e); // eslint-disable-line no-console
}
}
async function plugins() {
console.log('Building Plugins...');
try {
const plugins = await fs.readdir(path.join(__dirname, '../src/js/plugins'));
for (const plugin of plugins.filter((x) => x !== 'examples')) {
// run builds sequentially to limit RAM usage
await build(
genericRollup({
input: `./src/js/plugins/${plugin}/index.ts`,
fileName: `./dist/plugins/${plugin}.js`,
name: `tempusDominus.plugins.${formatName(plugin)}`,
kind: 'plugins',
})
);
}
const examplePlugins = await fs.readdir(
path.join(__dirname, '../src/js/plugins/examples')
);
for (const plugin of examplePlugins.map((x) => x.replace('.ts', ''))) {
// run builds sequentially to limit RAM usage
await build(
genericRollup({
input: `./src/js/plugins/examples/${plugin}.ts`,
fileName: `./dist/plugins/examples/${plugin}.js`,
name: `tempusDominus.plugins.${formatName(plugin)}`,
})
);
}
} catch (e) {
console.error(e); // eslint-disable-line no-console
}
}
const args = process.argv.slice(2);
let command = 'all';
if (args.length !== 0) command = args[0];
switch (command) {
case '-p':
plugins().then();
break;
case '-l':
locales().then();
break;
case 'all':
plugins().then(() => locales().then());
break;
}
================================================
FILE: build/rollup-plugin.config.js
================================================
const typescript = require('rollup-plugin-ts');
const ignore = require('rollup-plugin-ignore');
const banner = require('./banner.js');
const globals = {
'@popperjs/core': 'Popper',
tempusDominus: 'tempusDominus',
};
module.exports = (config) => {
const { input, fileName, name, kind } = config;
return {
input: {
input,
external: ['tempusDominus'],
plugins: [
ignore(['DateTime', 'ErrorMessages', 'FormatLocalization']),
typescript({
tsconfig: (resolvedConfig) => ({
...resolvedConfig,
declaration: kind !== undefined,
declarationDir: `./types/${kind}`,
}),
}),
],
},
output: {
banner,
file: fileName,
format: 'umd',
name: name || 'tempusDominus',
globals,
compact: true,
},
};
};
================================================
FILE: build/rollup.config.js
================================================
const typescript = require('rollup-plugin-ts');
import postcss from 'rollup-plugin-postcss';
import { terser } from 'rollup-plugin-terser';
const pkg = require('../package.json');
const banner = require('./banner.js');
const globals = {
'@popperjs/core': 'Popper',
};
export default [
{
input: 'src/js/tempus-dominus.ts',
output: [
{
banner,
file: pkg.main,
format: 'umd',
name: 'tempusDominus',
sourcemap: true,
globals,
},
{
banner,
file: pkg.module,
format: 'es',
name: 'tempusDominus',
sourcemap: true,
globals,
},
{
banner,
file: `${pkg.main.replace('.js', '')}.min.js`,
format: 'umd',
name: 'tempusDominus',
globals,
plugins: [terser()],
},
{
banner,
file: `${pkg.module.replace('.js', '')}.min.js`,
format: 'es',
name: 'tempusDominus',
globals,
plugins: [terser()],
},
],
external: ['@popperjs/core'],
plugins: [
typescript({
tsconfig: (resolvedConfig) => ({
...resolvedConfig,
}),
}),
],
},
{
input: 'dist/js/jQuery-provider.js',
output: [
{
file: 'dist/js/jQuery-provider.min.js',
},
],
plugins: [terser()],
},
{
input: 'src/scss/tempus-dominus.scss',
output: [
{
banner,
file: 'dist/css/tempus-dominus.css',
},
],
plugins: [
postcss({
sourceMap: true,
extract: true,
}),
],
},
{
input: 'src/scss/tempus-dominus.scss',
output: [
{
banner,
file: 'dist/css/tempus-dominus.min.css',
},
],
plugins: [
postcss({
extract: true,
minimize: true,
}),
],
},
];
================================================
FILE: build/serve.js
================================================
const { ParvusServer } = require('@eonasdan/parvus-server');
new ParvusServer({
port: 3001,
directory: `./docs`,
middlewares: [],
})
.startAsync()
.then();
================================================
FILE: build/utilities.js
================================================
const fs = require('fs').promises;
const { dirname } = require('path');
class Utilities {
static async copyFileAndEnsurePathExistsAsync(file) {
await fs.mkdir(dirname(file.destination), { recursive: true });
await fs.copyFile(file.source, file.destination);
}
static async copy() {
for (const file of [
{
source: './src/js/jQuery-provider.js',
destination: './dist/js/jQuery-provider.js',
},
]) {
console.log(`copying ${file.source} to ${file.destination}`);
await Utilities.copyFileAndEnsurePathExistsAsync(file);
}
}
static async removeFileAsync(filePath) {
if (!(await fs.stat(filePath)).isFile()) return;
try {
await fs.unlink(filePath);
} catch (e) {}
}
static async removeDirectoryAsync(directory, removeSelf = true) {
try {
await fs.rm(directory, { recursive: true, force: true });
if (!removeSelf) await fs.mkdir(dirname(directory), { recursive: true });
} catch (e) {
console.error(e);
}
}
}
const args = process.argv.slice(2);
switch (args[0]) {
case '--copy':
console.log('Copying files');
Utilities.copy().then();
break;
case '--clean':
console.log('Cleaning path: ', args[1]);
Utilities.removeDirectoryAsync(args[1]).then();
break;
}
================================================
FILE: package.json
================================================
{
"author": {
"name": "Jonathan Peterson"
},
"name": "@eonasdan/tempus-dominus",
"version": "6.10.3",
"style": "dist/css/tempus-dominus.css",
"sass": "scss/tempus-dominus.scss",
"main": "dist/js/tempus-dominus.js",
"module": "dist/js/tempus-dominus.esm.js",
"types": "types/tempus-dominus.d.ts",
"files": [
"dist/**/*",
"src/js/**/*.ts",
"src/js/locales/**/*.ts",
"src/js/plugins/**/*.ts",
"src/scss/**/*.scss",
"types/**/*"
],
"scripts": {
"start": "npm run build && concurrently \"npm:*-watch\"",
"test": "vitest --ui",
"test:silent": "vitest --run --silent",
"test:coverage": "vitest run --coverage",
"serve": "node ./build/serve.js",
"clean": "node ./build/utilities.js --clean ./dist && node ./build/utilities.js --clean ./types",
"build": "npm run clean && node ./build/utilities.js --copy && npm run rollup && npm run build:declarations && npm run build:plugins-and-locales",
"build:plugins": "node ./build/plugins.js -p",
"build:locales": "node ./build/plugins.js -l",
"build:plugins-and-locales": "node ./build/plugins.js",
"build:declarations": "node ./build/utilities.js --clean ./types && tsc --declaration --emitDeclarationOnly --outDir types",
"sass": "sass src/scss/tempus-dominus.scss ./dist/css/tempus-dominus.css",
"rollup": "rollup -c ./build/rollup.config.js",
"rollup-watch": "rollup -c ./build/rollup.config.js -w",
"docs": "node ./src/docs/make.js",
"docs-watch": "node ./src/docs/make.js --watch",
"release": "npm run eslint && npm run test:silent && npm run build",
"version": "node build/change-version.js",
"prepare": "husky install",
"prettier": "prettier --ignore-unknown --write .",
"eslint": "npm run prettier && npx eslint --ext .html,.ts ."
},
"lint-staged": {
"**/*!(.d)/.ts": [
"npm run eslint"
],
"**/*": [
"npm run prettier"
]
},
"bugs": {
"url": "https://github.com/eonasdan/tempus-dominus/issues"
},
"peerDependencies": {
"@popperjs/core": "^2.11.6"
},
"peerDependenciesMeta": {
"@popperjs/core\"": {
"optional": true
}
},
"description": "A robust and powerful date/time picker component. For usage, installation and demos see Project Site on GitHub",
"devDependencies": {
"@eonasdan/parvus-server": "^1.2.1",
"@popperjs/core": "^2.11.6",
"@rollup/plugin-node-resolve": "^14.1.0",
"@types/node": "^18.14.2",
"@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0",
"@vitest/coverage-c8": "^0.29.2",
"@vitest/ui": "^0.29.2",
"bootstrap": "^5.2.3",
"chokidar": "^3.5.3",
"clean-css": "^5.3.2",
"concurrently": "^7.6.0",
"dropcss": "^1.0.16",
"eslint": "^8.35.0",
"eslint-config-prettier": "^8.6.0",
"glob": "^7.2.3",
"globby": "^11.1.0",
"html-minifier-terser": "^5.1.1",
"husky": "^8.0.3",
"jsdom": "^20.0.3",
"lint-staged": "^13.1.2",
"prettier": "^2.8.4",
"rollup": "^2.79.1",
"rollup-plugin-ignore": "^1.0.10",
"rollup-plugin-postcss": "^4.0.2",
"rollup-plugin-terser": "^7.0.2",
"rollup-plugin-ts": "^3.2.0",
"sass": "^1.58.3",
"terser": "^5.16.5",
"tslib": "^2.5.0",
"typescript": "~4.9.5",
"vitest": "^0.29.2",
"vitest-github-actions-reporter": "^0.10.0"
},
"homepage": "https://getdatepicker.com/",
"keywords": [
"datepicker",
"datetimepicker",
"timepicker"
],
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/Eonasdan/tempus-dominus.git"
},
"wallaby": {
"filesWithNoCoverageCalculated": [
"test/fixtures/**/*"
]
},
"funding": "https://ko-fi.com/eonasdan"
}
================================================
FILE: sonar-project.properties
================================================
sonar.organization=eonasdan
sonar.projectKey=Eonasdan_tempus-dominus
sonar.projectName=tempus-dominus
sonar.projectVersion=6.9.4
sonar.sources = src/
sonar.tests = test/
================================================
FILE: src/docs/assets/no-styles.html
================================================
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='UTF-8'>
<meta name='description' content='Examples using Tempus Dominus without Bootstrap or other css frameworks.'>
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<meta name='viewport' content='width=device-width,initial-scale=1,shrink-to-fit=no'>
<title>Examples - No Styles - Tempus Dominus</title>
<link rel='apple-touch-icon' sizes='180x180' href='/apple-touch-icon.png'>
<link rel='icon' type='image/png' sizes='32x32' href='/favicon-32x32.png'>
<link rel='icon' type='image/png' sizes='16x16' href='/favicon-16x16.png'>
<link rel='manifest' href='/site.webmanifest'>
<link rel='mask-icon' href='/safari-pinned-tab.svg' color='#5bbad5'>
<meta name='msapplication-TileColor' content='#da532c'>
<meta name='theme-color' content='#ffffff'>
<meta name='title' content='Examples - No Styles'>
<meta name='description' content='Examples using Tempus Dominus without Bootstrap or other css frameworks.'>
<meta property='og:type' content='article'>
<meta property='og:url' content='https://getdatepicker.com/docs/6/examples/no-styles.html'>
<meta property='og:title' content='Examples - No Styles'>
<meta property='og:description' content='Examples using Tempus Dominus without Bootstrap or other css frameworks.'>
<meta class='metaImage' property='og:image' content=''>
<meta property='article:published_time' content='2021-07-08T04:00:00.000Z'>
<meta property='article:modified_time' content='2021-07-08T04:00:00.000Z'>
<meta property='article:tag' content='datepicker, javascript, open source, tempus dominus, eonasdan'>
<meta property='article:author' content='Jonathan Peterson'>
<meta property='article:section' content='Technology'>
<meta property='twitter:card' content='summary_large_image'>
<meta property='twitter:site' content='@eonasdan'>
<meta property='twitter:creator' content='@eonasdan'>
<meta property='twitter:url' content='https://getdatepicker.com/docs/6/examples/no-styles.html'>
<meta property='twitter:title' content='Examples - No Styles'>
<meta property='twitter:description' content='Examples using Tempus Dominus without Bootstrap or other css frameworks.'>
<meta class='metaImage' property='twitter:image' content=''>
<script src='/js/bundle.min.js'></script>
<script src='/6/js/tempus-dominus.js'></script>
<link rel='stylesheet' href='/6/css/tempus-dominus.css'>
</head>
<body>
<div id='outerContainer' class='container-xxl my-md-4 bd-layout'>
<main class='bd-main order-1'>
<div class='bd-intro ps-lg-4'>
<div class='d-md-flex align-items-center justify-content-between'>
<h1 class='bd-title title' id='content'>Examples without external styles</h1>
</div>
</div>
<div id='mainContent' class='bd-content ps-lg-4'>
<div class='row'>
<p>
This page is to demonstrate that the picker can be used free of other styling.
</p>
<p>
For full examples and to return to the main site <a href='index.html'>click here</a>.
</p>
</div>
<div class='row'>
<div class='tab-pane fade show active' id='datetimepicker1Html' role='tabpanel'
aria-labelledby='datetimepicker1Html-tab'>
<pre>
<code class='language-html'>
<div
class='input-group'
id='datetimepicker1'
data-td-target-input='nearest'
data-td-target-toggle='nearest'
>
<input
id='datetimepicker1Input'
type='text'
class='form-control'
data-td-target='#datetimepicker1'
/>
<span
class='input-group-text'
data-td-target='#datetimepicker1'
data-td-toggle='datetimepicker'
>
<span class='fas fa-calendar'></span>
</span>
</div>
</code>
</pre>
</div>
<div class='tab-pane fade' id='datetimepicker1Js' role='tabpanel' aria-labelledby='datetimepicker1Js-tab'>
<pre> <code class='language-javascript'>
new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'));
</code>
</pre>
</div>
<div class='container'>
<div class='row'>
<div class='col-sm-6'>
<label for='datetimepicker1Input' class='form-label'>Simple picker</label>
<div class='input-group ' id='datetimepicker1' data-td-target-input='nearest'
data-td-target-toggle='nearest'>
<input id='datetimepicker1Input' type='text' class='form-control' data-td-target='#datetimepicker1'>
<span class='input-group-text' data-td-target='#datetimepicker1' data-td-toggle='datetimepicker'>
<span class='fas fa-calendar'></span>
</span>
</div>
</div>
</div>
</div>
<script type='text/javascript'>
new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'));
</script>
</div>
</div>
</main>
</div>
<style>
/* these styles are here to keep the pickers off the edge of the screen */
.container {
width: 100%;
padding-right: 0.75rem;
padding-left: 0.75rem;
margin-right: auto;
margin-left: auto;
max-width: 80vh;
}
.row {
--bs-gutter-x: 1.5rem;
--bs-gutter-y: 0;
display: flex;
flex-wrap: wrap;
margin-top: calc(var(--bs-gutter-y) * -1);
margin-right: calc(var(--bs-gutter-x) / -2);
margin-left: calc(var(--bs-gutter-x) / -2);
}
</style>
<script src='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/js/solid.min.js'
integrity='sha512-Qc+cBMt/4/KXJ1F6nNQahXIsgPygHM4S2XWChoumV8qkpZ9oO+gBDBEpOxgbkQQ/6DlHx6cUxa5nBhEbuiR8xw=='
crossorigin='anonymous' referrerpolicy='no-referrer'></script>
<script defer='' src='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/js/brands.min.js'
integrity='sha512-vefaKmSAX3XohXhN50vLfnK12TPIO+4uRpHjXVkX726CqbicEiAQGRzsMTE+EpLkBk4noUcUYu6AQ5af2vfRLA=='
crossorigin='anonymous' referrerpolicy='no-referrer'></script>
<script defer='' src='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/js/fontawesome.min.js'
integrity='sha512-KCwrxBJebca0PPOaHELfqGtqkUlFUCuqCnmtydvBSTnJrBirJ55hRG5xcP4R9Rdx9Fz9IF3Yw6Rx40uhuAHR8Q=='
crossorigin='anonymous' referrerpolicy='no-referrer'></script>
<script defer='' src='https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/prism.min.js'
integrity='sha512-YBk7HhgDZvBxmtOfUdvX0z8IH2d10Hp3aEygaMNhtF8fSOvBZ16D/1bXZTJV6ndk/L/DlXxYStP8jrF77v2MIg=='
crossorigin='anonymous'></script>
<script defer='' src='https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/components/prism-javascript.min.js'
integrity='sha512-I4ZWqUpk7wqHcm7Gkv7k4IdgrDUTlGm1a7xeqyduqZLWeoGOn2E9us4XNBEDGclpk+6d1CmqIHYwmoyyL59zeA=='
crossorigin='anonymous'></script>
<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/themes/prism-tomorrow.min.css'
integrity='sha512-vswe+cgvic/XBoF1OcM/TeJ2FW0OofqAVdCZiEYkd6dwGXthvkSFWOoGGJgS2CW70VK5dQM5Oh+7ne47s74VTg=='
crossorigin='anonymous'>
<script src='https://storage.ko-fi.com/cdn/scripts/overlay-widget.js'></script>
<script defer=''>
kofiWidgetOverlay.draw('eonasdan', {
'type': 'floating-chat',
'floating-chat.donateButton.text': 'Support me',
'floating-chat.donateButton.background-color': '#323842',
'floating-chat.donateButton.text-color': '#fff'
});
</script>
</body>
</html>
================================================
FILE: src/docs/assets/repl-data.json
================================================
{
"note": "These are compressed JSON objects of different examples that can be loaded into the REPL code param. They are generated with https://stackblitz.com/edit/js-wpnd4a?file=index.js",
"iconOnly": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QQqALAgW01oB4IAHAQzgB04AAiFIAJgF4A5GJ4EyBJMzJckAYwDWZIgEYpgkWsw8IEaZhgoAtGQBuZOAX3ChEAtkxlpYpN2PY8USwkODIrACMLTSkAPgMhdiQhIxMzKQQeKwgYTHEhDKs1Hk84WSJ8zIA2AA8pIR4iJEyGcTEHaWJyWPYAeiQ4l17uPhj6ECZWADkYeQ4uGIBBTEwhbBgSIVCyMVEIeuEyT2VHIQIYeoICHjUGU4YyIVVNbVOYADpe+ZAAXyA",
"sideBySide": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QATJCAB0wENs8ACYAHTk4GcISOmQBC2AMoiyXYuT4CAviCoALAgFtMtADxMAfABU1jTqM3wIxVgTIROBNWSEyAtACNsb4aM4wmAiR4ADpdAHpDRU5dNg8yTE4EGCIAXgByOlsyIM0yJiQAYwBrMiIARgBJOCYSAnTOQrYICAzkok03OIT0g2lRT29+lwKSsojuzAM+XQYAN2im1haMpBq6txQiGBImTkwYFDcyObI4euiRDKy7XPyi0or06JvWNwI6d9YiFBy3NdqBAycDI33sF345lsbw+Xx+fwIhxQmDIwNBRHBzzg0zgugBdUudGu2Tuo0eVXWEIEBGwTFR6TsAA8qY1mq10u1OoV4MQYJgsQJXu9PgRvr8gekAMQ3HJIPJksrlLHhHG6ZisOCLNmrSmbba7d5kZkCqGi4Vw8UZaUkuX3MZPF7Q82IlDI+ky0kPMpYnGCNVMDWs5bshBvCB8kRJN6FVgouBZIi9CLq7GKZMB1O48LzX2cVQgDTaAByMDsekMJjMFisNjsDicLl8ZEGPhk-kCwTgYUiBhASiAA",
"localization": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8RMYBjAQ0yQC8mCl48ACYADpwCMACZNsfAOSB8EECsIIAEQOYE4QQEIggDhBegQRA5gZhBAfCCAWEEC8IIHkQKRSENMZJkWmA8EEDiIOq0bVgGRBegJhBA0iCG5QG4QOWN1OQsreggyaUB0EEAGEEAuEAVfT21ARhB9BUBJEHVEiLhomwYCAFl4AgALaUAkEF90hXi0wB4QOS1TQDEQAoAHIjIAN24SCHLhat5ZJUN-QGEQXOVeVvauyzg4MgAPMorxqRrtYMMZwDkQbLlmxbbO8NWishKATVt7CbqGpq8DQx6+wZhhp52aQyKazea8L4FdZbQEvPYHORHU7nCFGGYFO4lAAi9yYohir3qjTSAXaGmCGhuQl6AyGEBxzHxwNBRzOcl4pNM5LklKhmwIDLxBKkgEIQQ4nNkcq7c3mrGl-YZQMjCEhESQTEGIsHqBbeOT5VbQghKlVq6RixESnU+fU9JAMADWAAl-nC3op1Kp2U54loCkg4Aw+gBbZUEF2q2pKZqmXgzPWBdROELqcyrfFBsih4QRuGAYhBWsYPIAJEE9Xh9frl9odpQDJAIwrexK8zXUxhmqnRqwDmezZTrDekgBwQNsd+K8QD8IAp1I0zqE00IMyGw7W4PXhQWQiWy4tR527Y6AMr3eCiWpEj4+VRZfTKf2B5fCY8MU-SPMJpMp9k6RIzYzTAolyzMNn1fCZNyLYsv20fU-wA1YRBQFAbFKMgiCQUQkCzYFFH1QJjhcNIJw9IwMTIYoCAAFSQUNz3eNJvGjBdCnI+4BU4RsLxJJou0XCQADUsIAdydWx8SIAAxGAiGDTg+GAXhgx2aR6DgFALF4bBnmkAAmABaTCUCQAgpF4ABfVZ6GYGxpFIDECDsAg0AQSjKjIAB1MgyAdPgAEYhHMkAqEqAhg0wWggpAEKwoAORgBtaAAHm6AA+IQHn+XhmDgXhehgQZ8V4KyWHYThuBymBui4eAIF4EReHytD0MKqoyDqmAYEwLhulqphaqE8jMF4Pq6rc3hxGwAB6JSxnGpAIG6TAJAAOiERLJtStbNrgVz5qypgcoAIza6ICF4ZCYEOlgcF4QYmF4RKX3xFKG2DbphixGBgzrCBlpxBAmBILq0Cq8rfuK1gOGqnKAF5+F4ZbEfM9anrIFKGqIXhDuwKw+jKtThtuuwkCYQ6bF4MhlpQZaHtRlKX0KM7SF4OGFJECa8FkXC1E0HQvjMUzEZpsyAG4UbENHRuVXKiHyjC2tahrQZqoQ+rWja0rgZK+k1x6JaypaIAgGGpCWtSSCYFAyD0sAmH6PqgyQKqpE19YhLqrN3vpL6fuWyjPY+n21wgAAKURGBIPsqbIAgAFEbD7AAhbAAElRBDqRxAbLhQ26as0J0qQAEoKH4IQIdK6G+FIIQzPVun1ZpXXttctC2rsNqIbaxaSCMwpRs4GW5ZatzoiKxgWDIX7G813heBAMygA",
"timeOnly": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QATJCAB0wENs8ACYAHTk4GcAbkjIB3ALIw6ZLgHIAxphgKA1nIp9BnBTAC2TeGTgEIXXv22cZC1jLOcErTBEpar2MqyJcnLt5baevAEABa+zq6agYJ0rASyjpEBVpyhMCREDsTk0al6SHAkCdmkKVauunB0Dn6u7gIAvu6NIFShBHqYtG0gHV0AcjAJtAA8TAB87gBqZFlI8JwAbJxwMJzKcChznCSuEJxSesYEAFIHEOuumGQKBIUonGFknGKh8U-rDMxs2JyMqxgYmsRmESFYT1CL1GuhkE2+LHYADpdAYjCYIKMAPSwsgTJF8bGTECNIA",
"inputOnly": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QQqALAgW01oB5MBDAIzMwAECGEQC8AcgAmXAmQJJmZAA5IAxgGsyRAIziBq7hAgThRZgFpufTOIB8AORgC18dgHor-WwB04AgexIcEokBL7+-kiSEtKy8ooqGlq64REE2EpkErIAHgTiqf4GXEYmIhaq8MQwNqlutvQgTKyOshxKtgCCfkEhBAIoRDAkSgJccJLOlX5cRGQCcDD9cwCOJEhzk6YCBAzziZpEO04IJHCq8vAUAtjD+uNjmBBOEApKOAIkEPMPvaFCSH4kgAdO4OiAAL5AA",
"enabledDates": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuBAQ0wgFMAacCfEJAWwAcYAnAFwAJh2AVUxgVwgARGHSRxB5dkMKtS3eqXYBfdgmaj2AcgACpeIQgATQnAD0cgRAC0R0eMFaA3AB04b9uwDG8CB1aiLBoA7uwAvOxwpKEycgAUAJSucJ4BdEEwwQB0ZKyxpHFpGdkopHmyBQnsANTsAIxJHpHRPHwMgiJiEhBxdl78dKRwrFmlrACimHxDrABC2ACSRnFaJnKsigxIXgDWpMx1WglSwE2ezKR+zNsbvnicZ57sRkgQhABGU0b5EPcA2o8nuwiswQuRAU8ojEKgpBoksnRTEh2pgKnEAExSVYVI7glJA9gAXTxQOUJJUSRAlAAFqw6JgaFSQLT6QA5GByGgAHgYAD5xnAPl8zEJXkLSEZpBUIFyzHymjzeQBNGD8bymdgMDQANyQRiUGsIoMI2HYMAQz2lwJg7CG4rNzEtcgg1ueYs+pCysr5IGUQA",
"linkedPickers": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuBAQ0wgFMAacCfEJAWwAcYAnAFwAJh2AVUxgVwgARGHSRxB5dgDlCdUhAaEAxqXYBfdgmaj2AcgACpeIQgATQnAD0rPg0EBaM6PGC9AbgA6cdu2+-leAgOTHEAa1IzAAUkZQjmAEYAUUw+UjgOAF52Z2V+eQyAOhRSVhS0jIAhbABJMwAKPVC4COjY+IgEvQBKLx92QLhg9mbWhPZsuFIAdx47QRExCQh60ciYuNJE8oLWXv8BoJDwyIAmCfYp2d4BYRdl+tz89NZi0p2X6rrGtbbN5ggpx6UmAB18glIUH4zGYLzwWmIZAO6n2-QOVisgnEKHYpAAbi8RkhgukthADr8NvFkqldoVCGYzEkCRkADLE2xTZj1WTyRQqUiFfEvCCFZQAC0sJSk9VI3QmAD5OGCiS0zoV+AwLLY0AxWEggvVQf1fL5YcFmLF9UF4cbTfb2EshIRbPDBWZSoQkJhCtrSCrfOoVSi+oHUb50ZiINj2BB+AAjCDKS3xtTyVjimBmA6DYZxxPJpB6g0+bK-U6FfNJlOkHlyBRKVRClmsUUSqUUdiy+WZJV202-BIarUu0i661DI0B9jm1iW5QTiC26e+OiEAAeztduN9o+nQZNGnDR9Dfn6GNxLaJJK5A0s7FT7H4QwT1aQqbM7FYMDwkdjr8LYt4A1F8CxrepehAShxVYOhMBoAAeMwkDxAZMFMCBMj0HRpj0BVvE8VgkJQtCMKwwJMAcCA6AcAA2PCCI4dgEPQ1NMC0FgsMpdoyQSGo4HsVg9FIiBML0BAWBo1jSEwPCADEdDoBCrGkzB8LgQjfGIvFGMI5R0NErDxEEhwUB0TURhgFAHGFDI9F0-UzC4k4-g6LoHO1QgHFYMxvMIZgSlYBxjP4VgsKmfyFCEjyXS8ny-IC0pvKslBUnC0hIuCeyNKY9TCMIhCQtYBzfCQJymhcqleP4wTsvypjWGwBhSCw2x12inLNJEsSJOYGjBjnGBZJKnJYu83zWH8wKsIAYm4-5Ojq4rWCsPLloQ-kNM6pj9LIvQitM8yGG80h2qWrrPPGhLpr0ObKp4gF3O23xLvi78UFSlq9D9fV5AYB7ztYNauuYzbuqwogqKGsqEQcZRiHSCxmDw5TNuBjhUaUOA1q0qxkLxNblPxwn8fBvQKKomj6Jx5jVI45hnLVVyyVOGrQuE3bDPEySHFUvDuBgZTVJp7SHM5sSDrMmALMwKybJbQGysZ1oqoBIEYsmq7JsSoKivSzKOvq16JqmpL3s+-XZyW3x0cKgTQpGpWKqZ1XATZw3lt8Rrmta06Pa68WIZ5gadGG57Rs1t7TbC275o6dXttWhyNqxkbA-2+2gqlzUTrOkbjeu0pZrjlnAZesa3pStLvtHX7SH+-5AfR00U-vdPIYgaHP0h+HUjgJGUasNGSsxywRbxlDCYngnvCJyeoJAGC4OkGBbEQhgFXZJn2AbjplI3hCN4OABNaW7x8CFL0JUIbzJdgWC-cU1CrQtH3TTNP2-VUwi-aYYB3h6EAvxWVKE-ZghR2ByQfqdOQDBUhSEIOwTMth2LBEINgA48YYAwDCNiQos8rBHzgCAdQQA",
"customIcons": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QATJCAB0wENs8ACYAHTk4GckAY3gQuvfoIEEkAWzJcA5ACMknNQFphmGMIDWSin2kC6rAos6r1W4a0xk45okZOmSTZWo1JNrIiIYAHdNTzcpaToQuG9bPwCg0OjguAjTTiYiMgA3JBgScWsfOwALXKC4TUcEAnTTODIADwI4321ynMrNIlRSuuNIwQIYcw5i+O0HJxcOsgN66R0yALatYlYIUsXBHRgIKxt2pp2AX0HpFRICEbgiyQyRsa5icgvTZdXOV8p3Jd0Di9SL8hud3KcQFR+nJMLQADwMHLuHSbCAAXh4ICQcCY100KCCnk4uhQmlyTgImPcSDoGPoFjIsgUTBE+jIRAAjFSpOYCKxNAQ6AKAihGZpsbiCHTGgEyBBKSB3Lz+YLhURRQQBTAUChHNKVtl5dyAHzuOES65-IS0zG8xnyMgsgzsjkASRxlsVQwI2CYZDplha3P+qLpCBgRDk2ngxBgmGDgmVAqFfPVjLpAGI7UzHayXQmAPSmqRw5isOBWlEQdGYi2agkFJgC5oKq1J1WpjWZ7MOp1szkJswWFUp7W6-22hk5vvshPF6SlpjlzhVmsgEp+eyOZwBTHGuEFstweecA9H4sHxEXzDY-ScbKYOny7COLZkRmYzilbIIOn9AhMOIBYFsIdBwAAdJAdBkDeXTgY0BAFjicgFioMAwAQ8pEKwTYiGIAACHLgQAnOBHIFuGcCIWhGFYTh4qiHc4HCNWe6QiA0KYAAchhZDwkwxpQIUIxyJwrqMRAB4CXCAnuAAmgUK7LsIpTlqK3zlEIEmcAgQSiQQmkAGIxpwACCwRyjACicNBCCsCQmAEN8MCcOWGHlEQWnwFaAgHE5N5sqerBfj+aJKP+gF4MBeFMRqNGYRsTDMVZBZKN8IrpkoAD6KhsHAhj3jBYVwOhfqNK4xoAELoQl2FMEoEBiYxB6sBeBayXAICnEAA",
"viewMode": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QATJCAB0wENs8ACYAHTk4GcAbkjIB3ALIw6ZLgHJsZVkQhy+AgL4gqACwIBbTLW0g9hgHIwCZWgB4mAPgBqosZykzbAekf2H6zgAVHTJhV059aVCYJgIkeAhOVkxMGDFE7BgSTgIYTggdNKTOBgQEMiIyOAJOJDgkOOSw8QA6TgAxGCJOMgAPVn0WUIgyTDIAYzi4FGK6VmtOGAROACMkIgIdFr5vRz4QDSA",
"disableWeekday": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QiyJikBjApeCPAAmAB04ugrgBMAhtghoEAdTJkA1gBEkEUQCNMZYdwDaABgpcAbAF1+ggL4gqACwIBbTLWsg7jgHIwCZWgB4ADgB8yqoaWlyK4hBcMAhcBDZkXLIKvgD0QQGB5lwAmjAkXMyiAsIq6poiUTFxCUkA7nLyXJhI8kkAyiRwYthcABR6AJRcJcJcHaIEJES9A0ZD-OlB-CAWQA",
"inline": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QATJCAB0wENs8ACYAHTk4GckWYWS7FyfAQF8QVABYEAtploAeNgCMymTghhEAvAHI6rAmQJIlZJkgDGAazJEAjMc722ECCf1ElAFotHWMAPgBJETgyNQB6EMwwqU41BgA3FIEvVh8TTBgUQLJ0sjgCYyyhOhMzCysbOycXdxTk-lS4jLC5EEUVADkYC3UmSOjYuLG1MYBNGBJPVn5WTAgYThIIMk4CeR2m5yIhCYA6eLG+EGkgA",
"multipleDates": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QBbEzApAB0zIBEBDAsiPAATFyIKgAsCdTLVEgJUgHIxetADwsAfAFlGzNmQHdeEVQHpN6jQBUxBlkgDGAazJEBXTJhgB3CAIQwbgxMrOwCACY8fEIwAgBGBhBk7A684QB0ZpoAOnAgAL5AA",
"updateOptions": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuBAQ0wgFMAacCfEJAWwAcYAnAFwAJh2AVUxgVwgARGHSRxB7AL7sEzUewDkAAVLxCEACaE4AelZ8GggLSbR4wYoDcAHTh2AxvAgcHACx0pSaBqyTOAIX5WVnh2AF52Mwd+OlI4VgA6L1YAUUw+eNYA7ABJTQAKRXdPb19-OAhFAEpbOCdKjjIQ8XRy5wAFJAcAa1JmCPY4UgB3HkNBETEJCALo2Kzk0jSMuISc-KLtAz84hm6+5gBGGtq7OwyOMMiiElJHDzgvHz9A4NC4RMJNTVSANyyABkkC54v0ig5MAdFOR2AVqhEAHycOzNPxPF4VCBdXr9RL8BjbMqvSoFYB2ZikFzMbokiB4FFwbTYCBoBAAdVIpB6QhBhAARhlNAywgB+dgAbQAuuwGRKAAywgBsUrsUjVZzg13YAEJ4HUSk9iVigiF4IlIRoIMCXIlQigUBkivzWHBjAwaXRCMxsDUDY9nu1KqaPhbMFabUl7Y7SM7XcYyA1tD6-RqrCBKG5WHRMDQADzh-mkTCyFjhGwgIm7Uj7XHHXJwIysCvsS0QCDlkAIFh0YyF4sVxE4w553T9zCIux5zRIP6OcPtzviJvGFDyAnsTAwFDGUgAhIVuxITSdqv0GsHfpHQ9MwisQjGViaR-elLGZfBTvDb1U5sgOzbA+T4vswb7RhkX6kD+Lg3pOcB5h+zZwMep53ss561ocRwNk2N6sNgDCkJ2BgAB5-vOVqdt2zC9g0rDyJgN6AY+z73qByydgAxGeeyXscN66HBeYQAwOgUYuFaIau64MI+pBkUxd5Aaxr4cRW3FodWmFXop94sY+24xqhOwYXxsFTkgrYLh2FZEBAsgPg4xDxMmg6jkgQm6CJOieTOfxCX5VmUYo8hjHQrDGAAzIoAWzkFi7FDAmAJr2SoxVO-LvGEKHFAGxrOIo8UdooLpwOwpXup63q+oi3CGRkUR8oKpCaOwIxcn0TIQKOmVmnAvmzgN-kZiAWY5gAcjABj5gwiIAKqEmh7AwEG3W6LNeazewACaMD8K2OjsB6MB-MepDsIQQyjOwzTLQgy2reV2AHZgUJPOweZOJopCIgSRKYs4BQSsMIwA5UUrVKOX0-YkPBuCCsj8PUJIXSQMB2OwqNbiM9nYHt7ChOwlK3awbjnStdLlYQvQEzABNk1EpBEPwmBXAMcTsfT50gw9lMjEgpNc4zzOs+w4igt8d1C-JILoigvNYk9R1Wq0H3Q4i9H8KQUMwN9yIaELiYo6JzCEHEBjMIko6zXYIBSEAA",
"parentContainer": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QBjeAgQyTjKLwAIATGOkgLZk4BAHQBHckWwBlMpjJ0CMIgAoA5NyQA3AMQAHJkWEEAtAxEs2RdQEoQVABYEBmWgB4t2zkm4BedUNjEXNGK3Z1TjpMJggIAOMYgh0yTn1TAFZIiAJsBQCYbXYETBgAdy4mEmUAbk5HMlRnLgBGAAY2-QAPOrLfAkdWjoBSGvUAPgAdOE5OdxiAI3lOBBUAi2ZWdgARJgIyAAUkOgBrdgBJOH1qifcAekX5KZm5ryiYuIDWa7MUIhgSPpOKUUKYyEURJFfAFuHsyMkhPpjmciC1IrDmKYCNwsUYUPDTN9qgE2EYyDl1NNZtTZhimFiccwiPizMoUCh8upScYKc8ae4iQQfP51BtwkRdvsjqcLlcbpxcvoyAF9l0CJForF4upVkQBKERP9MJE7nzqe4IIYZprPupBaY-gD0qr1Tw9vTsbjmfCAroIPDknB0PpkvAIJSXjSaXSGViYOzORj4UhEciImb+ZamNaPtqEPSIDBML4VvS6EwFHBYTZxvcs3AM3M7vWzfcvM82zpxg4QM5XAA5GD7Dz6cYHMkiTiwSxbIj3UfuUcATQBUWznEtiiQCGwPgQCoaaTTRA3jgBmG4nCWnD2zDoDUvygPqV4-CEk4WMG4u5UN43Srobdjk4eQyHfMR52eEAAF8gA",
"functions": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuBAQ0wgFMAacCfEJAWwAcYAnAFwAJh2AVUxgVwgARGHSRxB7AL7sEzUewDkAAVLxCEACaE4AelZ8GggLSbR4wYoDcAHTh2AxvAgcE-OA9ZJ4AGRgp2AF52AAoGZlJkAA9ydgA3Yn5SAEoggD5OO0x-FFJmELMHfjpSOFYAOlzWAFFMPlLWACFsAElNEMVslEVk8jtO-0U+uHDIpBi7BMwk5Ns4KTn2dkdnDgYkBwBrPIAxd09vOAgg9jhSAHceQ0ERMQkIApgikrLK0hq6l6bW9sVtAy8JXWWzyAEYerFgHY6PxMF4GHUhIQDBA8OxWMwksNNEgIAjCNg0VCPKImGcyqjMh5sls0UQSKQ7FImUzZnYlnZCsUGm8PvUys02h0qkiDD1yoRNJpqnEGj5cQYzvlFA5MBtNkNQqlAhlibpdF1jsRMOwyHVPKRNOx-qQIHY3B4vL5-B1jabSOaDJpNQApADKaAAcuUXMxxCgkAhsGF1bt9k6juUbRBysDtppYhJMJhYgAmZJsvQG-zHVgAC1I7EwGg4ZtIFs09vjhz8KA61Zc7s9ls1abjjsOKeT5Q7rAACrHNIX9Yb0RWu-WvexxJpSFFyjwy7j2OckNn2MRzgTjgAjSsABmXCHYMLhSARpFFtuXx3pZCbA+dbc6NYXDeXcCrlEvaxsweyfomw6jhOIKaC0gFroWUiFhygFPNyrxVLU-LfEKihkKwT7ipK0qymU8ouKUeQdKq6qaiE2q6nY+oMIQzBkPBRgcLu+7IgYjAcKwMDovwzBwKaGLhkagHsE+7AwCeYCLqWwmELJyKkNw9CVgpSmeOUKxHGsbFkJocnBH2YHNs4SYaSmrHsaQnH8KwIRnJcT4hLm57ebEAAssSgueBZzPqkY3rC8KInZL6yMQZCxOWlZkE4MkOYQJQGMwsVwDAHARAAjvwSARJoBkjKB4EHDZw4EQAaokpBhCZlpPrEllVQmQ52SONYwem8FAUhswgJQZasHQmA0AAPNWZ4mggLCBDYIA2oCpCWaCzmsCt7CqhoEDLSAi3MHQxhzR6K1pP1eTTQahDzWkdjTTicSOB2h0reIXHGCg8j8AwVb+MYpBkTtIB2EgmhHWt2mbStnLIoQxisJoKNsVUxjfS5R1nGxtrg4jrDI6j6PMJjQkoCgdS46Q+MuAjcBPXA03YztcBQzDGnrZt22M6w2AMKQR0GFEhPUgdR0nWdqUYjAmCM-8JNo8T5PvEdADEsNAqBoKM7ozPTXiOjvZLX0jC5v3-QwKNruLSsoyrGPqytWvc3DuuK0jjsozkNMrdrG2gYzhtIHtH1SxocXGA4xClNozBXXdSCG7oxtM89uivYbr3h5LijyJcdCsMYADMig50gcR5xAh0qvLxgQGdABsFfPSeLlCeJnOKCKGmKDXdcnqw4nD3AxjhPQbHYDepBlxXADi7zqQYd0d6wXeG+vXfLtD+HvERg+BIoY-sGPE9hnQ08V36y9yUJ7DebmubGOeACsxhBWvnfwKn2eZ9nUaIBxqTUDHlUgM0GDXVAuwTqg47pQOmlA7gW5jgQDLDAc4RpZAXFkNZcSsdswpgQWkEAUggA",
"theme": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QATJCAB0wENs8ACYAHTk4GcCACzIBbMlwDkdVkQDWUvgIC+IKsIJjMtdSE3aAcjAJlaAHiYA+ACqiJ5gPTXLVgJowSnAMat+rTAgYTmYybyQEbCFRaPEyTgQYIljOJiRveTIiADonaz4QFSA",
"plugins": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuBAQ0wgFMAacCfEJAWwAcYAnAFwAJh2AVUxgVwgARGHSRxB5dgDdSzCEnhTSAD1ak4AE3YBfdgmaj2AcgACpeIQibCcAPTqBEALSbR4wcYDcAHTh-6JjZOdkwYQk0pIgAxJFkASQBjeAhdfUM6E3NLa1sHPgZBV3cJCDtNJAhWOwZMfhRxMqJnZFlvP1V1LQAKMIiASl9-ODhSAHceAsERMVLuv3Z2N0T+Og1WADoUUlYAUUw+dYAhbHjNbuMbdVZ6UgYkRIBrOQBGY37yBc4vxYqIWsI2Dw3zgizB7AeKWBMTipCSKU+oLBOkRix0fkGIEoAAtWHRMDQsSBcfiAHIwdQ0AA8DAAfNxsZV2KpCIwDuwINiYGNUoJxCh2KxsaR2LV6uIOdgqnwqTVaX4QDogA"
}
================================================
FILE: src/docs/js/docs.js
================================================
document.addEventListener('DOMContentLoaded', () => {
const subToc = document.getElementById('subToc');
if (subToc) {
document.getElementById('tocContents').innerHTML = subToc.innerHTML;
document.getElementById('tocContainer').classList.remove('d-none');
}
});
================================================
FILE: src/docs/js/migration.js
================================================
document.addEventListener('DOMContentLoaded', () => {
if (!document.getElementById('migration')) {
return;
}
const alertBox = document.getElementById('alert');
const createAlert = (message, style) => {
const div = document.createElement('div');
div.className = `alert alert-${style} alert-dismissible fade show`;
div.innerHTML = `${message}<button type='button' class='btn-close' data-bs-dismiss='alert' aria-label='Close'></button>`;
alertBox.appendChild(div);
};
class JsConvert {
constructor() {
this.input = document.getElementById('from');
this.output = document.getElementById('to');
this.convertButton = document.getElementById('convertButton');
this.datetimepicker1 = new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'));
this.convertedConfiguration = undefined;
this.convertButton.addEventListener('click', this.convert.bind(this));
this.input.addEventListener('change', this.convert.bind(this));
document.getElementById('tryIt').addEventListener('click', () => {
// run if it hasn't been for some reason
if (!this.convertedConfiguration) this.convert();
// if still no config, then there was an error.
if (!this.convertedConfiguration) return;
this.datetimepicker1.updateOptions(this.convertedConfiguration);
});
}
convert() {
this.convertedConfiguration = undefined;
alertBox.innerHTML = '';
this.output.value = '';
const value = this.input.value;
if (!value) {
this.output.value = 'No configuration was provided.';
return;
}
if (value.includes('moment')) {
createAlert(
'I can\'t convert moment objects. See Exception 1.',
'danger'
);
return;
}
if (value.match(/[()<>]/gi)) {
createAlert(
'Can\'t parse functions or object initializations like new Date(). See Exception 2.',
'danger'
);
return;
}
try {
let config = Function('"use strict";return (' + value + ')')();
const newOptions = {};
const prop = prop => obj => {
const value = obj[prop];
if (value) return value;
else {
obj[prop] = {};
return obj[prop];
}
};
const ensurePath = (paths, obj) => paths.split('.').reduce((value, key) => prop(key)(value), obj);
const differentAccepts = (key) => {
if (['viewMode', 'toolbarPlacement'].includes(key))
createAlert(`${key} takes a different set of values. Verify this option.`, 'warning');
};
Object.entries(config).forEach(([key, value]) => {
differentAccepts(key);
switch (key) {
case 'format':
createAlert('Format is no longer used to determine component display. See <a href="options.html#displayComponents" target="_blank">component usage</a> and <a href="options.html#hooksInputFormat" target="_blank">input formatting</a>.', 'warning');
ensurePath('display', newOptions);
newOptions.display.components = {
calendar: true,
date: true,
month: true,
year: true,
decades: true,
clock: true,
hours: true,
minutes: true,
seconds: false,
useTwentyfourHour: false
};
break;
case 'icons':
case 'sideBySide':
case 'calendarWeeks':
case 'viewMode':
case 'toolbarPlacement':
case 'inline':
ensurePath('display', newOptions);
newOptions.display[key] = value;
break;
case 'dayViewHeaderFormat':
createAlert('Moment is no longer supported. This "dayViewHeaderFormat" now accepts Intl formats. See <a href="options.html#localizationDayViewHeaderFormat" target="_blank">localization usage</a>', 'warning');
ensurePath('localization', newOptions);
newOptions.localization.dayViewHeaderFormat = { month: 'long', year: '2-digit' };
break;
case 'extraFormats':
case 'collapse':
case 'useStrict':
case 'widgetPositioning':
case 'widgetParent':
case 'keyBinds':
case 'ignoreReadonly':
case 'focusOnShow':
case 'timeZone':
createAlert(`${key} is no longer supported and was ignored.`, 'danger');
break;
case 'minDate':
case 'maxDate':
case 'enabledDates':
case 'disabledDates':
case 'enabledHours':
case 'disabledHours':
case 'daysOfWeekDisabled':
ensurePath('restrictions', newOptions);
newOptions.restrictions[key] = value;
break;
case 'disabledTimeIntervals':
ensurePath('restrictions', newOptions);
createAlert('The "disabledTimeIntervals" option now expects an array of <code>{ from: x, to: y}</code> See <a href="options.html#restrictionsDisabledTimeIntervals" target="_blank">usage</a>', 'warning');
newOptions.restrictions.restrictions = [{ from: new Date(), to: new Date() }];
break;
case 'useCurrent':
case 'stepping':
case 'defaultDate':
case 'keepOpen':
case 'keepInvalid':
case 'debug':
case 'allowInputToggle':
case 'viewDate':
newOptions[key] = value;
break;
case 'locale':
createAlert('Moment is no longer supported. This "locale" now accepts Intl languages. See <a href="options.html#localizationLocale" target="_blank">localization usage</a>', 'warning');
ensurePath('localization', newOptions);
newOptions.localization.locale = value;
break;
case 'showTodayButton':
case 'showClear':
case 'showClose':
case 'buttons':
ensurePath('display.buttons', newOptions);
const handleButton = (k, v) => {
newOptions.display.buttons[k.replace('show', '').replace('Button', '').toLowerCase()] = v;
};
if (key === 'buttons') {
//v5
Object.entries(value).forEach(([k, v]) => handleButton(k, v));
} else {
//v4
handleButton(key, value);
}
break;
case 'tooltips':
ensurePath('localization', newOptions);
Object.entries(value).forEach(([k, v]) => {
if (k.startsWith('prev')) k = k.replace('prev', 'previous');
if (k === 'togglePeriod') k = 'toggleMeridiem';
newOptions.localization[k] = v;
});
break;
case 'allowMultidate':
newOptions.multipleDates = value;
break;
case 'multidateSeparator':
newOptions.multipleDatesSeparator = value;
break;
case 'parseInputDate':
createAlert(`"parseInputDate" is now <a href='options.html#hooksInputFormat' target='_blank'><code>hooks.inputParse</code></a> and takes a function that must return a <code>DateTime</code> object.`, 'danger');
ensurePath('hooks.inputParse', newOptions);
newOptions.hooks.inputParse = undefined;
break;
}
});
let outputValue = '{\n';
let spacing = 0;
const readme = (obj) => {
Object.entries(obj).forEach(([key, value]) => {
if (!Array.isArray(value) && typeof value === 'object') {
spacing += 2;
outputValue += `${Array(spacing).fill(' ').join(' ')}${key}: {\n`;
spacing += 2;
readme(value);
spacing -= 2;
outputValue += `${Array(spacing).fill(' ').join(' ')}}\n`;
spacing -= 2;
return;
}
if (Array.isArray(value)) {
outputValue += `${Array(spacing).fill(' ').join(' ')}${key}: [${value}],\n`;
return;
}
outputValue += `${Array(spacing).fill(' ').join(' ')}${key}: ${typeof value === 'string' ? `'${value}'` : value},\n`;
});
};
readme(newOptions);
this.convertedConfiguration = newOptions;
this.output.value = `${outputValue}}`;
} catch (e) {
createAlert(`Something went wrong trying to perform a conversion. Please report your configuration settings.<br/>${e}`, 'danger');
}
}
}
class HtmlConvert {
constructor() {
this.input = document.getElementById('fromHtml');
this.output = document.getElementById('toHtml');
this.convertButton = document.getElementById('convertButtonHtml');
/*this.datetimepicker1 = new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'));
this.convertedConfiguration = undefined;*/
this.convertButton.addEventListener('click', this.convert.bind(this));
this.input.addEventListener('change', this.convert.bind(this));
/*document.getElementById('tryIt').addEventListener('click', () => {
// run if it hasn't been for some reason
if (!this.convertedConfiguration) this.convert();
// if still no config, then there was an error.
if (!this.convertedConfiguration) return;
this.datetimepicker1.updateOptions(this.convertedConfiguration);
});*/
}
convert() {
this.convertedConfiguration = undefined;
alertBox.innerHTML = '';
this.output.value = '';
let value = this.input.value;
if (!value) {
this.output.value = 'No configuration was provided.';
return;
}
value = value.replace('data-target', 'data-td-target')
.replace('data-toggle', 'data-td-toggle');
this.output.value = value;
}
}
new JsConvert();
new HtmlConvert();
});
================================================
FILE: src/docs/make.js
================================================
const fs = require('fs');
const jsdom = require('jsdom');
const { JSDOM } = jsdom;
const path = require('path');
const minifyHtml = require('html-minifier-terser').minify;
const dropCss = require('dropcss');
const { minify } = require('terser');
const sass = require('sass');
const chokidar = require('chokidar');
const rootDirectory = path.join('.', 'src', 'docs', 'partials');
const ParvusServer = require('@eonasdan/parvus-server').ParvusServer;
class PageMeta {
file;
title;
body;
postDate;
updateDate;
excerpt;
tags = '';
constructor(
file = '',
title = '',
body = '',
postDate = '',
updateDate = '',
excerpt = '',
tags = ''
) {
this.file = file;
this.title = title;
this.body = body;
this.postDate = postDate;
this.updateDate = updateDate;
this.excerpt = excerpt;
this.tags = tags;
}
parse(metaTag) {
if (!metaTag) return;
const title = metaTag.querySelector('#title')?.innerHTML;
if (title) this.title = title;
const postDate = metaTag.querySelector('#post-date')?.innerHTML;
if (postDate) this.postDate = postDate;
const updateDate = metaTag.querySelector('#update-date')?.innerHTML;
if (updateDate) this.updateDate = updateDate;
const excerpt = metaTag.querySelector('#excerpt')?.innerHTML;
if (excerpt) this.excerpt = excerpt;
const tags = metaTag.querySelector('#tags')?.innerHTML;
if (tags) this.tags = tags;
}
}
class FileInformation {
file;
isDirectory;
fullPath;
extension;
relativePath;
constructor(file, fullPath, isDirectory, extension) {
this.relativePath = fullPath
.replace(rootDirectory.replace(`.${path.sep}`, ''), '');
this.file = file;
this.fullPath = fullPath;
this.isDirectory = isDirectory;
this.extension = extension;
}
}
class Build {
shellTemplate = '';
pageTemplate = '';
postLoopTemplate = '';
//create meta info
pagesMeta = [];
// prepare site map
siteMap = '';
css = '';
cssWhitelist = new Set();
async startAsync(){
builder.updateAll();
if (process.argv.slice(2)[0] === '--watch') {
await builder.watcher();
}
}
updateAll() {
this.shellTemplate = this.loadTemplate('shell');
this.pageTemplate = this.pageDocument;
this.postLoopTemplate = this.loadTemplate(`post-loop`);
this.reset();
this.update404();
this.prepareCss();
this.updatePages();
this.updateHomepage();
this.minifyJs().then();
this.updateDist();
this.copyAssets();
}
reset() {
this.pagesMeta = [];
this.siteMap = '';
}
loadTemplate(template) {
return fs.readFileSync(path.join('.', 'src', 'docs', 'templates', `${template}.html`), 'utf8');
}
directoryWalk(directory, extension = '.html') {
let files = [];
fs.readdirSync(directory)
.map((x) => {
const fullPath = path.join(directory, x);
return new FileInformation(
x,
fullPath,
fs.statSync(fullPath).isDirectory(),
path.extname(x).toLowerCase()
);
})
.filter(
(x) => path.extname(x.file).toLowerCase() === extension || x.isDirectory
)
.forEach((x) => {
if (x.isDirectory) {
files = [...files, ...this.directoryWalk(x.fullPath)];
} else {
files.push(x);
}
});
return files;
}
getSearchBody(html) {
const bodyPrep = html.textContent
.toLowerCase()
.replace('.', ' ') //replace dots with spaces
//.replace(/((?<=\s)|(?=\s))[^(\w )]*|[^(\w )]*((?<=\s)|(?=\s))/gm, ' ') //remove special characters
.replace(/((?<=\s)|(?=\s))[^a-z ]*|[^a-z ]*((?<=\s)|(?=\s))/gm, ' ') //remove special characters
//.replace(/[^a-z ]*/gm, '') //remove special characters
.replace(/\s+/g, ' ')
.trim() //replace extra white space
.split(' '); // split at words;
return Array.from(new Set(bodyPrep)).join(' '); //remove duplicate words
}
removeDirectory(directory, removeSelf) {
if (removeSelf === undefined) removeSelf = true;
try {
const files = fs.readdirSync(directory) || [];
files.forEach((file) => {
const filePath = path.join(directory, file);
if (fs.statSync(filePath).isFile()) fs.unlinkSync(filePath);
else this.removeDirectory(filePath);
});
} catch (e) {
return;
}
if (removeSelf) fs.rmdirSync(directory);
}
copyDirectory(source, destination) {
fs.mkdirSync(destination, { recursive: true });
fs.readdirSync(source, { withFileTypes: true }).forEach((entry) => {
let sourcePath = path.join(source, entry.name);
let destinationPath = path.join(destination, entry.name);
entry.isDirectory()
? this.copyDirectory(sourcePath, destinationPath)
: this.copyFileAndEnsurePathExists(sourcePath, destinationPath);
});
}
copyFileAndEnsurePathExists(filePath, content) {
fs.mkdirSync(path.dirname(filePath), { recursive: true });
fs.copyFileSync(filePath, content);
}
writeFileAndEnsurePathExists(filePath, content) {
fs.mkdirSync(path.dirname(filePath), { recursive: true });
fs.writeFileSync(filePath, content);
}
// since everyone has to have their own metadata *rolls eyes* the primary purpose here
// is to quickly find similar tags and set them all at once
setMetaContent(rootElement, selector, content) {
[...rootElement.getElementsByClassName(selector)].forEach((element) => {
if (content) {
element.setAttribute('content', content);
element.removeAttribute('class');
} else rootElement.getElementsByTagName('head')[0].removeChild(element);
});
}
createRootHtml(html) {
html = minifyHtml(html, {
collapseWhitespace: false,
removeComments: true
});
return `<!DOCTYPE html>
<html lang='en'>${html}
</html>`;
}
get shellDocument() {
return new JSDOM(this.shellTemplate).window.document;
}
//read css files
prepareCss() {
this.cssWhitelist = new Set();
this.cssWhitelist.add('mt-30');
this.css = sass
.renderSync({
file: path.join('.', 'src', 'docs', 'styles', 'styles.scss')
})
.css.toString();
}
//read post template
get pageDocument() {
const indexDocument = new JSDOM(this.loadTemplate('page-template')).window
.document;
const shell = this.shellDocument;
shell.getElementById('outerContainer').innerHTML =
indexDocument.documentElement.innerHTML;
return shell.documentElement.innerHTML;
}
updatePages() {
this.reset();
//remove old stuff
this.removeDirectory(`./${siteConfig.output}`, false);
/* const pages = fs
.readdirSync('./src/docs/partials')
.filter((file) => path.extname(file).toLowerCase() === '.html');
*/
const pageMarch = (pages) => {
pages.forEach((fileInformation) => {
/*
const fullyQualifiedUrl = `${siteConfig.root}/${siteConfig.output}/${file}`;
const fullPath = `./src/docs/partials/${file}`;
*/
const fullyQualifiedUrl = `${siteConfig.root}/${siteConfig.output}/${fileInformation.relativePath}`;
const fullPath = fileInformation.fullPath;
const newPageDocument = new JSDOM(this.pageTemplate).window.document;
const postDocument = new JSDOM(fs.readFileSync(fullPath, 'utf8')).window
.document;
const article = postDocument.getElementById('page-body');
if (!article) {
console.error(`failed to read body for ${fullPath}`);
return;
}
const fileModified = fs.statSync(fullPath).mtime;
let pageMeta = new PageMeta(
fileInformation.file,
fileInformation.file.replace(fileInformation.extension, ''),
this.getSearchBody(article),
fileModified,
fileModified
);
pageMeta.parse(postDocument.getElementById('page-meta'));
newPageDocument.getElementById('mainContent').innerHTML =
article.innerHTML;
const publishDate = new Date(pageMeta.postDate).toISOString();
newPageDocument.title = pageMeta.title + ' - Tempus Dominus';
this.setMetaContent(newPageDocument, 'metaTitle', pageMeta.title);
//this.setStructuredData(structuredData, 'headline', pageMeta.title);
this.setInnerHtml(
newPageDocument.getElementsByClassName('title')[0],
pageMeta.title
);
this.setMetaContent(
newPageDocument,
'metaDescription',
pageMeta.excerpt
);
this.setMetaContent(newPageDocument, 'metaUrl', fullyQualifiedUrl);
this.setMetaContent(newPageDocument, 'metaPublishedTime', publishDate);
if (!pageMeta.updateDate) pageMeta.updateDate = pageMeta.postDate;
const updateDate = new Date(pageMeta.updateDate).toISOString();
this.setMetaContent(newPageDocument, 'metaModifiedTime', updateDate);
this.setMetaContent(newPageDocument, 'metaTag', pageMeta.tags);
this.pagesMeta.push(pageMeta);
const completeHtml = this.createRootHtml(
newPageDocument.documentElement.innerHTML
);
this.writeFileAndEnsurePathExists(
path.join('.', siteConfig.output, fileInformation.relativePath),
completeHtml
);
//update pure css
dropCss({
css: this.css,
html: completeHtml
}).sels.forEach((sel) => this.cssWhitelist.add(sel));
this.siteMap += `<url>
<loc>${fullyQualifiedUrl}</loc>
<lastmod>${new Date(pageMeta.updateDate).toISOString()}</lastmod>
<priority>0.80</priority>
</url>`;
});
};
pageMarch(this.directoryWalk(rootDirectory));
this.pagesMeta = this.pagesMeta.sort((a, b) => {
return +new Date(a.postDate) > +new Date(b.postDate) ? -1 : 0;
});
this.writeFileAndEnsurePathExists(
path.join('.', 'docs', '6', 'js', 'search.json'),
JSON.stringify(this.pagesMeta, null, 2)
);
this.updateSiteMap();
this.updateHomepage();
this.cleanCss();
this.updateDist();
this.copyAssets();
}
updateHomepage() {
const indexDocument = new JSDOM(
fs.readFileSync(path.join('.', 'src', 'docs', 'templates', 'index.html'), 'utf8')
).window.document;
const shell = this.shellDocument;
shell.getElementById('outerContainer').outerHTML =
indexDocument.documentElement.getElementsByTagName('main')[0].innerHTML;
const script = shell.createElement('script');
script.type = 'module';
script.innerHTML =
'import \'https://cdn.jsdelivr.net/npm/@pwabuilder/pwaupdate\';';
shell.getElementsByTagName('head')[0].appendChild(script);
const el = shell.createElement('pwa-update');
shell.body.appendChild(el);
const completeHtml = this.createRootHtml(shell.documentElement.innerHTML);
this.writeFileAndEnsurePathExists(path.join('.', 'docs', 'index.html'), completeHtml);
dropCss({
css: this.css,
html: completeHtml
}).sels.forEach((sel) => this.cssWhitelist.add(sel));
}
update404() {
const indexDocument = new JSDOM(
fs.readFileSync(path.join('.', 'src', 'docs', 'templates', '404.html'), 'utf8')
).window.document;
const shell = this.shellDocument;
shell.getElementById('outerContainer').innerHTML =
indexDocument.documentElement.innerHTML;
const completeHtml = this.createRootHtml(shell.documentElement.innerHTML);
this.writeFileAndEnsurePathExists(
path.join('.', 'docs', '404.html'),
this.createRootHtml(shell.documentElement.innerHTML)
);
dropCss({
css: this.css,
html: completeHtml
}).sels.forEach((sel) => this.cssWhitelist.add(sel));
}
updateSiteMap() {
this.siteMap = `<urlset xmlns='https://www.sitemaps.org/schemas/sitemap/0.9'>
<url>
<loc>${siteConfig.root}</loc>
<lastmod>${new Date().toISOString()}</lastmod>
<priority>1.00</priority>
</url>
${this.siteMap}
</urlset>`;
this.writeFileAndEnsurePathExists(path.join('.', 'docs', 'sitemap.xml'), this.siteMap);
}
updateCss() {
this.prepareCss();
const gatherCss = (fullPath) => {
const postDocument = new JSDOM(fs.readFileSync(fullPath, 'utf8')).window
.document;
dropCss({
css: this.css,
html: postDocument.documentElement.innerHTML
}).sels.forEach((sel) => this.cssWhitelist.add(sel));
};
this.directoryWalk(rootDirectory)
.map((x) => x.fullPath)
.forEach(gatherCss);
fs.readdirSync(path.join('.', 'src', 'docs', 'templates'))
.filter((file) => path.extname(file).toLowerCase() === '.html')
.map((file) => path.join('.', 'src', 'docs', 'templates', file))
.forEach(gatherCss);
this.cleanCss();
}
cleanCss() {
let cleaned = dropCss({
html: '',
css: this.css,
shouldDrop: (sel) => !this.cssWhitelist.has(sel)
});
this.writeFileAndEnsurePathExists(
path.join('.', 'docs', 'css', 'styles.min.css'),
//new cleanCSS().minify(cleaned.css).styles
this.css
);
}
async minifyJs() {
const loopDocument = new JSDOM(this.postLoopTemplate).window.document;
const getJs = () => {
let output = '';
const files = fs
.readdirSync('./src/docs/js')
.filter(
(file) =>
path.extname(file).toLowerCase() === '.js' &&
!file.includes('.min.')
);
files.forEach((file) => {
output += fs.readFileSync(`./src/docs/js/${file}`, 'utf8') + '\r\n';
});
output += '//Popper\r\n';
//bundle popper
output +=
fs.readFileSync(
`./node_modules/@popperjs/core/dist/umd/popper.js`,
'utf8'
) + '\r\n';
//bundle bootstrap
output +=
fs.readFileSync(
`./node_modules/bootstrap/dist/js/bootstrap.js`,
'utf8'
) + '\r\n';
return output;
};
const js = getJs().replace(
'[POSTLOOP]',
loopDocument.getElementsByTagName('body')[0].innerHTML
);
const uglified = await minify(js);
this.writeFileAndEnsurePathExists('./docs/js/bundle.js', js);
this.writeFileAndEnsurePathExists('./docs/js/bundle.min.js', uglified.code);
}
setInnerHtml(element, value) {
if (!element) return;
element.innerHTML = value;
}
updateDist() {
this.copyDirectory(path.join('.', 'dist', 'js'), path.join('.', siteConfig.output, 'js'));
this.copyDirectory(path.join('.', 'dist', 'css'), path.join('.', siteConfig.output, 'css'));
this.copyDirectory(path.join('.', 'dist', 'plugins'), path.join('.', siteConfig.output, 'js', 'plugins'));
this.copyDirectory(path.join('.', 'dist', 'locales'), path.join('.', siteConfig.output, 'js', 'locales'));
}
/**
* This is to copy files that don't belong to another process like images
* and unthemed paged
*/
copyAssets() {
[
{
source: './src/docs/assets/no-styles.html',
destination: './docs/6/examples/no-styles.html'
},
{
source: './src/docs/assets/repl-data.json',
destination: './docs/6/repl-data.json'
},
{
source: './src/docs/assets/site.webmanifest',
destination: './docs/site.webmanifest'
},
{
source: './src/docs/assets/carbon.css',
destination: './docs/css/carbon.css'
}
].forEach((file) => {
if (!fs.existsSync(file.source)) return;
fs.mkdirSync(path.dirname(file.destination), { recursive: true });
fs.copyFileSync(file.source, file.destination);
});
fs.mkdirSync('./docs/6/images', { recursive: true });
this.directoryWalk('./src/docs/assets', '.png').forEach(
(fileInformation) => {
fs.copyFileSync(
fileInformation.fullPath,
`./docs/6/images/${fileInformation.file}`
);
}
);
}
async watcher() {
const parvusServer = new ParvusServer({
port: 3001,
directory: `./docs`,
middlewares: []
});
const watcher = chokidar.watch(
[
path.join('src', 'docs', 'partials'),
path.join('src', 'docs', 'styles'),
path.join('src', 'docs', 'templates'),
path.join('src', 'docs', 'js'),
path.join('src', 'docs', 'assets'),
'dist/'
],
{
ignored: /(^|[\/\\])\../, // ignore dotfiles
//ignored: /(^|[\/\\])\..|make\.js|browser-sync-config\.js/g, // ignore dotfiles
ignoreInitial: true
}
);
let lastChange = '';
let lastChangeFile = '';
const handleChange = (event, file) => {
if (file.includes('.map.')) return;
log(`${event}: ${file}`);
try {
if (file.startsWith('dist')) {
builder.updateDist();
}
if (file.startsWith(path.join('src', 'docs', 'assets'))) {
builder.copyAssets();
}
if (file.startsWith(path.join('src', 'docs', 'partials'))) {
//reading the file stats seems to trigger this twice, so if the same file changed in less then a second, ignore
if (
lastChange === formatter.format(new Date()) &&
lastChangeFile === file
) {
log(`Skipping duplicate trigger`);
return;
}
builder.updatePages();
}
if (file.startsWith(path.join('src', 'docs', 'styles'))) {
builder.updateCss();
}
if (file.startsWith(path.join('src', 'docs', 'templates'))) {
builder.updateAll();
}
if (file.startsWith(path.join('src', 'docs', 'js'))) {
builder.minifyJs().then();
}
log('Update successful');
cleanTimer(() => {
parvusServer.refreshBrowser();
});
lastChange = formatter.format(new Date());
lastChangeFile = file;
console.log('');
} catch (e) {
log('Something went wrong');
console.log(e);
console.log('');
}
};
const cleanTimer = (callback, delay = 1000) => {
let timer = setTimeout(() => {
callback();
clearTimeout(timer);
}, delay);
};
watcher
.on('all', handleChange)
.on('ready', () => {
console.log('[Make] Watching files...');
});
console.clear();
await parvusServer.startAsync();
}
}
const formatter = new Intl.DateTimeFormat(undefined, {
year: 'numeric',
month: 'long',
day: 'numeric',
hour: 'numeric',
minute: 'numeric',
second: 'numeric'
});
const log = (message) => {
console.log(`[Make: ${formatter.format(new Date())}] ${message}`);
};
/**
* Site configuration
* @type {object}
* @property {string} root - Base url for the site.
* @property {string} output - Where the built partials will go.
*/
const siteConfig = JSON.parse(
fs.readFileSync(`./src/docs/site-config.json`, 'utf8')
);
log('Building...');
const builder = new Build();
builder.startAsync().then();
================================================
FILE: src/docs/partials/change-log-archive.html
================================================
<div id="page-body">
<div class='row'>
<h2>Beta9</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed jQuery provider. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2547'>#2547</a></li>
<li>Adds options for theme to fix <a href='https://github.com/Eonasdan/tempus-dominus/issues/2522'>#2522</a>. Big thanks to @matholum.</li>
<li>Fixed date view next/back button disabling when it shouldn't. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2595'>#2595</a></li>
<li>Fixed component disabling issue <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2502'>#2502</a></li>
<li>Changed default useTwentyfourHour to undefined. Now using DateTime.parts() to check if the view date has a "dayPeriod" property <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2510'>#2510</a></li>
<li>Fixed 24-hour 24/0 formatting
<a href='https://github.com/Eonasdan/tempus-dominus/issues/2563'>#2563</a>
</li>
<li>Fixed none latin number selection in the minute picker
<a href='https://github.com/Eonasdan/tempus-dominus/issues/2576'>#2576</a>
</li>
<li>Fixed input value to view date object reference
<a href='https://github.com/Eonasdan/tempus-dominus/issues/2568'>#2568</a>
</li>
</ul>
<h3>New</h3>
<ul>
<li>Add fr locale via #2581</li>
<li>Updated and published NuGet package.</li>
</ul>
<h3>Breaking changes</h3>
<ul>
<li>Renamed /src/sass to /src/scss to more accurately reflect code.</li>
</ul>
<h2>Beta8</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed view mode. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2583'>#2583</a></li>
<li>Fixed and simplified options merging <a href='https://github.com/Eonasdan/tempus-dominus/issues/2578'>#2578</a></li>
</ul>
<h2>Beta7</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed options mutable. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2487'>#2487</a></li>
<li>Fixed element toggle when input is disabled <a href='https://github.com/Eonasdan/tempus-dominus/issues/2495'>#2495</a></li>
<li>Fixed jQuery no conflict <a href='https://github.com/Eonasdan/tempus-dominus/issues/2506'>#2506</a></li>
<li>Fixed options update <a href='https://github.com/Eonasdan/tempus-dominus/issues/2549'>#2549</a></li>
</ul>
<h3>New</h3>
<ul>
<li>Added a new example for setting and getting dates.</li>
</ul>
<h2>Beta6</h2>
<h3>Bug Fixes</h3>
<ul>
<li>viewMode is optional <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2550'>#2550</a></li>
</ul>
<h3>New</h3>
<ul>
<li>Introduced a simple overridable function parseInput <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2552'>#2552</a></li>
</ul>
<h2>6-beta5</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed clear() doesn't erase text of date. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2472'>#2472</a></li>
<li>Fixed clear button event cycle. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2516'>#2516</a></li>
<li>Fixed 2 digit formatting. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2516'>#2513</a></li>
<li>Trigger native change event on input when available - fixes #2401 <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2533'>via #2533</a></li>
<li>Fixes use of SVG icons (issue #2527) <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2533'>via #2529</a></li>
</ul>
<h2>Version 6-beta4</h2>
<h3>New</h3>
<ul>
<li>Dark mode! The picker now has dark mode when the user's preference is dark.</li>
<li>Wrote a tiny service locator/di container in an effort to make plugins better</li>
<li>Added a momentjs plugin</li>
<li>Added DE, ES, IT, NL, RO locales thanks to @jcompagner <a
href='https://github.com/Eonasdan/tempus-dominus/pull/2484'>via #2484</a>.
</li>
<li><code>toggleMeridiem</code> supports a comma separated list. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2399'>#2399.</a>
</li>
<li>
All event types now provide <code>viewMode</code> which provides
'clock' | 'calendar' | 'months' | 'years' | 'decades' depending what view
the event occurred.
<a
href='https://github.com/Eonasdan/tempus-dominus/issues/2428'>#2428.</a>
</li>
</ul>
<h3>Breaking changes</h3>
<ul>
<li>Plugins work a little differently now. Hopefully they are a bit cleaner to work with now</li>
<li>Hooks have been removed. Plugins are a better way to handle this. You can look at the momentjs plugin for a
guide.
</li>
<li>Locale loading and authoring has changed a bit as well.</li>
<li><code>ViewUpdateEvent</code> no longer provides <code>change: Unit</code>.</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Fixed event 'hide.td' not triggered when input is empty. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2424'>#2424.</a>
</li>
<li>Fixed input change event trigger. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2401'>#2401.</a>
</li>
<li>Fixed dataset deletion issue. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2483'>#2483.</a>
</li>
<li>Fixed month manipulation issue <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2474'>#2474.</a> <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2486'>2486.</a>
</li>
<li>Fixed Wrong calendar rendering when startOfTheWeek <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2473'>#2473.</a>
</li>
<li>Fixed viewMode option not respected (#2466) thanks @jmolinap <a
href='https://github.com/Eonasdan/tempus-dominus/pull/2494'>via #2494.</a>
</li>
</ul>
<h2>Version 6-beta3</h2>
<h3>New</h3>
<ul>
<li>Allow to change parent container for the widget <a
href='https://github.com/Eonasdan/tempus-dominus/pull/2462'>via #2462</a>.
</li>
<li>Moved docs to gh-pages and set up a GitHub action to move compiled docs to that branch.</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Issue with time picker only & fixing range example <a
href='https://github.com/Eonasdan/tempus-dominus/pull/2463'>via #2463.</a>
</li>
<li>Fixed issue with reading the data- attributes. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2430'>#2430</a>
</li>
<li>Fixed start of the week option having the incorrect heading. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2414'>#2443</a>
</li>
</ul>
<h2>Version 6-alpha17</h2>
<h3>Bug fixes</h3>
<ul>
<li>Fixed issue with calendar weeks. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2441'>#2441</a>
</li>
</ul>
<h2>Version 6-alpha16</h2>
<h3>New</h3>
<ul>
<li>Started building html migration tool</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Fixed issue with daysOfWeekDisabled. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2419'>#2419</a>
</li>
<li>Fixed issue with reading the data- attributes. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2430'>#2430</a>
</li>
<li>Fixed start of the week option having the incorrect heading. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2414'>#2443</a>
</li>
</ul>
<h2>Version 6-alpha15</h2>
<h3>New</h3>
<ul>
<li>Added <code>localization.startOfTheWeek</code>. This allows setting the start of the week.</li>
<li>Added <code>numberingSystem</code> to <code>DateTimeFormatOptions</code></li>
<li>Added <code>meta</code> property to options.</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Fixed issue with 24 hour display formatting. <a href='https://github.com/Eonasdan/tempus-dominus/issues/2414'>#2414</a>
</li>
<li>Fixed default input change formatting function to check for empty dates. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2411'>#2411</a>
</li>
<li>Fixed an issue with the unsubscribe method typing. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2411'>#2411</a>
</li>
<li>Fixed an issue where the picker would try to update the clock view even it wasn't enabled. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2438'>#2438</a>
</li>
<li>Fixed an issue using a time component would not go back to the clock view. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2431'>#2431</a>
</li>
<li>The picker will return to the view date and show the calendar or clock after being reopened. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2410'>#2410</a>
</li>
<li>Fixed clock/calendar switching to wait until the other view is ready before switching. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2421'>#2421</a>
</li>
<li>Fixed the options interface so all properties are optionsal. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2439'>#2439</a>
</li>
<li><span class='badge bg-danger'>BREAKING</span> <code>localization.dayViewHeaderFormat</code> no longer takes a
string but instead accepts a <code>DateTimeFormatOptions</code>. This will allow for more customization. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2420'>#2420</a>
</li>
</ul>
</div>
<div class='row'>
<h2>Version 6-alpha14</h2>
<h3>New</h3>
<ul>
<li>Cleaned up css a bit. Got rid of the popper arrow and aligned the picker to the start of the element.</li>
<li><span class='badge bg-danger'>BREAKING</span> <code>display.inputFormat</code> now takes a function, not an
Intl format. It has also been moved to <code>hooks.inputFormat</code> By default a function will be executed
that uses Intl to format the selected date(s) based on the selected components.
</li>
<li>Added <code>hooks.inputParse</code></li>
<li>Merged number localization Thanks @hkvstore <a href='https://github.com/Eonasdan/tempus-dominus/issues/2408'>#2408</a>
</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Merged a fix for parsing issue from comparing constructor names. Thanks @faatihi <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2408'>#2408</a></li>
<li>Fixed doc issue</li>
<li>Fixed input value for real this time. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2387'>#2387</a></li>
<li>Fixed <code>keepOpen</code></li>
<li>Fixed widget positioning with rtl <a href='https://github.com/Eonasdan/tempus-dominus/issues/2400'>#2400</a>
</li>
</ul>
</div>
<div class='row'>
<h2>Version 6-alpha1.0.13</h2>
<h3>New</h3>
<ul>
<li>Created a new method <code>set(value: any, index?: number, from: string = 'date.set')</code> that tries to
conver the <code>value</code> provided and then tries to set that value to the <code>index</code> (or 0 if not
using multidate).
</li>
<li>Added esm output</li>
<li>Exposed <code>Unit</code> and <code>DateTimeFormatOptions</code> from the DateTime class.</li>
<li>Renamed <code>togglePeriod</code> to <code>toggleMeridiem</code></li>
<li>Added <code>toggleMeridiem</code> class to AM/PM button</li>
<li>Cleaned up css a bit. Got rid of the popper arrow and aligned the picker to the start of the element.</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Fixed dealing with input values/changes.</li>
<li>Fixed issue when calling hide if the widget hasn't been built (or shown) yet.</li>
<li>Fixed meridiem issue. Thanks @hkvstore <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2398'>#2398</a></li>
<li>Merged PR 2396 to fix 24 hour hour selection. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2395'>#2395</a></li>
<li>Fixed issue with time component grid. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2395'>#2395</a></li>
</ul>
</div>
<div class='row'>
<h2>Version 6-alpha1.0.4</h2>
<h3>Bug fixes</h3>
<ul>
<li>Fixed issue with meridiem (AM/PM) button clicks.</li>
</ul>
</div>
<div class='row'>
<h2>Version 6-alpha1.0.3</h2>
<h3>Bug fixes</h3>
<ul>
<li>Fixed year display after selecting a decade. <a href='https://github.com/Eonasdan/tempus-dominus/issues/2386'>#2386</a>
</li>
<li>Fixed issue if the input field had a value. <a href='https://github.com/Eonasdan/tempus-dominus/issues/2387'>#2387</a>
</li>
<li>Fixed setting the defaultDate option with a Date object. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2391'>#2391</a></li>
</ul>
</div>
<div class='row'>
<h2>Version 6-alpha1</h2>
<h3 id='general'>General</h3>
<ul>
<li>picker returns a <code>DateTime</code> which is an extended javascript <code>Date</code> object.</li>
<li>picker no longer uses jQuery, momentjs, or bootstrap</li>
<li>events now have interfaces</li>
</ul>
<h3 id='configuration'>Configuration</h3>
<ul>
<li>renamed <code>tooltip</code> to <code>localization</code>
<ul>
<li>renamed <code>tooltip.prevMonth</code> to <code>localization.previousMonth</code></li>
<li>renamed <code>tooltip.prevYear</code> to <code>localization.previousYear</code></li>
<li>renamed <code>tooltip.prevDecade</code> to <code>localization.previousDecade</code></li>
<li>renamed <code>tooltip.prevCentury</code> to <code>localization.previousCentury</code></li>
<li>moved <code>dayViewHeaderFormat</code> to <code>localization.dayViewHeaderFormat</code></li>
<li><code>dayViewHeaderFormat</code> now takes a javascript <code>intl</code> month option, e.g.
<code>long</code> (default)
</li>
</ul>
</li>
<li>moved <code>locale</code> to <code>localization</code>
</li>
<li>removed <code>useStrict</code></li>
<li>removed <code>timeZone</code></li>
<li>removed <code>format</code>
<ul>
<li>added <code>display.inputFormat</code> that takes <code>DateTimeFormatOptions</code>;</li>
</ul>
</li>
<li>removed <code>collapse</code></li>
<li>removed <code>extraFormats</code></li>
<li>removed <code>widgetParent</code></li>
<li>removed <code>widgetPositioning</code></li>
<li>changed <code>viewMode</code> from <code>'times' | 'days'</code> to <code>'clock' |
'calendar'</code></li>
<li>renamed <code>allowMultidate</code> and <code>multidateSeparator</code> to <code>multipleDates</code> and
<code>multipleDatesSeparator</code>
</li>
<li>moved the following to <code>restrictions</code>
<ul>
<li>minDate</li>
<li>maxDate</li>
<li>disabledDates</li>
<li>enabledDates</li>
<li>daysOfWeekDisabled</li>
<li>disabledHours</li>
<li>enabledHours</li>
<li>readonly</li>
<li>disabledTimeIntervals</li>
</ul>
</li>
<li>moved the following to <code>display</code>
<ul>
<li>sideBySide</li>
<li>calendarWeeks</li>
<li>viewMode</li>
<li>toolbarPlacement</li>
<li>buttons</li>
<li>widgetPositioning</li>
<li>icons</li>
<li>inline</li>
<li>keepOpen</li>
</ul>
</li>
<li>disabledTimeIntervals is now an array of <code>{ from: DateTime, to: DateTime }</code>
</li>
<li>removed check for <code>dateOptions</code> on the element data set. jQuery hid allowing an object by looping
through the properties
</li>
<li>removed <code>keybindings</code> - this might come back later</li>
<li>removed <code>readonly<</code></li>
<li>removed <code>ignoreReadonly<</code></li>
<li>removed <code>focusOnShow<</code></li>
</ul>
<h4 id='styles'>Styles</h4>
<h5 id='tip-all-new-css-values-are-in-namespace-css-in-the-consts-ts-file'>Tip: All new css values are in <code>Namespace.Css.*</code>
in the <code>consts.ts</code> file</h5>
<ul>
<li>renamed <code>bootstrap-datetimepicker-widget</code> to <code>tempus-dominus-widget</code></li>
<li>renamed <code>tempusDominus-bootstrap-datetimepicker-widget-with-calendar-weeks</code> to <code>tempus-dominus-with-calendar-weeks</code>
(
v5)
<ul>
<li>removed <code>.input-group [data-toggle="datetimepicker"]</code> setting the cursor type to
pointer.
</li>
</ul>
</li>
</ul>
<h6 id='date'>Date</h6>
<ul>
<li>renamed <code>datepicker</code> to <code>date-container</code></li>
<li>renamed <code>datepicker-decades</code> to <code>date-container-decades</code></li>
<li>renamed <code>datepicker-years</code> to <code>date-container-years</code></li>
<li>renamed <code>datepicker-months</code> to <code>date-container-months</code></li>
<li>renamed <code>datepicker-days</code> to <code>date-container-days</code></li>
<li>renamed <code>prev</code> to <code>previous</code></li>
<li>renamed <code>data-day</code> to <code>data-value</code> to be consistent with other views</li>
</ul>
<h6 id='time'>Time</h6>
<ul>
<li>renamed <code>usetwentyfour</code> to <code>useTwentyfour</code></li>
<li>renamed <code>timepicker</code> to <code>time-container</code></li>
<li>renamed <code>timepicker-hour</code> to <code>time-container-hour</code></li>
<li>renamed <code>timepicker-minute</code> to <code>time-container-minute</code></li>
<li>renamed <code>timepicker-second</code> to <code>time-container-second</code></li>
</ul>
<h5 id='saas'>Saas</h5>
<p>Saas file is now called <code>tempus-dominus.scss</code>. The "build" file has been deleted as it's
no longer required.</p>
<h3 id='events'>Events</h3>
<ul>
<li>changed <code>isInvalid</code> to <code>isValid</code> and flipped the boolean (v5)</li>
<li>changed event now emits <code>undefined</code> instead of false when the date is being cleared</li>
<li>changed plugin.name from <code>datetimepicker</code> to <code>tempus-dominus</code></li>
<li>changed root data namespace from <code>datetimepicker</code> to <code>td</code></li>
</ul>
</div>
<div class='row'>
<h1>
Version 5
</h1>
<p>
Version 5 was a rewrite of v4 taking some pending pull requests and fixes along with it. Unfortunately, I didn't
do a very good job at documenting those changes.
</p>
</div>
<div class='row'>
<h1>
Version 4
</h1>
<p>
The chang log from v2-v4 can be <a href='https://getdatepicker.com/4/ChangeLog/'>read here</a>.
</p>
</div>
</div>
<div id="page-meta">
<div id="title">Change Log Archive</div>
<div id="post-date">07/20/2021</div>
<div id="update-date">07/20/2021</div>
<div id="excerpt">An archive of changes between different version of tempus dominus.</div>
<div id="tags">datepicker, javascript, open source, tempus dominus, eonasdan</div>
</div>
================================================
FILE: src/docs/partials/change-log.html
================================================
<div id="page-body">
<div id='change-log'>
<h1>Version 6</h1>
<div class='row'>
<h2>6.9.4</h2>
<h3>New</h3>
<ul>
<li>SCSS now provides <code>root</code> css variables #2857</li>
<li>Custom date format parsing errors are now caught and provided through the event system. #2793</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Fixed #2886</li>
<li>Fixed #2884</li>
<li>Fixed #2881</li>
<li>Fixed #2879</li>
<li>Fixed #2877 </li>
</ul>
</div>
<div class='row'>
<h2>6.7.19</h2>
<h3>New</h3>
<ul>
<li>Added <code>maxWeekdayLength</code>. This option will truncate the day of the week header.</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Fixed #2871</li>
<li>Fixed #2860</li>
<li>Fixed #2817</li>
</ul>
</div>
<div class='row'>
<h2>6.7.16</h2>
<h3>Bug fixes</h3>
<ul>
<li>Reverted #2811</li>
<li>Fixed #2850</li>
<li>Fixed #2855</li>
</ul>
</div>
<div class='row'>
<h2>6.7.13</h2>
<h3>Bug fixes</h3>
<ul>
<li>Selecting any date element now updates the selected date. #2811</li>
<li>Hotfix for #2846</li>
</ul>
</div>
<div class='row'>
<h2>6.7.11</h2>
<h3>Bug fixes</h3>
<ul>
<li>Hotfix for #2837</li>
</ul>
</div>
<div class='row'>
<h2>6.7.10</h2>
<h3>New</h3>
<ul>
<li>Lots more test coverage #2791</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Hopefully fixed update options bounce. #2621</li>
<li>Fixed input toggle #2575</li>
<li>Fixed docs #2810</li>
</ul>
</div>
<div class='row'>
<h2>6.7.7</h2>
<h3>New</h3>
<ul>
<li>Lots more test coverage #2791</li>
<li>Placement option #2789</li>
<li>Exported default en-US locale #2687</li>
<li>When <code>userCurrent</code> is false the clock will now display <code>--</code> instead. #2764</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Fixed some issues with the date range #2788, #2798</li>
<li>Fixed calendarWeeks bug #2786</li>
<li>Fixed REPL issues #2795 #2784</li>
<li>Fixed multiple dates option not showing "active" state #2796</li>
</ul>
</div>
<div class='row'>
<h2>6.4.4</h2>
<h3>Bug fixes</h3>
<ul>
<li>Fixed an issue with the date formatting</li>
<li>Fixed format escape brackets</li>
<li>Fixes setting a date to null #2774</li>
</ul>
</div>
<div class='row'>
<h2>6.4.1</h2>
<h3>New</h3>
<ul>
<li>Migrated custom date format to main code #2734</li>
<li>Added Date Range functionality #2707</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Leading delimiter added when multipleDates #2766</li>
</ul>
</div>
<div class='row'>
<h2>6.2.10</h2>
<h3>Bug fixes</h3>
<ul>
<li>Can't change time & meridiem #2746</li>
<li>Fixed regression with #2600</li>
</ul>
</div>
<div class='row'>
<h2>6.2.9</h2>
<h3>Bug fixes</h3>
<ul>
<li>Fixed CustomDateFormat Plugin: Hours always undefined #2742</li>
</ul>
</div>
<div class='row'>
<h2>6.2.8</h2>
<h3>Bug fixes</h3>
<ul>
<li>Fixed error when using clear button on time component #2720</li>
<li>Fixed issue with promptTimeOnDateChange option #2630</li>
<li>Fixed useTwentyfourHour hour-range is 01 - 24, should be 00 - 23 #2600</li>
<li>Moved back @popperjs/core to peerDependencies and made it optional #2672</li>
</ul>
<h3>New</h3>
<ul>
<li>Pre commit hooks. Linter and prettier are now run before each commit. #2715</li>
<li>Locales and plugins now have typings included. #2719</li>
</ul>
</div>
<div class='row'>
<h2>6.2.7</h2>
<h3>Bug fixes</h3>
<ul>
<li>Fixed customDateFormat shows 'undefined' when you manually erase the date #2693</li>
<li>Fixed calendar header not updating correctly #2685</li>
<li>Fixed clock components disappearing when using side by side #2684</li>
<li>Fixed some doc issues #2706</li>
</ul>
<h3>New</h3>
<ul>
<li>Unit tests! #2711</li>
</ul>
</div>
<div class='row'>
<h2>6.2.6</h2>
<h3>Bug fixes</h3>
<ul>
<li>Fixed disabled/enabled dates performance issue. This also should fix the next/previous month selection
#2658
</li>
<li>Fixed view date syncing across options and not updating correctly #2611</li>
</ul>
</div>
<div class='row'>
<h2>6.2.5</h2>
<h3>New</h3>
<ul>
<li>Added Polish localization #2673
</li>
<li>Updated locales to include formats</li>
<li>Export (re-export?) Options interface</li>
</ul>
</div>
<div class='row'>
<h2>6.2.4</h2>
<h3>Bug fixes</h3>
<ul>
<li>Fix misspelling #2667</li>
<li>Fix issue with customFormatPlugin</li>
</ul>
</div>
<div class='row'>
<h2>6.2.3</h2>
<h3>Bug fixes</h3>
<ul>
<li>Fix popper reference</li>
</ul>
</div>
<div class='row'>
<h2>6.2.1</h2>
<h3>New</h3>
<ul>
<li>Added custom date format plugin docs.
</li>
<li>It is now possible to replace popperjs with another positioning system via <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2643'>#2643</a>.
</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Imports should work again. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2652'>#2652</a>
</li>
<li>Fixes for FR, FI, and IT locales. <a
href='https://github.com/Eonasdan/tempus-dominus/issues/2650'>#2650</a>
</li>
</ul>
</div>
<div class='row'>
<h2>6.0.1</h2>
<h3>New</h3>
<ul>
<li>Added a customDateFormat plugin and new options to allow custom formats to be provided for input
parsing/setting
</li>
<li>Replaced examples page with REPL</li>
<li>Lots of doc clean up</li>
</ul>
</div>
<div class='row'>
<h2>Older History</h2>
<p>
For older history, please see the <a href='change-log-archive.html'>archived change log</a>.
</p>
</div>
</div>
</div>
<div id="page-meta">
<div id="title">Change Log</div>
<div id="post-date">07/20/2021</div>
<div id="update-date">07/20/2021</div>
<div id="excerpt">An overview of changes between different version of tempus dominus</div>
<div id="tags">datepicker, javascript, open source, tempus dominus, eonasdan</div>
</div>
================================================
FILE: src/docs/partials/datetime.html
================================================
<div id="page-body">
<p>
In v6 I dropped moment as a required library since it is no longer recommended. Almost all the functions in the
picker make use of my custom DateTime class which extends the native Date object.
</p>
<p>
Because I am simply extending the native date object, any returned values will still behave like a date object.
Which means you don't need to adopt using DateTime in your project unless you want to. Once less library to worry about!
</p>
</div>
<div id="page-meta">
<div id="title">DateTime</div>
<div id="post-date">07/08/2021</div>
<div id="update-date">07/08/2021</div>
<div id="excerpt">Custom date extension object</div>
<div id="tags">datepicker, javascript, open source, tempus dominus, eonasdan</div>
</div>
================================================
FILE: src/docs/partials/examples/index.html
================================================
<div id="page-body">
<meta http-equiv="refresh" content="0; URL=https://getdatepicker.com/6/repl.html">
<link rel="canonical" href="https://getdatepicker.com/6/repl.html">
All the examples have been migrated to the REPL page!
Redirecting to <a href="https://getdatepicker.com/6/repl.html">https://getdatepicker.com/6/repl.html</a>
<!-- <div class='row'>-->
<!-- <p>-->
<!-- Version 6 removes the need for an input field, Bootstrap, jQuery and MomemntJs.-->
<!-- Each example comes code section that can be toggled by clicking on <i class='fa-solid fa-code'-->
<!-- aria-hidden='true'></i>.-->
<!-- </p>-->
<!-- <p>-->
<!-- If you still need jQuery, check out the <a href='jquery.html'>jQuery examples</a>.-->
<!-- </p>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='minimum-setup'>Minimum Setup <a class='anchor-link ' aria-label='Anchor' href='#minimum-setup'><i-->
<!-- class='fa-solid fa-anchor' aria-hidden='true'></i></a> <small class='show-code' title='View Code'><i-->
<!-- class='fa-solid fa-code' aria-hidden='true'></i></small></h3>-->
<!-- <p>-->
<!-- All you need is an element to attach the picker to.-->
<!-- </p>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='icon-onlyHtml-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#icon-onlyHtml' type='button'-->
<!-- role='tab' aria-controls='icon-onlyHtml' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='icon-onlyJs-tab' data-bs-toggle='tab' data-bs-target='#icon-onlyJs'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='icon-onlyJs' aria-selected='false'>Javascript-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='icon-onlyLog-tab' data-bs-toggle='tab' data-bs-target='#icon-onlyLog'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='icon-onlyLog' aria-selected='false'>Events-->
<!-- </button>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class='tab-content'>-->
<!-- <div class='tab-pane fade show active' id='icon-onlyHtml' role='tabpanel'-->
<!-- aria-labelledby='icon-onlyHtml-tab'>-->
<!-- <pre>-->
<!-- <code class='language-html'>-->
<!-- <span-->
<!-- id='icon-only'-->
<!-- class='log-event'-->
<!-- style='display: inline-block'-->
<!-- >-->
<!-- <i class='fa-solid fa-calendar fa-9x'></i>-->
<!-- </span>-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade' id='icon-onlyJs' role='tabpanel' aria-labelledby='icon-onlyJs-tab'>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('icon-only'));-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade logger' id='icon-onlyLog' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker1Log-tab'>-->
<!-- <div class='alert alert-info'>-->
<!-- Events will display as you manipulate the picker.-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='container'>-->
<!-- <div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <span-->
<!-- id='icon-only'-->
<!-- class='log-event'-->
<!-- style='display: inline-block'-->
<!-- >-->
<!-- <i class='fa-solid fa-calendar fa-6x' aria-hidden='true'></i>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type='text/javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('icon-only'));-->
<!-- </script>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='simple-setup'>Simple Setup-->
<!-- <a class='anchor-link ' aria-label='Anchor' href='#simple-setup'>-->
<!-- <i class='fa-solid fa-anchor' aria-hidden='true'></i></a>-->
<!-- <small class='show-code' title='View Code'><i class='fa-solid fa-code' aria-hidden='true'></i></small>-->
<!-- <a aria-label='stackblitz' href='https://stackblitz.com/edit/tempus-dominus-v6-simple-setup'-->
<!-- title='Stackblitz example'>-->
<!-- <i class='fa-solid fa-bolt' aria-hidden='true'></i></a>-->
<!-- </h3>-->
<!-- <p>-->
<!-- This is the simplest setup you can have with Bootstrap and Font Awesome 5. The picker defaults to FA 5 Solid-->
<!-- icons, however you can overwrite the defaults globally.-->
<!-- </p>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='datetimepicker1Html-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#datetimepicker1Html' type='button'-->
<!-- role='tab' aria-controls='datetimepicker1Html' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='datetimepicker1Js-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#datetimepicker1Js'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='datetimepicker1Js' aria-selected='false'>Javascript-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='datetimepicker1Log-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#datetimepicker1Log'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='datetimepicker1Log' aria-selected='false'>Events-->
<!-- </button>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class='tab-content'>-->
<!-- <div class='tab-pane fade show active' id='datetimepicker1Html' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker1Html-tab'>-->
<!-- <pre>-->
<!-- <code class='language-html'>-->
<!-- <div-->
<!-- class='input-group'-->
<!-- id='datetimepicker1'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='datetimepicker1Input'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#datetimepicker1'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#datetimepicker1'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade' id='datetimepicker1Js' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker1Js-tab'>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'));-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade logger' id='datetimepicker1Log' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker1Log-tab'>-->
<!-- <div class='alert alert-info'>-->
<!-- Events will display as you manipulate the picker.-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='container'>-->
<!-- <div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='datetimepicker1Input' class='form-label'>Simple picker</label>-->
<!-- <div-->
<!-- class='input-group log-event'-->
<!-- id='datetimepicker1'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='datetimepicker1Input'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#datetimepicker1'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#datetimepicker1'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type='text/javascript'>-->
<!-- const datetimepicker1 = new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'));-->
<!-- </script>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='side-by-side'>Side-by-Side-->
<!-- <a class='anchor-link ' aria-label='Anchor' href='#side-by-side'>-->
<!-- <i class='fa-solid fa-anchor' aria-hidden='true'></i></a>-->
<!-- <small class='show-code' title='View Code'><i class='fa-solid fa-code' aria-hidden='true'></i></small>-->
<!-- </h3>-->
<!-- <p>-->
<!-- This demonstrates the side-by-side option.-->
<!-- </p>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='pickerSideBySideHtml-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#pickerSideBySideHtml' type='button'-->
<!-- role='tab' aria-controls='pickerSideBySideHtml' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='pickerSideBySideJs-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#pickerSideBySideJs'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='pickerSideBySideJs' aria-selected='false'>Javascript-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='pickerSideBySideLog-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#pickerSideBySideLog'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='pickerSideBySideLog' aria-selected='false'>Events-->
<!-- </button>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class='tab-content'>-->
<!-- <div class='tab-pane fade show active' id='pickerSideBySideHtml' role='tabpanel'-->
<!-- aria-labelledby='pickerSideBySideHtml-tab'>-->
<!-- <pre>-->
<!-- <code class='language-html'>-->
<!-- <div-->
<!-- class='input-group'-->
<!-- id='pickerSideBySide'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='pickerSideBySideInput'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#pickerSideBySide'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#pickerSideBySide'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade' id='pickerSideBySideJs' role='tabpanel'-->
<!-- aria-labelledby='pickerSideBySideJs-tab'>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('pickerSideBySide', {-->
<!-- display: {-->
<!-- sideBySide: true-->
<!-- }-->
<!-- }));-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade logger' id='pickerSideBySideLog' role='tabpanel'-->
<!-- aria-labelledby='pickerSideBySideLog-tab'>-->
<!-- <div class='alert alert-info'>-->
<!-- Events will display as you manipulate the picker.-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='container'>-->
<!-- <div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='pickerSideBySideInput' class='form-label'>Side-by-Side picker</label>-->
<!-- <div-->
<!-- class='input-group log-event'-->
<!-- id='pickerSideBySide'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='pickerSideBySideInput'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#pickerSideBySide'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#pickerSideBySide'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type='text/javascript'>-->
<!-- const pickerSideBySide = new tempusDominus.TempusDominus(document.getElementById('pickerSideBySide'), {-->
<!-- display: {-->
<!-- sideBySide: true-->
<!-- }-->
<!-- });-->
<!-- </script>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='locales'>Using Locales <a class='anchor-link ' aria-label='Anchor' href='#locales'><i-->
<!-- class='fa-solid fa-anchor' aria-hidden='true'></i></a> <small class='show-code'><i-->
<!-- class='fa-solid fa-code' aria-hidden='true'></i></small></h3>-->
<!-- <p>-->
<!-- You can provide localization options to override the tooltips as well as the day/month display.-->
<!-- </p>-->
<!-- <p>-->
<!-- You could also set this globally via <code>tempusDominus.DefaultOptions.localization = { ... }</code> or by-->
<!-- creating a variable e.g. <code>const ru = { today:'Перейти сегодня' ... };</code> then provide the options-->
<!-- as-->
<!-- </p>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('datetimepicker2'), {-->
<!-- localization: ru-->
<!-- }-->
<!-- </code>-->
<!-- </pre>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='datetimepicker2Html-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#datetimepicker2Html' type='button'-->
<!-- role='tab' aria-controls='datetimepicker2Html' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='datetimepicker2Js-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#datetimepicker2Js'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='datetimepicker2Js' aria-selected='false'>Javascript-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='datetimepicker2Log-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#datetimepicker2Log'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='datetimepicker2Log' aria-selected='false'>Events-->
<!-- </button>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class='tab-content'>-->
<!-- <div class='tab-pane fade show active' id='datetimepicker2Html' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker2Html-tab'>-->
<!-- <pre>-->
<!-- <code class='language-html'>-->
<!-- <label for='datetimepicker2Input' class='form-label'>Russian locale</label>-->
<!-- <div-->
<!-- class='input-group log-event'-->
<!-- id='datetimepicker2'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='datetimepicker2Input'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#datetimepicker2'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#datetimepicker2'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade' id='datetimepicker2Js' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker2Js-tab'>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('datetimepicker2'), {-->
<!-- localization: {-->
<!-- today: 'Перейти сегодня',-->
<!-- clear: 'Очистить выделение',-->
<!-- close: 'Закрыть сборщик',-->
<!-- selectMonth: 'Выбрать месяц',-->
<!-- previousMonth: 'Предыдущий месяц',-->
<!-- nextMonth: 'В следующем месяце',-->
<!-- selectYear: 'Выбрать год',-->
<!-- previousYear: 'Предыдущий год',-->
<!-- nextYear: 'В следующем году',-->
<!-- selectDecade: 'Выбрать десятилетие',-->
<!-- previousDecade: 'Предыдущее десятилетие',-->
<!-- nextDecade: 'Следующее десятилетие',-->
<!-- previousCentury: 'Предыдущий век',-->
<!-- nextCentury: 'Следующий век',-->
<!-- pickHour: 'Выберите час',-->
<!-- incrementHour: 'Время увеличения',-->
<!-- decrementHour: 'Уменьшить час',-->
<!-- pickMinute: 'Выбрать минуту',-->
<!-- incrementMinute: 'Минута приращения',-->
<!-- decrementMinute: 'Уменьшить минуту',-->
<!-- pickSecond: 'Выбрать второй',-->
<!-- incrementSecond: 'Увеличение секунды',-->
<!-- decrementSecond: 'Уменьшение секунды',-->
<!-- toggleMeridiem: 'Переключить период',-->
<!-- selectTime: 'Выбрать время',-->
<!-- selectDate: 'Выбрать дату',-->
<!-- dayViewHeaderFormat: { month: 'long', year: '2-digit' },-->
<!-- locale: 'ru',-->
<!-- startOfTheWeek: 1-->
<!-- }-->
<!-- });-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade logger' id='datetimepicker2Log' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker2Log-tab'>-->
<!-- <div class='alert alert-info'>-->
<!-- Events will display as you manipulate the picker.-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='container'>-->
<!-- <div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='datetimepicker2Input' class='form-label'>Russian locale</label>-->
<!-- <div-->
<!-- class='input-group log-event'-->
<!-- id='datetimepicker2'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='datetimepicker2Input'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#datetimepicker2'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#datetimepicker2'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type='text/javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('datetimepicker2'), {-->
<!-- localization: {-->
<!-- today: 'Перейти сегодня',-->
<!-- clear: 'Очистить выделение',-->
<!-- close: 'Закрыть сборщик',-->
<!-- selectMonth: 'Выбрать месяц',-->
<!-- previousMonth: 'Предыдущий месяц',-->
<!-- nextMonth: 'В следующем месяце',-->
<!-- selectYear: 'Выбрать год',-->
<!-- previousYear: 'Предыдущий год',-->
<!-- nextYear: 'В следующем году',-->
<!-- selectDecade: 'Выбрать десятилетие',-->
<!-- previousDecade: 'Предыдущее десятилетие',-->
<!-- nextDecade: 'Следующее десятилетие',-->
<!-- previousCentury: 'Предыдущий век',-->
<!-- nextCentury: 'Следующий век',-->
<!-- pickHour: 'Выберите час',-->
<!-- incrementHour: 'Время увеличения',-->
<!-- decrementHour: 'Уменьшить час',-->
<!-- pickMinute: 'Выбрать минуту',-->
<!-- incrementMinute: 'Минута приращения',-->
<!-- decrementMinute: 'Уменьшить минуту',-->
<!-- pickSecond: 'Выбрать второй',-->
<!-- incrementSecond: 'Увеличение секунды',-->
<!-- decrementSecond: 'Уменьшение секунды',-->
<!-- toggleMeridiem: 'Переключить период',-->
<!-- selectTime: 'Выбрать время',-->
<!-- selectDate: 'Выбрать дату',-->
<!-- dayViewHeaderFormat: { month: 'long', year: '2-digit' },-->
<!-- locale: 'ru',-->
<!-- startOfTheWeek: 1-->
<!-- }-->
<!-- });-->
<!-- </script>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='time-only'>Time Only <a class='anchor-link ' aria-label='Anchor' href='#time-only'><i-->
<!-- class='fa-solid fa-anchor' aria-hidden='true'></i></a> <small class='show-code'><i-->
<!-- class='fa-solid fa-code' aria-hidden='true'></i></small></h3>-->
<!-- <p>-->
<!-- Version 6 no longer uses MomentJs so selecting the what to display is now done via the-->
<!-- <code>display.components</code>.-->
<!-- </p>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='datetimepicker3Html-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#datetimepicker3Html' type='button'-->
<!-- role='tab' aria-controls='datetimepicker3Html' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='datetimepicker3Js-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#datetimepicker3Js'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='datetimepicker3Js' aria-selected='false'>Javascript-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='datetimepicker3Log-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#datetimepicker3Log'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='datetimepicker3Log' aria-selected='false'>Events-->
<!-- </button>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class='tab-content'>-->
<!-- <div class='tab-pane fade show active' id='datetimepicker3Html' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker3Html-tab'>-->
<!-- <pre>-->
<!-- <code class='language-html'>-->
<!-- <div-->
<!-- class='input-group'-->
<!-- id='datetimepicker3'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='datetimepicker3Input'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#datetimepicker3'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#datetimepicker3'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-clock'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade' id='datetimepicker3Js' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker3Js-tab'>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('datetimepicker3'), {-->
<!-- display: {-->
<!-- viewMode: 'clock',-->
<!-- components: {-->
<!-- decades: false,-->
<!-- year: false,-->
<!-- month: false,-->
<!-- date: false,-->
<!-- hours: true,-->
<!-- minutes: true,-->
<!-- seconds: false-->
<!-- }-->
<!-- }-->
<!-- });-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade logger' id='datetimepicker3Log' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker3Log-tab'>-->
<!-- <div class='alert alert-info'>-->
<!-- Events will display as you manipulate the picker.-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='container'>-->
<!-- <div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='datetimepicker3Input' class='form-label'>Time</label>-->
<!-- <div-->
<!-- class='input-group log-event'-->
<!-- id='datetimepicker3'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='datetimepicker3Input'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#datetimepicker3'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#datetimepicker3'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-clock'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type='text/javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('datetimepicker3'), {-->
<!-- display: {-->
<!-- viewMode: 'clock',-->
<!-- components: {-->
<!-- decades: false,-->
<!-- year: false,-->
<!-- month: false,-->
<!-- date: false,-->
<!-- hours: true,-->
<!-- minutes: true,-->
<!-- seconds: false-->
<!-- }-->
<!-- }-->
<!-- });-->
<!-- </script>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='date-only'>Date Only <a class='anchor-link ' aria-label='Anchor' href='#date-only'><i-->
<!-- class='fa-solid fa-anchor' aria-hidden='true'></i></a> <small class='show-code'><i-->
<!-- class='fa-solid fa-code' aria-hidden='true'></i></small></h3>-->
<!-- <p>-->
<!-- Version 6 no longer uses MomentJs so selecting what to display is now done via the-->
<!-- <code>display.components</code>.-->
<!-- </p>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='datetimepicker4Html-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#datetimepicker4Html' type='button'-->
<!-- role='tab' aria-controls='datetimepicker4Html' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='datetimepicker4Js-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#datetimepicker4Js'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='datetimepicker4Js' aria-selected='false'>Javascript-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='datetimepicker4Log-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#datetimepicker4Log'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='datetimepicker4Log' aria-selected='false'>Events-->
<!-- </button>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class='tab-content'>-->
<!-- <div class='tab-pane fade show active' id='datetimepicker4Html' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker4Html-tab'>-->
<!-- <pre>-->
<!-- <code class='language-html'>-->
<!-- <div-->
<!-- class='input-group'-->
<!-- id='datetimepicker4'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='datetimepicker4Input'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#datetimepicker4'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#datetimepicker4'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade' id='datetimepicker4Js' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker4Js-tab'>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('datetimepicker4'), {-->
<!-- display: {-->
<!-- viewMode: 'clock',-->
<!-- components: {-->
<!-- decades: true,-->
<!-- year: true,-->
<!-- month: true,-->
<!-- date: true,-->
<!-- hours: false,-->
<!-- minutes: false,-->
<!-- seconds: false,-->
<!-- }-->
<!-- }-->
<!-- });-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade logger' id='datetimepicker4Log' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker4Log-tab'>-->
<!-- <div class='alert alert-info'>-->
<!-- Events will display as you manipulate the picker.-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='container'>-->
<!-- <div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='datetimepicker4Input' class='form-label'>Date</label>-->
<!-- <div-->
<!-- class='input-group log-event'-->
<!-- id='datetimepicker4'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='datetimepicker4Input'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#datetimepicker4'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#datetimepicker4'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type='text/javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('datetimepicker4'), {-->
<!-- display: {-->
<!-- components: {-->
<!-- date: true,-->
<!-- decades: true,-->
<!-- month: true,-->
<!-- year: true,-->
<!-- hours: false,-->
<!-- seconds: false,-->
<!-- minutes: false-->
<!-- }-->
<!-- }-->
<!-- });-->
<!-- </script>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='input-only'>Input Only <a class='anchor-link ' aria-label='Anchor' href='#simple-setup'><i-->
<!-- class='fa-solid fa-anchor' aria-hidden='true'></i></a> <small class='show-code' title='View Code'><i-->
<!-- class='fa-solid fa-code' aria-hidden='true'></i></small></h3>-->
<!-- <p>-->
<!-- An input group and icon are not required for the picker to function, you can also simply use an input field.-->
<!-- </p>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='datetimepicker5Html-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#datetimepicker5Html' type='button'-->
<!-- role='tab' aria-controls='datetimepicker5Html' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='datetimepicker5Js-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#datetimepicker5Js'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='datetimepicker5Js' aria-selected='false'>Javascript-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='datetimepicker5Log-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#datetimepicker5Log'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='datetimepicker5Log' aria-selected='false'>Events-->
<!-- </button>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class='tab-content'>-->
<!-- <div class='tab-pane fade show active' id='datetimepicker5Html' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker5Html-tab'>-->
<!-- <pre>-->
<!-- <code class='language-html'>-->
<!-- <div-->
<!-- class='input-group'-->
<!-- id='datetimepicker5'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='datetimepicker5Input'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#datetimepicker5'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#datetimepicker5'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade' id='datetimepicker5Js' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker5Js-tab'>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('datetimepicker5'));-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade logger' id='datetimepicker5Log' role='tabpanel'-->
<!-- aria-labelledby='datetimepicker5Log-tab'>-->
<!-- <div class='alert alert-info'>-->
<!-- Events will display as you manipulate the picker.-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='container'>-->
<!-- <div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='datetimepicker5' class='form-label'>No icon</label>-->
<!-- <input-->
<!-- id='datetimepicker5'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- />-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type='text/javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('datetimepicker5'), {});-->
<!-- </script>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='enabledDisabled-dates'>Enabled/Disabled Dates <a class='anchor-link ' aria-label='Anchor'-->
<!-- href='#simple-setup'><i-->
<!-- class='fa-solid fa-anchor' aria-hidden='true'></i></a> <small class='show-code' title='View Code'><i-->
<!-- class='fa-solid fa-code' aria-hidden='true'></i></small></h3>-->
<!-- <p>-->
<!-- You can provide an array of dates to enable or dates to disable.-->
<!-- </p>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='enabledDisabledHtml-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#enabledDisabledHtml' type='button'-->
<!-- role='tab' aria-controls='enabledDisabledHtml' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='enabledDisabledJs-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#enabledDisabledJs'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='enabledDisabledJs' aria-selected='false'>Javascript-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='enabledDisabledLog-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#enabledDisabledLog'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='enabledDisabledLog' aria-selected='false'>Events-->
<!-- </button>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class='tab-content'>-->
<!-- <div class='tab-pane fade show active' id='enabledDisabledHtml' role='tabpanel'-->
<!-- aria-labelledby='enabledDisabledHtml-tab'>-->
<!-- <pre>-->
<!-- <code class='language-html'>-->
<!-- <div-->
<!-- class='input-group'-->
<!-- id='enabledDisabled'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='enabledDisabledInput'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#enabledDisabled'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#enabledDisabled'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade' id='enabledDisabledJs' role='tabpanel'-->
<!-- aria-labelledby='enabledDisabledJs-tab'>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!-- const tomorrow = new Date();-->
<!-- tomorrow.setDate(tomorrow.getDate()+1);-->
<!-- new tempusDominus.TempusDominus(document.getElementById('enabledDisabled'), {-->
<!-- restrictions: {-->
<!-- disabledDates: [-->
<!-- tomorrow,-->
<!-- new tempusDominus.DateTime().manipulate(2, 'date')-->
<!-- ]-->
<!-- }-->
<!-- });-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade logger' id='enabledDisabledLog' role='tabpanel'-->
<!-- aria-labelledby='enabledDisabledLog-tab'>-->
<!-- <div class='alert alert-info'>-->
<!-- Events will display as you manipulate the picker.-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='container'>-->
<!-- <div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='enabledDisabledInput' class='form-label'>Next two days are disabled</label>-->
<!-- <div-->
<!-- class='input-group log-event'-->
<!-- id='enabledDisabled'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='enabledDisabledInput'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#enabledDisabled'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#enabledDisabled'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type='text/javascript'>-->
<!-- const tomorrow = new Date();-->
<!-- tomorrow.setDate(tomorrow.getDate() + 1);-->
<!-- new tempusDominus.TempusDominus(document.getElementById('enabledDisabled'), {-->
<!-- restrictions: {-->
<!-- disabledDates: [-->
<!-- tomorrow,-->
<!-- new tempusDominus.DateTime().manipulate(2, 'date')-->
<!-- ]-->
<!-- }-->
<!-- });-->
<!-- </script>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='linked-pickers'>Linked pickers <a class='anchor-link ' aria-label='Anchor' href='#linked-pickers'><i-->
<!-- class='fa-solid fa-anchor' aria-hidden='true'></i></a> <small class='show-code' title='View Code'><i-->
<!-- class='fa-solid fa-code' aria-hidden='true'></i></small></h3>-->
<!-- <p>-->
<!-- You can use event listeners or the subscribe method to link two pickers together. For example, a hotel stay-->
<!-- booking.-->
<!-- </p>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='linkedPickersHtml-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#linkedPickersHtml' type='button'-->
<!-- role='tab' aria-controls='linkedPickersHtml' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='linkedPickersJs-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#linkedPickersJs'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='linkedPickersJs' aria-selected='false'>Javascript-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='linkedPickersLog-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#linkedPickersLog'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='linkedPickersLog' aria-selected='false'>Events-->
<!-- </button>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class='tab-content'>-->
<!-- <div class='tab-pane fade show active' id='linkedPickersHtml' role='tabpanel'-->
<!-- aria-labelledby='linkedPickersHtml-tab'>-->
<!-- <pre>-->
<!-- <code class='language-html'>-->
<!--<div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='linkedPickers1Input' class='form-label'>From</label>-->
<!-- <div-->
<!-- class='input-group log-event'-->
<!-- id='linkedPickers1'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='linkedPickers1Input'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#linkedPickers1'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#linkedPickers1'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='linkedPickers2Input' class='form-label'>To</label>-->
<!-- <div-->
<!-- class='input-group log-event'-->
<!-- id='linkedPickers2'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='linkedPickers2Input'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#linkedPickers2'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#linkedPickers2'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!--</div>-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade' id='linkedPickersJs' role='tabpanel' aria-labelledby='linkedPickersJs-tab'>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!--const linkedPicker1Element = document.getElementById('linkedPickers1');-->
<!--const linked1 = new tempusDominus.TempusDominus(linkedPicker1Element);-->
<!--const linked2 = new tempusDominus.TempusDominus(document.getElementById('linkedPickers2'), {-->
<!-- useCurrent: false-->
<!--});-->
<!--//using event listeners-->
<!--linkedPicker1Element.addEventListener(tempusDominus.Namespace.events.change, (e) => {-->
<!-- linked2.updateOptions({-->
<!-- restrictions: {-->
<!-- minDate: e.detail.date-->
<!-- }-->
<!-- });-->
<!--});-->
<!--//using subscribe method-->
<!--const subscription = linked2.subscribe(tempusDominus.Namespace.events.change, (e) => {-->
<!-- linked1.updateOptions({-->
<!-- restrictions: {-->
<!-- maxDate: e.date-->
<!-- }-->
<!-- });-->
<!--});-->
<!--// event listener can be unsubscribed to:-->
<!--// subscription.unsubscribe();-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade logger' id='linkedPickersLog' role='tabpanel'-->
<!-- aria-labelledby='linkedPickersLog-tab'>-->
<!-- <div class='alert alert-info'>-->
<!-- Events will display as you manipulate the picker.-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='container'>-->
<!-- <div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='linkedPickers1Input' class='form-label'>From</label>-->
<!-- <div-->
<!-- class='input-group log-event'-->
<!-- id='linkedPickers1'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='linkedPickers1Input'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#linkedPickers1'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#linkedPickers1'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='linkedPickers2Input' class='form-label'>To</label>-->
<!-- <div-->
<!-- class='input-group log-event'-->
<!-- id='linkedPickers2'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='linkedPickers2Input'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#linkedPickers2'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#linkedPickers2'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type='text/javascript'>-->
<!-- const linkedPicker1Element = document.getElementById('linkedPickers1');-->
<!-- const linked1 = new tempusDominus.TempusDominus(linkedPicker1Element);-->
<!-- const linked2 = new tempusDominus.TempusDominus(document.getElementById('linkedPickers2'), {-->
<!-- useCurrent: false-->
<!-- });-->
<!-- //using event listeners-->
<!-- linkedPicker1Element.addEventListener(tempusDominus.Namespace.events.change, (e) => {-->
<!-- linked2.updateOptions({-->
<!-- restrictions: {-->
<!-- minDate: e.detail.date-->
<!-- }-->
<!-- });-->
<!-- });-->
<!-- //using subscribe method-->
<!-- const subscription = linked2.subscribe(tempusDominus.Namespace.events.change, (e) => {-->
<!-- linked1.updateOptions({-->
<!-- restrictions: {-->
<!-- maxDate: e.date-->
<!-- }-->
<!-- });-->
<!-- });-->
<!-- // event listener can be unsubscribed to:-->
<!-- // subscription.unsubscribe();-->
<!-- </script>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='custom-icons'>Custom Icons <a class='anchor-link ' aria-label='Anchor' href='#custom-icons'><i-->
<!-- class='fa-solid fa-anchor' aria-hidden='true'></i></a> <small class='show-code' title='View Code'><i-->
<!-- class='fa-solid fa-code' aria-hidden='true'></i></small></h3>-->
<!-- <p>-->
<!-- You can change the icons from the Font Awesome default to another icon-->
<!-- set like <a href='https://icons.getbootstrap.com/' target='_blank' rel='noopener'>Bootstrap's Icon</a>-->
<!-- </p>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='customIconsHtml-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#customIconsHtml' type='button'-->
<!-- role='tab' aria-controls='customIconsHtml' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='customIconsJs-tab' data-bs-toggle='tab' data-bs-target='#customIconsJs'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='customIconsJs' aria-selected='false'>Javascript-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='customIconsLog-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#customIconsLog'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='customIconsLog' aria-selected='false'>Events-->
<!-- </button>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class='tab-content'>-->
<!-- <div class='tab-pane fade show active' id='customIconsHtml' role='tabpanel'-->
<!-- aria-labelledby='customIconsHtml-tab'>-->
<!-- <pre>-->
<!-- <code class='language-html'>-->
<!-- <div-->
<!-- class='input-group'-->
<!-- id='customIcons'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='customIconsInput'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#customIcons'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#customIcons'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='bi bi-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade' id='customIconsJs' role='tabpanel' aria-labelledby='customIconsJs-tab'>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('customIcons'), {-->
<!-- display: {-->
<!-- icons: {-->
<!-- time: 'bi bi-clock',-->
<!-- date: 'bi bi-calendar',-->
<!-- up: 'bi bi-arrow-up',-->
<!-- down: 'bi bi-arrow-down',-->
<!-- previous: 'bi bi-chevron-left',-->
<!-- next: 'bi bi-chevron-right',-->
<!-- today: 'bi bi-calendar-check',-->
<!-- clear: 'bi bi-trash',-->
<!-- close: 'bi bi-x',-->
<!-- },-->
<!-- buttons: {-->
<!-- today: true,-->
<!-- clear: true,-->
<!-- close: true,-->
<!-- },-->
<!-- }-->
<!-- });-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade logger' id='customIconsLog' role='tabpanel'-->
<!-- aria-labelledby='customIconsLog-tab'>-->
<!-- <div class='alert alert-info'>-->
<!-- Events will display as you manipulate the picker.-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='container'>-->
<!-- <div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='customIconsInput' class='form-label'>Bootstrap Icons</label>-->
<!-- <div-->
<!-- class='input-group log-event'-->
<!-- id='customIcons'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='customIconsInput'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#customIcons'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#customIcons'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='bi bi-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type='text/javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('customIcons'), {-->
<!-- display: {-->
<!-- icons: {-->
<!-- time: 'bi bi-clock',-->
<!-- date: 'bi bi-calendar',-->
<!-- up: 'bi bi-arrow-up',-->
<!-- down: 'bi bi-arrow-down',-->
<!-- previous: 'bi bi-chevron-left',-->
<!-- next: 'bi bi-chevron-right',-->
<!-- today: 'bi bi-calendar-check',-->
<!-- clear: 'bi bi-trash',-->
<!-- close: 'bi bi-x'-->
<!-- },-->
<!-- buttons: {-->
<!-- today: true,-->
<!-- clear: true,-->
<!-- close: true-->
<!-- }-->
<!-- }-->
<!-- });-->
<!-- </script>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='view-mode'>View Mode <a class='anchor-link ' aria-label='Anchor' href='#view-mode'><i-->
<!-- class='fa-solid fa-anchor' aria-hidden='true'></i></a> <small class='show-code' title='View Code'><i-->
<!-- class='fa-solid fa-code' aria-hidden='true'></i></small></h3>-->
<!-- <p>-->
<!-- The view mode options allows you to show a different initial view. For example selecting a date of birth.-->
<!-- </p>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='viewModeHtml-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#viewModeHtml' type='button'-->
<!-- role='tab' aria-controls='viewModeHtml' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='viewModeJs-tab' data-bs-toggle='tab' data-bs-target='#viewModeJs'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='viewModeJs' aria-selected='false'>Javascript-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='viewModeLog-tab' data-bs-toggle='tab' data-bs-target='#viewModeLog'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='viewModeLog' aria-selected='false'>Events-->
<!-- </button>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class='tab-content'>-->
<!-- <div class='tab-pane fade show active' id='viewModeHtml' role='tabpanel'-->
<!-- aria-labelledby='viewModeHtml-tab'>-->
<!-- <pre>-->
<!-- <code class='language-html'>-->
<!-- <div-->
<!-- class='input-group'-->
<!-- id='viewMode'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='viewModeInput'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#viewMode'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#viewMode'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade' id='viewModeJs' role='tabpanel' aria-labelledby='viewModeJs-tab'>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('viewMode'), {-->
<!-- display: {-->
<!-- viewMode: 'years'-->
<!-- }-->
<!-- });-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade logger' id='viewModeLog' role='tabpanel'-->
<!-- aria-labelledby='viewModeLog-tab'>-->
<!-- <div class='alert alert-info'>-->
<!-- Events will display as you manipulate the picker.-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='container'>-->
<!-- <div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='viewModeInput' class='form-label'>Birth Date</label>-->
<!-- <div-->
<!-- class='input-group log-event'-->
<!-- id='viewMode'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='viewModeInput'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#viewMode'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#viewMode'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type='text/javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('viewMode'), {-->
<!-- display: {-->
<!-- viewMode: 'years'-->
<!-- }-->
<!-- });-->
<!-- </script>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='min-view-mode'>Minimum View <a class='anchor-link ' aria-label='Anchor' href='#min-view-mode'><i-->
<!-- class='fa-solid fa-anchor' aria-hidden='true'></i></a> <small class='show-code' title='View Code'><i-->
<!-- class='fa-solid fa-code' aria-hidden='true'></i></small></h3>-->
<!-- <p>-->
<!-- You can set the minimum view mode by turning off lower level components. If you only want your user to-->
<!-- select-->
<!-- month and year, <code>display.components.date: false</code>. The <code>display.components</code> object also-->
<!-- provides convenience shortcuts. For instance if you don't want any of the time picker components to be-->
<!-- available-->
<!-- simple set <code>display.components.clock: false</code>. Do be aware that-->
<!-- <code>display.components.clock</code>-->
<!-- must be true (default) in order to display the time components regardless of <code>display.components.hours|minutes|seconds</code>-->
<!-- is true. The same applies for <code>display.components.calendar</code>-->
<!-- </p>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='minViewModeHtml-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#minViewModeHtml' type='button'-->
<!-- role='tab' aria-controls='minViewModeHtml' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='minViewModeJs-tab' data-bs-toggle='tab' data-bs-target='#minViewModeJs'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='minViewModeJs' aria-selected='false'>Javascript-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='minViewModeLog-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#minViewModeLog'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='minViewModeLog' aria-selected='false'>Events-->
<!-- </button>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class='tab-content'>-->
<!-- <div class='tab-pane fade show active' id='minViewModeHtml' role='tabpanel'-->
<!-- aria-labelledby='minViewModeHtml-tab'>-->
<!-- <pre>-->
<!-- <code class='language-html'>-->
<!-- <div-->
<!-- class='input-group'-->
<!-- id='minViewMode'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='minViewModeInput'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#minViewMode'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#minViewMode'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade' id='minViewModeJs' role='tabpanel' aria-labelledby='minViewModeJs-tab'>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('minViewMode'), {-->
<!-- display: {-->
<!-- components: {-->
<!-- clock:false,-->
<!-- date: false,-->
<!-- }-->
<!-- }-->
<!-- });-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade logger' id='minViewModeLog' role='tabpanel'-->
<!-- aria-labelledby='minViewModeLog-tab'>-->
<!-- <div class='alert alert-info'>-->
<!-- Events will display as you manipulate the picker.-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='container'>-->
<!-- <div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='minViewModeInput' class='form-label'>Month/Year</label>-->
<!-- <div-->
<!-- class='input-group log-event'-->
<!-- id='minViewMode'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='minViewModeInput'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#minViewMode'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#minViewMode'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type='text/javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('minViewMode'), {-->
<!-- display: {-->
<!-- components: {-->
<!-- clock: false,-->
<!-- date: false-->
<!-- }-->
<!-- }-->
<!-- });-->
<!-- </script>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='disabled-days-of-the-week'>Disabled Days of the Week <a class='anchor-link ' aria-label='Anchor'-->
<!-- href='#disabled-days-of-the-week'><i-->
<!-- class='fa-solid fa-anchor' aria-hidden='true'></i></a> <small class='show-code' title='View Code'><i-->
<!-- class='fa-solid fa-code' aria-hidden='true'></i></small></h3>-->
<!-- <p>-->
<!-- This is the simplest setup you can have with Bootstrap and Font Awesome 5. The picker defaults to FA 5 Solid-->
<!-- icons, however you can overwrite the defaults globally.-->
<!-- </p>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='disabledDowHtml-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#disabledDowHtml' type='button'-->
<!-- role='tab' aria-controls='disabledDowHtml' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='disabledDowJs-tab' data-bs-toggle='tab' data-bs-target='#disabledDowJs'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='disabledDowJs' aria-selected='false'>Javascript-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='disabledDowLog-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#disabledDowLog'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='disabledDowLog' aria-selected='false'>Events-->
<!-- </button>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class='tab-content'>-->
<!-- <div class='tab-pane fade show active' id='disabledDowHtml' role='tabpanel'-->
<!-- aria-labelledby='disabledDowHtml-tab'>-->
<!-- <pre>-->
<!-- <code class='language-html'>-->
<!-- <div-->
<!-- class='input-group'-->
<!-- id='disabledDow'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='disabledDowInput'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#disabledDow'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#disabledDow'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade' id='disabledDowJs' role='tabpanel' aria-labelledby='disabledDowJs-tab'>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('disabledDow'), {-->
<!-- restrictions: {-->
<!-- daysOfWeekDisabled: [0, 6]-->
<!-- }-->
<!-- });-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade logger' id='disabledDowLog' role='tabpanel'-->
<!-- aria-labelledby='disabledDowLog-tab'>-->
<!-- <div class='alert alert-info'>-->
<!-- Events will display as you manipulate the picker.-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='container'>-->
<!-- <div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='disabledDowInput' class='form-label'>Closed Weekends</label>-->
<!-- <div-->
<!-- class='input-group log-event'-->
<!-- id='disabledDow'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='disabledDowInput'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#disabledDow'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#disabledDow'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type='text/javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('disabledDow'), {-->
<!-- restrictions: {-->
<!-- daysOfWeekDisabled: [0, 6]-->
<!-- }-->
<!-- });-->
<!-- </script>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='inline'>Inline <a class='anchor-link ' aria-label='Anchor' href='#inline'><i-->
<!-- class='fa-solid fa-anchor' aria-hidden='true'></i></a> <small class='show-code' title='View Code'><i-->
<!-- class='fa-solid fa-code' aria-hidden='true'></i></small></h3>-->
<!-- <p>-->
<!-- You can also use the picker inline-->
<!-- </p>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='inlineHtml-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#inlineHtml' type='button'-->
<!-- role='tab' aria-controls='inlineHtml' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='inlineJs-tab' data-bs-toggle='tab' data-bs-target='#inlineJs'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='inlineJs' aria-selected='false'>Javascript-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='inlineLog-tab' data-bs-toggle='tab' data-bs-target='#inlineLog'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='inlineLog' aria-selected='false'>Events-->
<!-- </button>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class='tab-content'>-->
<!-- <div class='tab-pane fade show active' id='inlineHtml' role='tabpanel'-->
<!-- aria-labelledby='inlineHtml-tab'>-->
<!-- <pre>-->
<!-- <code class='language-html'>-->
<!-- <div-->
<!-- class='log-event'-->
<!-- id='inlinePicker'-->
<!-- >-->
<!-- </div>-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade' id='inlineJs' role='tabpanel' aria-labelledby='inlineJs-tab'>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('inlinePicker'), {-->
<!-- display: {-->
<!-- inline: true-->
<!-- }-->
<!-- });-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade logger' id='inlineLog' role='tabpanel'-->
<!-- aria-labelledby='inlineLog-tab'>-->
<!-- <div class='alert alert-info'>-->
<!-- Events will display as you manipulate the picker.-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='container'>-->
<!-- <div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='inlinePicker' class='form-label'>Inline</label>-->
<!-- <div-->
<!-- class='log-event'-->
<!-- id='inlinePicker'-->
<!-- >-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type='text/javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('inlinePicker'), {-->
<!-- display: {-->
<!-- inline: true-->
<!-- }-->
<!-- });-->
<!-- </script>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='theme'>Theme <a class='anchor-link ' aria-label='Anchor' href='#theme'><i-->
<!-- class='fa-solid fa-anchor' aria-hidden='true'></i></a> <small class='show-code' title='View Code'><i-->
<!-- class='fa-solid fa-code' aria-hidden='true'></i></small></h3>-->
<!-- <p>-->
<!-- You can also specify the theme for the picker.-->
<!-- </p>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='themeHtml-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#themeHtml' type='button'-->
<!-- role='tab' aria-controls='themeHtml' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='themeJs-tab' data-bs-toggle='tab' data-bs-target='#themeJs'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='themeJs' aria-selected='false'>Javascript-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='themeLog-tab' data-bs-toggle='tab' data-bs-target='#themeLog'-->
<!-- type='button'-->
<!-- role='tab' aria-controls='themeLog' aria-selected='false'>Events-->
<!-- </button>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class='tab-content'>-->
<!-- <div class='tab-pane fade show active' id='themeHtml' role='tabpanel'-->
<!-- aria-labelledby='themeHtml-tab'>-->
<!-- <pre>-->
<!-- <code class='language-html'>-->
<!-- <div-->
<!-- class='input-group'-->
<!-- id='themePicker'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-->-->
<!--<input-->
<!-- id='themePickerInput'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#themePicker'-->
<!--/>-->
<!--<span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#themePicker'-->
<!-- data-td-toggle='datetimepicker'-->
<!-->-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!--</span>-->
<!--</div>-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade' id='themeJs' role='tabpanel' aria-labelledby='themeJs-tab'>-->
<!-- <pre>-->
<!-- <code class='language-javascript'>-->
<!-- new tempusDominus.TempusDominus(document.getElementById('themePicker'), {-->
<!-- display: {-->
<!-- theme: 'dark'-->
<!-- }-->
<!-- });-->
<!-- </code>-->
<!-- </pre>-->
<!-- </div>-->
<!-- <div class='tab-pane fade logger' id='themeLog' role='tabpanel'-->
<!-- aria-labelledby='themeLog-tab'>-->
<!-- <div class='alert alert-info'>-->
<!-- Events will display as you manipulate the picker.-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='container'>-->
<!-- <div class='row'>-->
<!-- <div class='col-sm-6'>-->
<!-- <label for='themePicker' class='form-label'>Theme</label>-->
<!-- <div-->
<!-- class='input-group'-->
<!-- id='themePicker'-->
<!-- data-td-target-input='nearest'-->
<!-- data-td-target-toggle='nearest'-->
<!-- >-->
<!-- <input-->
<!-- id='themePickerInput'-->
<!-- type='text'-->
<!-- class='form-control'-->
<!-- data-td-target='#themePicker'-->
<!-- />-->
<!-- <span-->
<!-- class='input-group-text'-->
<!-- data-td-target='#themePicker'-->
<!-- data-td-toggle='datetimepicker'-->
<!-- >-->
<!-- <span class='fa-solid fa-calendar'></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class='row mt-3'>-->
<!-- <div class='col-sm-6'>-->
<!-- <button id='setThemeLight' class='btn btn-primary'>Set to Light</button>-->
<!-- <button id='setThemeDark' class='btn btn-primary'>Set to Dark</button>-->
<!-- <button id='setThemeAuto' class='btn btn-primary'>Set to Auto</button>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <script type='text/javascript'>-->
<!-- const themePicker = new tempusDominus.TempusDominus(document.getElementById('themePicker'), {-->
<!-- display: {-->
<!-- theme: 'dark'-->
<!-- }-->
<!-- });-->
<!-- const updateTheme = theme => themePicker.updateOptions({ display: { theme } });-->
<!-- const setThemeLightButton = document.getElementById('setThemeLight');-->
<!-- const setThemeDarkButton = document.getElementById('setThemeDark');-->
<!-- const setThemeAutoButton = document.getElementById('setThemeAuto');-->
<!-- setThemeLightButton.addEventListener('click', () => updateTheme('light'));-->
<!-- setThemeDarkButton.addEventListener('click', () => updateTheme('dark'));-->
<!-- setThemeAutoButton.addEventListener('click', () => updateTheme('auto'));-->
<!-- </script>-->
<!-- </div>-->
<!-- <div class='row'>-->
<!-- <h3 id='multidate'>Multiple Dates <a class='anchor-link ' aria-label='Anchor' href='#multidate'><i-->
<!-- class='fa-solid fa-anchor' aria-hidden='true'></i></a> <small class='show-code' title='View Code'><i-->
<!-- class='fa-solid fa-code' aria-hidden='true'></i></small></h3>-->
<!-- <p>-->
<!-- The picker allows for multiple dates to be selected.-->
<!-- </p>-->
<!-- <div class='code-blocks d-none'>-->
<!-- <ul class='nav nav-tabs' role='tablist'>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link active' id='multipleDateHtml-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#multipleDateHtml' type='button'-->
<!-- role='tab' aria-controls='multipleDateHtml' aria-selected='true'>HTML-->
<!-- </button>-->
<!-- </li>-->
<!-- <li class='nav-item' role='presentation'>-->
<!-- <button class='nav-link' id='multipleDateJs-tab' data-bs-toggle='tab'-->
<!-- data-bs-target='#multipleDateJs'-->
<!-- type='button'-->
<!--
gitextract_udtrmfag/ ├── .eslintignore ├── .eslintrc.yml ├── .gitattributes ├── .github/ │ ├── CONTRIBUTING.md │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ └── config.yml │ ├── PULL_REQUEST_TEMPLATE │ └── workflows/ │ ├── base/ │ │ └── action.yaml │ ├── build/ │ │ └── action.yaml │ ├── codeql-analysis.yml │ ├── docs/ │ │ └── action.yaml │ ├── docs.yaml │ ├── feature-branch.yaml │ ├── nuget/ │ │ └── action.yaml │ ├── nuget.yml │ ├── pr.yml │ ├── publish.yml │ ├── release/ │ │ └── action.yaml │ └── stale.yaml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .npmignore ├── .prettierignore ├── .prettierrc ├── CNAME ├── LICENSE ├── README.md ├── build/ │ ├── banner.js │ ├── change-version.js │ ├── plugins.js │ ├── rollup-plugin.config.js │ ├── rollup.config.js │ ├── serve.js │ └── utilities.js ├── package.json ├── sonar-project.properties ├── src/ │ ├── docs/ │ │ ├── assets/ │ │ │ ├── no-styles.html │ │ │ └── repl-data.json │ │ ├── js/ │ │ │ ├── docs.js │ │ │ └── migration.js │ │ ├── make.js │ │ ├── partials/ │ │ │ ├── change-log-archive.html │ │ │ ├── change-log.html │ │ │ ├── datetime.html │ │ │ ├── examples/ │ │ │ │ ├── index.html │ │ │ │ └── jquery.html │ │ │ ├── functions/ │ │ │ │ ├── dates.html │ │ │ │ ├── display.html │ │ │ │ └── index.html │ │ │ ├── functions.html │ │ │ ├── index.html │ │ │ ├── installing.html │ │ │ ├── locale.html │ │ │ ├── migration.html │ │ │ ├── namespace/ │ │ │ │ ├── css.html │ │ │ │ ├── errors.html │ │ │ │ ├── events.html │ │ │ │ ├── index.html │ │ │ │ └── unit.html │ │ │ ├── options/ │ │ │ │ ├── display.html │ │ │ │ ├── index.html │ │ │ │ ├── keyboard-navigation.html │ │ │ │ ├── localization.html │ │ │ │ └── restrictions.html │ │ │ ├── options.html │ │ │ ├── plugins/ │ │ │ │ ├── bi1.html │ │ │ │ ├── customDateFormat.html │ │ │ │ ├── fa5.html │ │ │ │ ├── floating-ui.html │ │ │ │ ├── index.html │ │ │ │ ├── moment.html │ │ │ │ └── paint.html │ │ │ └── repl.html │ │ ├── site-config.json │ │ ├── styles/ │ │ │ ├── bs5_docs.scss │ │ │ └── styles.scss │ │ └── templates/ │ │ ├── 404.html │ │ ├── index.html │ │ ├── page-template.html │ │ ├── post-loop.html │ │ └── shell.html │ ├── js/ │ │ ├── actions.ts │ │ ├── dates.ts │ │ ├── datetime.ts │ │ ├── display/ │ │ │ ├── calendar/ │ │ │ │ ├── date-display.ts │ │ │ │ ├── decade-display.ts │ │ │ │ ├── month-display.ts │ │ │ │ └── year-display.ts │ │ │ ├── collapse.ts │ │ │ ├── index.ts │ │ │ └── time/ │ │ │ ├── hour-display.ts │ │ │ ├── minute-display.ts │ │ │ ├── second-display.ts │ │ │ └── time-display.ts │ │ ├── jQuery-provider.js │ │ ├── locales/ │ │ │ ├── ar-SA.ts │ │ │ ├── ar.ts │ │ │ ├── ca.ts │ │ │ ├── cs.ts │ │ │ ├── de.ts │ │ │ ├── es.ts │ │ │ ├── fi.ts │ │ │ ├── fr.ts │ │ │ ├── hr.ts │ │ │ ├── hy.ts │ │ │ ├── it.ts │ │ │ ├── nl.ts │ │ │ ├── pl.ts │ │ │ ├── pt-PT.ts │ │ │ ├── ro.ts │ │ │ ├── ru.ts │ │ │ ├── sk.ts │ │ │ ├── sl.ts │ │ │ ├── sr-Latn.ts │ │ │ ├── sr.ts │ │ │ ├── tr.ts │ │ │ ├── uk.ts │ │ │ ├── zh-CN.ts │ │ │ ├── zh-HK.ts │ │ │ ├── zh-MO.ts │ │ │ └── zh-TW.ts │ │ ├── plugins/ │ │ │ ├── bi-one/ │ │ │ │ └── index.ts │ │ │ ├── customDateFormat/ │ │ │ │ └── index.ts │ │ │ ├── examples/ │ │ │ │ ├── custom-paint-job.ts │ │ │ │ └── sample.ts │ │ │ ├── fa-five/ │ │ │ │ └── index.ts │ │ │ └── moment-parse/ │ │ │ └── index.ts │ │ ├── tempus-dominus.ts │ │ ├── utilities/ │ │ │ ├── action-types.ts │ │ │ ├── calendar-modes.ts │ │ │ ├── default-format-localization.ts │ │ │ ├── default-options.ts │ │ │ ├── errors.ts │ │ │ ├── event-emitter.ts │ │ │ ├── event-types.ts │ │ │ ├── namespace.ts │ │ │ ├── optionConverter.ts │ │ │ ├── optionProcessor.ts │ │ │ ├── options.ts │ │ │ ├── optionsStore.ts │ │ │ ├── service-locator.ts │ │ │ ├── typeChecker.ts │ │ │ └── view-mode.ts │ │ └── validation.ts │ ├── nuget/ │ │ ├── TempusDominus.nuspec │ │ └── TempusDominus.scss.nuspec │ └── scss/ │ ├── _variables.scss │ └── tempus-dominus.scss ├── td logo.xcf ├── test/ │ ├── actions.test.ts │ ├── dates.test.ts │ ├── datetime.test.ts │ ├── fixtures/ │ │ ├── dates.fixture.ts │ │ ├── display.fixture.ts │ │ ├── eventemitters.fixture.ts │ │ ├── optionStore.fixture.ts │ │ ├── serviceLocator.fixture.ts │ │ └── validation.fixture.ts │ ├── tempus-dominus.test.ts │ ├── test-import.ts │ ├── test-utilities.ts │ ├── utilities/ │ │ ├── optionProccessor.test.ts │ │ ├── optionStore.test.ts │ │ ├── serviceLocator.test.ts │ │ └── typeCechker.test.ts │ └── validation.test.ts ├── tsconfig.json └── vite.config.ts
SYMBOL INDEX (346 symbols across 41 files)
FILE: build/banner.js
function getBanner (line 6) | function getBanner() {
FILE: build/change-version.js
function updateVersionInFile (line 6) | function updateVersionInFile(filePath, oldVersion, newVersion) {
function updateVersions (line 23) | async function updateVersions(newVersion) {
FILE: build/plugins.js
function build (line 10) | async function build(option) {
function locales (line 15) | async function locales() {
function plugins (line 37) | async function plugins() {
FILE: build/utilities.js
class Utilities (line 4) | class Utilities {
method copyFileAndEnsurePathExistsAsync (line 5) | static async copyFileAndEnsurePathExistsAsync(file) {
method copy (line 11) | static async copy() {
method removeFileAsync (line 23) | static async removeFileAsync(filePath) {
method removeDirectoryAsync (line 30) | static async removeDirectoryAsync(directory, removeSelf = true) {
FILE: src/docs/js/migration.js
class JsConvert (line 14) | class JsConvert {
method constructor (line 15) | constructor() {
method convert (line 34) | convert() {
class HtmlConvert (line 225) | class HtmlConvert {
method constructor (line 226) | constructor() {
method convert (line 245) | convert() {
FILE: src/docs/make.js
class PageMeta (line 14) | class PageMeta {
method constructor (line 23) | constructor(
method parse (line 41) | parse(metaTag) {
class FileInformation (line 60) | class FileInformation {
method constructor (line 67) | constructor(file, fullPath, isDirectory, extension) {
class Build (line 77) | class Build {
method startAsync (line 90) | async startAsync(){
method updateAll (line 99) | updateAll() {
method reset (line 113) | reset() {
method loadTemplate (line 118) | loadTemplate(template) {
method directoryWalk (line 122) | directoryWalk(directory, extension = '.html') {
method getSearchBody (line 149) | getSearchBody(html) {
method removeDirectory (line 162) | removeDirectory(directory, removeSelf) {
method copyDirectory (line 177) | copyDirectory(source, destination) {
method copyFileAndEnsurePathExists (line 190) | copyFileAndEnsurePathExists(filePath, content) {
method writeFileAndEnsurePathExists (line 196) | writeFileAndEnsurePathExists(filePath, content) {
method setMetaContent (line 204) | setMetaContent(rootElement, selector, content) {
method createRootHtml (line 213) | createRootHtml(html) {
method shellDocument (line 224) | get shellDocument() {
method prepareCss (line 229) | prepareCss() {
method pageDocument (line 241) | get pageDocument() {
method updatePages (line 250) | updatePages() {
method updateHomepage (line 354) | updateHomepage() {
method update404 (line 381) | update404() {
method updateSiteMap (line 400) | updateSiteMap() {
method updateCss (line 412) | updateCss() {
method cleanCss (line 436) | cleanCss() {
method minifyJs (line 449) | async minifyJs() {
method setInnerHtml (line 495) | setInnerHtml(element, value) {
method updateDist (line 500) | updateDist() {
method copyAssets (line 511) | copyAssets() {
method watcher (line 546) | async watcher() {
FILE: src/js/actions.ts
class Actions (line 16) | class Actions {
method constructor (line 23) | constructor() {
method do (line 41) | do(e: any, action?: ActionTypes) {
method handleShowClockContainers (line 164) | private handleShowClockContainers(action: ActionTypes) {
method handleNextPrevious (line 207) | private handleNextPrevious(action: ActionTypes) {
method hideOrClock (line 222) | private hideOrClock(e) {
method manipulateAndSet (line 241) | private manipulateAndSet(lastPicked: DateTime, unit: Unit, value = 1) {
method handleSelectCalendarMode (line 248) | private handleSelectCalendarMode(
method handleToggle (line 283) | private handleToggle(currentTarget: HTMLElement) {
method handleSelectDay (line 324) | private handleSelectDay(currentTarget: HTMLElement) {
method handleMultiDate (line 352) | private handleMultiDate(day: DateTime) {
method handleDateRange (line 364) | private handleDateRange(day: DateTime) {
FILE: src/js/dates.ts
class Dates (line 14) | class Dates {
method constructor (line 20) | constructor() {
method picked (line 29) | get picked(): DateTime[] {
method lastPicked (line 36) | get lastPicked(): DateTime {
method lastPickedIndex (line 43) | get lastPickedIndex(): number {
method formatInput (line 52) | formatInput(date: DateTime): string {
method parseInput (line 63) | parseInput(value: any): DateTime {
method setFromInput (line 88) | setFromInput(value: any, index?: number) {
method add (line 104) | add(date: DateTime): void {
method isPicked (line 114) | isPicked(targetDate: DateTime, unit?: Unit): boolean {
method pickedIndex (line 137) | pickedIndex(targetDate: DateTime, unit?: Unit): number {
method clear (line 152) | clear() {
method getStartEndYear (line 171) | static getStartEndYear(
method updateInput (line 182) | updateInput(target?: DateTime) {
method setValue (line 207) | setValue(target?: DateTime, index?: number): void {
method _setValueNull (line 274) | private _setValueNull(isClear: boolean, index: number, oldDate: DateTi...
FILE: src/js/datetime.ts
type parsedTime (line 5) | type parsedTime = {
type Unit (line 19) | enum Unit {
type DateTimeFormatOptions (line 37) | interface DateTimeFormatOptions extends Intl.DateTimeFormatOptions {
type FormatMatch (line 100) | interface FormatMatch {
type FormatMatchString (line 105) | interface FormatMatchString {
type FormatExpression (line 110) | interface FormatExpression {
class DateTime (line 138) | class DateTime extends Date {
method setLocale (line 146) | setLocale(value: string): this {
method setLocalization (line 158) | setLocalization(value: FormatLocalization): this {
method convert (line 170) | static convert(
method clone (line 196) | get clone() {
method isValid (line 208) | static isValid(d): boolean {
method startOf (line 221) | startOf(unit: Unit | 'weekDay', startOfTheWeek = 0): this {
method endOf (line 263) | endOf(unit: Unit | 'weekDay', startOfTheWeek = 0): this {
method manipulate (line 306) | manipulate(value: number, unit: Unit): this {
method isBefore (line 319) | isBefore(compare: DateTime, unit?: Unit): boolean {
method isAfter (line 337) | isAfter(compare: DateTime, unit?: Unit): boolean {
method isSame (line 355) | isSame(compare: DateTime, unit?: Unit): boolean {
method isBetween (line 376) | isBetween(
method parts (line 407) | parts(
method seconds (line 422) | get seconds(): number {
method seconds (line 429) | set seconds(value: number) {
method secondsFormatted (line 436) | get secondsFormatted(): string {
method minutes (line 443) | get minutes(): number {
method minutes (line 450) | set minutes(value: number) {
method minutesFormatted (line 457) | get minutesFormatted(): string {
method hours (line 464) | get hours(): number {
method hours (line 471) | set hours(value: number) {
method getHoursFormatted (line 479) | getHoursFormatted(hourCycle: Intl.LocaleHourCycleKey = 'h12') {
method meridiem (line 490) | meridiem(locale: string = this.localization.locale): string {
method date (line 502) | get date(): number {
method date (line 509) | set date(value: number) {
method dateFormatted (line 516) | get dateFormatted(): string {
method weekDay (line 523) | get weekDay(): number {
method month (line 530) | get month(): number {
method month (line 537) | set month(value: number) {
method monthFormatted (line 550) | get monthFormatted(): string {
method year (line 557) | get year(): number {
method year (line 564) | set year(value: number) {
method week (line 572) | get week(): number {
method weeksInWeekYear (line 590) | weeksInWeekYear() {
method dateToDataValue (line 607) | dateToDataValue(): string {
method isLeapYear (line 618) | get isLeapYear() {
method computeOrdinal (line 624) | private computeOrdinal() {
method getAllMonths (line 648) | private getAllMonths(
method replaceTokens (line 660) | private replaceTokens(formatStr, formats) {
method parseTwoDigitYear (line 683) | private parseTwoDigitYear(input: number) {
method offsetFromString (line 687) | private offsetFromString(input: string) {
method zoneInformation (line 702) | private zoneInformation(date: DateTime, style: 'z' | 'zz' | 'zzz') {
method addInput (line 725) | private addInput(property) {
method getLocaleAfternoon (line 731) | private getLocaleAfternoon(): string {
method meridiemMatch (line 741) | private meridiemMatch(input: string) {
method correctHours (line 867) | private correctHours(time) {
method makeParser (line 882) | private makeParser(format: string) {
method fromString (line 931) | static fromString(input: string, localization: FormatLocalization): Da...
method format (line 979) | format(
FILE: src/js/display/calendar/date-display.ts
class DateDisplay (line 13) | class DateDisplay {
method constructor (line 18) | constructor() {
method getPicker (line 28) | getPicker(): HTMLElement {
method _update (line 80) | _update(widget: HTMLElement, paint: Paint): void {
method _handleDateRange (line 141) | private _handleDateRange(innerDate: DateTime, classes: string[]) {
method handleMouseEvents (line 160) | private handleMouseEvents(container: HTMLElement) {
method _updateCalendarView (line 261) | private _updateCalendarView(container: Element) {
method _daysOfTheWeek (line 294) | private _daysOfTheWeek(): HTMLElement[] {
method _handleCalendarWeeks (line 332) | private _handleCalendarWeeks(container: HTMLElement, innerDate: DateTi...
FILE: src/js/display/calendar/decade-display.ts
class DecadeDisplay (line 13) | class DecadeDisplay {
method constructor (line 20) | constructor() {
method getPicker (line 30) | getPicker() {
method _update (line 47) | _update(widget: HTMLElement, paint: Paint) {
FILE: src/js/display/calendar/month-display.ts
class MonthDisplay (line 13) | class MonthDisplay {
method constructor (line 18) | constructor() {
method getPicker (line 27) | getPicker(): HTMLElement {
method _update (line 45) | _update(widget: HTMLElement, paint: Paint): void {
FILE: src/js/display/calendar/year-display.ts
class YearDisplay (line 13) | class YearDisplay {
method constructor (line 20) | constructor() {
method getPicker (line 30) | getPicker(): HTMLElement {
method _update (line 48) | _update(widget: HTMLElement, paint: Paint) {
FILE: src/js/display/collapse.ts
class Collapse (line 6) | class Collapse {
method toggle (line 11) | static toggle(target: HTMLElement) {
method showImmediately (line 23) | static showImmediately(target: HTMLElement) {
method show (line 33) | static show(target: HTMLElement) {
method hideImmediately (line 62) | static hideImmediately(target: HTMLElement) {
method hide (line 72) | static hide(target: HTMLElement) {
FILE: src/js/display/index.ts
class Display (line 24) | class Display {
method constructor (line 44) | constructor() {
method widget (line 69) | get widget(): HTMLElement | undefined {
method dateContainer (line 73) | get dateContainer(): HTMLElement | undefined {
method timeContainer (line 77) | get timeContainer(): HTMLElement | undefined {
method isVisible (line 84) | get isVisible() {
method _update (line 94) | _update(unit: ViewUpdateValues): void {
method paint (line 152) | paint(
method show (line 166) | show(): void {
method _showSetupViewMode (line 244) | private _showSetupViewMode() {
method _showSetDefaultIfNeeded (line 278) | private _showSetDefaultIfNeeded() {
method createPopup (line 307) | async createPopup(
method updatePopup (line 327) | updatePopup(): void {
method _showMode (line 338) | _showMode(direction?: number): void {
method _updateTheme (line 395) | _updateTheme(theme?: 'light' | 'dark' | 'auto'): void {
method _getThemeClass (line 418) | _getThemeClass(): string {
method _updateCalendarHeader (line 435) | _updateCalendarHeader() {
method hide (line 516) | hide(): void {
method toggle (line 540) | toggle() {
method _dispose (line 548) | _dispose() {
method _buildWidget (line 565) | private _buildWidget(): HTMLElement {
method _buildWidgetSideBySide (line 652) | private _buildWidgetSideBySide(
method _hasTime (line 679) | get _hasTime(): boolean {
method _hasDate (line 691) | get _hasDate(): boolean {
method _hasDateAndTime (line 700) | get _hasDateAndTime(): boolean {
method getToolbarElements (line 708) | getToolbarElements(): HTMLElement[] {
method getHeadTemplate (line 774) | getHeadTemplate(): HTMLElement {
method _iconTag (line 809) | _iconTag(iconClass: string): HTMLElement | SVGElement {
method _rebuild (line 859) | _rebuild() {
method refreshCurrentView (line 865) | refreshCurrentView() {
method _keyboardEvent (line 888) | private _keyboardEvent(event: KeyboardEvent) {
method findViewDateElement (line 897) | public findViewDateElement(): HTMLElement {
method _handleKeyDownDate (line 929) | private _handleKeyDownDate(event: KeyboardEvent) {
method _handleKeyDownClock (line 1077) | private _handleKeyDownClock(event: KeyboardEvent) {
method _handleTab (line 1166) | private _handleTab(activeElement: HTMLElement, event: KeyboardEvent) {
method _handleFocus (line 1235) | private _handleFocus() {
method _handleFocusClock (line 1240) | private _handleFocusClock() {
type Paint (line 1249) | type Paint = (
FILE: src/js/display/time/hour-display.ts
class HourDisplay (line 13) | class HourDisplay {
method constructor (line 18) | constructor() {
method getPicker (line 27) | getPicker(): HTMLElement {
method _update (line 45) | _update(widget: HTMLElement, paint: Paint): void {
FILE: src/js/display/time/minute-display.ts
class MinuteDisplay (line 12) | class MinuteDisplay {
method constructor (line 16) | constructor() {
method getPicker (line 24) | getPicker(): HTMLElement {
method _update (line 46) | _update(widget: HTMLElement, paint: Paint): void {
FILE: src/js/display/time/second-display.ts
class secondDisplay (line 12) | class secondDisplay {
method constructor (line 16) | constructor() {
method getPicker (line 24) | getPicker(): HTMLElement {
method _update (line 42) | _update(widget: HTMLElement, paint: Paint): void {
FILE: src/js/display/time/time-display.ts
class TimeDisplay (line 12) | class TimeDisplay {
method constructor (line 18) | constructor() {
method getPicker (line 28) | getPicker(iconTag: (iconClass: string) => HTMLElement): HTMLElement {
method _update (line 42) | _update(widget: HTMLElement): void {
method _grid (line 171) | private _grid(iconTag: (iconClass: string) => HTMLElement): HTMLElemen...
FILE: src/js/jQuery-provider.js
constant JQUERY_NO_CONFLICT (line 148) | const JQUERY_NO_CONFLICT = $.fn[name];
FILE: src/js/tempus-dominus.ts
class TempusDominus (line 33) | class TempusDominus {
method constructor (line 45) | constructor(element: HTMLElement, options: Options = {} as Options) {
method viewDate (line 82) | get viewDate() {
method viewDate (line 86) | set viewDate(value) {
method updateOptions (line 103) | updateOptions(options, reset = false): void {
method toggle (line 118) | toggle(): void {
method show (line 128) | show(): void {
method hide (line 138) | hide(): void {
method disable (line 147) | disable(): void {
method enable (line 160) | enable(): void {
method clear (line 170) | clear(): void {
method subscribe (line 182) | subscribe(
method dispose (line 230) | dispose() {
method locale (line 265) | locale(language: string) {
method _triggerEvent (line 279) | private _triggerEvent(event: BaseEvent) {
method _publish (line 329) | private _publish(event: BaseEvent) {
method _viewUpdate (line 345) | private _viewUpdate() {
method _unsubscribe (line 352) | private _unsubscribe(eventName, index) {
method _initializeOptions (line 363) | private _initializeOptions(
method _initializeInput (line 451) | private _initializeInput() {
method _initializeToggle (line 487) | private _initializeToggle() {
method _handleAfterChangeEvent (line 515) | private _handleAfterChangeEvent(e: ChangeEvent) {
method _handleToggleKeydown (line 613) | private _handleToggleKeydown(event: KeyboardEvent) {
FILE: src/js/utilities/action-types.ts
type ActionTypes (line 1) | enum ActionTypes {
FILE: src/js/utilities/errors.ts
class TdError (line 1) | class TdError extends Error {
class ErrorMessages (line 5) | class ErrorMessages {
method unexpectedOption (line 14) | unexpectedOption(optionName: string) {
method unexpectedOptions (line 26) | unexpectedOptions(optionName: string[]) {
method unexpectedOptionValue (line 40) | unexpectedOptionValue(
method typeMismatch (line 64) | typeMismatch(optionName: string, badType: string, expectedType: string) {
method numbersOutOfRange (line 79) | numbersOutOfRange(optionName: string, lower: number, upper: number) {
method failedToParseDate (line 95) | failedToParseDate(optionName: string, date: any, soft = false) {
method mustProvideElement (line 107) | mustProvideElement() {
method subscribeMismatch (line 117) | subscribeMismatch() {
method conflictingConfiguration (line 128) | conflictingConfiguration(message?: string) {
method customDateFormatError (line 139) | customDateFormatError(message?: string) {
method dateString (line 149) | dateString() {
method deprecatedWarning (line 155) | deprecatedWarning(message: string, remediation?: string) {
method throwError (line 161) | throwError(message) {
FILE: src/js/utilities/event-emitter.ts
type ViewUpdateValues (line 5) | type ViewUpdateValues = Unit | 'decade' | 'clock' | 'calendar' | 'all';
class EventEmitter (line 7) | class EventEmitter<T> {
method subscribe (line 10) | subscribe(callback: (value: T) => void) {
method unsubscribe (line 15) | unsubscribe(index: number) {
method emit (line 19) | emit(value?: T) {
method destroy (line 25) | destroy() {
class EventEmitters (line 31) | class EventEmitters {
method destroy (line 38) | destroy() {
FILE: src/js/utilities/event-types.ts
type BaseEvent (line 4) | interface BaseEvent {
type ParseErrorEvent (line 9) | interface ParseErrorEvent extends BaseEvent {
type FailEvent (line 19) | interface FailEvent extends BaseEvent {
type HideEvent (line 28) | interface HideEvent extends BaseEvent {
type ChangeEvent (line 35) | interface ChangeEvent extends BaseEvent {
type ViewUpdateEvent (line 45) | interface ViewUpdateEvent extends BaseEvent {
FILE: src/js/utilities/namespace.ts
constant NAME (line 3) | const NAME = 'tempus-dominus',
class Events (line 9) | class Events {
class Css (line 51) | class Css {
class Namespace (line 284) | class Namespace {
FILE: src/js/utilities/optionConverter.ts
class OptionConverter (line 13) | class OptionConverter {
method deepCopy (line 22) | static deepCopy(input): Options {
method objectPath (line 58) | static objectPath(paths: string, obj) {
method spread (line 81) | static spread(provided, copyTo, localization: FormatLocalization, path...
method processKey (line 147) | static processKey(
method _mergeOptions (line 165) | static _mergeOptions(providedOptions: Options, mergeTo: Options): Opti...
method _dataToOptions (line 178) | static _dataToOptions(element, options: Options): Options {
method normalizeObject (line 236) | private static normalizeObject(objectToNormalized: (object) => object) {
method _dateTypeCheck (line 274) | static _dateTypeCheck(
method _typeCheckDateArray (line 288) | static _typeCheckDateArray(
method _typeCheckNumberArray (line 303) | static _typeCheckNumberArray(
method dateConversion (line 317) | static dateConversion(
method getFlattenDefaultOptions (line 327) | private static getFlattenDefaultOptions(): string[] {
method _validateConflicts (line 348) | static _validateConflicts(config: Options) {
FILE: src/js/utilities/optionProcessor.ts
type OptionProcessorFunctionArguments (line 9) | interface OptionProcessorFunctionArguments {
type OptionProcessorFunction (line 18) | type OptionProcessorFunction = (
function mandatoryDate (line 23) | function mandatoryDate(key: string): OptionProcessorFunction {
function optionalDate (line 33) | function optionalDate(key: string): OptionProcessorFunction {
function numbersInRange (line 43) | function numbersInRange(
function validHourRange (line 59) | function validHourRange(key: string): OptionProcessorFunction {
function validDateArray (line 63) | function validDateArray(key: string): OptionProcessorFunction {
function validKeyOption (line 73) | function validKeyOption(keyOptions: string[]): OptionProcessorFunction {
function processKey (line 182) | function processKey(this: void, args: OptionProcessorFunctionArguments) {
FILE: src/js/utilities/options.ts
type Options (line 4) | interface Options {
type FormatLocalization (line 68) | interface FormatLocalization {
type Localization (line 83) | interface Localization extends FormatLocalization {
FILE: src/js/utilities/optionsStore.ts
class OptionsStore (line 6) | class OptionsStore {
method currentCalendarViewMode (line 14) | get currentCalendarViewMode() {
method currentCalendarViewMode (line 18) | set currentCalendarViewMode(value) {
method viewDate (line 25) | get viewDate() {
method viewDate (line 29) | set viewDate(v) {
method refreshCurrentView (line 38) | refreshCurrentView() {
method isTwelveHour (line 45) | get isTwelveHour() {
FILE: src/js/utilities/service-locator.ts
type Constructable (line 2) | type Constructable<T> = new (...args: any[]) => T;
class ServiceLocator (line 4) | class ServiceLocator {
method locate (line 7) | locate<T>(identifier: Constructable<T>): T {
FILE: src/js/utilities/typeChecker.ts
function tryConvertToDateTime (line 12) | function tryConvertToDateTime(
function convertToDateTime (line 38) | function convertToDateTime(
function typeCheckDateArray (line 67) | function typeCheckDateArray(
function typeCheckNumberArray (line 95) | function typeCheckNumberArray(
FILE: src/js/utilities/view-mode.ts
type ViewMode (line 1) | type ViewMode = {
FILE: src/js/validation.ts
class Validation (line 8) | class Validation {
method constructor (line 11) | constructor() {
method isValid (line 21) | isValid(targetDate: DateTime, granularity?: Unit): boolean {
method _enabledDisabledDatesIsValid (line 55) | private _enabledDisabledDatesIsValid(
method _isInDisabledDates (line 85) | private _isInDisabledDates(testDate: DateTime) {
method _isInEnabledDates (line 103) | private _isInEnabledDates(testDate: DateTime) {
method _minMaxIsValid (line 115) | private _minMaxIsValid(granularity: Unit, targetDate: DateTime) {
method _enabledDisabledHoursIsValid (line 140) | private _enabledDisabledHoursIsValid(targetDate: DateTime) {
method _isInDisabledHours (line 165) | private _isInDisabledHours(testDate: DateTime) {
method _isInEnabledHours (line 184) | private _isInEnabledHours(testDate: DateTime) {
method dateRangeIsValid (line 197) | dateRangeIsValid(dates: DateTime[], index: number, target: DateTime) {
FILE: test/fixtures/dates.fixture.ts
class FixtureDates (line 7) | class FixtureDates {
method lastPicked (line 10) | get lastPicked(): DateTime {
method lastPickedIndex (line 14) | get lastPickedIndex(): number {
method picked (line 21) | get picked(): DateTime[] {
method add (line 27) | add(value) {
method clear (line 31) | clear() {
method setValue (line 41) | setValue(value, index) {
FILE: test/fixtures/display.fixture.ts
class FixtureDisplay (line 3) | class FixtureDisplay {
method _iconTag (line 11) | _iconTag() {
method _hasDateAndTime (line 20) | get _hasDateAndTime(): boolean {
FILE: test/fixtures/eventemitters.fixture.ts
class FixtureEventEmitters (line 10) | class FixtureEventEmitters {
FILE: test/fixtures/optionStore.fixture.ts
class FixtureOptionsStore (line 6) | class FixtureOptionsStore {
method reset (line 18) | reset() {
FILE: test/fixtures/serviceLocator.fixture.ts
type MockLoad (line 3) | type MockLoad = { [key: string]: Constructable<any> };
class FixtureServiceLocator (line 5) | class FixtureServiceLocator {
method locate (line 8) | locate<T>(identifier: Constructable<T>): T {
method load (line 14) | load(name: string, service: Constructable<any>) {
method loadEach (line 18) | loadEach(toLoad: MockLoad) {
FILE: test/fixtures/validation.fixture.ts
class FixtureValidation (line 3) | class FixtureValidation {
FILE: test/utilities/serviceLocator.test.ts
class MyService (line 7) | class MyService {
method constructor (line 10) | constructor() {
Condensed preview — 169 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (796K chars).
[
{
"path": ".eslintignore",
"chars": 71,
"preview": "**/dist/\n**/docs/\n**/coverage/\n**/.husky/\n**/types/\n**/build/\n**/test/\n"
},
{
"path": ".eslintrc.yml",
"chars": 314,
"preview": "env:\n browser: true\n es2021: true\nextends:\n - eslint:recommended\n - plugin:@typescript-eslint/recommended\n - pretti"
},
{
"path": ".gitattributes",
"chars": 2518,
"preview": "###############################################################################\n# Set default behavior to automatically "
},
{
"path": ".github/CONTRIBUTING.md",
"chars": 1884,
"preview": "# Submitting Issues\n\nIf you are submitting a bug, please test and/or fork [this StackBlitz](https://stackblitz.com/edit/"
},
{
"path": ".github/FUNDING.yml",
"chars": 80,
"preview": "# These are supported funding model platforms\n\ngithub: eonasdan\nko_fi: eonasdan\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 3148,
"preview": "name: Report a bug\ndescription: Tell us about your issue.\ntitle: \"Provide a general summary of the issue\"\nlabels: [\"Type"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 174,
"preview": "contact_links:\n - name: Ask a question\n url: https://github.com/Eonasdan/tempus-dominus/discussions/new\n about: A"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE",
"chars": 671,
"preview": "PRs relating to the v4 will be closed and locked.\n\n* **Please check if the PR fulfills these requirements**\n- [ ] Tests "
},
{
"path": ".github/workflows/base/action.yaml",
"chars": 388,
"preview": "name: Setup Node\ndescription: Setup node\n\ninputs:\n registry:\n description: 'A Github PAT'\n default: 'https://regi"
},
{
"path": ".github/workflows/build/action.yaml",
"chars": 600,
"preview": "name: Build\ndescription: Build\n\ninputs:\n GITHUB_TOKEN:\n description: 'A Github PAT'\n required: true\n SONAR_TOKEN"
},
{
"path": ".github/workflows/codeql-analysis.yml",
"chars": 2331,
"preview": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# Y"
},
{
"path": ".github/workflows/docs/action.yaml",
"chars": 321,
"preview": "name: Deploy Docs\n\ninputs:\n GITHUB_TOKEN:\n description: 'A Github PAT'\n required: true\n\nruns:\n using: composite\n"
},
{
"path": ".github/workflows/docs.yaml",
"chars": 518,
"preview": "name: Publish Docs\non:\n workflow_dispatch:\njobs:\n docs:\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n "
},
{
"path": ".github/workflows/feature-branch.yaml",
"chars": 1838,
"preview": "name: Feature Branch Publish Package\n\non:\n push:\n branches:\n - 'feature/*'\n - 'bug/*'\n - development\n"
},
{
"path": ".github/workflows/nuget/action.yaml",
"chars": 840,
"preview": "name: Nuget Publish\ndescription: Setup node\n\ninputs:\n NUGET_API_KEY:\n description: 'A Nuget API Key'\n required: t"
},
{
"path": ".github/workflows/nuget.yml",
"chars": 519,
"preview": "name: Publish Nuget\non:\n workflow_dispatch:\njobs:\n build:\n runs-on: windows-latest\n steps:\n - name: Checkou"
},
{
"path": ".github/workflows/pr.yml",
"chars": 509,
"preview": "name: Pull Request\non:\n push:\n branches: [ development ]\n pull_request:\n branches: [ development ]\n workflow_di"
},
{
"path": ".github/workflows/publish.yml",
"chars": 893,
"preview": "name: Publish Package\non:\n release:\n types: [ created ]\n workflow_dispatch:\njobs:\n publish:\n runs-on: ubuntu-la"
},
{
"path": ".github/workflows/release/action.yaml",
"chars": 634,
"preview": "name: Release\ndescription: Release\n\ninputs:\n GITHUB_TOKEN:\n description: 'A Github PAT'\n required: true\n SONAR_T"
},
{
"path": ".github/workflows/stale.yaml",
"chars": 656,
"preview": "name: 'Close stale issues and PRs'\non:\n schedule:\n - cron: '30 1 * * *' #at 1:30 pm\n\njobs:\n stale:\n runs-on: ubu"
},
{
"path": ".gitignore",
"chars": 242,
"preview": "bower_components\nnode_modules\n.idea\n.vs\nobj\nbin\nsite\n*.user\n*.csproj\n*.sln\n*.nupkg\nsrc/docs/partials/examples/test.html\n"
},
{
"path": ".husky/pre-commit",
"chars": 69,
"preview": "#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\nnpx lint-staged\n"
},
{
"path": ".npmignore",
"chars": 118,
"preview": "/assets\n/_includes\n/_layouts\n/.gitignore\n/node_modules\n/test\n*.log\n*.swp\n*~\n*.tgz\n/site\n*.user\n*.csproj\n*.sln\n*.nupkg\n"
},
{
"path": ".prettierignore",
"chars": 40,
"preview": "dist\ndocs\nnode_modules\n.github\ncoverage\n"
},
{
"path": ".prettierrc",
"chars": 105,
"preview": "{\n \"singleQuote\": true,\n \"tabWidth\": 2,\n \"htmlWhitespaceSensitivity\": \"ignore\",\n \"endOfLine\": \"lf\"\n}\n"
},
{
"path": "CNAME",
"chars": 17,
"preview": "getdatepicker.com"
},
{
"path": "LICENSE",
"chars": 1096,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2021 Jonathan Peterson (@Eonasdan)\n\nPermission is hereby granted, free of charge, t"
},
{
"path": "README.md",
"chars": 1824,
"preview": "[](https://ko-fi.com/R6R53OEFF)\n\n# Paid support only\n\nPlease note tha"
},
{
"path": "build/banner.js",
"chars": 357,
"preview": "'use strict';\n\nconst pkg = require('../package.json');\nconst year = new Date().getFullYear();\n\nfunction getBanner() {\n "
},
{
"path": "build/change-version.js",
"chars": 2228,
"preview": "const fs = require('fs');\nconst path = require('path');\nconst globby = require('globby');\n\n// Function to update version"
},
{
"path": "build/plugins.js",
"chars": 2522,
"preview": "const rollup = require('rollup');\nconst genericRollup = require('./rollup-plugin.config');\nconst fs = require('fs').prom"
},
{
"path": "build/rollup-plugin.config.js",
"chars": 849,
"preview": "const typescript = require('rollup-plugin-ts');\nconst ignore = require('rollup-plugin-ignore');\n\nconst banner = require("
},
{
"path": "build/rollup.config.js",
"chars": 1871,
"preview": "const typescript = require('rollup-plugin-ts');\nimport postcss from 'rollup-plugin-postcss';\nimport { terser } from 'rol"
},
{
"path": "build/serve.js",
"chars": 167,
"preview": "const { ParvusServer } = require('@eonasdan/parvus-server');\n\nnew ParvusServer({\n port: 3001,\n directory: `./docs`,\n "
},
{
"path": "build/utilities.js",
"chars": 1307,
"preview": "const fs = require('fs').promises;\nconst { dirname } = require('path');\n\nclass Utilities {\n static async copyFileAndEns"
},
{
"path": "package.json",
"chars": 3754,
"preview": "{\n \"author\": {\n \"name\": \"Jonathan Peterson\"\n },\n \"name\": \"@eonasdan/tempus-dominus\",\n \"version\": \"6.10.3\",\n \"sty"
},
{
"path": "sonar-project.properties",
"chars": 172,
"preview": "sonar.organization=eonasdan\nsonar.projectKey=Eonasdan_tempus-dominus\n\nsonar.projectName=tempus-dominus\nsonar.projectVers"
},
{
"path": "src/docs/assets/no-styles.html",
"chars": 7596,
"preview": "<!DOCTYPE html>\n<html lang='en'>\n<head>\n <meta charset='UTF-8'>\n <meta name='description' content='Examples using Temp"
},
{
"path": "src/docs/assets/repl-data.json",
"chars": 12062,
"preview": "{\n \"note\": \"These are compressed JSON objects of different examples that can be loaded into the REPL code param. They a"
},
{
"path": "src/docs/js/docs.js",
"chars": 276,
"preview": "document.addEventListener('DOMContentLoaded', () => {\n const subToc = document.getElementById('subToc');\n\n if (subToc)"
},
{
"path": "src/docs/js/migration.js",
"chars": 10296,
"preview": "document.addEventListener('DOMContentLoaded', () => {\n if (!document.getElementById('migration')) {\n return;\n }\n\n "
},
{
"path": "src/docs/make.js",
"chars": 18986,
"preview": "const fs = require('fs');\nconst jsdom = require('jsdom');\nconst { JSDOM } = jsdom;\nconst path = require('path');\nconst m"
},
{
"path": "src/docs/partials/change-log-archive.html",
"chars": 19869,
"preview": "<div id=\"page-body\">\n <div class='row'>\n <h2>Beta9</h2>\n <h3>Bug Fixes</h3>\n <ul>\n <li>Fixed jQuery provi"
},
{
"path": "src/docs/partials/change-log.html",
"chars": 6947,
"preview": "<div id=\"page-body\">\n <div id='change-log'>\n <h1>Version 6</h1>\n\n <div class='row'>\n <h2>6.9.4</h2>\n <h"
},
{
"path": "src/docs/partials/datetime.html",
"chars": 779,
"preview": "<div id=\"page-body\">\n <p>\n In v6 I dropped moment as a required library since it is no longer recommended. Almost al"
},
{
"path": "src/docs/partials/examples/index.html",
"chars": 109696,
"preview": "<div id=\"page-body\">\n <meta http-equiv=\"refresh\" content=\"0; URL=https://getdatepicker.com/6/repl.html\">\n <link rel=\"c"
},
{
"path": "src/docs/partials/examples/jquery.html",
"chars": 5389,
"preview": "<div id=\"page-body\">\n <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js'\n integri"
},
{
"path": "src/docs/partials/functions/dates.html",
"chars": 7839,
"preview": "<div id=\"page-body\">\n <div class='row'>\n For the sake of the following documentation, assume there's a picker setup "
},
{
"path": "src/docs/partials/functions/display.html",
"chars": 4052,
"preview": "<div id=\"page-body\">\n <div class='row'>\n For the sake of the following documentation, assume there's a picker setup "
},
{
"path": "src/docs/partials/functions/index.html",
"chars": 6753,
"preview": "<div id=\"page-body\">\n <div class='row'>\n For the sake of the following documentation, assume there's a picker "
},
{
"path": "src/docs/partials/functions.html",
"chars": 674,
"preview": "<div id=\"page-body\">\n <meta http-equiv=\"refresh\" content=\"0; URL=https://getdatepicker.com/6/functions\">\n <link re"
},
{
"path": "src/docs/partials/index.html",
"chars": 1411,
"preview": "<div id=\"page-body\">\n <div class='row'>\n <p class=\"lead mb-4\">\n Tempus Dominus is the successor to the very pop"
},
{
"path": "src/docs/partials/installing.html",
"chars": 2471,
"preview": "<div id=\"page-body\">\n <div class='row'>\n <p>\n No matter how you choose to get the files, make sure that Popper "
},
{
"path": "src/docs/partials/locale.html",
"chars": 3369,
"preview": "<div id=\"page-body\">\n <div class='row'>\n <p>\n The locale files offer a simple way to globally or individually s"
},
{
"path": "src/docs/partials/migration.html",
"chars": 5321,
"preview": "<div id=\"page-body\">\n <div id='migration'>\n <p>\n Version 6 defaults to FA 5 icons (but will switch to FA 6 when"
},
{
"path": "src/docs/partials/namespace/css.html",
"chars": 15373,
"preview": "<div id=\"page-body\">\n <p>\n The picker uses the following css classes to style the picker.\n </p>\n <div class='row'>"
},
{
"path": "src/docs/partials/namespace/errors.html",
"chars": 7477,
"preview": "<div id=\"page-body\">\n <p>\n The date picker will throw errors for a number of different reason. Most errors are relat"
},
{
"path": "src/docs/partials/namespace/events.html",
"chars": 2719,
"preview": "<div id=\"page-body\">\n <div class='row'>\n <p>\n These events may provide additional details. For native javascrip"
},
{
"path": "src/docs/partials/namespace/index.html",
"chars": 1197,
"preview": "<div id=\"page-body\">\n <div class='row'>\n <p>\n Tempus Dominus uses and exposes a Namespace class for consistency"
},
{
"path": "src/docs/partials/namespace/unit.html",
"chars": 599,
"preview": "<div id=\"page-body\">\n <p>\n The picker uses the following enum to represent a breakdown of date/time.\n </p>\n <div c"
},
{
"path": "src/docs/partials/options/display.html",
"chars": 20378,
"preview": "<div id=\"page-body\">\n <p id='overview'>\n The display options allow you to control much of the picker's look and feel"
},
{
"path": "src/docs/partials/options/index.html",
"chars": 12464,
"preview": "<div id=\"page-body\">\n <p id='overview'>\n Options can be provided during the initial setup through the constructor <c"
},
{
"path": "src/docs/partials/options/keyboard-navigation.html",
"chars": 10178,
"preview": "<div id=\"page-body\">\n <p id='overview'>\n Thanks to\n <a href=\"www.dimagi.com\" target=\"_blank\" rel=\"noopener norefe"
},
{
"path": "src/docs/partials/options/localization.html",
"chars": 19910,
"preview": "<div id=\"page-body\">\n <div class='row' id='overview'>\n <div class='col'>\n <p>\n Most of the localization "
},
{
"path": "src/docs/partials/options/restrictions.html",
"chars": 6132,
"preview": "<div id=\"page-body\">\n <p id='overview'>\n Restrictions allow you to prevent users from selected dates or times based "
},
{
"path": "src/docs/partials/options.html",
"chars": 519,
"preview": "<div id=\"page-body\">\n <meta http-equiv=\"refresh\" content=\"0; URL=https://getdatepicker.com/6/options\">\n <link rel="
},
{
"path": "src/docs/partials/plugins/bi1.html",
"chars": 4065,
"preview": "<div id=\"page-body\">\n <div class='row'>\n <p>\n You can use this plugin to set the global default icons to Bootst"
},
{
"path": "src/docs/partials/plugins/customDateFormat.html",
"chars": 5911,
"preview": "<div id=\"page-body\">\n <div class='row'>\n <div class='alert alert-info'>\n <i class=\"fa-solid fa-exclamation\"></i"
},
{
"path": "src/docs/partials/plugins/fa5.html",
"chars": 4509,
"preview": "<div id=\"page-body\">\n <div class='row'>\n <p>\n You can use this plugin to set the global default icons to FA5. T"
},
{
"path": "src/docs/partials/plugins/floating-ui.html",
"chars": 1177,
"preview": "<div id='page-body'>\n <div class='row'>\n <h3>Floating UI</h3>\n <p>\n By default, @popperJS/core is required f"
},
{
"path": "src/docs/partials/plugins/index.html",
"chars": 3515,
"preview": "<div id=\"page-body\">\n <div class='row'>\n <h3>Introduction</h3>\n <p>\n Plugins allow you to extend the picker "
},
{
"path": "src/docs/partials/plugins/moment.html",
"chars": 3327,
"preview": "<div id='page-body'>\n <div class='row'>\n <p>\n If you still need to use moment.js, you can load this plugin to u"
},
{
"path": "src/docs/partials/plugins/paint.html",
"chars": 2570,
"preview": "<div id=\"page-body\">\n <div class='row'>\n <p>\n You can customize the css classes applied to dates by overwriting"
},
{
"path": "src/docs/partials/repl.html",
"chars": 9504,
"preview": "<div id=\"page-body\">\n <div id='embed'></div>\n\n <script src=\"https://cdn.jsdelivr.net/npm/@stackblitz/sdk@1.9.0/bundles"
},
{
"path": "src/docs/site-config.json",
"chars": 64,
"preview": "{\n \"root\": \"https://getdatepicker.com\",\n \"output\" : \"docs/6\"\n}"
},
{
"path": "src/docs/styles/bs5_docs.scss",
"chars": 8819,
"preview": "/*!\n * Bootstrap Docs (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Tw"
},
{
"path": "src/docs/styles/styles.scss",
"chars": 3738,
"preview": "@use \"../../../node_modules/bootstrap/scss/bootstrap.scss\";\n@use \"bs5_docs\";\n@import \"https://fonts.googleapis.com/css?f"
},
{
"path": "src/docs/templates/404.html",
"chars": 499,
"preview": "<!-- ##### Archive List Posts Area Start ##### -->\n<div class=\"archive-list-posts-area mb-80 mt-3\">\n <div class=\"cont"
},
{
"path": "src/docs/templates/index.html",
"chars": 6710,
"preview": "<main>\n <div class='bd-masthead mb-3' id='content'>\n <div class='container-xxl bd-gutter'>\n <div class='col-md-"
},
{
"path": "src/docs/templates/page-template.html",
"chars": 5335,
"preview": "<aside class='bd-sidebar'>\n <nav class='collapse bd-links' id='bd-docs-nav' aria-label='Docs navigation'>\n <ul class"
},
{
"path": "src/docs/templates/post-loop.html",
"chars": 883,
"preview": "<div class=\"single-post-area style-2\">\n <div class=\"row align-items-center\">\n <div class=\"col-12 col-md-6\">\n "
},
{
"path": "src/docs/templates/shell.html",
"chars": 14146,
"preview": "<!DOCTYPE html>\n<html lang='en'>\n\n<head>\n <meta charset='UTF-8'>\n <meta name='description' content='A robust and power"
},
{
"path": "src/js/actions.ts",
"chars": 12144,
"preview": "import { DateTime, Unit } from './datetime';\nimport Collapse from './display/collapse';\nimport Namespace from './utiliti"
},
{
"path": "src/js/dates.ts",
"chars": 8531,
"preview": "import { DateTime, getFormatByUnit, Unit } from './datetime';\nimport Namespace from './utilities/namespace';\nimport {\n "
},
{
"path": "src/js/datetime.ts",
"chars": 28240,
"preview": "import { FormatLocalization } from './utilities/options';\nimport Namespace from './utilities/namespace';\nimport DefaultF"
},
{
"path": "src/js/display/calendar/date-display.ts",
"chars": 11775,
"preview": "import { DateTime, Unit } from '../../datetime';\nimport Namespace from '../../utilities/namespace';\nimport Validation fr"
},
{
"path": "src/js/display/calendar/decade-display.ts",
"chars": 4404,
"preview": "import Dates from '../../dates';\nimport { DateTime, Unit } from '../../datetime';\nimport Namespace from '../../utilities"
},
{
"path": "src/js/display/calendar/month-display.ts",
"chars": 3450,
"preview": "import { Unit } from '../../datetime';\nimport Namespace from '../../utilities/namespace';\nimport Validation from '../../"
},
{
"path": "src/js/display/calendar/year-display.ts",
"chars": 3649,
"preview": "import { DateTime, Unit } from '../../datetime';\nimport Namespace from '../../utilities/namespace';\nimport Dates from '."
},
{
"path": "src/js/display/collapse.ts",
"chars": 3736,
"preview": "import Namespace from '../utilities/namespace';\n\n/**\n * Provides a collapse functionality to the view changes\n */\nexport"
},
{
"path": "src/js/display/index.ts",
"chars": 36681,
"preview": "import DateDisplay from './calendar/date-display';\nimport MonthDisplay from './calendar/month-display';\nimport YearDispl"
},
{
"path": "src/js/display/time/hour-display.ts",
"chars": 2345,
"preview": "import { Unit } from '../../datetime';\nimport Namespace from '../../utilities/namespace';\nimport Validation from '../../"
},
{
"path": "src/js/display/time/minute-display.ts",
"chars": 2407,
"preview": "import { Unit } from '../../datetime';\nimport Namespace from '../../utilities/namespace';\nimport Validation from '../../"
},
{
"path": "src/js/display/time/second-display.ts",
"chars": 2155,
"preview": "import { Unit } from '../../datetime';\nimport Namespace from '../../utilities/namespace';\nimport Validation from '../../"
},
{
"path": "src/js/display/time/time-display.ts",
"chars": 10958,
"preview": "import { Unit } from '../../datetime';\nimport Namespace from '../../utilities/namespace';\nimport Validation from '../../"
},
{
"path": "src/js/jQuery-provider.js",
"chars": 4789,
"preview": "///<reference src=\"js/tempus-dominus\"/>\n/*global $, tempusDominus */\n\n/*!\n * Tempus Dominus v6.10.3 (https://getdatepick"
},
{
"path": "src/js/locales/ar-SA.ts",
"chars": 1147,
"preview": "const name = 'ar-SA';\n\nconst localization = {\n today: 'اليوم',\n clear: 'مسح',\n close: 'إغلاق',\n selectMonth: 'اختر ا"
},
{
"path": "src/js/locales/ar.ts",
"chars": 1139,
"preview": "const name = 'ar';\n\nconst localization = {\n today: 'اليوم',\n clear: 'مسح',\n close: 'إغلاق',\n selectMonth: 'اختر الشه"
},
{
"path": "src/js/locales/ca.ts",
"chars": 1282,
"preview": "const name = 'ca';\n\nconst localization = {\n today: 'Avui',\n clear: 'Esborrar selecció',\n close: 'Tancar selector',\n "
},
{
"path": "src/js/locales/cs.ts",
"chars": 1270,
"preview": "const name = 'cs';\n\nconst localization = {\n today: 'Dnes',\n clear: 'Vymazat výběr',\n close: 'Zavřít výběrové okno',\n "
},
{
"path": "src/js/locales/de.ts",
"chars": 1272,
"preview": "const name = 'de';\n\nconst localization = {\n today: 'Heute',\n clear: 'Auswahl löschen',\n close: 'Auswahlbox schließen'"
},
{
"path": "src/js/locales/es.ts",
"chars": 1288,
"preview": "const name = 'es';\n\nconst localization = {\n today: 'Hoy',\n clear: 'Borrar selección',\n close: 'Cerrar selector',\n se"
},
{
"path": "src/js/locales/fi.ts",
"chars": 1306,
"preview": "const name = 'fi';\n\nconst localization = {\n today: 'Tänään',\n clear: 'Tyhjennä',\n close: 'Sulje',\n selectMonth: 'Val"
},
{
"path": "src/js/locales/fr.ts",
"chars": 1413,
"preview": "const name = 'fr';\n\nconst localization = {\n today: \"Aujourd'hui\",\n clear: 'Effacer la sélection',\n close: 'Fermer',\n "
},
{
"path": "src/js/locales/hr.ts",
"chars": 1265,
"preview": "const name = 'hr';\n\nconst localization = {\n today: 'Danas',\n clear: 'Poništi odabir',\n close: 'Zatvori',\n selectMont"
},
{
"path": "src/js/locales/hy.ts",
"chars": 1218,
"preview": "const name = 'hy';\n\nconst localization = {\n today: 'Այսօր',\n clear: 'Ջնջել ընտրվածը',\n close: 'Փակել',\n selectMonth:"
},
{
"path": "src/js/locales/it.ts",
"chars": 1299,
"preview": "const name = 'it';\n\nconst localization = {\n today: 'Oggi',\n clear: 'Cancella selezione',\n close: 'Chiudi',\n selectMo"
},
{
"path": "src/js/locales/nl.ts",
"chars": 1318,
"preview": "const name = 'nl';\n\nconst localization = {\n today: 'Vandaag',\n clear: 'Verwijder selectie',\n close: 'Sluit de picker'"
},
{
"path": "src/js/locales/pl.ts",
"chars": 1255,
"preview": "const name = 'pl';\n\nconst localization = {\n today: 'Dzisiaj',\n clear: 'Wyczyść',\n close: 'Zamknij',\n selectMonth: 'W"
},
{
"path": "src/js/locales/pt-PT.ts",
"chars": 1287,
"preview": "const name = 'pt-PT';\n\nconst localization = {\n today: 'Hoje',\n clear: 'Limpar seleção',\n close: 'Eliminar seleção',\n "
},
{
"path": "src/js/locales/ro.ts",
"chars": 1302,
"preview": "const name = 'ro';\n\nconst localization = {\n today: 'Mergi la ziua de astăzi',\n clear: 'Șterge selecția',\n close: 'Înc"
},
{
"path": "src/js/locales/ru.ts",
"chars": 1293,
"preview": "const name = 'ru';\n\nconst localization = {\n today: 'Перейти сегодня',\n clear: 'Очистить выделение',\n close: 'Закрыть "
},
{
"path": "src/js/locales/sk.ts",
"chars": 1295,
"preview": "const name = 'sk';\n\nconst localization = {\n today: 'Dnes',\n clear: 'Vymazať výber',\n close: 'Zavrieť výberové okno',\n"
},
{
"path": "src/js/locales/sl.ts",
"chars": 1253,
"preview": "const name = 'sl';\n\nconst localization = {\n today: 'Danes',\n clear: 'Počisti',\n close: 'Zapri',\n selectMonth: 'Izber"
},
{
"path": "src/js/locales/sr-Latn.ts",
"chars": 1239,
"preview": "const name = 'sr-Latn';\n\nconst localization = {\n today: 'Danas',\n clear: 'Izbriši izbor',\n close: 'Zatvori',\n select"
},
{
"path": "src/js/locales/sr.ts",
"chars": 1226,
"preview": "const name = 'sr';\n\nconst localization = {\n today: 'Данас',\n clear: 'Избриши избор',\n close: 'Затвори',\n selectMonth"
},
{
"path": "src/js/locales/tr.ts",
"chars": 1192,
"preview": "const name = 'tr';\n\nconst localization = {\n today: 'Bugün',\n clear: 'Temizle',\n close: 'Kapat',\n selectMonth: 'Ay se"
},
{
"path": "src/js/locales/uk.ts",
"chars": 1270,
"preview": "const name = 'uk';\n\nconst localization = {\n today: 'Сьогодні',\n clear: 'Очистити',\n close: 'Закрити',\n selectMonth: "
},
{
"path": "src/js/locales/zh-CN.ts",
"chars": 970,
"preview": "const name = 'zh-CN';\n\nconst localization = {\n today: '今天',\n clear: '清空',\n close: '关闭',\n selectMonth: '选择月份',\n prev"
},
{
"path": "src/js/locales/zh-HK.ts",
"chars": 970,
"preview": "const name = 'zh-HK';\n\nconst localization = {\n today: '今天',\n clear: '清空',\n close: '關閉',\n selectMonth: '選擇月份',\n prev"
},
{
"path": "src/js/locales/zh-MO.ts",
"chars": 970,
"preview": "const name = 'zh-MO';\n\nconst localization = {\n today: '今天',\n clear: '清空',\n close: '關閉',\n selectMonth: '選擇月份',\n prev"
},
{
"path": "src/js/locales/zh-TW.ts",
"chars": 970,
"preview": "const name = 'zh-TW';\n\nconst localization = {\n today: '今天',\n clear: '清空',\n close: '關閉',\n selectMonth: '選擇月份',\n prev"
},
{
"path": "src/js/plugins/bi-one/index.ts",
"chars": 527,
"preview": "// this obviously requires the Bootstrap Icons v1 libraries to be loaded\n\nconst biOneIcons = {\n type: 'icons',\n time: "
},
{
"path": "src/js/plugins/customDateFormat/index.ts",
"chars": 129,
"preview": "export default () => {\n console.warn(\n 'This plugin has been merged with the main picker and is now longer required'"
},
{
"path": "src/js/plugins/examples/custom-paint-job.ts",
"chars": 422,
"preview": "/* eslint-disable */\n// noinspection JSUnusedGlobalSymbols\nexport default (option, tdClasses, tdFactory) => {\n // noins"
},
{
"path": "src/js/plugins/examples/sample.ts",
"chars": 819,
"preview": "// noinspection JSUnusedGlobalSymbols\n\nexport default (option, tdClasses, tdFactory) => {\n // extend the picker\n // e."
},
{
"path": "src/js/plugins/fa-five/index.ts",
"chars": 524,
"preview": "// this obviously requires the FA 6 libraries to be loaded\n\nconst faFiveIcons = {\n type: 'icons',\n time: 'fas fa-clock"
},
{
"path": "src/js/plugins/moment-parse/index.ts",
"chars": 629,
"preview": "//obviously, loading moment js is required.\ndeclare let moment;\nexport default (option, tdClasses, tdFactory) => {\n tdC"
},
{
"path": "src/js/tempus-dominus.ts",
"chars": 20088,
"preview": "import Display from './display/index';\nimport Dates from './dates';\nimport Actions from './actions';\nimport {\n DateTime"
},
{
"path": "src/js/utilities/action-types.ts",
"chars": 833,
"preview": "enum ActionTypes {\n next = 'next',\n previous = 'previous',\n changeCalendarView = 'changeCalendarView',\n selectMonth "
},
{
"path": "src/js/utilities/calendar-modes.ts",
"chars": 690,
"preview": "import { Unit } from '../datetime';\nimport Namespace from './namespace';\nimport ViewMode from './view-mode';\n\nconst Cale"
},
{
"path": "src/js/utilities/default-format-localization.ts",
"chars": 543,
"preview": "import { FormatLocalization } from './options';\n\nconst DefaultFormatLocalization: FormatLocalization = {\n dateFormats: "
},
{
"path": "src/js/utilities/default-options.ts",
"chars": 3101,
"preview": "import Options, { Localization } from './options';\nimport { DateTime } from '../datetime';\nimport DefaultFormatLocalizat"
},
{
"path": "src/js/utilities/errors.ts",
"chars": 5098,
"preview": "export class TdError extends Error {\n code: number;\n}\n\nexport class ErrorMessages {\n private base = 'TD:';\n\n //#regio"
},
{
"path": "src/js/utilities/event-emitter.ts",
"chars": 1218,
"preview": "import { DateTime, Unit } from '../datetime';\nimport ActionTypes from './action-types';\nimport { BaseEvent } from './eve"
},
{
"path": "src/js/utilities/event-types.ts",
"chars": 989,
"preview": "import { DateTime } from '../datetime';\nimport ViewMode from './view-mode';\n\ninterface BaseEvent {\n type: string;\n vie"
},
{
"path": "src/js/utilities/namespace.ts",
"chars": 6255,
"preview": "import { ErrorMessages } from './errors';\n// this is not the way I want this to stay but nested classes seemed to blown "
},
{
"path": "src/js/utilities/optionConverter.ts",
"chars": 11385,
"preview": "import Namespace from './namespace';\nimport { DateTime } from '../datetime';\nimport DefaultOptions from './default-optio"
},
{
"path": "src/js/utilities/optionProcessor.ts",
"chars": 5510,
"preview": "import Namespace from './namespace';\nimport type { FormatLocalization } from './options';\nimport {\n convertToDateTime,\n"
},
{
"path": "src/js/utilities/options.ts",
"chars": 2907,
"preview": "import { DateTime, DateTimeFormatOptions } from '../datetime';\nimport ViewMode from './view-mode';\n\nexport default inter"
},
{
"path": "src/js/utilities/optionsStore.ts",
"chars": 1142,
"preview": "import { DateTime } from '../datetime';\nimport CalendarModes from './calendar-modes';\nimport ViewMode from './view-mode'"
},
{
"path": "src/js/utilities/service-locator.ts",
"chars": 592,
"preview": "//eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport declare type Constructable<T> = new (...args: any[]"
},
{
"path": "src/js/utilities/typeChecker.ts",
"chars": 3176,
"preview": "import Namespace from './namespace';\nimport { DateTime } from '../datetime';\nimport { FormatLocalization } from './optio"
},
{
"path": "src/js/utilities/view-mode.ts",
"chars": 98,
"preview": "type ViewMode = {\n clock;\n calendar;\n months;\n years;\n decades;\n};\n\nexport default ViewMode;\n"
},
{
"path": "src/js/validation.ts",
"chars": 6402,
"preview": "import { DateTime, Unit } from './datetime';\nimport { serviceLocator } from './utilities/service-locator';\nimport { Opti"
},
{
"path": "src/nuget/TempusDominus.nuspec",
"chars": 1483,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n <"
},
{
"path": "src/nuget/TempusDominus.scss.nuspec",
"chars": 1502,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n <"
},
{
"path": "src/scss/_variables.scss",
"chars": 3239,
"preview": "@use 'sass:color';\n\n$td-light: #fff !default;\n$td-widget-background: $td-light !default;\n$td-font-color: #000 !default;\n"
},
{
"path": "src/scss/tempus-dominus.scss",
"chars": 9994,
"preview": "@import 'variables';\n\n.visually-hidden {\n position: absolute !important;\n width: 1px !important;\n height: 1px !import"
},
{
"path": "test/actions.test.ts",
"chars": 18034,
"preview": "import {\n createElementWithClasses,\n loadFixtures,\n newDate,\n reset,\n store,\n} from './test-utilities';\nimport { af"
},
{
"path": "test/dates.test.ts",
"chars": 8899,
"preview": "import {\n loadFixtures,\n newDate,\n newDateMinute,\n newDateStringMinute,\n reset,\n secondaryDate,\n store,\n} from '."
},
{
"path": "test/datetime.test.ts",
"chars": 15946,
"preview": "/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport {\n defaultLocalization,\n newDate,\n newDateStringMinute"
},
{
"path": "test/fixtures/dates.fixture.ts",
"chars": 1025,
"preview": "import { vi } from 'vitest';\nimport { DateTime } from '../../src/js/datetime';\nimport { EventEmitters } from '../../src/"
},
{
"path": "test/fixtures/display.fixture.ts",
"chars": 451,
"preview": "import { vi } from 'vitest';\n\nexport class FixtureDisplay {\n _showMode = vi.fn();\n _updateCalendarHeader = vi.fn();\n "
},
{
"path": "test/fixtures/eventemitters.fixture.ts",
"chars": 362,
"preview": "import { vi } from 'vitest';\n\nconst fakeEmitter = () => ({\n emit: vi.fn(),\n subscribe: vi.fn(),\n unsubscribe: vi.fn()"
},
{
"path": "test/fixtures/optionStore.fixture.ts",
"chars": 812,
"preview": "import { OptionConverter } from '../../src/js/utilities/optionConverter';\nimport DefaultOptions from '../../src/js/utili"
},
{
"path": "test/fixtures/serviceLocator.fixture.ts",
"chars": 643,
"preview": "import { Constructable } from '../../src/js/utilities/service-locator';\n\nexport declare type MockLoad = { [key: string]:"
},
{
"path": "test/fixtures/validation.fixture.ts",
"chars": 116,
"preview": "import { vi } from 'vitest';\n\nexport class FixtureValidation {\n isValid = vi.fn();\n dateRangeIsValid = vi.fn();\n}\n"
},
{
"path": "test/tempus-dominus.test.ts",
"chars": 1135,
"preview": "import { beforeEach, expect, test } from 'vitest';\nimport { TempusDominus } from '../src/js/tempus-dominus';\n\nbeforeEach"
},
{
"path": "test/test-import.ts",
"chars": 348,
"preview": "import { TempusDominus, version, extend } from '../src/js/tempus-dominus';\n//import { localization } from '../src/locale"
},
{
"path": "test/test-utilities.ts",
"chars": 1901,
"preview": "import { DateTime, Unit } from '../src/js/datetime';\nimport { OptionsStore } from '../src/js/utilities/optionsStore';\nim"
},
{
"path": "test/utilities/optionProccessor.test.ts",
"chars": 9630,
"preview": "import {\n newDate,\n newDateMinute,\n secondaryDate,\n defaultLocalization,\n} from '../test-utilities';\nimport { expect"
},
{
"path": "test/utilities/optionStore.test.ts",
"chars": 1528,
"preview": "import { newDate, secondaryDate } from '../test-utilities';\nimport { beforeEach, expect, test } from 'vitest';\nimport { "
},
{
"path": "test/utilities/serviceLocator.test.ts",
"chars": 854,
"preview": "import { afterEach, expect, test, vi } from 'vitest';\nimport {\n serviceLocator,\n setupServiceLocator,\n} from '../../sr"
},
{
"path": "test/utilities/typeCechker.test.ts",
"chars": 2577,
"preview": "import {\n newDate,\n newDateMinute,\n vanillaDate,\n secondaryDate,\n defaultLocalization,\n} from '../test-utilities';\n"
},
{
"path": "test/validation.test.ts",
"chars": 8133,
"preview": "/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { newDate, reset, store } from './test-utilities';\nimport"
},
{
"path": "tsconfig.json",
"chars": 655,
"preview": "{\n \"compilerOptions\": {\n \"module\": \"ES2020\",\n \"target\": \"ES2020\",\n \"lib\": [\n \"es6\",\n \"dom\",\n \"e"
},
{
"path": "vite.config.ts",
"chars": 529,
"preview": "import { defineConfig } from 'vitest/config';\nimport GithubActionsReporter from 'vitest-github-actions-reporter';\n\nexpor"
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the Eonasdan/tempus-dominus GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 169 files (743.2 KB), approximately 207.1k tokens, and a symbol index with 346 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.