diff --git a/.Rbuildignore b/.Rbuildignore index 5c3fc844..2d2f1e2a 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -9,4 +9,5 @@ compare_versions .github docs ^LICENSE$ -^inst/doc/.*\.pdf$ \ No newline at end of file +^inst/doc/.*\.pdf$ +.lintr \ No newline at end of file diff --git a/.gitignore b/.gitignore index 31d5a6fd..62bf4e8a 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,10 @@ inst/results.json # Other .DS_Store +# Visual Studio Code +.vscode/ +.lintr + errorReport.txt output/ results/ @@ -35,7 +39,6 @@ thresholds/ hs_err_pid*.log docs/Gemfile docs/Gemfile.lock -sql vignettes/*.log /doc/ /Meta/ diff --git a/DESCRIPTION b/DESCRIPTION index 0f0e746c..1087fc1f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Package: DataQualityDashboard Type: Package Title: Execute and View Data Quality Checks on OMOP CDM Database -Version: 2.5.0 -Date: 2023-11-04 +Version: 2.6.0 +Date: 2024-02-21 Authors@R: c( person("Katy", "Sadowski", email = "sadowski@ohdsi.org", role = c("aut", "cre")), person("Clair", "Blacketer", role = c("aut")), diff --git a/NEWS.md b/NEWS.md index 33d2149e..1e2cc31e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,24 @@ +DataQualityDashboard 2.6.0 +========================== +This release includes: + +### New Checks +4 new data quality check types have been added in this release: + +- `plausibleStartBeforeEnd`: The number and percent of records with a value in the **cdmFieldName** field of the **cdmTableName** that occurs after the date in the **plausibleStartBeforeEndFieldName**. +- `plausibleAfterBirth`: The number and percent of records with a date value in the **cdmFieldName** field of the **cdmTableName** table that occurs prior to birth. +- `plausibleBeforeDeath`: The number and percent of records with a date value in the **cdmFieldName** field of the **cdmTableName** table that occurs after death. +- `plausibleGenderUseDescendants`: For descendants of CONCEPT_ID **conceptId** (**conceptName**), the number and percent of records associated with patients with an implausible gender (correct gender = **plausibleGenderUseDescendants**). + +The 3 temporal plausibilty checks are intended to **replace** `plausibleTemporalAfter` and `plausibleDuringLife`, for a more comprehensive and clear approach to various temporality scenarios. `plausibleGenderUseDescendants` is intended to **replace** `plausibleGender`, to enhance readability of the DQD results and improve performance. The replaced checks are still available and enabled by default in DQD; however, in a future major release, these checks will be deprecated. Please plan accordingly. + +For more information on the new checks, please check the [Check Type Definitions](https://ohdsi.github.io/DataQualityDashboard/articles/CheckTypeDescriptions.html) documentation page. If you'd like to disable the deprecated checks, please see the suggested check exclusion workflow in our Getting Started code [here](https://ohdsi.github.io/DataQualityDashboard/articles/DataQualityDashboard.html). + +### New Documentation +We have begun an initiative to add more comprehensive user documentation at the data quality check level. A dedicated documentation page is being created for each check type. Each check's page will include detailed information about how its result is generated and what to do if it fails. Guidance is provided for both ETL developers and data users. + +9 pages have been added so far, and the rest will come in a future release. Check them out [here](https://ohdsi.github.io/DataQualityDashboard/articles/checkIndex.html) and please reach out with feedback as we continue improving our documentation! + DataQualityDashboard 2.5.0 ========================== This release includes: diff --git a/R/constants.R b/R/constants.R index 9d502957..b62710e6 100644 --- a/R/constants.R +++ b/R/constants.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # diff --git a/R/convertResultsCase.R b/R/convertResultsCase.R index 0efa1f5e..b461956c 100644 --- a/R/convertResultsCase.R +++ b/R/convertResultsCase.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # diff --git a/R/evaluateThresholds.R b/R/evaluateThresholds.R index 55b57891..21280ba0 100644 --- a/R/evaluateThresholds.R +++ b/R/evaluateThresholds.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # @@ -78,7 +78,28 @@ checkResults[i, ]$cdmFieldName ) } else if (checkResults[i, ]$checkLevel == "CONCEPT") { - if (is.na(checkResults[i, ]$unitConceptId)) { + if (is.na(checkResults[i, ]$unitConceptId) && + grepl(",", checkResults[i, ]$conceptId)) { + thresholdFilter <- sprintf( + "conceptChecks$%s[conceptChecks$cdmTableName == '%s' & + conceptChecks$cdmFieldName == '%s' & + conceptChecks$conceptId == '%s']", + thresholdField, + checkResults[i, ]$cdmTableName, + checkResults[i, ]$cdmFieldName, + checkResults[i, ]$conceptId + ) + notesFilter <- sprintf( + "conceptChecks$%s[conceptChecks$cdmTableName == '%s' & + conceptChecks$cdmFieldName == '%s' & + conceptChecks$conceptId == '%s']", + notesField, + checkResults[i, ]$cdmTableName, + checkResults[i, ]$cdmFieldName, + checkResults[i, ]$conceptId + ) + } else if (is.na(checkResults[i, ]$unitConceptId) && + !grepl(",", checkResults[i, ]$conceptId)) { thresholdFilter <- sprintf( "conceptChecks$%s[conceptChecks$cdmTableName == '%s' & conceptChecks$cdmFieldName == '%s' & diff --git a/R/executeDqChecks.R b/R/executeDqChecks.R index 178e0ab4..4b0569f7 100644 --- a/R/executeDqChecks.R +++ b/R/executeDqChecks.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # @@ -123,6 +123,7 @@ executeDqChecks <- function(connectionDetails, } } + # temporary patch to work around vroom 1.6.4 bug readr::local_edition(1) @@ -258,6 +259,18 @@ executeDqChecks <- function(connectionDetails, stop("No checks are available based on excluded tables. Please review tablesToExclude.") } + if ("plausibleDuringLife" %in% checkDescriptionsDf$checkName) { + warning("DEPRECATION WARNING - The plausibleDuringLife check has been reimplemented with the plausibleBeforeDeath check.") + } + + if ("plausibleTemporalAfter" %in% checkDescriptionsDf$checkName) { + warning("DEPRECATION WARNING - The plausibleTemporalAfter check has been reimplemented with the plausibleAfterBirth and plausibleStartBeforeEnd checks.") + } + + if ("plausibleGender" %in% checkDescriptionsDf$checkName) { + warning("DEPRECATION WARNING - The plausibleGender check has been reimplemented with the plausibleGenderUseDescendants check.") + } + checkDescriptions <- split(checkDescriptionsDf, seq_len(nrow(checkDescriptionsDf))) connection <- NULL diff --git a/R/getCheckId.R b/R/getCheckId.R index 52a2592e..e7c8baa0 100644 --- a/R/getCheckId.R +++ b/R/getCheckId.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # diff --git a/R/listChecks.R b/R/listChecks.R index 6e286a29..5dc32393 100644 --- a/R/listChecks.R +++ b/R/listChecks.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # diff --git a/R/processCheck.R b/R/processCheck.R index 984a00fb..1c890165 100644 --- a/R/processCheck.R +++ b/R/processCheck.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # diff --git a/R/reEvaluateThresholds.R b/R/reEvaluateThresholds.R index 9b93fbb9..a3974be3 100644 --- a/R/reEvaluateThresholds.R +++ b/R/reEvaluateThresholds.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # diff --git a/R/readThresholdFile.R b/R/readThresholdFile.R index d53574a7..bd38b9cd 100644 --- a/R/readThresholdFile.R +++ b/R/readThresholdFile.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # diff --git a/R/recordResult.R b/R/recordResult.R index 7317e6d6..70e52d1c 100644 --- a/R/recordResult.R +++ b/R/recordResult.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # diff --git a/R/runCheck.R b/R/runCheck.R index e4e2bd78..892b4104 100644 --- a/R/runCheck.R +++ b/R/runCheck.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # diff --git a/R/sqlOnly.R b/R/sqlOnly.R index 74219902..fa4cf286 100644 --- a/R/sqlOnly.R +++ b/R/sqlOnly.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # diff --git a/R/summarizeResults.R b/R/summarizeResults.R index 94916e03..8e070477 100644 --- a/R/summarizeResults.R +++ b/R/summarizeResults.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # diff --git a/R/view.R b/R/view.R index 1304459a..fbcb8126 100644 --- a/R/view.R +++ b/R/view.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # diff --git a/R/writeDBResultsTo.R b/R/writeDBResultsTo.R index 2b4e446a..6d19175f 100644 --- a/R/writeDBResultsTo.R +++ b/R/writeDBResultsTo.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # diff --git a/R/writeJsonResultsTo.R b/R/writeJsonResultsTo.R index 869539b6..08b68b0c 100644 --- a/R/writeJsonResultsTo.R +++ b/R/writeJsonResultsTo.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # diff --git a/R/writeResultsTo.R b/R/writeResultsTo.R index 53b6295d..e4c93e1e 100644 --- a/R/writeResultsTo.R +++ b/R/writeResultsTo.R @@ -1,4 +1,4 @@ -# Copyright 2023 Observational Health Data Sciences and Informatics +# Copyright 2024 Observational Health Data Sciences and Informatics # # This file is part of DataQualityDashboard # diff --git a/_pkgdown.yml b/_pkgdown.yml index 63139cb3..e1dc440b 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -16,6 +16,7 @@ navbar: - intro - reference - articles + - checks - news right: [hades, github] components: @@ -31,6 +32,44 @@ navbar: news: text: Changelog href: news/index.html + articles: + text: Articles + menu: + - text: Check Type Definitions + href: articles/CheckTypeDescriptions.html + - text: DQ Check Failure Thresholds + href: articles/Thresholds.html + - text: DQ Check Statuses + href: articles/CheckStatusDefinitions.html + - text: Adding a New Data Quality Check + href: articles/AddNewCheck.html + - text: DQD for Cohorts + href: articles/DqdForCohorts.html + - text: SQL-only Mode + href: articles/SqlOnly.html + checks: + text: NEW! Data Quality Check Types + menu: + - text: Index + href: articles/checkIndex.html + - text: cdmTable + href: articles/checks/cdmTable.html + - text: cdmField + href: articles/checks/cdmField.html + - text: cdmDatatype + href: articles/checks/cdmDatatype.html + - text: isPrimaryKey + href: articles/checks/isPrimaryKey.html + - text: isForeignKey + href: articles/checks/isForeignKey.html + - text: isRequired + href: articles/checks/isRequired.html + - text: fkDomain + href: articles/checks/fkDomain.html + - text: fkClass + href: articles/checks/fkClass.html + - text: plausibleAfterBirth + href: articles/checks/plausibleAfterBirth.html hades: text: hadesLogo href: https://ohdsi.github.io/Hades @@ -67,3 +106,5 @@ reference: desc: > Function to write DQD results from a database table into a JSON file contents: writeDBResultsToJson + +url: https://ohdsi.github.io/DataQualityDashboard/ diff --git a/docs/404.html b/docs/404.html index 727f16f7..24d94dbd 100644 --- a/docs/404.html +++ b/docs/404.html @@ -7,11 +7,11 @@ Page not found (404) • DataQualityDashboard - - + + - - + + - - - - - - - -Page not found (404) • DataQualityDashboard - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
-
- - -Content not found. Please use links in the navbar. - -
- - - -
- - - - -
- - - - - - - - diff --git a/docs/_site/LICENSE-text.html b/docs/_site/LICENSE-text.html deleted file mode 100644 index 8b816135..00000000 --- a/docs/_site/LICENSE-text.html +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - - - -License • DataQualityDashboard - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
-
- - -
                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
- -
- - - -
- - - - -
- - - - - - - - diff --git a/docs/_site/assets/css/style.css b/docs/_site/assets/css/style.css deleted file mode 100644 index bc2033b3..00000000 --- a/docs/_site/assets/css/style.css +++ /dev/null @@ -1,2883 +0,0 @@ -/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */ -/** 1. Change the default font family in all browsers (opinionated). 2. Prevent adjustments of font size after orientation changes in IE and iOS. */ -html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ } - -/** Remove the margin in all browsers (opinionated). */ -body { margin: 0; } - -/* HTML5 display definitions ========================================================================== */ -/** Add the correct display in IE 9-. 1. Add the correct display in Edge, IE, and Firefox. 2. Add the correct display in IE. */ -article, aside, details, figcaption, figure, footer, header, main, menu, nav, section { /* 1 */ display: block; } - -summary { display: list-item; } - -/** Add the correct display in IE 9-. */ -audio, canvas, progress, video { display: inline-block; } - -/** Add the correct display in iOS 4-7. */ -audio:not([controls]) { display: none; height: 0; } - -/** Add the correct vertical alignment in Chrome, Firefox, and Opera. */ -progress { vertical-align: baseline; } - -/** Add the correct display in IE 10-. 1. Add the correct display in IE. */ -template, [hidden] { display: none !important; } - -/* Links ========================================================================== */ -/** Remove the gray background on active links in IE 10. */ -a { background-color: transparent; /* 1 */ } - -/** Remove the outline on focused links when they are also active or hovered in all browsers (opinionated). */ -a:active, a:hover { outline-width: 0; } - -/* Text-level semantics ========================================================================== */ -/** 1. Remove the bottom border in Firefox 39-. 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. */ -abbr[title] { border-bottom: none; /* 1 */ text-decoration: underline; /* 2 */ text-decoration: underline dotted; /* 2 */ } - -/** Prevent the duplicate application of `bolder` by the next rule in Safari 6. */ -b, strong { font-weight: inherit; } - -/** Add the correct font weight in Chrome, Edge, and Safari. */ -b, strong { font-weight: bolder; } - -/** Add the correct font style in Android 4.3-. */ -dfn { font-style: italic; } - -/** Correct the font size and margin on `h1` elements within `section` and `article` contexts in Chrome, Firefox, and Safari. */ -h1 { font-size: 2em; margin: 0.67em 0; } - -/** Add the correct background and color in IE 9-. */ -mark { background-color: #ff0; color: #000; } - -/** Add the correct font size in all browsers. */ -small { font-size: 80%; } - -/** Prevent `sub` and `sup` elements from affecting the line height in all browsers. */ -sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } - -sub { bottom: -0.25em; } - -sup { top: -0.5em; } - -/* Embedded content ========================================================================== */ -/** Remove the border on images inside links in IE 10-. */ -img { border-style: none; } - -/** Hide the overflow in IE. */ -svg:not(:root) { overflow: hidden; } - -/* Grouping content ========================================================================== */ -/** 1. Correct the inheritance and scaling of font size in all browsers. 2. Correct the odd `em` font sizing in all browsers. */ -code, kbd, pre, samp { font-family: monospace, monospace; /* 1 */ font-size: 1em; /* 2 */ } - -/** Add the correct margin in IE 8. */ -figure { margin: 1em 40px; } - -/** 1. Add the correct box sizing in Firefox. 2. Show the overflow in Edge and IE. */ -hr { box-sizing: content-box; /* 1 */ height: 0; /* 1 */ overflow: visible; /* 2 */ } - -/* Forms ========================================================================== */ -/** 1. Change font properties to `inherit` in all browsers (opinionated). 2. Remove the margin in Firefox and Safari. */ -button, input, select, textarea { font: inherit; /* 1 */ margin: 0; /* 2 */ } - -/** Restore the font weight unset by the previous rule. */ -optgroup { font-weight: bold; } - -/** Show the overflow in IE. 1. Show the overflow in Edge. */ -button, input { /* 1 */ overflow: visible; } - -/** Remove the inheritance of text transform in Edge, Firefox, and IE. 1. Remove the inheritance of text transform in Firefox. */ -button, select { /* 1 */ text-transform: none; } - -/** 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` controls in Android 4. 2. Correct the inability to style clickable types in iOS and Safari. */ -button, html [type="button"], [type="reset"], [type="submit"] { -webkit-appearance: button; /* 2 */ } - -/** Remove the inner border and padding in Firefox. */ -button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { border-style: none; padding: 0; } - -/** Restore the focus styles unset by the previous rule. */ -button:-moz-focusring, [type="button"]:-moz-focusring, [type="reset"]:-moz-focusring, [type="submit"]:-moz-focusring { outline: 1px dotted ButtonText; } - -/** Change the border, margin, and padding in all browsers (opinionated). */ -fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } - -/** 1. Correct the text wrapping in Edge and IE. 2. Correct the color inheritance from `fieldset` elements in IE. 3. Remove the padding so developers are not caught out when they zero out `fieldset` elements in all browsers. */ -legend { box-sizing: border-box; /* 1 */ color: inherit; /* 2 */ display: table; /* 1 */ max-width: 100%; /* 1 */ padding: 0; /* 3 */ white-space: normal; /* 1 */ } - -/** Remove the default vertical scrollbar in IE. */ -textarea { overflow: auto; } - -/** 1. Add the correct box sizing in IE 10-. 2. Remove the padding in IE 10-. */ -[type="checkbox"], [type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } - -/** Correct the cursor style of increment and decrement buttons in Chrome. */ -[type="number"]::-webkit-inner-spin-button, [type="number"]::-webkit-outer-spin-button { height: auto; } - -/** 1. Correct the odd appearance in Chrome and Safari. 2. Correct the outline style in Safari. */ -[type="search"] { -webkit-appearance: textfield; /* 1 */ outline-offset: -2px; /* 2 */ } - -/** Remove the inner padding and cancel buttons in Chrome and Safari on OS X. */ -[type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration { -webkit-appearance: none; } - -/** Correct the text style of placeholders in Chrome, Edge, and Safari. */ -::-webkit-input-placeholder { color: inherit; opacity: 0.54; } - -/** 1. Correct the inability to style clickable types in iOS and Safari. 2. Change font properties to `inherit` in Safari. */ -::-webkit-file-upload-button { -webkit-appearance: button; /* 1 */ font: inherit; /* 2 */ } - -* { box-sizing: border-box; } - -input, select, textarea, button { font-family: inherit; font-size: inherit; line-height: inherit; } - -body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; line-height: 1.5; color: #24292e; background-color: #fff; } - -a { color: #0366d6; text-decoration: none; } -a:hover { text-decoration: underline; } - -b, strong { font-weight: 600; } - -hr, .rule { height: 0; margin: 15px 0; overflow: hidden; background: transparent; border: 0; border-bottom: 1px solid #dfe2e5; } -hr::before, .rule::before { display: table; content: ""; } -hr::after, .rule::after { display: table; clear: both; content: ""; } - -table { border-spacing: 0; border-collapse: collapse; } - -td, th { padding: 0; } - -button { cursor: pointer; border-radius: 0; } - -[hidden][hidden] { display: none !important; } - -details summary { cursor: pointer; } -details:not([open]) > *:not(summary) { display: none !important; } - -h1, h2, h3, h4, h5, h6 { margin-top: 0; margin-bottom: 0; } - -h1 { font-size: 32px; font-weight: 600; } - -h2 { font-size: 24px; font-weight: 600; } - -h3 { font-size: 20px; font-weight: 600; } - -h4 { font-size: 16px; font-weight: 600; } - -h5 { font-size: 14px; font-weight: 600; } - -h6 { font-size: 12px; font-weight: 600; } - -p { margin-top: 0; margin-bottom: 10px; } - -small { font-size: 90%; } - -blockquote { margin: 0; } - -ul, ol { padding-left: 0; margin-top: 0; margin-bottom: 0; } - -ol ol, ul ol { list-style-type: lower-roman; } - -ul ul ol, ul ol ol, ol ul ol, ol ol ol { list-style-type: lower-alpha; } - -dd { margin-left: 0; } - -tt, code { font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; } - -pre { margin-top: 0; margin-bottom: 0; font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; } - -.octicon { vertical-align: text-bottom; } - -/* Fade in an element */ -.anim-fade-in { animation-name: fade-in; animation-duration: 1s; animation-timing-function: ease-in-out; } -.anim-fade-in.fast { animation-duration: 300ms; } - -@keyframes fade-in { 0% { opacity: 0; } - 100% { opacity: 1; } } -/* Fade out an element */ -.anim-fade-out { animation-name: fade-out; animation-duration: 1s; animation-timing-function: ease-out; } -.anim-fade-out.fast { animation-duration: 0.3s; } - -@keyframes fade-out { 0% { opacity: 1; } - 100% { opacity: 0; } } -/* Fade in and slide up an element */ -.anim-fade-up { opacity: 0; animation-name: fade-up; animation-duration: 0.3s; animation-fill-mode: forwards; animation-timing-function: ease-out; animation-delay: 1s; } - -@keyframes fade-up { 0% { opacity: 0.8; transform: translateY(100%); } - 100% { opacity: 1; transform: translateY(0); } } -/* Fade an element out and slide down */ -.anim-fade-down { animation-name: fade-down; animation-duration: 0.3s; animation-fill-mode: forwards; animation-timing-function: ease-in; } - -@keyframes fade-down { 0% { opacity: 1; transform: translateY(0); } - 100% { opacity: 0.5; transform: translateY(100%); } } -/* Grow an element width from 0 to 100% */ -.anim-grow-x { width: 0%; animation-name: grow-x; animation-duration: 0.3s; animation-fill-mode: forwards; animation-timing-function: ease; animation-delay: 0.5s; } - -@keyframes grow-x { to { width: 100%; } } -/* Shrink an element from 100% to 0% */ -.anim-shrink-x { animation-name: shrink-x; animation-duration: 0.3s; animation-fill-mode: forwards; animation-timing-function: ease-in-out; animation-delay: 0.5s; } - -@keyframes shrink-x { to { width: 0%; } } -/* Fade in an element and scale it fast */ -.anim-scale-in { animation-name: scale-in; animation-duration: 0.15s; animation-timing-function: cubic-bezier(0.2, 0, 0.13, 1.5); } - -@keyframes scale-in { 0% { opacity: 0; transform: scale(0.5); } - 100% { opacity: 1; transform: scale(1); } } -/* Pulse an element's opacity */ -.anim-pulse { animation-name: pulse; animation-duration: 2s; animation-timing-function: linear; animation-iteration-count: infinite; } - -@keyframes pulse { 0% { opacity: 0.3; } - 10% { opacity: 1; } - 100% { opacity: 0.3; } } -/* Pulse in an element */ -.anim-pulse-in { animation-name: pulse-in; animation-duration: 0.5s; } - -@keyframes pulse-in { 0% { transform: scale3d(1, 1, 1); } - 50% { transform: scale3d(1.1, 1.1, 1.1); } - 100% { transform: scale3d(1, 1, 1); } } -/* Increase scale of an element on hover */ -.hover-grow { transition: transform 0.3s; backface-visibility: hidden; } -.hover-grow:hover { transform: scale(1.025); } - -/* Add a gray border on all sides */ -.border { border: 1px #e1e4e8 solid !important; } - -/* Add a gray border to the left and right */ -.border-y { border-top: 1px #e1e4e8 solid !important; border-bottom: 1px #e1e4e8 solid !important; } - -/* Remove borders from all sides */ -.border-0 { border: 0 !important; } - -.border-dashed { border-style: dashed !important; } - -/* Use with .border to turn the border blue */ -.border-blue { border-color: #0366d6 !important; } - -/* Use with .border to turn the border blue-light */ -.border-blue-light { border-color: #c8e1ff !important; } - -/* Use with .border to turn the border green */ -.border-green { border-color: #34d058 !important; } - -/* Use with .border to turn the border green light */ -.border-green-light { border-color: #a2cbac !important; } - -/* Use with .border to turn the border red */ -.border-red { border-color: #d73a49 !important; } - -/* Use with .border to turn the border red-light */ -.border-red-light { border-color: #cea0a5 !important; } - -/* Use with .border to turn the border purple */ -.border-purple { border-color: #6f42c1 !important; } - -/* Use with .border to turn the border yellow */ -.border-yellow { border-color: #d9d0a5 !important; } - -/* Use with .border to turn the border gray-light */ -.border-gray-light { border-color: #eaecef !important; } - -/* Use with .border to turn the border gray-dark */ -.border-gray-dark { border-color: #d1d5da !important; } - -/* Use with .border to turn the border rgba black 0.15 */ -.border-black-fade { border-color: rgba(27, 31, 35, 0.15) !important; } - -/* Add a gray border */ -/* Add a gray border to the top */ -.border-top { border-top: 1px #e1e4e8 solid !important; } - -/* Add a gray border to the right */ -.border-right { border-right: 1px #e1e4e8 solid !important; } - -/* Add a gray border to the bottom */ -.border-bottom { border-bottom: 1px #e1e4e8 solid !important; } - -/* Add a gray border to the left */ -.border-left { border-left: 1px #e1e4e8 solid !important; } - -/* Remove the top border */ -.border-top-0 { border-top: 0 !important; } - -/* Remove the right border */ -.border-right-0 { border-right: 0 !important; } - -/* Remove the bottom border */ -.border-bottom-0 { border-bottom: 0 !important; } - -/* Remove the left border */ -.border-left-0 { border-left: 0 !important; } - -/* Remove the border-radius */ -.rounded-0 { border-radius: 0 !important; } - -/* Add a border-radius to all corners */ -.rounded-1 { border-radius: 3px !important; } - -/* Add a 2x border-radius to all corners */ -.rounded-2 { border-radius: 6px !important; } - -.rounded-top-0 { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } - -.rounded-top-1 { border-top-left-radius: 3px !important; border-top-right-radius: 3px !important; } - -.rounded-top-2 { border-top-left-radius: 6px !important; border-top-right-radius: 6px !important; } - -.rounded-right-0 { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } - -.rounded-right-1 { border-top-right-radius: 3px !important; border-bottom-right-radius: 3px !important; } - -.rounded-right-2 { border-top-right-radius: 6px !important; border-bottom-right-radius: 6px !important; } - -.rounded-bottom-0 { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } - -.rounded-bottom-1 { border-bottom-right-radius: 3px !important; border-bottom-left-radius: 3px !important; } - -.rounded-bottom-2 { border-bottom-right-radius: 6px !important; border-bottom-left-radius: 6px !important; } - -.rounded-left-0 { border-bottom-left-radius: 0 !important; border-top-left-radius: 0 !important; } - -.rounded-left-1 { border-bottom-left-radius: 3px !important; border-top-left-radius: 3px !important; } - -.rounded-left-2 { border-bottom-left-radius: 6px !important; border-top-left-radius: 6px !important; } - -@media (min-width: 544px) { /* Add a gray border */ - /* Add a gray border to the top */ - .border-sm-top { border-top: 1px #e1e4e8 solid !important; } - /* Add a gray border to the right */ - .border-sm-right { border-right: 1px #e1e4e8 solid !important; } - /* Add a gray border to the bottom */ - .border-sm-bottom { border-bottom: 1px #e1e4e8 solid !important; } - /* Add a gray border to the left */ - .border-sm-left { border-left: 1px #e1e4e8 solid !important; } - /* Remove the top border */ - .border-sm-top-0 { border-top: 0 !important; } - /* Remove the right border */ - .border-sm-right-0 { border-right: 0 !important; } - /* Remove the bottom border */ - .border-sm-bottom-0 { border-bottom: 0 !important; } - /* Remove the left border */ - .border-sm-left-0 { border-left: 0 !important; } - /* Remove the border-radius */ - .rounded-sm-0 { border-radius: 0 !important; } - /* Add a border-radius to all corners */ - .rounded-sm-1 { border-radius: 3px !important; } - /* Add a 2x border-radius to all corners */ - .rounded-sm-2 { border-radius: 6px !important; } - .rounded-sm-top-0 { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } - .rounded-sm-top-1 { border-top-left-radius: 3px !important; border-top-right-radius: 3px !important; } - .rounded-sm-top-2 { border-top-left-radius: 6px !important; border-top-right-radius: 6px !important; } - .rounded-sm-right-0 { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } - .rounded-sm-right-1 { border-top-right-radius: 3px !important; border-bottom-right-radius: 3px !important; } - .rounded-sm-right-2 { border-top-right-radius: 6px !important; border-bottom-right-radius: 6px !important; } - .rounded-sm-bottom-0 { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } - .rounded-sm-bottom-1 { border-bottom-right-radius: 3px !important; border-bottom-left-radius: 3px !important; } - .rounded-sm-bottom-2 { border-bottom-right-radius: 6px !important; border-bottom-left-radius: 6px !important; } - .rounded-sm-left-0 { border-bottom-left-radius: 0 !important; border-top-left-radius: 0 !important; } - .rounded-sm-left-1 { border-bottom-left-radius: 3px !important; border-top-left-radius: 3px !important; } - .rounded-sm-left-2 { border-bottom-left-radius: 6px !important; border-top-left-radius: 6px !important; } } -@media (min-width: 768px) { /* Add a gray border */ - /* Add a gray border to the top */ - .border-md-top { border-top: 1px #e1e4e8 solid !important; } - /* Add a gray border to the right */ - .border-md-right { border-right: 1px #e1e4e8 solid !important; } - /* Add a gray border to the bottom */ - .border-md-bottom { border-bottom: 1px #e1e4e8 solid !important; } - /* Add a gray border to the left */ - .border-md-left { border-left: 1px #e1e4e8 solid !important; } - /* Remove the top border */ - .border-md-top-0 { border-top: 0 !important; } - /* Remove the right border */ - .border-md-right-0 { border-right: 0 !important; } - /* Remove the bottom border */ - .border-md-bottom-0 { border-bottom: 0 !important; } - /* Remove the left border */ - .border-md-left-0 { border-left: 0 !important; } - /* Remove the border-radius */ - .rounded-md-0 { border-radius: 0 !important; } - /* Add a border-radius to all corners */ - .rounded-md-1 { border-radius: 3px !important; } - /* Add a 2x border-radius to all corners */ - .rounded-md-2 { border-radius: 6px !important; } - .rounded-md-top-0 { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } - .rounded-md-top-1 { border-top-left-radius: 3px !important; border-top-right-radius: 3px !important; } - .rounded-md-top-2 { border-top-left-radius: 6px !important; border-top-right-radius: 6px !important; } - .rounded-md-right-0 { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } - .rounded-md-right-1 { border-top-right-radius: 3px !important; border-bottom-right-radius: 3px !important; } - .rounded-md-right-2 { border-top-right-radius: 6px !important; border-bottom-right-radius: 6px !important; } - .rounded-md-bottom-0 { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } - .rounded-md-bottom-1 { border-bottom-right-radius: 3px !important; border-bottom-left-radius: 3px !important; } - .rounded-md-bottom-2 { border-bottom-right-radius: 6px !important; border-bottom-left-radius: 6px !important; } - .rounded-md-left-0 { border-bottom-left-radius: 0 !important; border-top-left-radius: 0 !important; } - .rounded-md-left-1 { border-bottom-left-radius: 3px !important; border-top-left-radius: 3px !important; } - .rounded-md-left-2 { border-bottom-left-radius: 6px !important; border-top-left-radius: 6px !important; } } -@media (min-width: 1012px) { /* Add a gray border */ - /* Add a gray border to the top */ - .border-lg-top { border-top: 1px #e1e4e8 solid !important; } - /* Add a gray border to the right */ - .border-lg-right { border-right: 1px #e1e4e8 solid !important; } - /* Add a gray border to the bottom */ - .border-lg-bottom { border-bottom: 1px #e1e4e8 solid !important; } - /* Add a gray border to the left */ - .border-lg-left { border-left: 1px #e1e4e8 solid !important; } - /* Remove the top border */ - .border-lg-top-0 { border-top: 0 !important; } - /* Remove the right border */ - .border-lg-right-0 { border-right: 0 !important; } - /* Remove the bottom border */ - .border-lg-bottom-0 { border-bottom: 0 !important; } - /* Remove the left border */ - .border-lg-left-0 { border-left: 0 !important; } - /* Remove the border-radius */ - .rounded-lg-0 { border-radius: 0 !important; } - /* Add a border-radius to all corners */ - .rounded-lg-1 { border-radius: 3px !important; } - /* Add a 2x border-radius to all corners */ - .rounded-lg-2 { border-radius: 6px !important; } - .rounded-lg-top-0 { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } - .rounded-lg-top-1 { border-top-left-radius: 3px !important; border-top-right-radius: 3px !important; } - .rounded-lg-top-2 { border-top-left-radius: 6px !important; border-top-right-radius: 6px !important; } - .rounded-lg-right-0 { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } - .rounded-lg-right-1 { border-top-right-radius: 3px !important; border-bottom-right-radius: 3px !important; } - .rounded-lg-right-2 { border-top-right-radius: 6px !important; border-bottom-right-radius: 6px !important; } - .rounded-lg-bottom-0 { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } - .rounded-lg-bottom-1 { border-bottom-right-radius: 3px !important; border-bottom-left-radius: 3px !important; } - .rounded-lg-bottom-2 { border-bottom-right-radius: 6px !important; border-bottom-left-radius: 6px !important; } - .rounded-lg-left-0 { border-bottom-left-radius: 0 !important; border-top-left-radius: 0 !important; } - .rounded-lg-left-1 { border-bottom-left-radius: 3px !important; border-top-left-radius: 3px !important; } - .rounded-lg-left-2 { border-bottom-left-radius: 6px !important; border-top-left-radius: 6px !important; } } -@media (min-width: 1280px) { /* Add a gray border */ - /* Add a gray border to the top */ - .border-xl-top { border-top: 1px #e1e4e8 solid !important; } - /* Add a gray border to the right */ - .border-xl-right { border-right: 1px #e1e4e8 solid !important; } - /* Add a gray border to the bottom */ - .border-xl-bottom { border-bottom: 1px #e1e4e8 solid !important; } - /* Add a gray border to the left */ - .border-xl-left { border-left: 1px #e1e4e8 solid !important; } - /* Remove the top border */ - .border-xl-top-0 { border-top: 0 !important; } - /* Remove the right border */ - .border-xl-right-0 { border-right: 0 !important; } - /* Remove the bottom border */ - .border-xl-bottom-0 { border-bottom: 0 !important; } - /* Remove the left border */ - .border-xl-left-0 { border-left: 0 !important; } - /* Remove the border-radius */ - .rounded-xl-0 { border-radius: 0 !important; } - /* Add a border-radius to all corners */ - .rounded-xl-1 { border-radius: 3px !important; } - /* Add a 2x border-radius to all corners */ - .rounded-xl-2 { border-radius: 6px !important; } - .rounded-xl-top-0 { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } - .rounded-xl-top-1 { border-top-left-radius: 3px !important; border-top-right-radius: 3px !important; } - .rounded-xl-top-2 { border-top-left-radius: 6px !important; border-top-right-radius: 6px !important; } - .rounded-xl-right-0 { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } - .rounded-xl-right-1 { border-top-right-radius: 3px !important; border-bottom-right-radius: 3px !important; } - .rounded-xl-right-2 { border-top-right-radius: 6px !important; border-bottom-right-radius: 6px !important; } - .rounded-xl-bottom-0 { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } - .rounded-xl-bottom-1 { border-bottom-right-radius: 3px !important; border-bottom-left-radius: 3px !important; } - .rounded-xl-bottom-2 { border-bottom-right-radius: 6px !important; border-bottom-left-radius: 6px !important; } - .rounded-xl-left-0 { border-bottom-left-radius: 0 !important; border-top-left-radius: 0 !important; } - .rounded-xl-left-1 { border-bottom-left-radius: 3px !important; border-top-left-radius: 3px !important; } - .rounded-xl-left-2 { border-bottom-left-radius: 6px !important; border-top-left-radius: 6px !important; } } -/* Add a 50% border-radius to make something into a circle */ -.circle { border-radius: 50% !important; } - -.box-shadow { box-shadow: 0 1px 1px rgba(27, 31, 35, 0.1) !important; } - -.box-shadow-medium { box-shadow: 0 1px 5px rgba(27, 31, 35, 0.15) !important; } - -.box-shadow-large { box-shadow: 0 1px 15px rgba(27, 31, 35, 0.15) !important; } - -.box-shadow-extra-large { box-shadow: 0 10px 50px rgba(27, 31, 35, 0.07) !important; } - -.box-shadow-none { box-shadow: none !important; } - -/* Set the background to $bg-white */ -.bg-white { background-color: #fff !important; } - -/* Set the background to $bg-blue */ -.bg-blue { background-color: #0366d6 !important; } - -/* Set the background to $bg-blue-light */ -.bg-blue-light { background-color: #f1f8ff !important; } - -/* Set the background to $bg-gray-dark */ -.bg-gray-dark { background-color: #24292e !important; } - -/* Set the background to $bg-gray */ -.bg-gray { background-color: #f6f8fa !important; } - -/* Set the background to $bg-gray-light */ -.bg-gray-light { background-color: #fafbfc !important; } - -/* Set the background to $bg-green */ -.bg-green { background-color: #28a745 !important; } - -/* Set the background to $bg-green-light */ -.bg-green-light { background-color: #dcffe4 !important; } - -/* Set the background to $bg-red */ -.bg-red { background-color: #d73a49 !important; } - -/* Set the background to $bg-red-light */ -.bg-red-light { background-color: #ffdce0 !important; } - -/* Set the background to $bg-yellow */ -.bg-yellow { background-color: #ffd33d !important; } - -/* Set the background to $bg-yellow-light */ -.bg-yellow-light { background-color: #fff5b1 !important; } - -/* Set the background to $bg-purple */ -.bg-purple { background-color: #6f42c1 !important; } - -/* Set the background to $bg-purple-light */ -.bg-purple-light { background-color: #f5f0ff !important; } - -.bg-shade-gradient { background-image: linear-gradient(180deg, rgba(27, 31, 35, 0.065), rgba(27, 31, 35, 0)) !important; background-repeat: no-repeat !important; background-size: 100% 200px !important; } - -/* Set the text color to $text-blue */ -.text-blue { color: #0366d6 !important; } - -/* Set the text color to $text-red */ -.text-red { color: #cb2431 !important; } - -/* Set the text color to $text-gray-light */ -.text-gray-light { color: #6a737d !important; } - -/* Set the text color to $text-gray */ -.text-gray { color: #586069 !important; } - -/* Set the text color to $text-gray-dark */ -.text-gray-dark { color: #24292e !important; } - -/* Set the text color to $text-green */ -.text-green { color: #28a745 !important; } - -/* Set the text color to $text-orange */ -.text-orange { color: #a04100 !important; } - -/* Set the text color to $text-orange-light */ -.text-orange-light { color: #e36209 !important; } - -/* Set the text color to $text-purple */ -.text-purple { color: #6f42c1 !important; } - -/* Set the text color to $text-white */ -.text-white { color: #fff !important; } - -/* Set the text color to inherit */ -.text-inherit { color: inherit !important; } - -.text-pending { color: #b08800 !important; } - -.bg-pending { color: #dbab09 !important; } - -.link-gray { color: #586069 !important; } -.link-gray:hover { color: #0366d6 !important; } - -.link-gray-dark { color: #24292e !important; } -.link-gray-dark:hover { color: #0366d6 !important; } - -/* Set the link color to $text-blue on hover Useful when you want only part of a link to turn blue on hover */ -.link-hover-blue:hover { color: #0366d6 !important; } - -/* Make a link $text-gray, then $text-blue on hover and removes the underline */ -.muted-link { color: #586069 !important; } -.muted-link:hover { color: #0366d6 !important; text-decoration: none; } - -.details-overlay[open] > summary::before { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 80; display: block; cursor: default; content: " "; background: transparent; } - -.details-overlay-dark[open] > summary::before { z-index: 99; background: rgba(27, 31, 35, 0.5); } - -.flex-row { flex-direction: row !important; } - -.flex-row-reverse { flex-direction: row-reverse !important; } - -.flex-column { flex-direction: column !important; } - -.flex-wrap { flex-wrap: wrap !important; } - -.flex-nowrap { flex-wrap: nowrap !important; } - -.flex-justify-start { justify-content: flex-start !important; } - -.flex-justify-end { justify-content: flex-end !important; } - -.flex-justify-center { justify-content: center !important; } - -.flex-justify-between { justify-content: space-between !important; } - -.flex-justify-around { justify-content: space-around !important; } - -.flex-items-start { align-items: flex-start !important; } - -.flex-items-end { align-items: flex-end !important; } - -.flex-items-center { align-items: center !important; } - -.flex-items-baseline { align-items: baseline !important; } - -.flex-items-stretch { align-items: stretch !important; } - -.flex-content-start { align-content: flex-start !important; } - -.flex-content-end { align-content: flex-end !important; } - -.flex-content-center { align-content: center !important; } - -.flex-content-between { align-content: space-between !important; } - -.flex-content-around { align-content: space-around !important; } - -.flex-content-stretch { align-content: stretch !important; } - -.flex-auto { flex: 1 1 auto !important; } - -.flex-shrink-0 { flex-shrink: 0 !important; } - -.flex-self-auto { align-self: auto !important; } - -.flex-self-start { align-self: flex-start !important; } - -.flex-self-end { align-self: flex-end !important; } - -.flex-self-center { align-self: center !important; } - -.flex-self-baseline { align-self: baseline !important; } - -.flex-self-stretch { align-self: stretch !important; } - -.flex-item-equal { flex-grow: 1; flex-basis: 0; } - -@media (min-width: 544px) { .flex-sm-row { flex-direction: row !important; } - .flex-sm-row-reverse { flex-direction: row-reverse !important; } - .flex-sm-column { flex-direction: column !important; } - .flex-sm-wrap { flex-wrap: wrap !important; } - .flex-sm-nowrap { flex-wrap: nowrap !important; } - .flex-sm-justify-start { justify-content: flex-start !important; } - .flex-sm-justify-end { justify-content: flex-end !important; } - .flex-sm-justify-center { justify-content: center !important; } - .flex-sm-justify-between { justify-content: space-between !important; } - .flex-sm-justify-around { justify-content: space-around !important; } - .flex-sm-items-start { align-items: flex-start !important; } - .flex-sm-items-end { align-items: flex-end !important; } - .flex-sm-items-center { align-items: center !important; } - .flex-sm-items-baseline { align-items: baseline !important; } - .flex-sm-items-stretch { align-items: stretch !important; } - .flex-sm-content-start { align-content: flex-start !important; } - .flex-sm-content-end { align-content: flex-end !important; } - .flex-sm-content-center { align-content: center !important; } - .flex-sm-content-between { align-content: space-between !important; } - .flex-sm-content-around { align-content: space-around !important; } - .flex-sm-content-stretch { align-content: stretch !important; } - .flex-sm-auto { flex: 1 1 auto !important; } - .flex-sm-shrink-0 { flex-shrink: 0 !important; } - .flex-sm-self-auto { align-self: auto !important; } - .flex-sm-self-start { align-self: flex-start !important; } - .flex-sm-self-end { align-self: flex-end !important; } - .flex-sm-self-center { align-self: center !important; } - .flex-sm-self-baseline { align-self: baseline !important; } - .flex-sm-self-stretch { align-self: stretch !important; } - .flex-sm-item-equal { flex-grow: 1; flex-basis: 0; } } -@media (min-width: 768px) { .flex-md-row { flex-direction: row !important; } - .flex-md-row-reverse { flex-direction: row-reverse !important; } - .flex-md-column { flex-direction: column !important; } - .flex-md-wrap { flex-wrap: wrap !important; } - .flex-md-nowrap { flex-wrap: nowrap !important; } - .flex-md-justify-start { justify-content: flex-start !important; } - .flex-md-justify-end { justify-content: flex-end !important; } - .flex-md-justify-center { justify-content: center !important; } - .flex-md-justify-between { justify-content: space-between !important; } - .flex-md-justify-around { justify-content: space-around !important; } - .flex-md-items-start { align-items: flex-start !important; } - .flex-md-items-end { align-items: flex-end !important; } - .flex-md-items-center { align-items: center !important; } - .flex-md-items-baseline { align-items: baseline !important; } - .flex-md-items-stretch { align-items: stretch !important; } - .flex-md-content-start { align-content: flex-start !important; } - .flex-md-content-end { align-content: flex-end !important; } - .flex-md-content-center { align-content: center !important; } - .flex-md-content-between { align-content: space-between !important; } - .flex-md-content-around { align-content: space-around !important; } - .flex-md-content-stretch { align-content: stretch !important; } - .flex-md-auto { flex: 1 1 auto !important; } - .flex-md-shrink-0 { flex-shrink: 0 !important; } - .flex-md-self-auto { align-self: auto !important; } - .flex-md-self-start { align-self: flex-start !important; } - .flex-md-self-end { align-self: flex-end !important; } - .flex-md-self-center { align-self: center !important; } - .flex-md-self-baseline { align-self: baseline !important; } - .flex-md-self-stretch { align-self: stretch !important; } - .flex-md-item-equal { flex-grow: 1; flex-basis: 0; } } -@media (min-width: 1012px) { .flex-lg-row { flex-direction: row !important; } - .flex-lg-row-reverse { flex-direction: row-reverse !important; } - .flex-lg-column { flex-direction: column !important; } - .flex-lg-wrap { flex-wrap: wrap !important; } - .flex-lg-nowrap { flex-wrap: nowrap !important; } - .flex-lg-justify-start { justify-content: flex-start !important; } - .flex-lg-justify-end { justify-content: flex-end !important; } - .flex-lg-justify-center { justify-content: center !important; } - .flex-lg-justify-between { justify-content: space-between !important; } - .flex-lg-justify-around { justify-content: space-around !important; } - .flex-lg-items-start { align-items: flex-start !important; } - .flex-lg-items-end { align-items: flex-end !important; } - .flex-lg-items-center { align-items: center !important; } - .flex-lg-items-baseline { align-items: baseline !important; } - .flex-lg-items-stretch { align-items: stretch !important; } - .flex-lg-content-start { align-content: flex-start !important; } - .flex-lg-content-end { align-content: flex-end !important; } - .flex-lg-content-center { align-content: center !important; } - .flex-lg-content-between { align-content: space-between !important; } - .flex-lg-content-around { align-content: space-around !important; } - .flex-lg-content-stretch { align-content: stretch !important; } - .flex-lg-auto { flex: 1 1 auto !important; } - .flex-lg-shrink-0 { flex-shrink: 0 !important; } - .flex-lg-self-auto { align-self: auto !important; } - .flex-lg-self-start { align-self: flex-start !important; } - .flex-lg-self-end { align-self: flex-end !important; } - .flex-lg-self-center { align-self: center !important; } - .flex-lg-self-baseline { align-self: baseline !important; } - .flex-lg-self-stretch { align-self: stretch !important; } - .flex-lg-item-equal { flex-grow: 1; flex-basis: 0; } } -@media (min-width: 1280px) { .flex-xl-row { flex-direction: row !important; } - .flex-xl-row-reverse { flex-direction: row-reverse !important; } - .flex-xl-column { flex-direction: column !important; } - .flex-xl-wrap { flex-wrap: wrap !important; } - .flex-xl-nowrap { flex-wrap: nowrap !important; } - .flex-xl-justify-start { justify-content: flex-start !important; } - .flex-xl-justify-end { justify-content: flex-end !important; } - .flex-xl-justify-center { justify-content: center !important; } - .flex-xl-justify-between { justify-content: space-between !important; } - .flex-xl-justify-around { justify-content: space-around !important; } - .flex-xl-items-start { align-items: flex-start !important; } - .flex-xl-items-end { align-items: flex-end !important; } - .flex-xl-items-center { align-items: center !important; } - .flex-xl-items-baseline { align-items: baseline !important; } - .flex-xl-items-stretch { align-items: stretch !important; } - .flex-xl-content-start { align-content: flex-start !important; } - .flex-xl-content-end { align-content: flex-end !important; } - .flex-xl-content-center { align-content: center !important; } - .flex-xl-content-between { align-content: space-between !important; } - .flex-xl-content-around { align-content: space-around !important; } - .flex-xl-content-stretch { align-content: stretch !important; } - .flex-xl-auto { flex: 1 1 auto !important; } - .flex-xl-shrink-0 { flex-shrink: 0 !important; } - .flex-xl-self-auto { align-self: auto !important; } - .flex-xl-self-start { align-self: flex-start !important; } - .flex-xl-self-end { align-self: flex-end !important; } - .flex-xl-self-center { align-self: center !important; } - .flex-xl-self-baseline { align-self: baseline !important; } - .flex-xl-self-stretch { align-self: stretch !important; } - .flex-xl-item-equal { flex-grow: 1; flex-basis: 0; } } -/* Set position to static */ -.position-static { position: static !important; } - -/* Set position to relative */ -.position-relative { position: relative !important; } - -/* Set position to absolute */ -.position-absolute { position: absolute !important; } - -/* Set position to fixed */ -.position-fixed { position: fixed !important; } - -/* Set top 0 */ -.top-0 { top: 0 !important; } - -/* Set right 0 */ -.right-0 { right: 0 !important; } - -/* Set bottom 0 */ -.bottom-0 { bottom: 0 !important; } - -/* Set left 0 */ -.left-0 { left: 0 !important; } - -/* Vertical align middle */ -.v-align-middle { vertical-align: middle !important; } - -/* Vertical align top */ -.v-align-top { vertical-align: top !important; } - -/* Vertical align bottom */ -.v-align-bottom { vertical-align: bottom !important; } - -/* Vertical align to the top of the text */ -.v-align-text-top { vertical-align: text-top !important; } - -/* Vertical align to the bottom of the text */ -.v-align-text-bottom { vertical-align: text-bottom !important; } - -/* Vertical align to the parent's baseline */ -.v-align-baseline { vertical-align: baseline !important; } - -/* Set the overflow hidden */ -.overflow-hidden { overflow: hidden !important; } - -/* Set the overflow scroll */ -.overflow-scroll { overflow: scroll !important; } - -/* Set the overflow auto */ -.overflow-auto { overflow: auto !important; } - -/* Clear floats around the element */ -.clearfix::before { display: table; content: ""; } -.clearfix::after { display: table; clear: both; content: ""; } - -/* Float to the left */ -.float-left { float: left !important; } - -/* Float to the right */ -.float-right { float: right !important; } - -/* No float */ -.float-none { float: none !important; } - -@media (min-width: 544px) { /* Float to the left */ - .float-sm-left { float: left !important; } - /* Float to the right */ - .float-sm-right { float: right !important; } - /* No float */ - .float-sm-none { float: none !important; } } -@media (min-width: 768px) { /* Float to the left */ - .float-md-left { float: left !important; } - /* Float to the right */ - .float-md-right { float: right !important; } - /* No float */ - .float-md-none { float: none !important; } } -@media (min-width: 1012px) { /* Float to the left */ - .float-lg-left { float: left !important; } - /* Float to the right */ - .float-lg-right { float: right !important; } - /* No float */ - .float-lg-none { float: none !important; } } -@media (min-width: 1280px) { /* Float to the left */ - .float-xl-left { float: left !important; } - /* Float to the right */ - .float-xl-right { float: right !important; } - /* No float */ - .float-xl-none { float: none !important; } } -/* Max width 100% */ -.width-fit { max-width: 100% !important; } - -/* Set the width to 100% */ -.width-full { width: 100% !important; } - -/* Max height 100% */ -.height-fit { max-height: 100% !important; } - -/* Set the height to 100% */ -.height-full { height: 100% !important; } - -/* Remove min-width from element */ -.min-width-0 { min-width: 0 !important; } - -/* Set the direction to rtl */ -.direction-rtl { direction: rtl !important; } - -/* Set the direction to ltr */ -.direction-ltr { direction: ltr !important; } - -@media (min-width: 544px) { /* Set the direction to rtl */ - .direction-sm-rtl { direction: rtl !important; } - /* Set the direction to ltr */ - .direction-sm-ltr { direction: ltr !important; } } -@media (min-width: 768px) { /* Set the direction to rtl */ - .direction-md-rtl { direction: rtl !important; } - /* Set the direction to ltr */ - .direction-md-ltr { direction: ltr !important; } } -@media (min-width: 1012px) { /* Set the direction to rtl */ - .direction-lg-rtl { direction: rtl !important; } - /* Set the direction to ltr */ - .direction-lg-ltr { direction: ltr !important; } } -@media (min-width: 1280px) { /* Set the direction to rtl */ - .direction-xl-rtl { direction: rtl !important; } - /* Set the direction to ltr */ - .direction-xl-ltr { direction: ltr !important; } } -/* Set a $size margin to all sides at $breakpoint */ -.m-0 { margin: 0 !important; } - -/* Set a $size margin on the top at $breakpoint */ -.mt-0 { margin-top: 0 !important; } - -/* Set a $size margin on the right at $breakpoint */ -.mr-0 { margin-right: 0 !important; } - -/* Set a $size margin on the bottom at $breakpoint */ -.mb-0 { margin-bottom: 0 !important; } - -/* Set a $size margin on the left at $breakpoint */ -.ml-0 { margin-left: 0 !important; } - -/* Set a $size margin on the left & right at $breakpoint */ -.mx-0 { margin-right: 0 !important; margin-left: 0 !important; } - -/* Set a $size margin on the top & bottom at $breakpoint */ -.my-0 { margin-top: 0 !important; margin-bottom: 0 !important; } - -/* Set a $size margin to all sides at $breakpoint */ -.m-1 { margin: 4px !important; } - -/* Set a $size margin on the top at $breakpoint */ -.mt-1 { margin-top: 4px !important; } - -/* Set a $size margin on the right at $breakpoint */ -.mr-1 { margin-right: 4px !important; } - -/* Set a $size margin on the bottom at $breakpoint */ -.mb-1 { margin-bottom: 4px !important; } - -/* Set a $size margin on the left at $breakpoint */ -.ml-1 { margin-left: 4px !important; } - -/* Set a negative $size margin on top at $breakpoint */ -.mt-n1 { margin-top: -4px !important; } - -/* Set a negative $size margin on the right at $breakpoint */ -.mr-n1 { margin-right: -4px !important; } - -/* Set a negative $size margin on the bottom at $breakpoint */ -.mb-n1 { margin-bottom: -4px !important; } - -/* Set a negative $size margin on the left at $breakpoint */ -.ml-n1 { margin-left: -4px !important; } - -/* Set a $size margin on the left & right at $breakpoint */ -.mx-1 { margin-right: 4px !important; margin-left: 4px !important; } - -/* Set a $size margin on the top & bottom at $breakpoint */ -.my-1 { margin-top: 4px !important; margin-bottom: 4px !important; } - -/* Set a $size margin to all sides at $breakpoint */ -.m-2 { margin: 8px !important; } - -/* Set a $size margin on the top at $breakpoint */ -.mt-2 { margin-top: 8px !important; } - -/* Set a $size margin on the right at $breakpoint */ -.mr-2 { margin-right: 8px !important; } - -/* Set a $size margin on the bottom at $breakpoint */ -.mb-2 { margin-bottom: 8px !important; } - -/* Set a $size margin on the left at $breakpoint */ -.ml-2 { margin-left: 8px !important; } - -/* Set a negative $size margin on top at $breakpoint */ -.mt-n2 { margin-top: -8px !important; } - -/* Set a negative $size margin on the right at $breakpoint */ -.mr-n2 { margin-right: -8px !important; } - -/* Set a negative $size margin on the bottom at $breakpoint */ -.mb-n2 { margin-bottom: -8px !important; } - -/* Set a negative $size margin on the left at $breakpoint */ -.ml-n2 { margin-left: -8px !important; } - -/* Set a $size margin on the left & right at $breakpoint */ -.mx-2 { margin-right: 8px !important; margin-left: 8px !important; } - -/* Set a $size margin on the top & bottom at $breakpoint */ -.my-2 { margin-top: 8px !important; margin-bottom: 8px !important; } - -/* Set a $size margin to all sides at $breakpoint */ -.m-3 { margin: 16px !important; } - -/* Set a $size margin on the top at $breakpoint */ -.mt-3 { margin-top: 16px !important; } - -/* Set a $size margin on the right at $breakpoint */ -.mr-3 { margin-right: 16px !important; } - -/* Set a $size margin on the bottom at $breakpoint */ -.mb-3 { margin-bottom: 16px !important; } - -/* Set a $size margin on the left at $breakpoint */ -.ml-3 { margin-left: 16px !important; } - -/* Set a negative $size margin on top at $breakpoint */ -.mt-n3 { margin-top: -16px !important; } - -/* Set a negative $size margin on the right at $breakpoint */ -.mr-n3 { margin-right: -16px !important; } - -/* Set a negative $size margin on the bottom at $breakpoint */ -.mb-n3 { margin-bottom: -16px !important; } - -/* Set a negative $size margin on the left at $breakpoint */ -.ml-n3 { margin-left: -16px !important; } - -/* Set a $size margin on the left & right at $breakpoint */ -.mx-3 { margin-right: 16px !important; margin-left: 16px !important; } - -/* Set a $size margin on the top & bottom at $breakpoint */ -.my-3 { margin-top: 16px !important; margin-bottom: 16px !important; } - -/* Set a $size margin to all sides at $breakpoint */ -.m-4 { margin: 24px !important; } - -/* Set a $size margin on the top at $breakpoint */ -.mt-4 { margin-top: 24px !important; } - -/* Set a $size margin on the right at $breakpoint */ -.mr-4 { margin-right: 24px !important; } - -/* Set a $size margin on the bottom at $breakpoint */ -.mb-4 { margin-bottom: 24px !important; } - -/* Set a $size margin on the left at $breakpoint */ -.ml-4 { margin-left: 24px !important; } - -/* Set a negative $size margin on top at $breakpoint */ -.mt-n4 { margin-top: -24px !important; } - -/* Set a negative $size margin on the right at $breakpoint */ -.mr-n4 { margin-right: -24px !important; } - -/* Set a negative $size margin on the bottom at $breakpoint */ -.mb-n4 { margin-bottom: -24px !important; } - -/* Set a negative $size margin on the left at $breakpoint */ -.ml-n4 { margin-left: -24px !important; } - -/* Set a $size margin on the left & right at $breakpoint */ -.mx-4 { margin-right: 24px !important; margin-left: 24px !important; } - -/* Set a $size margin on the top & bottom at $breakpoint */ -.my-4 { margin-top: 24px !important; margin-bottom: 24px !important; } - -/* Set a $size margin to all sides at $breakpoint */ -.m-5 { margin: 32px !important; } - -/* Set a $size margin on the top at $breakpoint */ -.mt-5 { margin-top: 32px !important; } - -/* Set a $size margin on the right at $breakpoint */ -.mr-5 { margin-right: 32px !important; } - -/* Set a $size margin on the bottom at $breakpoint */ -.mb-5 { margin-bottom: 32px !important; } - -/* Set a $size margin on the left at $breakpoint */ -.ml-5 { margin-left: 32px !important; } - -/* Set a negative $size margin on top at $breakpoint */ -.mt-n5 { margin-top: -32px !important; } - -/* Set a negative $size margin on the right at $breakpoint */ -.mr-n5 { margin-right: -32px !important; } - -/* Set a negative $size margin on the bottom at $breakpoint */ -.mb-n5 { margin-bottom: -32px !important; } - -/* Set a negative $size margin on the left at $breakpoint */ -.ml-n5 { margin-left: -32px !important; } - -/* Set a $size margin on the left & right at $breakpoint */ -.mx-5 { margin-right: 32px !important; margin-left: 32px !important; } - -/* Set a $size margin on the top & bottom at $breakpoint */ -.my-5 { margin-top: 32px !important; margin-bottom: 32px !important; } - -/* Set a $size margin to all sides at $breakpoint */ -.m-6 { margin: 40px !important; } - -/* Set a $size margin on the top at $breakpoint */ -.mt-6 { margin-top: 40px !important; } - -/* Set a $size margin on the right at $breakpoint */ -.mr-6 { margin-right: 40px !important; } - -/* Set a $size margin on the bottom at $breakpoint */ -.mb-6 { margin-bottom: 40px !important; } - -/* Set a $size margin on the left at $breakpoint */ -.ml-6 { margin-left: 40px !important; } - -/* Set a negative $size margin on top at $breakpoint */ -.mt-n6 { margin-top: -40px !important; } - -/* Set a negative $size margin on the right at $breakpoint */ -.mr-n6 { margin-right: -40px !important; } - -/* Set a negative $size margin on the bottom at $breakpoint */ -.mb-n6 { margin-bottom: -40px !important; } - -/* Set a negative $size margin on the left at $breakpoint */ -.ml-n6 { margin-left: -40px !important; } - -/* Set a $size margin on the left & right at $breakpoint */ -.mx-6 { margin-right: 40px !important; margin-left: 40px !important; } - -/* Set a $size margin on the top & bottom at $breakpoint */ -.my-6 { margin-top: 40px !important; margin-bottom: 40px !important; } - -/* responsive horizontal auto margins */ -.mx-auto { margin-right: auto !important; margin-left: auto !important; } - -@media (min-width: 544px) { /* Set a $size margin to all sides at $breakpoint */ - .m-sm-0 { margin: 0 !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-sm-0 { margin-top: 0 !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-sm-0 { margin-right: 0 !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-sm-0 { margin-bottom: 0 !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-sm-0 { margin-left: 0 !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-sm-0 { margin-right: 0 !important; margin-left: 0 !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-sm-0 { margin-top: 0 !important; margin-bottom: 0 !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-sm-1 { margin: 4px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-sm-1 { margin-top: 4px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-sm-1 { margin-right: 4px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-sm-1 { margin-bottom: 4px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-sm-1 { margin-left: 4px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-sm-n1 { margin-top: -4px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-sm-n1 { margin-right: -4px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-sm-n1 { margin-bottom: -4px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-sm-n1 { margin-left: -4px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-sm-1 { margin-right: 4px !important; margin-left: 4px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-sm-1 { margin-top: 4px !important; margin-bottom: 4px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-sm-2 { margin: 8px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-sm-2 { margin-top: 8px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-sm-2 { margin-right: 8px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-sm-2 { margin-bottom: 8px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-sm-2 { margin-left: 8px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-sm-n2 { margin-top: -8px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-sm-n2 { margin-right: -8px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-sm-n2 { margin-bottom: -8px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-sm-n2 { margin-left: -8px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-sm-2 { margin-right: 8px !important; margin-left: 8px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-sm-2 { margin-top: 8px !important; margin-bottom: 8px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-sm-3 { margin: 16px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-sm-3 { margin-top: 16px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-sm-3 { margin-right: 16px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-sm-3 { margin-bottom: 16px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-sm-3 { margin-left: 16px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-sm-n3 { margin-top: -16px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-sm-n3 { margin-right: -16px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-sm-n3 { margin-bottom: -16px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-sm-n3 { margin-left: -16px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-sm-3 { margin-right: 16px !important; margin-left: 16px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-sm-3 { margin-top: 16px !important; margin-bottom: 16px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-sm-4 { margin: 24px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-sm-4 { margin-top: 24px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-sm-4 { margin-right: 24px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-sm-4 { margin-bottom: 24px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-sm-4 { margin-left: 24px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-sm-n4 { margin-top: -24px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-sm-n4 { margin-right: -24px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-sm-n4 { margin-bottom: -24px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-sm-n4 { margin-left: -24px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-sm-4 { margin-right: 24px !important; margin-left: 24px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-sm-4 { margin-top: 24px !important; margin-bottom: 24px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-sm-5 { margin: 32px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-sm-5 { margin-top: 32px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-sm-5 { margin-right: 32px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-sm-5 { margin-bottom: 32px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-sm-5 { margin-left: 32px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-sm-n5 { margin-top: -32px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-sm-n5 { margin-right: -32px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-sm-n5 { margin-bottom: -32px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-sm-n5 { margin-left: -32px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-sm-5 { margin-right: 32px !important; margin-left: 32px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-sm-5 { margin-top: 32px !important; margin-bottom: 32px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-sm-6 { margin: 40px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-sm-6 { margin-top: 40px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-sm-6 { margin-right: 40px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-sm-6 { margin-bottom: 40px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-sm-6 { margin-left: 40px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-sm-n6 { margin-top: -40px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-sm-n6 { margin-right: -40px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-sm-n6 { margin-bottom: -40px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-sm-n6 { margin-left: -40px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-sm-6 { margin-right: 40px !important; margin-left: 40px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-sm-6 { margin-top: 40px !important; margin-bottom: 40px !important; } - /* responsive horizontal auto margins */ - .mx-sm-auto { margin-right: auto !important; margin-left: auto !important; } } -@media (min-width: 768px) { /* Set a $size margin to all sides at $breakpoint */ - .m-md-0 { margin: 0 !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-md-0 { margin-top: 0 !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-md-0 { margin-right: 0 !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-md-0 { margin-bottom: 0 !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-md-0 { margin-left: 0 !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-md-0 { margin-right: 0 !important; margin-left: 0 !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-md-0 { margin-top: 0 !important; margin-bottom: 0 !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-md-1 { margin: 4px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-md-1 { margin-top: 4px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-md-1 { margin-right: 4px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-md-1 { margin-bottom: 4px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-md-1 { margin-left: 4px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-md-n1 { margin-top: -4px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-md-n1 { margin-right: -4px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-md-n1 { margin-bottom: -4px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-md-n1 { margin-left: -4px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-md-1 { margin-right: 4px !important; margin-left: 4px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-md-1 { margin-top: 4px !important; margin-bottom: 4px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-md-2 { margin: 8px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-md-2 { margin-top: 8px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-md-2 { margin-right: 8px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-md-2 { margin-bottom: 8px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-md-2 { margin-left: 8px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-md-n2 { margin-top: -8px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-md-n2 { margin-right: -8px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-md-n2 { margin-bottom: -8px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-md-n2 { margin-left: -8px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-md-2 { margin-right: 8px !important; margin-left: 8px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-md-2 { margin-top: 8px !important; margin-bottom: 8px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-md-3 { margin: 16px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-md-3 { margin-top: 16px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-md-3 { margin-right: 16px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-md-3 { margin-bottom: 16px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-md-3 { margin-left: 16px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-md-n3 { margin-top: -16px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-md-n3 { margin-right: -16px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-md-n3 { margin-bottom: -16px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-md-n3 { margin-left: -16px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-md-3 { margin-right: 16px !important; margin-left: 16px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-md-3 { margin-top: 16px !important; margin-bottom: 16px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-md-4 { margin: 24px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-md-4 { margin-top: 24px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-md-4 { margin-right: 24px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-md-4 { margin-bottom: 24px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-md-4 { margin-left: 24px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-md-n4 { margin-top: -24px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-md-n4 { margin-right: -24px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-md-n4 { margin-bottom: -24px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-md-n4 { margin-left: -24px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-md-4 { margin-right: 24px !important; margin-left: 24px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-md-4 { margin-top: 24px !important; margin-bottom: 24px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-md-5 { margin: 32px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-md-5 { margin-top: 32px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-md-5 { margin-right: 32px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-md-5 { margin-bottom: 32px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-md-5 { margin-left: 32px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-md-n5 { margin-top: -32px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-md-n5 { margin-right: -32px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-md-n5 { margin-bottom: -32px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-md-n5 { margin-left: -32px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-md-5 { margin-right: 32px !important; margin-left: 32px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-md-5 { margin-top: 32px !important; margin-bottom: 32px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-md-6 { margin: 40px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-md-6 { margin-top: 40px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-md-6 { margin-right: 40px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-md-6 { margin-bottom: 40px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-md-6 { margin-left: 40px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-md-n6 { margin-top: -40px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-md-n6 { margin-right: -40px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-md-n6 { margin-bottom: -40px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-md-n6 { margin-left: -40px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-md-6 { margin-right: 40px !important; margin-left: 40px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-md-6 { margin-top: 40px !important; margin-bottom: 40px !important; } - /* responsive horizontal auto margins */ - .mx-md-auto { margin-right: auto !important; margin-left: auto !important; } } -@media (min-width: 1012px) { /* Set a $size margin to all sides at $breakpoint */ - .m-lg-0 { margin: 0 !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-lg-0 { margin-top: 0 !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-lg-0 { margin-right: 0 !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-lg-0 { margin-bottom: 0 !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-lg-0 { margin-left: 0 !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-lg-0 { margin-right: 0 !important; margin-left: 0 !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-lg-0 { margin-top: 0 !important; margin-bottom: 0 !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-lg-1 { margin: 4px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-lg-1 { margin-top: 4px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-lg-1 { margin-right: 4px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-lg-1 { margin-bottom: 4px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-lg-1 { margin-left: 4px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-lg-n1 { margin-top: -4px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-lg-n1 { margin-right: -4px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-lg-n1 { margin-bottom: -4px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-lg-n1 { margin-left: -4px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-lg-1 { margin-right: 4px !important; margin-left: 4px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-lg-1 { margin-top: 4px !important; margin-bottom: 4px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-lg-2 { margin: 8px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-lg-2 { margin-top: 8px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-lg-2 { margin-right: 8px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-lg-2 { margin-bottom: 8px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-lg-2 { margin-left: 8px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-lg-n2 { margin-top: -8px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-lg-n2 { margin-right: -8px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-lg-n2 { margin-bottom: -8px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-lg-n2 { margin-left: -8px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-lg-2 { margin-right: 8px !important; margin-left: 8px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-lg-2 { margin-top: 8px !important; margin-bottom: 8px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-lg-3 { margin: 16px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-lg-3 { margin-top: 16px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-lg-3 { margin-right: 16px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-lg-3 { margin-bottom: 16px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-lg-3 { margin-left: 16px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-lg-n3 { margin-top: -16px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-lg-n3 { margin-right: -16px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-lg-n3 { margin-bottom: -16px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-lg-n3 { margin-left: -16px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-lg-3 { margin-right: 16px !important; margin-left: 16px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-lg-3 { margin-top: 16px !important; margin-bottom: 16px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-lg-4 { margin: 24px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-lg-4 { margin-top: 24px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-lg-4 { margin-right: 24px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-lg-4 { margin-bottom: 24px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-lg-4 { margin-left: 24px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-lg-n4 { margin-top: -24px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-lg-n4 { margin-right: -24px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-lg-n4 { margin-bottom: -24px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-lg-n4 { margin-left: -24px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-lg-4 { margin-right: 24px !important; margin-left: 24px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-lg-4 { margin-top: 24px !important; margin-bottom: 24px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-lg-5 { margin: 32px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-lg-5 { margin-top: 32px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-lg-5 { margin-right: 32px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-lg-5 { margin-bottom: 32px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-lg-5 { margin-left: 32px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-lg-n5 { margin-top: -32px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-lg-n5 { margin-right: -32px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-lg-n5 { margin-bottom: -32px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-lg-n5 { margin-left: -32px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-lg-5 { margin-right: 32px !important; margin-left: 32px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-lg-5 { margin-top: 32px !important; margin-bottom: 32px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-lg-6 { margin: 40px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-lg-6 { margin-top: 40px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-lg-6 { margin-right: 40px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-lg-6 { margin-bottom: 40px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-lg-6 { margin-left: 40px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-lg-n6 { margin-top: -40px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-lg-n6 { margin-right: -40px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-lg-n6 { margin-bottom: -40px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-lg-n6 { margin-left: -40px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-lg-6 { margin-right: 40px !important; margin-left: 40px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-lg-6 { margin-top: 40px !important; margin-bottom: 40px !important; } - /* responsive horizontal auto margins */ - .mx-lg-auto { margin-right: auto !important; margin-left: auto !important; } } -@media (min-width: 1280px) { /* Set a $size margin to all sides at $breakpoint */ - .m-xl-0 { margin: 0 !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-xl-0 { margin-top: 0 !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-xl-0 { margin-right: 0 !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-xl-0 { margin-bottom: 0 !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-xl-0 { margin-left: 0 !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-xl-0 { margin-right: 0 !important; margin-left: 0 !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-xl-0 { margin-top: 0 !important; margin-bottom: 0 !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-xl-1 { margin: 4px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-xl-1 { margin-top: 4px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-xl-1 { margin-right: 4px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-xl-1 { margin-bottom: 4px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-xl-1 { margin-left: 4px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-xl-n1 { margin-top: -4px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-xl-n1 { margin-right: -4px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-xl-n1 { margin-bottom: -4px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-xl-n1 { margin-left: -4px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-xl-1 { margin-right: 4px !important; margin-left: 4px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-xl-1 { margin-top: 4px !important; margin-bottom: 4px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-xl-2 { margin: 8px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-xl-2 { margin-top: 8px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-xl-2 { margin-right: 8px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-xl-2 { margin-bottom: 8px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-xl-2 { margin-left: 8px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-xl-n2 { margin-top: -8px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-xl-n2 { margin-right: -8px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-xl-n2 { margin-bottom: -8px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-xl-n2 { margin-left: -8px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-xl-2 { margin-right: 8px !important; margin-left: 8px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-xl-2 { margin-top: 8px !important; margin-bottom: 8px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-xl-3 { margin: 16px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-xl-3 { margin-top: 16px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-xl-3 { margin-right: 16px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-xl-3 { margin-bottom: 16px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-xl-3 { margin-left: 16px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-xl-n3 { margin-top: -16px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-xl-n3 { margin-right: -16px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-xl-n3 { margin-bottom: -16px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-xl-n3 { margin-left: -16px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-xl-3 { margin-right: 16px !important; margin-left: 16px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-xl-3 { margin-top: 16px !important; margin-bottom: 16px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-xl-4 { margin: 24px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-xl-4 { margin-top: 24px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-xl-4 { margin-right: 24px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-xl-4 { margin-bottom: 24px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-xl-4 { margin-left: 24px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-xl-n4 { margin-top: -24px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-xl-n4 { margin-right: -24px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-xl-n4 { margin-bottom: -24px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-xl-n4 { margin-left: -24px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-xl-4 { margin-right: 24px !important; margin-left: 24px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-xl-4 { margin-top: 24px !important; margin-bottom: 24px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-xl-5 { margin: 32px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-xl-5 { margin-top: 32px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-xl-5 { margin-right: 32px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-xl-5 { margin-bottom: 32px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-xl-5 { margin-left: 32px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-xl-n5 { margin-top: -32px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-xl-n5 { margin-right: -32px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-xl-n5 { margin-bottom: -32px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-xl-n5 { margin-left: -32px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-xl-5 { margin-right: 32px !important; margin-left: 32px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-xl-5 { margin-top: 32px !important; margin-bottom: 32px !important; } - /* Set a $size margin to all sides at $breakpoint */ - .m-xl-6 { margin: 40px !important; } - /* Set a $size margin on the top at $breakpoint */ - .mt-xl-6 { margin-top: 40px !important; } - /* Set a $size margin on the right at $breakpoint */ - .mr-xl-6 { margin-right: 40px !important; } - /* Set a $size margin on the bottom at $breakpoint */ - .mb-xl-6 { margin-bottom: 40px !important; } - /* Set a $size margin on the left at $breakpoint */ - .ml-xl-6 { margin-left: 40px !important; } - /* Set a negative $size margin on top at $breakpoint */ - .mt-xl-n6 { margin-top: -40px !important; } - /* Set a negative $size margin on the right at $breakpoint */ - .mr-xl-n6 { margin-right: -40px !important; } - /* Set a negative $size margin on the bottom at $breakpoint */ - .mb-xl-n6 { margin-bottom: -40px !important; } - /* Set a negative $size margin on the left at $breakpoint */ - .ml-xl-n6 { margin-left: -40px !important; } - /* Set a $size margin on the left & right at $breakpoint */ - .mx-xl-6 { margin-right: 40px !important; margin-left: 40px !important; } - /* Set a $size margin on the top & bottom at $breakpoint */ - .my-xl-6 { margin-top: 40px !important; margin-bottom: 40px !important; } - /* responsive horizontal auto margins */ - .mx-xl-auto { margin-right: auto !important; margin-left: auto !important; } } -/* Set a $size padding to all sides at $breakpoint */ -.p-0 { padding: 0 !important; } - -/* Set a $size padding to the top at $breakpoint */ -.pt-0 { padding-top: 0 !important; } - -/* Set a $size padding to the right at $breakpoint */ -.pr-0 { padding-right: 0 !important; } - -/* Set a $size padding to the bottom at $breakpoint */ -.pb-0 { padding-bottom: 0 !important; } - -/* Set a $size padding to the left at $breakpoint */ -.pl-0 { padding-left: 0 !important; } - -/* Set a $size padding to the left & right at $breakpoint */ -.px-0 { padding-right: 0 !important; padding-left: 0 !important; } - -/* Set a $size padding to the top & bottom at $breakpoint */ -.py-0 { padding-top: 0 !important; padding-bottom: 0 !important; } - -/* Set a $size padding to all sides at $breakpoint */ -.p-1 { padding: 4px !important; } - -/* Set a $size padding to the top at $breakpoint */ -.pt-1 { padding-top: 4px !important; } - -/* Set a $size padding to the right at $breakpoint */ -.pr-1 { padding-right: 4px !important; } - -/* Set a $size padding to the bottom at $breakpoint */ -.pb-1 { padding-bottom: 4px !important; } - -/* Set a $size padding to the left at $breakpoint */ -.pl-1 { padding-left: 4px !important; } - -/* Set a $size padding to the left & right at $breakpoint */ -.px-1 { padding-right: 4px !important; padding-left: 4px !important; } - -/* Set a $size padding to the top & bottom at $breakpoint */ -.py-1 { padding-top: 4px !important; padding-bottom: 4px !important; } - -/* Set a $size padding to all sides at $breakpoint */ -.p-2 { padding: 8px !important; } - -/* Set a $size padding to the top at $breakpoint */ -.pt-2 { padding-top: 8px !important; } - -/* Set a $size padding to the right at $breakpoint */ -.pr-2 { padding-right: 8px !important; } - -/* Set a $size padding to the bottom at $breakpoint */ -.pb-2 { padding-bottom: 8px !important; } - -/* Set a $size padding to the left at $breakpoint */ -.pl-2 { padding-left: 8px !important; } - -/* Set a $size padding to the left & right at $breakpoint */ -.px-2 { padding-right: 8px !important; padding-left: 8px !important; } - -/* Set a $size padding to the top & bottom at $breakpoint */ -.py-2 { padding-top: 8px !important; padding-bottom: 8px !important; } - -/* Set a $size padding to all sides at $breakpoint */ -.p-3 { padding: 16px !important; } - -/* Set a $size padding to the top at $breakpoint */ -.pt-3 { padding-top: 16px !important; } - -/* Set a $size padding to the right at $breakpoint */ -.pr-3 { padding-right: 16px !important; } - -/* Set a $size padding to the bottom at $breakpoint */ -.pb-3 { padding-bottom: 16px !important; } - -/* Set a $size padding to the left at $breakpoint */ -.pl-3 { padding-left: 16px !important; } - -/* Set a $size padding to the left & right at $breakpoint */ -.px-3 { padding-right: 16px !important; padding-left: 16px !important; } - -/* Set a $size padding to the top & bottom at $breakpoint */ -.py-3 { padding-top: 16px !important; padding-bottom: 16px !important; } - -/* Set a $size padding to all sides at $breakpoint */ -.p-4 { padding: 24px !important; } - -/* Set a $size padding to the top at $breakpoint */ -.pt-4 { padding-top: 24px !important; } - -/* Set a $size padding to the right at $breakpoint */ -.pr-4 { padding-right: 24px !important; } - -/* Set a $size padding to the bottom at $breakpoint */ -.pb-4 { padding-bottom: 24px !important; } - -/* Set a $size padding to the left at $breakpoint */ -.pl-4 { padding-left: 24px !important; } - -/* Set a $size padding to the left & right at $breakpoint */ -.px-4 { padding-right: 24px !important; padding-left: 24px !important; } - -/* Set a $size padding to the top & bottom at $breakpoint */ -.py-4 { padding-top: 24px !important; padding-bottom: 24px !important; } - -/* Set a $size padding to all sides at $breakpoint */ -.p-5 { padding: 32px !important; } - -/* Set a $size padding to the top at $breakpoint */ -.pt-5 { padding-top: 32px !important; } - -/* Set a $size padding to the right at $breakpoint */ -.pr-5 { padding-right: 32px !important; } - -/* Set a $size padding to the bottom at $breakpoint */ -.pb-5 { padding-bottom: 32px !important; } - -/* Set a $size padding to the left at $breakpoint */ -.pl-5 { padding-left: 32px !important; } - -/* Set a $size padding to the left & right at $breakpoint */ -.px-5 { padding-right: 32px !important; padding-left: 32px !important; } - -/* Set a $size padding to the top & bottom at $breakpoint */ -.py-5 { padding-top: 32px !important; padding-bottom: 32px !important; } - -/* Set a $size padding to all sides at $breakpoint */ -.p-6 { padding: 40px !important; } - -/* Set a $size padding to the top at $breakpoint */ -.pt-6 { padding-top: 40px !important; } - -/* Set a $size padding to the right at $breakpoint */ -.pr-6 { padding-right: 40px !important; } - -/* Set a $size padding to the bottom at $breakpoint */ -.pb-6 { padding-bottom: 40px !important; } - -/* Set a $size padding to the left at $breakpoint */ -.pl-6 { padding-left: 40px !important; } - -/* Set a $size padding to the left & right at $breakpoint */ -.px-6 { padding-right: 40px !important; padding-left: 40px !important; } - -/* Set a $size padding to the top & bottom at $breakpoint */ -.py-6 { padding-top: 40px !important; padding-bottom: 40px !important; } - -@media (min-width: 544px) { /* Set a $size padding to all sides at $breakpoint */ - .p-sm-0 { padding: 0 !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-sm-0 { padding-top: 0 !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-sm-0 { padding-right: 0 !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-sm-0 { padding-bottom: 0 !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-sm-0 { padding-left: 0 !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-sm-0 { padding-right: 0 !important; padding-left: 0 !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-sm-0 { padding-top: 0 !important; padding-bottom: 0 !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-sm-1 { padding: 4px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-sm-1 { padding-top: 4px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-sm-1 { padding-right: 4px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-sm-1 { padding-bottom: 4px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-sm-1 { padding-left: 4px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-sm-1 { padding-right: 4px !important; padding-left: 4px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-sm-1 { padding-top: 4px !important; padding-bottom: 4px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-sm-2 { padding: 8px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-sm-2 { padding-top: 8px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-sm-2 { padding-right: 8px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-sm-2 { padding-bottom: 8px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-sm-2 { padding-left: 8px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-sm-2 { padding-right: 8px !important; padding-left: 8px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-sm-2 { padding-top: 8px !important; padding-bottom: 8px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-sm-3 { padding: 16px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-sm-3 { padding-top: 16px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-sm-3 { padding-right: 16px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-sm-3 { padding-bottom: 16px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-sm-3 { padding-left: 16px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-sm-3 { padding-right: 16px !important; padding-left: 16px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-sm-3 { padding-top: 16px !important; padding-bottom: 16px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-sm-4 { padding: 24px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-sm-4 { padding-top: 24px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-sm-4 { padding-right: 24px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-sm-4 { padding-bottom: 24px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-sm-4 { padding-left: 24px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-sm-4 { padding-right: 24px !important; padding-left: 24px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-sm-4 { padding-top: 24px !important; padding-bottom: 24px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-sm-5 { padding: 32px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-sm-5 { padding-top: 32px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-sm-5 { padding-right: 32px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-sm-5 { padding-bottom: 32px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-sm-5 { padding-left: 32px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-sm-5 { padding-right: 32px !important; padding-left: 32px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-sm-5 { padding-top: 32px !important; padding-bottom: 32px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-sm-6 { padding: 40px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-sm-6 { padding-top: 40px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-sm-6 { padding-right: 40px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-sm-6 { padding-bottom: 40px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-sm-6 { padding-left: 40px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-sm-6 { padding-right: 40px !important; padding-left: 40px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-sm-6 { padding-top: 40px !important; padding-bottom: 40px !important; } } -@media (min-width: 768px) { /* Set a $size padding to all sides at $breakpoint */ - .p-md-0 { padding: 0 !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-md-0 { padding-top: 0 !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-md-0 { padding-right: 0 !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-md-0 { padding-bottom: 0 !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-md-0 { padding-left: 0 !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-md-0 { padding-right: 0 !important; padding-left: 0 !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-md-0 { padding-top: 0 !important; padding-bottom: 0 !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-md-1 { padding: 4px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-md-1 { padding-top: 4px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-md-1 { padding-right: 4px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-md-1 { padding-bottom: 4px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-md-1 { padding-left: 4px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-md-1 { padding-right: 4px !important; padding-left: 4px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-md-1 { padding-top: 4px !important; padding-bottom: 4px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-md-2 { padding: 8px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-md-2 { padding-top: 8px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-md-2 { padding-right: 8px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-md-2 { padding-bottom: 8px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-md-2 { padding-left: 8px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-md-2 { padding-right: 8px !important; padding-left: 8px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-md-2 { padding-top: 8px !important; padding-bottom: 8px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-md-3 { padding: 16px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-md-3 { padding-top: 16px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-md-3 { padding-right: 16px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-md-3 { padding-bottom: 16px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-md-3 { padding-left: 16px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-md-3 { padding-right: 16px !important; padding-left: 16px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-md-3 { padding-top: 16px !important; padding-bottom: 16px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-md-4 { padding: 24px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-md-4 { padding-top: 24px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-md-4 { padding-right: 24px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-md-4 { padding-bottom: 24px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-md-4 { padding-left: 24px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-md-4 { padding-right: 24px !important; padding-left: 24px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-md-4 { padding-top: 24px !important; padding-bottom: 24px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-md-5 { padding: 32px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-md-5 { padding-top: 32px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-md-5 { padding-right: 32px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-md-5 { padding-bottom: 32px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-md-5 { padding-left: 32px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-md-5 { padding-right: 32px !important; padding-left: 32px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-md-5 { padding-top: 32px !important; padding-bottom: 32px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-md-6 { padding: 40px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-md-6 { padding-top: 40px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-md-6 { padding-right: 40px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-md-6 { padding-bottom: 40px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-md-6 { padding-left: 40px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-md-6 { padding-right: 40px !important; padding-left: 40px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-md-6 { padding-top: 40px !important; padding-bottom: 40px !important; } } -@media (min-width: 1012px) { /* Set a $size padding to all sides at $breakpoint */ - .p-lg-0 { padding: 0 !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-lg-0 { padding-top: 0 !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-lg-0 { padding-right: 0 !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-lg-0 { padding-bottom: 0 !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-lg-0 { padding-left: 0 !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-lg-0 { padding-right: 0 !important; padding-left: 0 !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-lg-0 { padding-top: 0 !important; padding-bottom: 0 !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-lg-1 { padding: 4px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-lg-1 { padding-top: 4px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-lg-1 { padding-right: 4px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-lg-1 { padding-bottom: 4px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-lg-1 { padding-left: 4px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-lg-1 { padding-right: 4px !important; padding-left: 4px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-lg-1 { padding-top: 4px !important; padding-bottom: 4px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-lg-2 { padding: 8px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-lg-2 { padding-top: 8px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-lg-2 { padding-right: 8px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-lg-2 { padding-bottom: 8px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-lg-2 { padding-left: 8px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-lg-2 { padding-right: 8px !important; padding-left: 8px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-lg-2 { padding-top: 8px !important; padding-bottom: 8px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-lg-3 { padding: 16px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-lg-3 { padding-top: 16px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-lg-3 { padding-right: 16px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-lg-3 { padding-bottom: 16px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-lg-3 { padding-left: 16px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-lg-3 { padding-right: 16px !important; padding-left: 16px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-lg-3 { padding-top: 16px !important; padding-bottom: 16px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-lg-4 { padding: 24px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-lg-4 { padding-top: 24px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-lg-4 { padding-right: 24px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-lg-4 { padding-bottom: 24px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-lg-4 { padding-left: 24px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-lg-4 { padding-right: 24px !important; padding-left: 24px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-lg-4 { padding-top: 24px !important; padding-bottom: 24px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-lg-5 { padding: 32px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-lg-5 { padding-top: 32px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-lg-5 { padding-right: 32px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-lg-5 { padding-bottom: 32px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-lg-5 { padding-left: 32px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-lg-5 { padding-right: 32px !important; padding-left: 32px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-lg-5 { padding-top: 32px !important; padding-bottom: 32px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-lg-6 { padding: 40px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-lg-6 { padding-top: 40px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-lg-6 { padding-right: 40px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-lg-6 { padding-bottom: 40px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-lg-6 { padding-left: 40px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-lg-6 { padding-right: 40px !important; padding-left: 40px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-lg-6 { padding-top: 40px !important; padding-bottom: 40px !important; } } -@media (min-width: 1280px) { /* Set a $size padding to all sides at $breakpoint */ - .p-xl-0 { padding: 0 !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-xl-0 { padding-top: 0 !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-xl-0 { padding-right: 0 !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-xl-0 { padding-bottom: 0 !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-xl-0 { padding-left: 0 !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-xl-0 { padding-right: 0 !important; padding-left: 0 !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-xl-0 { padding-top: 0 !important; padding-bottom: 0 !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-xl-1 { padding: 4px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-xl-1 { padding-top: 4px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-xl-1 { padding-right: 4px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-xl-1 { padding-bottom: 4px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-xl-1 { padding-left: 4px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-xl-1 { padding-right: 4px !important; padding-left: 4px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-xl-1 { padding-top: 4px !important; padding-bottom: 4px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-xl-2 { padding: 8px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-xl-2 { padding-top: 8px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-xl-2 { padding-right: 8px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-xl-2 { padding-bottom: 8px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-xl-2 { padding-left: 8px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-xl-2 { padding-right: 8px !important; padding-left: 8px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-xl-2 { padding-top: 8px !important; padding-bottom: 8px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-xl-3 { padding: 16px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-xl-3 { padding-top: 16px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-xl-3 { padding-right: 16px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-xl-3 { padding-bottom: 16px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-xl-3 { padding-left: 16px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-xl-3 { padding-right: 16px !important; padding-left: 16px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-xl-3 { padding-top: 16px !important; padding-bottom: 16px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-xl-4 { padding: 24px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-xl-4 { padding-top: 24px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-xl-4 { padding-right: 24px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-xl-4 { padding-bottom: 24px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-xl-4 { padding-left: 24px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-xl-4 { padding-right: 24px !important; padding-left: 24px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-xl-4 { padding-top: 24px !important; padding-bottom: 24px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-xl-5 { padding: 32px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-xl-5 { padding-top: 32px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-xl-5 { padding-right: 32px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-xl-5 { padding-bottom: 32px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-xl-5 { padding-left: 32px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-xl-5 { padding-right: 32px !important; padding-left: 32px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-xl-5 { padding-top: 32px !important; padding-bottom: 32px !important; } - /* Set a $size padding to all sides at $breakpoint */ - .p-xl-6 { padding: 40px !important; } - /* Set a $size padding to the top at $breakpoint */ - .pt-xl-6 { padding-top: 40px !important; } - /* Set a $size padding to the right at $breakpoint */ - .pr-xl-6 { padding-right: 40px !important; } - /* Set a $size padding to the bottom at $breakpoint */ - .pb-xl-6 { padding-bottom: 40px !important; } - /* Set a $size padding to the left at $breakpoint */ - .pl-xl-6 { padding-left: 40px !important; } - /* Set a $size padding to the left & right at $breakpoint */ - .px-xl-6 { padding-right: 40px !important; padding-left: 40px !important; } - /* Set a $size padding to the top & bottom at $breakpoint */ - .py-xl-6 { padding-top: 40px !important; padding-bottom: 40px !important; } } -.p-responsive { padding-right: 16px !important; padding-left: 16px !important; } -@media (min-width: 544px) { .p-responsive { padding-right: 40px !important; padding-left: 40px !important; } } -@media (min-width: 1012px) { .p-responsive { padding-right: 16px !important; padding-left: 16px !important; } } - -/* Set the font size to 26px */ -.h1 { font-size: 26px !important; } -@media (min-width: 768px) { .h1 { font-size: 32px !important; } } - -/* Set the font size to 22px */ -.h2 { font-size: 22px !important; } -@media (min-width: 768px) { .h2 { font-size: 24px !important; } } - -/* Set the font size to 18px */ -.h3 { font-size: 18px !important; } -@media (min-width: 768px) { .h3 { font-size: 20px !important; } } - -/* Set the font size to 16px */ -.h4 { font-size: 16px !important; } - -/* Set the font size to 14px */ -.h5 { font-size: 14px !important; } - -/* Set the font size to 12px */ -.h6 { font-size: 12px !important; } - -.h1, .h2, .h3, .h4, .h5, .h6 { font-weight: 600 !important; } - -/* Set the font size to 26px */ -.f1 { font-size: 26px !important; } -@media (min-width: 768px) { .f1 { font-size: 32px !important; } } - -/* Set the font size to 22px */ -.f2 { font-size: 22px !important; } -@media (min-width: 768px) { .f2 { font-size: 24px !important; } } - -/* Set the font size to 18px */ -.f3 { font-size: 18px !important; } -@media (min-width: 768px) { .f3 { font-size: 20px !important; } } - -/* Set the font size to 16px */ -.f4 { font-size: 16px !important; } -@media (min-width: 768px) { .f4 { font-size: 16px !important; } } - -/* Set the font size to 14px */ -.f5 { font-size: 14px !important; } - -/* Set the font size to 12px */ -.f6 { font-size: 12px !important; } - -/* Set the font size to 40px and weight to light */ -.f00-light { font-size: 40px !important; font-weight: 300 !important; } -@media (min-width: 768px) { .f00-light { font-size: 48px !important; } } - -/* Set the font size to 32px and weight to light */ -.f0-light { font-size: 32px !important; font-weight: 300 !important; } -@media (min-width: 768px) { .f0-light { font-size: 40px !important; } } - -/* Set the font size to 26px and weight to light */ -.f1-light { font-size: 26px !important; font-weight: 300 !important; } -@media (min-width: 768px) { .f1-light { font-size: 32px !important; } } - -/* Set the font size to 22px and weight to light */ -.f2-light { font-size: 22px !important; font-weight: 300 !important; } -@media (min-width: 768px) { .f2-light { font-size: 24px !important; } } - -/* Set the font size to 18px and weight to light */ -.f3-light { font-size: 18px !important; font-weight: 300 !important; } -@media (min-width: 768px) { .f3-light { font-size: 20px !important; } } - -/* Set the font size to ${#h6-size} */ -.text-small { font-size: 12px !important; } - -/* Large leading paragraphs */ -.lead { margin-bottom: 30px; font-size: 20px; font-weight: 300; color: #586069; } - -/* Set the line height to ultra condensed */ -.lh-condensed-ultra { line-height: 1 !important; } - -/* Set the line height to condensed */ -.lh-condensed { line-height: 1.25 !important; } - -/* Set the line height to default */ -.lh-default { line-height: 1.5 !important; } - -/* Set the line height to zero */ -.lh-0 { line-height: 0 !important; } - -/* Text align to the right */ -.text-right { text-align: right !important; } - -/* Text align to the left */ -.text-left { text-align: left !important; } - -/* Text align to the center */ -.text-center { text-align: center !important; } - -@media (min-width: 544px) { /* Text align to the right */ - .text-sm-right { text-align: right !important; } - /* Text align to the left */ - .text-sm-left { text-align: left !important; } - /* Text align to the center */ - .text-sm-center { text-align: center !important; } } -@media (min-width: 768px) { /* Text align to the right */ - .text-md-right { text-align: right !important; } - /* Text align to the left */ - .text-md-left { text-align: left !important; } - /* Text align to the center */ - .text-md-center { text-align: center !important; } } -@media (min-width: 1012px) { /* Text align to the right */ - .text-lg-right { text-align: right !important; } - /* Text align to the left */ - .text-lg-left { text-align: left !important; } - /* Text align to the center */ - .text-lg-center { text-align: center !important; } } -@media (min-width: 1280px) { /* Text align to the right */ - .text-xl-right { text-align: right !important; } - /* Text align to the left */ - .text-xl-left { text-align: left !important; } - /* Text align to the center */ - .text-xl-center { text-align: center !important; } } -/* Set the font weight to normal */ -.text-normal { font-weight: 400 !important; } - -/* Set the font weight to bold */ -.text-bold { font-weight: 600 !important; } - -/* Set the font to italic */ -.text-italic { font-style: italic !important; } - -/* Make text uppercase */ -.text-uppercase { text-transform: uppercase !important; } - -/* Underline text */ -.text-underline { text-decoration: underline !important; } - -/* Don't underline text */ -.no-underline { text-decoration: none !important; } - -/* Don't wrap white space */ -.no-wrap { white-space: nowrap !important; } - -/* Normal white space */ -.ws-normal { white-space: normal !important; } - -/* Allow long lines with no spaces to line break */ -.wb-break-all { word-break: break-all !important; } - -.text-emphasized { font-weight: 600; color: #24292e; } - -.list-style-none { list-style: none !important; } - -/* Add a dark text shadow */ -.text-shadow-dark { text-shadow: 0 1px 1px rgba(27, 31, 35, 0.25), 0 1px 25px rgba(27, 31, 35, 0.75); } - -/* Add a light text shadow */ -.text-shadow-light { text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); } - -/* Set to monospace font */ -.text-mono { font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; } - -/* Disallow user from selecting text */ -.user-select-none { user-select: none !important; } - -.d-block { display: block !important; } - -.d-flex { display: flex !important; } - -.d-inline { display: inline !important; } - -.d-inline-block { display: inline-block !important; } - -.d-inline-flex { display: inline-flex !important; } - -.d-none { display: none !important; } - -.d-table { display: table !important; } - -.d-table-cell { display: table-cell !important; } - -@media (min-width: 544px) { .d-sm-block { display: block !important; } - .d-sm-flex { display: flex !important; } - .d-sm-inline { display: inline !important; } - .d-sm-inline-block { display: inline-block !important; } - .d-sm-inline-flex { display: inline-flex !important; } - .d-sm-none { display: none !important; } - .d-sm-table { display: table !important; } - .d-sm-table-cell { display: table-cell !important; } } -@media (min-width: 768px) { .d-md-block { display: block !important; } - .d-md-flex { display: flex !important; } - .d-md-inline { display: inline !important; } - .d-md-inline-block { display: inline-block !important; } - .d-md-inline-flex { display: inline-flex !important; } - .d-md-none { display: none !important; } - .d-md-table { display: table !important; } - .d-md-table-cell { display: table-cell !important; } } -@media (min-width: 1012px) { .d-lg-block { display: block !important; } - .d-lg-flex { display: flex !important; } - .d-lg-inline { display: inline !important; } - .d-lg-inline-block { display: inline-block !important; } - .d-lg-inline-flex { display: inline-flex !important; } - .d-lg-none { display: none !important; } - .d-lg-table { display: table !important; } - .d-lg-table-cell { display: table-cell !important; } } -@media (min-width: 1280px) { .d-xl-block { display: block !important; } - .d-xl-flex { display: flex !important; } - .d-xl-inline { display: inline !important; } - .d-xl-inline-block { display: inline-block !important; } - .d-xl-inline-flex { display: inline-flex !important; } - .d-xl-none { display: none !important; } - .d-xl-table { display: table !important; } - .d-xl-table-cell { display: table-cell !important; } } -.v-hidden { visibility: hidden !important; } - -.v-visible { visibility: visible !important; } - -@media (max-width: 544px) { .hide-sm { display: none !important; } } -@media (min-width: 544px) and (max-width: 768px) { .hide-md { display: none !important; } } -@media (min-width: 768px) and (max-width: 1012px) { .hide-lg { display: none !important; } } -@media (min-width: 1012px) { .hide-xl { display: none !important; } } -/* Set the table-layout to fixed */ -.table-fixed { table-layout: fixed !important; } - -.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); word-wrap: normal; border: 0; } - -.show-on-focus { position: absolute; width: 1px; height: 1px; margin: 0; overflow: hidden; clip: rect(1px, 1px, 1px, 1px); } -.show-on-focus:focus { z-index: 20; width: auto; height: auto; clip: auto; } - -.container { width: 980px; margin-right: auto; margin-left: auto; } -.container::before { display: table; content: ""; } -.container::after { display: table; clear: both; content: ""; } - -.container-md { max-width: 768px; margin-right: auto; margin-left: auto; } - -.container-lg { max-width: 1012px; margin-right: auto; margin-left: auto; } - -.container-xl { max-width: 1280px; margin-right: auto; margin-left: auto; } - -.columns { margin-right: -10px; margin-left: -10px; } -.columns::before { display: table; content: ""; } -.columns::after { display: table; clear: both; content: ""; } - -.column { float: left; padding-right: 10px; padding-left: 10px; } - -.one-third { width: 33.333333%; } - -.two-thirds { width: 66.666667%; } - -.one-fourth { width: 25%; } - -.one-half { width: 50%; } - -.three-fourths { width: 75%; } - -.one-fifth { width: 20%; } - -.four-fifths { width: 80%; } - -.centered { display: block; float: none; margin-right: auto; margin-left: auto; } - -.col-1 { width: 8.3333333333%; } - -.col-2 { width: 16.6666666667%; } - -.col-3 { width: 25%; } - -.col-4 { width: 33.3333333333%; } - -.col-5 { width: 41.6666666667%; } - -.col-6 { width: 50%; } - -.col-7 { width: 58.3333333333%; } - -.col-8 { width: 66.6666666667%; } - -.col-9 { width: 75%; } - -.col-10 { width: 83.3333333333%; } - -.col-11 { width: 91.6666666667%; } - -.col-12 { width: 100%; } - -@media (min-width: 544px) { .col-sm-1 { width: 8.3333333333%; } - .col-sm-2 { width: 16.6666666667%; } - .col-sm-3 { width: 25%; } - .col-sm-4 { width: 33.3333333333%; } - .col-sm-5 { width: 41.6666666667%; } - .col-sm-6 { width: 50%; } - .col-sm-7 { width: 58.3333333333%; } - .col-sm-8 { width: 66.6666666667%; } - .col-sm-9 { width: 75%; } - .col-sm-10 { width: 83.3333333333%; } - .col-sm-11 { width: 91.6666666667%; } - .col-sm-12 { width: 100%; } } -@media (min-width: 768px) { .col-md-1 { width: 8.3333333333%; } - .col-md-2 { width: 16.6666666667%; } - .col-md-3 { width: 25%; } - .col-md-4 { width: 33.3333333333%; } - .col-md-5 { width: 41.6666666667%; } - .col-md-6 { width: 50%; } - .col-md-7 { width: 58.3333333333%; } - .col-md-8 { width: 66.6666666667%; } - .col-md-9 { width: 75%; } - .col-md-10 { width: 83.3333333333%; } - .col-md-11 { width: 91.6666666667%; } - .col-md-12 { width: 100%; } } -@media (min-width: 1012px) { .col-lg-1 { width: 8.3333333333%; } - .col-lg-2 { width: 16.6666666667%; } - .col-lg-3 { width: 25%; } - .col-lg-4 { width: 33.3333333333%; } - .col-lg-5 { width: 41.6666666667%; } - .col-lg-6 { width: 50%; } - .col-lg-7 { width: 58.3333333333%; } - .col-lg-8 { width: 66.6666666667%; } - .col-lg-9 { width: 75%; } - .col-lg-10 { width: 83.3333333333%; } - .col-lg-11 { width: 91.6666666667%; } - .col-lg-12 { width: 100%; } } -@media (min-width: 1280px) { .col-xl-1 { width: 8.3333333333%; } - .col-xl-2 { width: 16.6666666667%; } - .col-xl-3 { width: 25%; } - .col-xl-4 { width: 33.3333333333%; } - .col-xl-5 { width: 41.6666666667%; } - .col-xl-6 { width: 50%; } - .col-xl-7 { width: 58.3333333333%; } - .col-xl-8 { width: 66.6666666667%; } - .col-xl-9 { width: 75%; } - .col-xl-10 { width: 83.3333333333%; } - .col-xl-11 { width: 91.6666666667%; } - .col-xl-12 { width: 100%; } } -.gutter { margin-right: -16px; margin-left: -16px; } -.gutter > [class*="col-"] { padding-right: 16px !important; padding-left: 16px !important; } - -.gutter-condensed { margin-right: -8px; margin-left: -8px; } -.gutter-condensed > [class*="col-"] { padding-right: 8px !important; padding-left: 8px !important; } - -.gutter-spacious { margin-right: -24px; margin-left: -24px; } -.gutter-spacious > [class*="col-"] { padding-right: 24px !important; padding-left: 24px !important; } - -@media (min-width: 544px) { .gutter-sm { margin-right: -16px; margin-left: -16px; } - .gutter-sm > [class*="col-"] { padding-right: 16px !important; padding-left: 16px !important; } - .gutter-sm-condensed { margin-right: -8px; margin-left: -8px; } - .gutter-sm-condensed > [class*="col-"] { padding-right: 8px !important; padding-left: 8px !important; } - .gutter-sm-spacious { margin-right: -24px; margin-left: -24px; } - .gutter-sm-spacious > [class*="col-"] { padding-right: 24px !important; padding-left: 24px !important; } } -@media (min-width: 768px) { .gutter-md { margin-right: -16px; margin-left: -16px; } - .gutter-md > [class*="col-"] { padding-right: 16px !important; padding-left: 16px !important; } - .gutter-md-condensed { margin-right: -8px; margin-left: -8px; } - .gutter-md-condensed > [class*="col-"] { padding-right: 8px !important; padding-left: 8px !important; } - .gutter-md-spacious { margin-right: -24px; margin-left: -24px; } - .gutter-md-spacious > [class*="col-"] { padding-right: 24px !important; padding-left: 24px !important; } } -@media (min-width: 1012px) { .gutter-lg { margin-right: -16px; margin-left: -16px; } - .gutter-lg > [class*="col-"] { padding-right: 16px !important; padding-left: 16px !important; } - .gutter-lg-condensed { margin-right: -8px; margin-left: -8px; } - .gutter-lg-condensed > [class*="col-"] { padding-right: 8px !important; padding-left: 8px !important; } - .gutter-lg-spacious { margin-right: -24px; margin-left: -24px; } - .gutter-lg-spacious > [class*="col-"] { padding-right: 24px !important; padding-left: 24px !important; } } -@media (min-width: 1280px) { .gutter-xl { margin-right: -16px; margin-left: -16px; } - .gutter-xl > [class*="col-"] { padding-right: 16px !important; padding-left: 16px !important; } - .gutter-xl-condensed { margin-right: -8px; margin-left: -8px; } - .gutter-xl-condensed > [class*="col-"] { padding-right: 8px !important; padding-left: 8px !important; } - .gutter-xl-spacious { margin-right: -24px; margin-left: -24px; } - .gutter-xl-spacious > [class*="col-"] { padding-right: 24px !important; padding-left: 24px !important; } } -.offset-1 { margin-left: 8.3333333333% !important; } - -.offset-2 { margin-left: 16.6666666667% !important; } - -.offset-3 { margin-left: 25% !important; } - -.offset-4 { margin-left: 33.3333333333% !important; } - -.offset-5 { margin-left: 41.6666666667% !important; } - -.offset-6 { margin-left: 50% !important; } - -.offset-7 { margin-left: 58.3333333333% !important; } - -.offset-8 { margin-left: 66.6666666667% !important; } - -.offset-9 { margin-left: 75% !important; } - -.offset-10 { margin-left: 83.3333333333% !important; } - -.offset-11 { margin-left: 91.6666666667% !important; } - -@media (min-width: 544px) { .offset-sm-1 { margin-left: 8.3333333333% !important; } - .offset-sm-2 { margin-left: 16.6666666667% !important; } - .offset-sm-3 { margin-left: 25% !important; } - .offset-sm-4 { margin-left: 33.3333333333% !important; } - .offset-sm-5 { margin-left: 41.6666666667% !important; } - .offset-sm-6 { margin-left: 50% !important; } - .offset-sm-7 { margin-left: 58.3333333333% !important; } - .offset-sm-8 { margin-left: 66.6666666667% !important; } - .offset-sm-9 { margin-left: 75% !important; } - .offset-sm-10 { margin-left: 83.3333333333% !important; } - .offset-sm-11 { margin-left: 91.6666666667% !important; } } -@media (min-width: 768px) { .offset-md-1 { margin-left: 8.3333333333% !important; } - .offset-md-2 { margin-left: 16.6666666667% !important; } - .offset-md-3 { margin-left: 25% !important; } - .offset-md-4 { margin-left: 33.3333333333% !important; } - .offset-md-5 { margin-left: 41.6666666667% !important; } - .offset-md-6 { margin-left: 50% !important; } - .offset-md-7 { margin-left: 58.3333333333% !important; } - .offset-md-8 { margin-left: 66.6666666667% !important; } - .offset-md-9 { margin-left: 75% !important; } - .offset-md-10 { margin-left: 83.3333333333% !important; } - .offset-md-11 { margin-left: 91.6666666667% !important; } } -@media (min-width: 1012px) { .offset-lg-1 { margin-left: 8.3333333333% !important; } - .offset-lg-2 { margin-left: 16.6666666667% !important; } - .offset-lg-3 { margin-left: 25% !important; } - .offset-lg-4 { margin-left: 33.3333333333% !important; } - .offset-lg-5 { margin-left: 41.6666666667% !important; } - .offset-lg-6 { margin-left: 50% !important; } - .offset-lg-7 { margin-left: 58.3333333333% !important; } - .offset-lg-8 { margin-left: 66.6666666667% !important; } - .offset-lg-9 { margin-left: 75% !important; } - .offset-lg-10 { margin-left: 83.3333333333% !important; } - .offset-lg-11 { margin-left: 91.6666666667% !important; } } -@media (min-width: 1280px) { .offset-xl-1 { margin-left: 8.3333333333% !important; } - .offset-xl-2 { margin-left: 16.6666666667% !important; } - .offset-xl-3 { margin-left: 25% !important; } - .offset-xl-4 { margin-left: 33.3333333333% !important; } - .offset-xl-5 { margin-left: 41.6666666667% !important; } - .offset-xl-6 { margin-left: 50% !important; } - .offset-xl-7 { margin-left: 58.3333333333% !important; } - .offset-xl-8 { margin-left: 66.6666666667% !important; } - .offset-xl-9 { margin-left: 75% !important; } - .offset-xl-10 { margin-left: 83.3333333333% !important; } - .offset-xl-11 { margin-left: 91.6666666667% !important; } } -.markdown-body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; line-height: 1.5; word-wrap: break-word; } -.markdown-body::before { display: table; content: ""; } -.markdown-body::after { display: table; clear: both; content: ""; } -.markdown-body > *:first-child { margin-top: 0 !important; } -.markdown-body > *:last-child { margin-bottom: 0 !important; } -.markdown-body a:not([href]) { color: inherit; text-decoration: none; } -.markdown-body .absent { color: #cb2431; } -.markdown-body .anchor { float: left; padding-right: 4px; margin-left: -20px; line-height: 1; } -.markdown-body .anchor:focus { outline: none; } -.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre { margin-top: 0; margin-bottom: 16px; } -.markdown-body hr { height: 0.25em; padding: 0; margin: 24px 0; background-color: #e1e4e8; border: 0; } -.markdown-body blockquote { padding: 0 1em; color: #6a737d; border-left: 0.25em solid #dfe2e5; } -.markdown-body blockquote > :first-child { margin-top: 0; } -.markdown-body blockquote > :last-child { margin-bottom: 0; } -.markdown-body kbd { display: inline-block; padding: 3px 5px; font-size: 11px; line-height: 10px; color: #444d56; vertical-align: middle; background-color: #fafbfc; border: solid 1px #c6cbd1; border-bottom-color: #959da5; border-radius: 3px; box-shadow: inset 0 -1px 0 #959da5; } - -.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { margin-top: 24px; margin-bottom: 16px; font-weight: 600; line-height: 1.25; } -.markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link { color: #1b1f23; vertical-align: middle; visibility: hidden; } -.markdown-body h1:hover .anchor, .markdown-body h2:hover .anchor, .markdown-body h3:hover .anchor, .markdown-body h4:hover .anchor, .markdown-body h5:hover .anchor, .markdown-body h6:hover .anchor { text-decoration: none; } -.markdown-body h1:hover .anchor .octicon-link, .markdown-body h2:hover .anchor .octicon-link, .markdown-body h3:hover .anchor .octicon-link, .markdown-body h4:hover .anchor .octicon-link, .markdown-body h5:hover .anchor .octicon-link, .markdown-body h6:hover .anchor .octicon-link { visibility: visible; } -.markdown-body h1 tt, .markdown-body h1 code, .markdown-body h2 tt, .markdown-body h2 code, .markdown-body h3 tt, .markdown-body h3 code, .markdown-body h4 tt, .markdown-body h4 code, .markdown-body h5 tt, .markdown-body h5 code, .markdown-body h6 tt, .markdown-body h6 code { font-size: inherit; } -.markdown-body h1 { padding-bottom: 0.3em; font-size: 2em; border-bottom: 1px solid #eaecef; } -.markdown-body h2 { padding-bottom: 0.3em; font-size: 1.5em; border-bottom: 1px solid #eaecef; } -.markdown-body h3 { font-size: 1.25em; } -.markdown-body h4 { font-size: 1em; } -.markdown-body h5 { font-size: 0.875em; } -.markdown-body h6 { font-size: 0.85em; color: #6a737d; } - -.markdown-body ul, .markdown-body ol { padding-left: 2em; } -.markdown-body ul.no-list, .markdown-body ol.no-list { padding: 0; list-style-type: none; } -.markdown-body ul ul, .markdown-body ul ol, .markdown-body ol ol, .markdown-body ol ul { margin-top: 0; margin-bottom: 0; } -.markdown-body li { word-wrap: break-all; } -.markdown-body li > p { margin-top: 16px; } -.markdown-body li + li { margin-top: 0.25em; } -.markdown-body dl { padding: 0; } -.markdown-body dl dt { padding: 0; margin-top: 16px; font-size: 1em; font-style: italic; font-weight: 600; } -.markdown-body dl dd { padding: 0 16px; margin-bottom: 16px; } - -.markdown-body table { display: block; width: 100%; overflow: auto; } -.markdown-body table th { font-weight: 600; } -.markdown-body table th, .markdown-body table td { padding: 6px 13px; border: 1px solid #dfe2e5; } -.markdown-body table tr { background-color: #fff; border-top: 1px solid #c6cbd1; } -.markdown-body table tr:nth-child(2n) { background-color: #f6f8fa; } -.markdown-body table img { background-color: transparent; } - -.markdown-body img { max-width: 100%; box-sizing: content-box; background-color: #fff; } -.markdown-body img[align=right] { padding-left: 20px; } -.markdown-body img[align=left] { padding-right: 20px; } -.markdown-body .emoji { max-width: none; vertical-align: text-top; background-color: transparent; } -.markdown-body span.frame { display: block; overflow: hidden; } -.markdown-body span.frame > span { display: block; float: left; width: auto; padding: 7px; margin: 13px 0 0; overflow: hidden; border: 1px solid #dfe2e5; } -.markdown-body span.frame span img { display: block; float: left; } -.markdown-body span.frame span span { display: block; padding: 5px 0 0; clear: both; color: #24292e; } -.markdown-body span.align-center { display: block; overflow: hidden; clear: both; } -.markdown-body span.align-center > span { display: block; margin: 13px auto 0; overflow: hidden; text-align: center; } -.markdown-body span.align-center span img { margin: 0 auto; text-align: center; } -.markdown-body span.align-right { display: block; overflow: hidden; clear: both; } -.markdown-body span.align-right > span { display: block; margin: 13px 0 0; overflow: hidden; text-align: right; } -.markdown-body span.align-right span img { margin: 0; text-align: right; } -.markdown-body span.float-left { display: block; float: left; margin-right: 13px; overflow: hidden; } -.markdown-body span.float-left span { margin: 13px 0 0; } -.markdown-body span.float-right { display: block; float: right; margin-left: 13px; overflow: hidden; } -.markdown-body span.float-right > span { display: block; margin: 13px auto 0; overflow: hidden; text-align: right; } - -.markdown-body code, .markdown-body tt { padding: 0.2em 0.4em; margin: 0; font-size: 85%; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; } -.markdown-body code br, .markdown-body tt br { display: none; } -.markdown-body del code { text-decoration: inherit; } -.markdown-body pre { word-wrap: normal; } -.markdown-body pre > code { padding: 0; margin: 0; font-size: 100%; word-break: normal; white-space: pre; background: transparent; border: 0; } -.markdown-body .highlight { margin-bottom: 16px; } -.markdown-body .highlight pre { margin-bottom: 0; word-break: normal; } -.markdown-body .highlight pre, .markdown-body pre { padding: 16px; overflow: auto; font-size: 85%; line-height: 1.45; background-color: #f6f8fa; border-radius: 3px; } -.markdown-body pre code, .markdown-body pre tt { display: inline; max-width: auto; padding: 0; margin: 0; overflow: visible; line-height: inherit; word-wrap: normal; background-color: transparent; border: 0; } - -.markdown-body .csv-data td, .markdown-body .csv-data th { padding: 5px; overflow: hidden; font-size: 12px; line-height: 1; text-align: left; white-space: nowrap; } -.markdown-body .csv-data .blob-num { padding: 10px 8px 9px; text-align: right; background: #fff; border: 0; } -.markdown-body .csv-data tr { border-top: 0; } -.markdown-body .csv-data th { font-weight: 600; background: #f6f8fa; border-top: 0; } - -.highlight table td { padding: 5px; } - -.highlight table pre { margin: 0; } - -.highlight .cm { color: #999988; font-style: italic; } - -.highlight .cp { color: #999999; font-weight: bold; } - -.highlight .c1 { color: #999988; font-style: italic; } - -.highlight .cs { color: #999999; font-weight: bold; font-style: italic; } - -.highlight .c, .highlight .cd { color: #999988; font-style: italic; } - -.highlight .err { color: #a61717; background-color: #e3d2d2; } - -.highlight .gd { color: #000000; background-color: #ffdddd; } - -.highlight .ge { color: #000000; font-style: italic; } - -.highlight .gr { color: #aa0000; } - -.highlight .gh { color: #999999; } - -.highlight .gi { color: #000000; background-color: #ddffdd; } - -.highlight .go { color: #888888; } - -.highlight .gp { color: #555555; } - -.highlight .gs { font-weight: bold; } - -.highlight .gu { color: #aaaaaa; } - -.highlight .gt { color: #aa0000; } - -.highlight .kc { color: #000000; font-weight: bold; } - -.highlight .kd { color: #000000; font-weight: bold; } - -.highlight .kn { color: #000000; font-weight: bold; } - -.highlight .kp { color: #000000; font-weight: bold; } - -.highlight .kr { color: #000000; font-weight: bold; } - -.highlight .kt { color: #445588; font-weight: bold; } - -.highlight .k, .highlight .kv { color: #000000; font-weight: bold; } - -.highlight .mf { color: #009999; } - -.highlight .mh { color: #009999; } - -.highlight .il { color: #009999; } - -.highlight .mi { color: #009999; } - -.highlight .mo { color: #009999; } - -.highlight .m, .highlight .mb, .highlight .mx { color: #009999; } - -.highlight .sb { color: #d14; } - -.highlight .sc { color: #d14; } - -.highlight .sd { color: #d14; } - -.highlight .s2 { color: #d14; } - -.highlight .se { color: #d14; } - -.highlight .sh { color: #d14; } - -.highlight .si { color: #d14; } - -.highlight .sx { color: #d14; } - -.highlight .sr { color: #009926; } - -.highlight .s1 { color: #d14; } - -.highlight .ss { color: #990073; } - -.highlight .s { color: #d14; } - -.highlight .na { color: #008080; } - -.highlight .bp { color: #999999; } - -.highlight .nb { color: #0086B3; } - -.highlight .nc { color: #445588; font-weight: bold; } - -.highlight .no { color: #008080; } - -.highlight .nd { color: #3c5d5d; font-weight: bold; } - -.highlight .ni { color: #800080; } - -.highlight .ne { color: #990000; font-weight: bold; } - -.highlight .nf { color: #990000; font-weight: bold; } - -.highlight .nl { color: #990000; font-weight: bold; } - -.highlight .nn { color: #555555; } - -.highlight .nt { color: #000080; } - -.highlight .vc { color: #008080; } - -.highlight .vg { color: #008080; } - -.highlight .vi { color: #008080; } - -.highlight .nv { color: #008080; } - -.highlight .ow { color: #000000; font-weight: bold; } - -.highlight .o { color: #000000; font-weight: bold; } - -.highlight .w { color: #bbbbbb; } - -.highlight { background-color: #f8f8f8; } diff --git a/docs/_site/authors.html b/docs/_site/authors.html deleted file mode 100644 index d0107162..00000000 --- a/docs/_site/authors.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - -Authors • DataQualityDashboard - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
-
- - -
    -
  • -

    Clair Blacketer. Author, maintainer. -

    -
  • -
  • -

    Ajit Londhe. Author. -

    -
  • -
  • -

    Anthony Sena. Author. -

    -
  • -
  • -

    Anthony Molinaro. Author. -

    -
  • -
  • -

    Frank DeFalco. Author. -

    -
  • -
  • -

    Pavel Grafkin. Author. -

    -
  • -
- -
- -
- - - - -
- - - - - - - - diff --git a/docs/_site/bootstrap-toc.css b/docs/_site/bootstrap-toc.css deleted file mode 100644 index 5a859415..00000000 --- a/docs/_site/bootstrap-toc.css +++ /dev/null @@ -1,60 +0,0 @@ -/*! - * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) - * Copyright 2015 Aidan Feldman - * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ - -/* modified from https://github.com/twbs/bootstrap/blob/94b4076dd2efba9af71f0b18d4ee4b163aa9e0dd/docs/assets/css/src/docs.css#L548-L601 */ - -/* All levels of nav */ -nav[data-toggle='toc'] .nav > li > a { - display: block; - padding: 4px 20px; - font-size: 13px; - font-weight: 500; - color: #767676; -} -nav[data-toggle='toc'] .nav > li > a:hover, -nav[data-toggle='toc'] .nav > li > a:focus { - padding-left: 19px; - color: #563d7c; - text-decoration: none; - background-color: transparent; - border-left: 1px solid #563d7c; -} -nav[data-toggle='toc'] .nav > .active > a, -nav[data-toggle='toc'] .nav > .active:hover > a, -nav[data-toggle='toc'] .nav > .active:focus > a { - padding-left: 18px; - font-weight: bold; - color: #563d7c; - background-color: transparent; - border-left: 2px solid #563d7c; -} - -/* Nav: second level (shown on .active) */ -nav[data-toggle='toc'] .nav .nav { - display: none; /* Hide by default, but at >768px, show it */ - padding-bottom: 10px; -} -nav[data-toggle='toc'] .nav .nav > li > a { - padding-top: 1px; - padding-bottom: 1px; - padding-left: 30px; - font-size: 12px; - font-weight: normal; -} -nav[data-toggle='toc'] .nav .nav > li > a:hover, -nav[data-toggle='toc'] .nav .nav > li > a:focus { - padding-left: 29px; -} -nav[data-toggle='toc'] .nav .nav > .active > a, -nav[data-toggle='toc'] .nav .nav > .active:hover > a, -nav[data-toggle='toc'] .nav .nav > .active:focus > a { - padding-left: 28px; - font-weight: 500; -} - -/* from https://github.com/twbs/bootstrap/blob/e38f066d8c203c3e032da0ff23cd2d6098ee2dd6/docs/assets/css/src/docs.css#L631-L634 */ -nav[data-toggle='toc'] .nav > .active > ul { - display: block; -} diff --git a/docs/_site/bootstrap-toc.js b/docs/_site/bootstrap-toc.js deleted file mode 100644 index 1cdd573b..00000000 --- a/docs/_site/bootstrap-toc.js +++ /dev/null @@ -1,159 +0,0 @@ -/*! - * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) - * Copyright 2015 Aidan Feldman - * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ -(function() { - 'use strict'; - - window.Toc = { - helpers: { - // return all matching elements in the set, or their descendants - findOrFilter: function($el, selector) { - // http://danielnouri.org/notes/2011/03/14/a-jquery-find-that-also-finds-the-root-element/ - // http://stackoverflow.com/a/12731439/358804 - var $descendants = $el.find(selector); - return $el.filter(selector).add($descendants).filter(':not([data-toc-skip])'); - }, - - generateUniqueIdBase: function(el) { - var text = $(el).text(); - var anchor = text.trim().toLowerCase().replace(/[^A-Za-z0-9]+/g, '-'); - return anchor || el.tagName.toLowerCase(); - }, - - generateUniqueId: function(el) { - var anchorBase = this.generateUniqueIdBase(el); - for (var i = 0; ; i++) { - var anchor = anchorBase; - if (i > 0) { - // add suffix - anchor += '-' + i; - } - // check if ID already exists - if (!document.getElementById(anchor)) { - return anchor; - } - } - }, - - generateAnchor: function(el) { - if (el.id) { - return el.id; - } else { - var anchor = this.generateUniqueId(el); - el.id = anchor; - return anchor; - } - }, - - createNavList: function() { - return $(''); - }, - - createChildNavList: function($parent) { - var $childList = this.createNavList(); - $parent.append($childList); - return $childList; - }, - - generateNavEl: function(anchor, text) { - var $a = $(''); - $a.attr('href', '#' + anchor); - $a.text(text); - var $li = $('
  • '); - $li.append($a); - return $li; - }, - - generateNavItem: function(headingEl) { - var anchor = this.generateAnchor(headingEl); - var $heading = $(headingEl); - var text = $heading.data('toc-text') || $heading.text(); - return this.generateNavEl(anchor, text); - }, - - // Find the first heading level (`

    `, then `

    `, etc.) that has more than one element. Defaults to 1 (for `

    `). - getTopLevel: function($scope) { - for (var i = 1; i <= 6; i++) { - var $headings = this.findOrFilter($scope, 'h' + i); - if ($headings.length > 1) { - return i; - } - } - - return 1; - }, - - // returns the elements for the top level, and the next below it - getHeadings: function($scope, topLevel) { - var topSelector = 'h' + topLevel; - - var secondaryLevel = topLevel + 1; - var secondarySelector = 'h' + secondaryLevel; - - return this.findOrFilter($scope, topSelector + ',' + secondarySelector); - }, - - getNavLevel: function(el) { - return parseInt(el.tagName.charAt(1), 10); - }, - - populateNav: function($topContext, topLevel, $headings) { - var $context = $topContext; - var $prevNav; - - var helpers = this; - $headings.each(function(i, el) { - var $newNav = helpers.generateNavItem(el); - var navLevel = helpers.getNavLevel(el); - - // determine the proper $context - if (navLevel === topLevel) { - // use top level - $context = $topContext; - } else if ($prevNav && $context === $topContext) { - // create a new level of the tree and switch to it - $context = helpers.createChildNavList($prevNav); - } // else use the current $context - - $context.append($newNav); - - $prevNav = $newNav; - }); - }, - - parseOps: function(arg) { - var opts; - if (arg.jquery) { - opts = { - $nav: arg - }; - } else { - opts = arg; - } - opts.$scope = opts.$scope || $(document.body); - return opts; - } - }, - - // accepts a jQuery object, or an options object - init: function(opts) { - opts = this.helpers.parseOps(opts); - - // ensure that the data attribute is in place for styling - opts.$nav.attr('data-toggle', 'toc'); - - var $topContext = this.helpers.createChildNavList(opts.$nav); - var topLevel = this.helpers.getTopLevel(opts.$scope); - var $headings = this.helpers.getHeadings(opts.$scope, topLevel); - this.helpers.populateNav($topContext, topLevel, $headings); - } - }; - - $(function() { - $('nav[data-toggle="toc"]').each(function(i, el) { - var $nav = $(el); - Toc.init($nav); - }); - }); -})(); diff --git a/docs/_site/docsearch.css b/docs/_site/docsearch.css deleted file mode 100644 index e5f1fe1d..00000000 --- a/docs/_site/docsearch.css +++ /dev/null @@ -1,148 +0,0 @@ -/* Docsearch -------------------------------------------------------------- */ -/* - Source: https://github.com/algolia/docsearch/ - License: MIT -*/ - -.algolia-autocomplete { - display: block; - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1 -} - -.algolia-autocomplete .ds-dropdown-menu { - width: 100%; - min-width: none; - max-width: none; - padding: .75rem 0; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, .1); - box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .175); -} - -@media (min-width:768px) { - .algolia-autocomplete .ds-dropdown-menu { - width: 175% - } -} - -.algolia-autocomplete .ds-dropdown-menu::before { - display: none -} - -.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-] { - padding: 0; - background-color: rgb(255,255,255); - border: 0; - max-height: 80vh; -} - -.algolia-autocomplete .ds-dropdown-menu .ds-suggestions { - margin-top: 0 -} - -.algolia-autocomplete .algolia-docsearch-suggestion { - padding: 0; - overflow: visible -} - -.algolia-autocomplete .algolia-docsearch-suggestion--category-header { - padding: .125rem 1rem; - margin-top: 0; - font-size: 1.3em; - font-weight: 500; - color: #00008B; - border-bottom: 0 -} - -.algolia-autocomplete .algolia-docsearch-suggestion--wrapper { - float: none; - padding-top: 0 -} - -.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column { - float: none; - width: auto; - padding: 0; - text-align: left -} - -.algolia-autocomplete .algolia-docsearch-suggestion--content { - float: none; - width: auto; - padding: 0 -} - -.algolia-autocomplete .algolia-docsearch-suggestion--content::before { - display: none -} - -.algolia-autocomplete .ds-suggestion:not(:first-child) .algolia-docsearch-suggestion--category-header { - padding-top: .75rem; - margin-top: .75rem; - border-top: 1px solid rgba(0, 0, 0, .1) -} - -.algolia-autocomplete .ds-suggestion .algolia-docsearch-suggestion--subcategory-column { - display: block; - padding: .1rem 1rem; - margin-bottom: 0.1; - font-size: 1.0em; - font-weight: 400 - /* display: none */ -} - -.algolia-autocomplete .algolia-docsearch-suggestion--title { - display: block; - padding: .25rem 1rem; - margin-bottom: 0; - font-size: 0.9em; - font-weight: 400 -} - -.algolia-autocomplete .algolia-docsearch-suggestion--text { - padding: 0 1rem .5rem; - margin-top: -.25rem; - font-size: 0.8em; - font-weight: 400; - line-height: 1.25 -} - -.algolia-autocomplete .algolia-docsearch-footer { - width: 110px; - height: 20px; - z-index: 3; - margin-top: 10.66667px; - float: right; - font-size: 0; - line-height: 0; -} - -.algolia-autocomplete .algolia-docsearch-footer--logo { - background-image: url("data:image/svg+xml;utf8,"); - background-repeat: no-repeat; - background-position: 50%; - background-size: 100%; - overflow: hidden; - text-indent: -9000px; - width: 100%; - height: 100%; - display: block; - transform: translate(-8px); -} - -.algolia-autocomplete .algolia-docsearch-suggestion--highlight { - color: #FF8C00; - background: rgba(232, 189, 54, 0.1) -} - - -.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight { - box-shadow: inset 0 -2px 0 0 rgba(105, 105, 105, .5) -} - -.algolia-autocomplete .ds-suggestion.ds-cursor .algolia-docsearch-suggestion--content { - background-color: rgba(192, 192, 192, .15) -} diff --git a/docs/_site/docsearch.js b/docs/_site/docsearch.js deleted file mode 100644 index b35504cd..00000000 --- a/docs/_site/docsearch.js +++ /dev/null @@ -1,85 +0,0 @@ -$(function() { - - // register a handler to move the focus to the search bar - // upon pressing shift + "/" (i.e. "?") - $(document).on('keydown', function(e) { - if (e.shiftKey && e.keyCode == 191) { - e.preventDefault(); - $("#search-input").focus(); - } - }); - - $(document).ready(function() { - // do keyword highlighting - /* modified from https://jsfiddle.net/julmot/bL6bb5oo/ */ - var mark = function() { - - var referrer = document.URL ; - var paramKey = "q" ; - - if (referrer.indexOf("?") !== -1) { - var qs = referrer.substr(referrer.indexOf('?') + 1); - var qs_noanchor = qs.split('#')[0]; - var qsa = qs_noanchor.split('&'); - var keyword = ""; - - for (var i = 0; i < qsa.length; i++) { - var currentParam = qsa[i].split('='); - - if (currentParam.length !== 2) { - continue; - } - - if (currentParam[0] == paramKey) { - keyword = decodeURIComponent(currentParam[1].replace(/\+/g, "%20")); - } - } - - if (keyword !== "") { - $(".contents").unmark({ - done: function() { - $(".contents").mark(keyword); - } - }); - } - } - }; - - mark(); - }); -}); - -/* Search term highlighting ------------------------------*/ - -function matchedWords(hit) { - var words = []; - - var hierarchy = hit._highlightResult.hierarchy; - // loop to fetch from lvl0, lvl1, etc. - for (var idx in hierarchy) { - words = words.concat(hierarchy[idx].matchedWords); - } - - var content = hit._highlightResult.content; - if (content) { - words = words.concat(content.matchedWords); - } - - // return unique words - var words_uniq = [...new Set(words)]; - return words_uniq; -} - -function updateHitURL(hit) { - - var words = matchedWords(hit); - var url = ""; - - if (hit.anchor) { - url = hit.url_without_anchor + '?q=' + escape(words.join(" ")) + '#' + hit.anchor; - } else { - url = hit.url + '?q=' + escape(words.join(" ")); - } - - return url; -} diff --git a/docs/_site/index.html b/docs/_site/index.html deleted file mode 100644 index 80f06db2..00000000 --- a/docs/_site/index.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - - -Execute and View Data Quality Checks on OMOP CDM Database • DataQualityDashboard - - - - - - - - - - -
    -
    - - - - -
    -
    - -
    - - -

    The goal of the Data Quality Dashboard (DQD) project is to design and develop an open-source tool to expose and evaluate observational data quality.

    -
    -
    -

    -Introduction

    -

    This package will run a series of data quality checks against an OMOP CDM instance (currently supports v5.3.1 and v5.2.2). It systematically runs the checks, evaluates the checks against some pre-specified threshold, and then communicates what was done in a transparent and easily understandable way.

    -
    -
    -

    -Overview

    -

    The quality checks were organized according to the Kahn Framework1 which uses a system of categories and contexts that represent stratgies for assessing data quality. ##TODO for an introduction to the kahn framework please click [here] link.

    -

    Using this framework, the Data Quality Dashboard takes a systematic-based approach to running data quality checks. Instead of writing thousands of individual checks, we use “data quality check types”. These “check types” are more general, parameterized data quality checks into which OMOP tables, fields, and concepts can be substituted to represent a singular data quality idea. For example, one check type might be written as

    -
    -

    The number and percent of records with a value in the cdmFieldName field of the cdmTableName table less than plausibleValueLow.

    -
    -

    This would be considered an atemporal plausibility verification check because we are looking for implausibly low values in some field based on internal knowledge. We can use this check type to substitute in values for cdmFieldName, cdmTableName, and plausibleValueLow to create a unique data quality check. If we apply it to PERSON.YEAR_OF_BIRTH here is how that might look:

    -
    -

    The number and percent of records with a value in the year_of_birth field of the PERSON table less than 1850.

    -
    -

    And, since it is parameterized, we can similarly apply it to DRUG_EXPOSURE.days_supply:

    -
    -

    The number and percent of records with a value in the days_supply field of the DRUG_EXPOSURE table less than 0.

    -
    -

    Version 1 of the tool includes 20 different check types organized into Kahn contexts and categories. Additionally, each data quality check type is considered either a table check, field check, or concept-level check. Table-level checks are those evaluating the table at a high-level without reference to individual fields, or those that span multiple event tables. These include checks making sure required tables are present or that at least some of the people in the PERSON table have records in the event tables. Field-level checks are those related to specific fields in a table. The majority of the check types in version 1 are field-level checks. These include checks evaluating primary key relationship and those investigating if the concepts in a field conform to the specified domain. Concept-level checks are related to individual concepts. These include checks looking for gender-specific concepts in persons of the wrong gender and plausible values for measurement-unit pairs. ##TODO The below table lists all check types, the check level (table, field, concept), a description of the check, and Kahn category and context it fits into. Remove table, click here for more information on the checks included

    -

    After systematically applying the 20 check types to an OMOP CDM version approximately 3,351 individual data quality checks are resolved, run against the database, and evaluated based on a pre-specified threshold ##TODO [more about thresholds here]. The R package then creates a json object that is read into an RShiny application to view the results.

    -

    -
    -
    -

    -Features

    -
      -
    • Utilizes configurable data check thresholds
    • -
    • Analyzes data in the OMOP Common Data Model format for all data checks
    • -
    • Produces a set of data check results with supplemental investigation assets.
    • -
    -
    -
    -

    -Technology

    -

    DataQualityDashboard is an R package

    -
    -
    -

    -System Requirements

    -

    Requires R (version 3.2.2 or higher). Requires DatabaseConnector and SqlRender.

    -
    -
    -

    -R Installation

    -
    install.packages("devtools")
    -devtools::install_github("OHDSI/DataQualityDashboard")
    -
    -
    -

    -Executing Data Quality Checks

    -
    -# fill out the connection details -----------------------------------------------------------------------
    -connectionDetails <- DatabaseConnector::createConnectionDetails(dbms = "",
    -                                                              user = "",
    -                                                              password = "",
    -                                                              server = "",
    -                                                              port = "",
    -                                                              extraSettings = "")
    -
    -cdmDatabaseSchema <- "yourCdmSchema" # the fully qualified database schema name of the CDM
    -resultsDatabaseSchema <- "yourResultsSchema" # the fully qualified database schema name of the results schema (that you can write to)
    -cdmSourceName <- "Your CDM Source" # a human readable name for your CDM source
    -
    -# determine how many threads (concurrent SQL sessions) to use ----------------------------------------
    -numThreads <- 1 # on Redshift, 3 seems to work well
    -
    -# specify if you want to execute the queries or inspect them ------------------------------------------
    -sqlOnly <- FALSE # set to TRUE if you just want to get the SQL scripts and not actually run the queries
    -
    -# where should the logs go? -------------------------------------------------------------------------
    -outputFolder <- "output"
    -
    -# logging type -------------------------------------------------------------------------------------
    -verboseMode <- FALSE # set to TRUE if you want to see activity written to the console
    -
    -# write results to table? ------------------------------------------------------------------------------
    -writeToTable <- TRUE # set to FALSE if you want to skip writing to a SQL table in the results schema
    -
    -# if writing to table and using Redshift, bulk loading can be initialized -------------------------------
    -
    -# Sys.setenv("AWS_ACCESS_KEY_ID" = "",
    -#            "AWS_SECRET_ACCESS_KEY" = "",
    -#            "AWS_DEFAULT_REGION" = "",
    -#            "AWS_BUCKET_NAME" = "",
    -#            "AWS_OBJECT_KEY" = "",
    -#            "AWS_SSE_TYPE" = "AES256",
    -#            "USE_MPP_BULK_LOAD" = TRUE)
    -
    -# which DQ check levels to run -------------------------------------------------------------------
    -checkLevels <- c("TABLE", "FIELD", "CONCEPT")
    -
    -# which DQ checks to run? ------------------------------------
    -
    -checkNames <- c() # Names can be found in inst/csv/OMOP_CDM_v5.3.1_Check_Desciptions.csv
    -
    -# run the job --------------------------------------------------------------------------------------
    -DataQualityDashboard::executeDqChecks(connectionDetails = connectionDetails,
    -                                    cdmDatabaseSchema = cdmDatabaseSchema,
    -                                    resultsDatabaseSchema = resultsDatabaseSchema,
    -                                    cdmSourceName = cdmSourceName,
    -                                    numThreads = numThreads,
    -                                    sqlOnly = sqlOnly,
    -                                    outputFolder = outputFolder,
    -                                    verboseMode = verboseMode,
    -                                    writeToTable = writeToTable,
    -                                    checkLevels = checkLevels,
    -                                    checkNames = checkNames)
    -
    -# inspect logs ----------------------------------------------------------------------------
    -ParallelLogger::launchLogViewer(logFileName = file.path(outputFolder, cdmSourceName,
    -                                                      sprintf("log_DqDashboard_%s.txt", cdmSourceName)))
    -
    -# (OPTIONAL) if you want to write the JSON file to the results table separately -----------------------------
    -jsonFilePath <- ""
    -DataQualityDashboard::writeJsonResultsToTable(connectionDetails = connectionDetails,
    -                                            resultsDatabaseSchema = resultsDatabaseSchema,
    -                                            jsonFilePath = jsonFilePath)
    -
    -
    -

    -Viewing Results

    -

    Launching Dashboard as Shiny App

    -
    DataQualityDashboard::viewDqDashboard(jsonPath = file.path(getwd(), outputFolder, cdmSourceName, sprintf("results_%s.json", cdmSourceName)))
    -

    Launching on a web server

    -

    If you have npm installed:

    -
      -
    1. Install http-server:
    2. -
    -
    npm install -g http-server
    -
      -
    1. Rename the json file to results.json and place it in inst/shinyApps/www

    2. -
    3. Go to inst/shinyApps/www, then run:

    4. -
    -
    http-server
    -

    A results JSON file for the Synthea synthetic dataset will be shown. You can view your results by replacing the results.json file with your file (with name results.json).

    -
    -
    -

    -View checks

    -

    To see description of checks using R, execute the command bellow:

    -
    View(read.csv(system.file("csv","OMOP_CDMv5.3.1_Check_Descriptions.csv",package="DataQualityDashboard"),as.is=T))
    -
    -
    -

    -Support

    - -
    -
    -

    -License

    -

    DataQualityDashboard is licensed under Apache License 2.0

    -
    -

    -Development status

    -

    V1.0 ready for use.

    -
    -
    -
    -

    -Acknowledgements

    -

    This project is supported in part through the National Science Foundation grant IIS 1251151.

    -

    1 Kahn, M.G., et al., A Harmonized Data Quality Assessment Terminology and Framework for the Secondary Use of Electronic Health Record Data. EGEMS (Wash DC), 2016. 4(1): p. 1244. ↩︎

    -
    - -
    - - -
    - - -
    - -
    -

    Site built with pkgdown 1.5.1.

    -
    - -
    -
    - - - - - - diff --git a/docs/_site/link.svg b/docs/_site/link.svg deleted file mode 100644 index 88ad8276..00000000 --- a/docs/_site/link.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/docs/_site/pkgdown.css b/docs/_site/pkgdown.css deleted file mode 100644 index c01e5923..00000000 --- a/docs/_site/pkgdown.css +++ /dev/null @@ -1,367 +0,0 @@ -/* Sticky footer */ - -/** - * Basic idea: https://philipwalton.github.io/solved-by-flexbox/demos/sticky-footer/ - * Details: https://github.com/philipwalton/solved-by-flexbox/blob/master/assets/css/components/site.css - * - * .Site -> body > .container - * .Site-content -> body > .container .row - * .footer -> footer - * - * Key idea seems to be to ensure that .container and __all its parents__ - * have height set to 100% - * - */ - -html, body { - height: 100%; -} - -body { - position: relative; -} - -body > .container { - display: flex; - height: 100%; - flex-direction: column; -} - -body > .container .row { - flex: 1 0 auto; -} - -footer { - margin-top: 45px; - padding: 35px 0 36px; - border-top: 1px solid #e5e5e5; - color: #666; - display: flex; - flex-shrink: 0; -} -footer p { - margin-bottom: 0; -} -footer div { - flex: 1; -} -footer .pkgdown { - text-align: right; -} -footer p { - margin-bottom: 0; -} - -img.icon { - float: right; -} - -img { - max-width: 100%; -} - -/* Fix bug in bootstrap (only seen in firefox) */ -summary { - display: list-item; -} - -/* Typographic tweaking ---------------------------------*/ - -.contents .page-header { - margin-top: calc(-60px + 1em); -} - -dd { - margin-left: 3em; -} - -/* Section anchors ---------------------------------*/ - -a.anchor { - margin-left: -30px; - display:inline-block; - width: 30px; - height: 30px; - visibility: hidden; - - background-image: url(./link.svg); - background-repeat: no-repeat; - background-size: 20px 20px; - background-position: center center; -} - -.hasAnchor:hover a.anchor { - visibility: visible; -} - -@media (max-width: 767px) { - .hasAnchor:hover a.anchor { - visibility: hidden; - } -} - - -/* Fixes for fixed navbar --------------------------*/ - -.contents h1, .contents h2, .contents h3, .contents h4 { - padding-top: 60px; - margin-top: -40px; -} - -/* Navbar submenu --------------------------*/ - -.dropdown-submenu { - position: relative; -} - -.dropdown-submenu>.dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - border-radius: 0 6px 6px 6px; -} - -.dropdown-submenu:hover>.dropdown-menu { - display: block; -} - -.dropdown-submenu>a:after { - display: block; - content: " "; - float: right; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - border-width: 5px 0 5px 5px; - border-left-color: #cccccc; - margin-top: 5px; - margin-right: -10px; -} - -.dropdown-submenu:hover>a:after { - border-left-color: #ffffff; -} - -.dropdown-submenu.pull-left { - float: none; -} - -.dropdown-submenu.pull-left>.dropdown-menu { - left: -100%; - margin-left: 10px; - border-radius: 6px 0 6px 6px; -} - -/* Sidebar --------------------------*/ - -#pkgdown-sidebar { - margin-top: 30px; - position: -webkit-sticky; - position: sticky; - top: 70px; -} - -#pkgdown-sidebar h2 { - font-size: 1.5em; - margin-top: 1em; -} - -#pkgdown-sidebar h2:first-child { - margin-top: 0; -} - -#pkgdown-sidebar .list-unstyled li { - margin-bottom: 0.5em; -} - -/* bootstrap-toc tweaks ------------------------------------------------------*/ - -/* All levels of nav */ - -nav[data-toggle='toc'] .nav > li > a { - padding: 4px 20px 4px 6px; - font-size: 1.5rem; - font-weight: 400; - color: inherit; -} - -nav[data-toggle='toc'] .nav > li > a:hover, -nav[data-toggle='toc'] .nav > li > a:focus { - padding-left: 5px; - color: inherit; - border-left: 1px solid #878787; -} - -nav[data-toggle='toc'] .nav > .active > a, -nav[data-toggle='toc'] .nav > .active:hover > a, -nav[data-toggle='toc'] .nav > .active:focus > a { - padding-left: 5px; - font-size: 1.5rem; - font-weight: 400; - color: inherit; - border-left: 2px solid #878787; -} - -/* Nav: second level (shown on .active) */ - -nav[data-toggle='toc'] .nav .nav { - display: none; /* Hide by default, but at >768px, show it */ - padding-bottom: 10px; -} - -nav[data-toggle='toc'] .nav .nav > li > a { - padding-left: 16px; - font-size: 1.35rem; -} - -nav[data-toggle='toc'] .nav .nav > li > a:hover, -nav[data-toggle='toc'] .nav .nav > li > a:focus { - padding-left: 15px; -} - -nav[data-toggle='toc'] .nav .nav > .active > a, -nav[data-toggle='toc'] .nav .nav > .active:hover > a, -nav[data-toggle='toc'] .nav .nav > .active:focus > a { - padding-left: 15px; - font-weight: 500; - font-size: 1.35rem; -} - -/* orcid ------------------------------------------------------------------- */ - -.orcid { - font-size: 16px; - color: #A6CE39; - /* margins are required by official ORCID trademark and display guidelines */ - margin-left:4px; - margin-right:4px; - vertical-align: middle; -} - -/* Reference index & topics ----------------------------------------------- */ - -.ref-index th {font-weight: normal;} - -.ref-index td {vertical-align: top;} -.ref-index .icon {width: 40px;} -.ref-index .alias {width: 40%;} -.ref-index-icons .alias {width: calc(40% - 40px);} -.ref-index .title {width: 60%;} - -.ref-arguments th {text-align: right; padding-right: 10px;} -.ref-arguments th, .ref-arguments td {vertical-align: top;} -.ref-arguments .name {width: 20%;} -.ref-arguments .desc {width: 80%;} - -/* Nice scrolling for wide elements --------------------------------------- */ - -table { - display: block; - overflow: auto; -} - -/* Syntax highlighting ---------------------------------------------------- */ - -pre { - word-wrap: normal; - word-break: normal; - border: 1px solid #eee; -} - -pre, code { - background-color: #f8f8f8; - color: #333; -} - -pre code { - overflow: auto; - word-wrap: normal; - white-space: pre; -} - -pre .img { - margin: 5px 0; -} - -pre .img img { - background-color: #fff; - display: block; - height: auto; -} - -code a, pre a { - color: #375f84; -} - -a.sourceLine:hover { - text-decoration: none; -} - -.fl {color: #1514b5;} -.fu {color: #000000;} /* function */ -.ch,.st {color: #036a07;} /* string */ -.kw {color: #264D66;} /* keyword */ -.co {color: #888888;} /* comment */ - -.message { color: black; font-weight: bolder;} -.error { color: orange; font-weight: bolder;} -.warning { color: #6A0366; font-weight: bolder;} - -/* Clipboard --------------------------*/ - -.hasCopyButton { - position: relative; -} - -.btn-copy-ex { - position: absolute; - right: 0; - top: 0; - visibility: hidden; -} - -.hasCopyButton:hover button.btn-copy-ex { - visibility: visible; -} - -/* headroom.js ------------------------ */ - -.headroom { - will-change: transform; - transition: transform 200ms linear; -} -.headroom--pinned { - transform: translateY(0%); -} -.headroom--unpinned { - transform: translateY(-100%); -} - -/* mark.js ----------------------------*/ - -mark { - background-color: rgba(255, 255, 51, 0.5); - border-bottom: 2px solid rgba(255, 153, 51, 0.3); - padding: 1px; -} - -/* vertical spacing after htmlwidgets */ -.html-widget { - margin-bottom: 10px; -} - -/* fontawesome ------------------------ */ - -.fab { - font-family: "Font Awesome 5 Brands" !important; -} - -/* don't display links in code chunks when printing */ -/* source: https://stackoverflow.com/a/10781533 */ -@media print { - code a:link:after, code a:visited:after { - content: ""; - } -} diff --git a/docs/_site/pkgdown.js b/docs/_site/pkgdown.js deleted file mode 100644 index 7e7048fa..00000000 --- a/docs/_site/pkgdown.js +++ /dev/null @@ -1,108 +0,0 @@ -/* http://gregfranko.com/blog/jquery-best-practices/ */ -(function($) { - $(function() { - - $('.navbar-fixed-top').headroom(); - - $('body').css('padding-top', $('.navbar').height() + 10); - $(window).resize(function(){ - $('body').css('padding-top', $('.navbar').height() + 10); - }); - - $('[data-toggle="tooltip"]').tooltip(); - - var cur_path = paths(location.pathname); - var links = $("#navbar ul li a"); - var max_length = -1; - var pos = -1; - for (var i = 0; i < links.length; i++) { - if (links[i].getAttribute("href") === "#") - continue; - // Ignore external links - if (links[i].host !== location.host) - continue; - - var nav_path = paths(links[i].pathname); - - var length = prefix_length(nav_path, cur_path); - if (length > max_length) { - max_length = length; - pos = i; - } - } - - // Add class to parent
  • , and enclosing
  • if in dropdown - if (pos >= 0) { - var menu_anchor = $(links[pos]); - menu_anchor.parent().addClass("active"); - menu_anchor.closest("li.dropdown").addClass("active"); - } - }); - - function paths(pathname) { - var pieces = pathname.split("/"); - pieces.shift(); // always starts with / - - var end = pieces[pieces.length - 1]; - if (end === "index.html" || end === "") - pieces.pop(); - return(pieces); - } - - // Returns -1 if not found - function prefix_length(needle, haystack) { - if (needle.length > haystack.length) - return(-1); - - // Special case for length-0 haystack, since for loop won't run - if (haystack.length === 0) { - return(needle.length === 0 ? 0 : -1); - } - - for (var i = 0; i < haystack.length; i++) { - if (needle[i] != haystack[i]) - return(i); - } - - return(haystack.length); - } - - /* Clipboard --------------------------*/ - - function changeTooltipMessage(element, msg) { - var tooltipOriginalTitle=element.getAttribute('data-original-title'); - element.setAttribute('data-original-title', msg); - $(element).tooltip('show'); - element.setAttribute('data-original-title', tooltipOriginalTitle); - } - - if(ClipboardJS.isSupported()) { - $(document).ready(function() { - var copyButton = ""; - - $(".examples, div.sourceCode").addClass("hasCopyButton"); - - // Insert copy buttons: - $(copyButton).prependTo(".hasCopyButton"); - - // Initialize tooltips: - $('.btn-copy-ex').tooltip({container: 'body'}); - - // Initialize clipboard: - var clipboardBtnCopies = new ClipboardJS('[data-clipboard-copy]', { - text: function(trigger) { - return trigger.parentNode.textContent; - } - }); - - clipboardBtnCopies.on('success', function(e) { - changeTooltipMessage(e.trigger, 'Copied!'); - e.clearSelection(); - }); - - clipboardBtnCopies.on('error', function() { - changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy'); - }); - }); - } -})(window.jQuery || window.$) diff --git a/docs/_site/pkgdown.yml b/docs/_site/pkgdown.yml deleted file mode 100644 index 012cc0cf..00000000 --- a/docs/_site/pkgdown.yml +++ /dev/null @@ -1,6 +0,0 @@ -pandoc: 2.7.3 -pkgdown: 1.5.1 -pkgdown_sha: ~ -articles: [] -last_built: 2020-04-22T23:06Z - diff --git a/docs/_site/reference/executeDqChecks.html b/docs/_site/reference/executeDqChecks.html deleted file mode 100644 index 21c70019..00000000 --- a/docs/_site/reference/executeDqChecks.html +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - - - -Execute DQ checks — executeDqChecks • DataQualityDashboard - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - -
    - -
    -
    - - -
    - -

    Execute DQ checks

    - -
    - -
    executeDqChecks(
    -  connectionDetails,
    -  cdmDatabaseSchema,
    -  resultsDatabaseSchema,
    -  cdmSourceName,
    -  numThreads = 1,
    -  sqlOnly = FALSE,
    -  outputFolder = "output",
    -  verboseMode = FALSE,
    -  writeToTable = TRUE,
    -  checkLevels = c("TABLE", "FIELD", "CONCEPT"),
    -  checkNames = c(),
    -  tablesToExclude = c(),
    -  cdmVersion = "5.3.1"
    -)
    - -

    Arguments

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    connectionDetails

    A connectionDetails object for connecting to the CDM database

    cdmDatabaseSchema

    The fully qualified database name of the CDM schema

    resultsDatabaseSchema

    The fully qualified database name of the results schema

    cdmSourceName

    The name of the CDM data source

    numThreads

    The number of concurrent threads to use to execute the queries

    sqlOnly

    Should the SQLs be executed (FALSE) or just returned (TRUE)?

    outputFolder

    The folder to output logs and SQL files to

    verboseMode

    Boolean to determine if the console will show all execution steps. Default = FALSE

    writeToTable

    Boolean to indicate if the check results will be written to the dqdashboard_results table -in the resultsDatabaseSchema. Default is TRUE.

    checkLevels

    Choose which DQ check levels to execute. Default is all 3 (TABLE, FIELD, CONCEPT)

    checkNames

    (OPTIONAL) Choose which check names to execute. Names can be found in inst/csv/OMOP_CDM_v[cdmVersion]_Check_Desciptions.csv

    tablesToExclude

    (OPTIONAL) Choose which CDM tables to exclude from the execution.

    cdmVersion

    The CDM version to target for the data source. By default, 5.3.1 is used.

    - -

    Value

    - -

    If sqlOnly = FALSE, a list object of results

    - - -
    - -
    - - -
    - - -
    -

    Site built with pkgdown 1.5.1.

    -
    - -
    -
    - - - - - - - - diff --git a/docs/_site/reference/index.html b/docs/_site/reference/index.html deleted file mode 100644 index 666d8125..00000000 --- a/docs/_site/reference/index.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - - -Function reference • DataQualityDashboard - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -

    Execution

    -

    Function for running data quality checks

    -
    -

    executeDqChecks()

    -

    Execute DQ checks

    -

    writeJsonResultsToTable()

    -

    Write JSON Results to SQL Table

    -

    View Dashboard

    -

    Function for viewing the data quality dashboard

    -
    -

    viewDqDashboard()

    -

    View DQ Dashboard

    -
    - - -
    - - -
    - - -
    -

    Site built with pkgdown 1.5.1.

    -
    - -
    -
    - - - - - - - - diff --git a/docs/_site/reference/viewDqDashboard.html b/docs/_site/reference/viewDqDashboard.html deleted file mode 100644 index 0d838f5f..00000000 --- a/docs/_site/reference/viewDqDashboard.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - -View DQ Dashboard — viewDqDashboard • DataQualityDashboard - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - -
    - -
    -
    - - -
    - -

    View DQ Dashboard

    - -
    - -
    viewDqDashboard(jsonPath)
    - -

    Arguments

    - - - - - - -
    jsonPath

    The path to the JSON file produced by executeDqChecks

    - - -
    - -
    - - -
    - - -
    -

    Site built with pkgdown 1.5.1.

    -
    - -
    -
    - - - - - - - - diff --git a/docs/_site/reference/writeJsonResultsToTable.html b/docs/_site/reference/writeJsonResultsToTable.html deleted file mode 100644 index 5fe0196d..00000000 --- a/docs/_site/reference/writeJsonResultsToTable.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - -Write JSON Results to SQL Table — writeJsonResultsToTable • DataQualityDashboard - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - -
    - -
    -
    - - -
    - -

    Write JSON Results to SQL Table

    - -
    - -
    writeJsonResultsToTable(connectionDetails, resultsDatabaseSchema, jsonFilePath)
    - -

    Arguments

    - - - - - - - - - - - - - - -
    connectionDetails

    A connectionDetails object for connecting to the CDM database

    resultsDatabaseSchema

    The fully qualified database name of the results schema

    jsonFilePath

    Path to the JSON results file generated using the execute function

    - - -
    - -
    - - -
    - - -
    -

    Site built with pkgdown 1.5.1.

    -
    - -
    -
    - - - - - - - - diff --git a/docs/articles/AddNewCheck.html b/docs/articles/AddNewCheck.html index 345db18c..2b0d51f1 100644 --- a/docs/articles/AddNewCheck.html +++ b/docs/articles/AddNewCheck.html @@ -33,7 +33,7 @@ DataQualityDashboard - 2.5.0 + 2.6.0 @@ -59,22 +59,61 @@ +
  • + @@ -108,7 +147,7 @@

    Add a New Data Quality Check

    Don Torok

    -

    2023-11-04

    +

    2024-02-21

    Source: vignettes/AddNewCheck.rmd @@ -117,10 +156,6 @@

    2023-11-04

    -

    Add a New Check to Data Quality Dashboard

    diff --git a/docs/articles/CheckStatusDefinitions.html b/docs/articles/CheckStatusDefinitions.html index ac597143..d55d44e0 100644 --- a/docs/articles/CheckStatusDefinitions.html +++ b/docs/articles/CheckStatusDefinitions.html @@ -5,13 +5,13 @@ -Check Status Descriptions • DataQualityDashboard +Check Status Definitions • DataQualityDashboard - +
    -

    DQD check statuses +

    Introduction

    -
    -

    Introduction -

    In the DataQualityDashboard v2, new check statuses were introduced: Error and Not Applicable. These were introduced to more accurately reflect the quality of data contained in a @@ -145,9 +177,9 @@

    Introduction -

    Not Applicable -

    +
    +

    Not Applicable +

    The results of a DQ check may not be applicable to a given CDM instance depending on the implementation and content of the instance. For example, the DQ check for plausible values of HbA1c lab results @@ -212,7 +244,6 @@

    Not Applicable -

    diff --git a/docs/articles/CheckTypeDescriptions.html b/docs/articles/CheckTypeDescriptions.html index ac9d2909..93a9adad 100644 --- a/docs/articles/CheckTypeDescriptions.html +++ b/docs/articles/CheckTypeDescriptions.html @@ -33,7 +33,7 @@ DataQualityDashboard - 2.5.0 + 2.6.0
    @@ -59,22 +59,61 @@ + + @@ -109,7 +148,7 @@

    Data Quality Check Type Definitions

    Clair Blacketer

    -

    2023-11-04

    +

    2024-02-21

    Source: vignettes/CheckTypeDescriptions.rmd @@ -118,10 +157,6 @@

    2023-11-04

    -

    Introduction

    @@ -426,6 +461,10 @@

    plausibleValueHigh - (for Fields)

    plausibleTemporalAfter

    +

    Warning: This check is reimplemented by the +plausibleStartBeforeEnd and +plausibleAfterBirth checks, and will be deprecated in the +future.

    Name: plausibleTemporalAfter
    Level: Field check
    Context: Verification
    Category: Plausibility @@ -443,6 +482,9 @@

    plausibleTemporalAfter

    plausibleDuringLife

    +

    Warning: This check is reimplemented by the +plausibleBeforeDeath check, and will be deprecated in the +future.

    Name: plausibleDuringLife
    Level: Field check
    Context: Verification
    Category: Plausibility @@ -457,6 +499,57 @@

    plausibleDuringLife +

    plausibleStartBeforeEnd +

    +

    Name: plausibleStartBeforeEnd +
    Level: Field check
    Context: +Verification
    Category: Plausibility +
    Subcategory: Temporal

    +

    Description: The number and percent of records with +a value in the cdmFieldName field of the +cdmTableName that occurs after the date in the +plausibleStartBeforeEndFieldName.

    +

    Definition: This check is attempting to apply +temporal rules within a table, specifically checking that all start +dates are before the end dates. For example, in the VISIT_OCCURRENCE +table it checks that the VISIT_OCCURRENCE_START_DATE is before +VISIT_OCCURRENCE_END_DATE.

    +

    +
    +

    plausibleAfterBirth +

    +

    Name: plausibleAfterBirth +
    Level: Field check
    Context: +Verification
    Category: Plausibility +
    Subcategory: Temporal

    +

    Description: The number and percent of records with +a date value in the cdmFieldName field of the +cdmTableName table that occurs prior to birth.

    +

    Definition: This check will calculate the number of +records that occur before a person’s birth. If the +person.birth_datetime is given this is used. If not, it is +calculated from the person.year_of_birth, +person.month_of_birth, and +person.day_of_birth, taking the first month of the year, +day of the month if the respective value is not given. For example, if +only year of birth is given, the birth date is assumed to be January 1st +of that year.

    +
    +
    +

    plausibleBeforeDeath +

    +

    Name: plausibleBeforeDeath +
    Level: Field check
    Context: +Verification
    Category: Plausibility +
    Subcategory: Temporal

    +

    Description: The number and percent of records with +a date value in the cdmFieldName field of the +cdmTableName table that occurs after death.

    +

    Definition: This check will calculate the number of +records that occur more than 60 days after a person’s death. The 60 day +‘washout’ period is to allow for administrative records after death.

    +
    +

    plausibleValueLow - (for Concept + Unit combinations)

    Name: plausibleValueLow
    Level: @@ -509,6 +602,9 @@

    plausibleValueHigh -

    plausibleGender

    +

    Warning: This check is reimplemented by the +plausibleGenderUseDescendants check below, and will be +deprecated in the future.

    Name: plausibleGender
    Level: Concept check
    Context: Validation
    Category: Plausibility @@ -525,6 +621,26 @@

    plausibleGender

    +

    plausibleGenderUseDescendants +

    +

    Name: plausibleGenderUseDescendants +
    Level: Concept check
    Context: +Validation
    Category: Plausibility +
    Subcategory: Atemporal

    +

    Description: For descendants of CONCEPT_ID +conceptId (conceptName), the number +and percent of records associated with patients with an implausible +gender (correct gender = +plausibleGenderUseDescendants).

    +

    Definition: This check will count the number of +records that have an incorrect gender associated with a gender-specific +concept_id. In this new implementation, the base concept_id is one or +more broad ancestor concepts such as “Procedure on female genital +system”. Any record with a descendant of this concept_id will be checked +for an associated person gender matching the gender-specific +concept.

    +
    +

    plausibleUnitConceptIds

    Name: plausibleUnitConceptIds diff --git a/docs/articles/DataQualityDashboard.html b/docs/articles/DataQualityDashboard.html index fd3146d7..d131afe1 100644 --- a/docs/articles/DataQualityDashboard.html +++ b/docs/articles/DataQualityDashboard.html @@ -33,7 +33,7 @@ DataQualityDashboard - 2.5.0 + 2.6.0

    @@ -59,22 +59,61 @@ + + @@ -109,7 +148,7 @@

    Getting Started

    Clair Blacketer

    -

    2023-11-04

    +

    2024-02-21

    Source: vignettes/DataQualityDashboard.rmd @@ -118,15 +157,6 @@

    2023-11-04

    - -
    -

    Getting Started -

    -
    -

    R Installation

    diff --git a/docs/articles/DqdForCohorts.html b/docs/articles/DqdForCohorts.html index 4b7fae0e..13edf2bf 100644 --- a/docs/articles/DqdForCohorts.html +++ b/docs/articles/DqdForCohorts.html @@ -33,7 +33,7 @@ DataQualityDashboard - 2.5.0 + 2.6.0
    @@ -59,22 +59,61 @@ + + @@ -109,7 +148,7 @@

    Running the DQD on a Cohort

    Clair Blacketer

    -

    2023-11-04

    +

    2024-02-21

    Source: vignettes/DqdForCohorts.rmd @@ -118,13 +157,6 @@

    2023-11-04

    - -
    -

    DQD Cohort Functionality -

    Running the Data Quality Dashboard for a cohort is fairly straightforward. There are two options in the executeDqChecks function, cohortDefinitionId @@ -160,14 +192,11 @@

    DQD Cohort FunctionalitywriteTableName option reflect the name of the cohort so that the results don’t get confused with those of the entire database.

    -

    + diff --git a/docs/articles/GettingStarted.html b/docs/articles/GettingStarted.html deleted file mode 100644 index b54d1573..00000000 --- a/docs/articles/GettingStarted.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - • DataQualityDashboard - - - - - - - - - - -
    -
    - - - - -
    -
    - - - - -
    -

    -Getting Started

    -
    -
    -
    -

    -R Installation

    -
    install.packages("devtools")
    -devtools::install_github("OHDSI/DataQualityDashboard")
    -
    -
    -

    -Executing Data Quality Checks

    -
    -# fill out the connection details -----------------------------------------------------------------------
    -connectionDetails <- DatabaseConnector::createConnectionDetails(dbms = "",
    -                                                              user = "",
    -                                                              password = "",
    -                                                              server = "",
    -                                                              port = "",
    -                                                              extraSettings = "")
    -
    -cdmDatabaseSchema <- "yourCdmSchema" # the fully qualified database schema name of the CDM
    -resultsDatabaseSchema <- "yourResultsSchema" # the fully qualified database schema name of the results schema (that you can write to)
    -cdmSourceName <- "Your CDM Source" # a human readable name for your CDM source
    -
    -# determine how many threads (concurrent SQL sessions) to use ----------------------------------------
    -numThreads <- 1 # on Redshift, 3 seems to work well
    -
    -# specify if you want to execute the queries or inspect them ------------------------------------------
    -sqlOnly <- FALSE # set to TRUE if you just want to get the SQL scripts and not actually run the queries
    -
    -# where should the logs go? -------------------------------------------------------------------------
    -outputFolder <- "output"
    -
    -# logging type -------------------------------------------------------------------------------------
    -verboseMode <- FALSE # set to TRUE if you want to see activity written to the console
    -
    -# write results to table? ------------------------------------------------------------------------------
    -writeToTable <- TRUE # set to FALSE if you want to skip writing to a SQL table in the results schema
    -
    -# if writing to table and using Redshift, bulk loading can be initialized -------------------------------
    -
    -# Sys.setenv("AWS_ACCESS_KEY_ID" = "",
    -#            "AWS_SECRET_ACCESS_KEY" = "",
    -#            "AWS_DEFAULT_REGION" = "",
    -#            "AWS_BUCKET_NAME" = "",
    -#            "AWS_OBJECT_KEY" = "",
    -#            "AWS_SSE_TYPE" = "AES256",
    -#            "USE_MPP_BULK_LOAD" = TRUE)
    -
    -# which DQ check levels to run -------------------------------------------------------------------
    -checkLevels <- c("TABLE", "FIELD", "CONCEPT")
    -
    -# which DQ checks to run? ------------------------------------
    -
    -checkNames <- c() # Names can be found in inst/csv/OMOP_CDM_v5.3.1_Check_Desciptions.csv
    -
    -# which CDM tables to exclude? ------------------------------------
    -
    -tablesToExclude <- c()
    -
    -# run the job --------------------------------------------------------------------------------------
    -DataQualityDashboard::executeDqChecks(connectionDetails = connectionDetails,
    -                                    cdmDatabaseSchema = cdmDatabaseSchema,
    -                                    resultsDatabaseSchema = resultsDatabaseSchema,
    -                                    cdmSourceName = cdmSourceName,
    -                                    numThreads = numThreads,
    -                                    sqlOnly = sqlOnly,
    -                                    outputFolder = outputFolder,
    -                                    verboseMode = verboseMode,
    -                                    writeToTable = writeToTable,
    -                                    checkLevels = checkLevels,
    -                                    tablesToExclude = tablesToExclude,
    -                                    checkNames = checkNames)
    -
    -# inspect logs ----------------------------------------------------------------------------
    -ParallelLogger::launchLogViewer(logFileName = file.path(outputFolder, cdmSourceName,
    -                                                      sprintf("log_DqDashboard_%s.txt", cdmSourceName)))
    -
    -# (OPTIONAL) if you want to write the JSON file to the results table separately -----------------------------
    -jsonFilePath <- ""
    -DataQualityDashboard::writeJsonResultsToTable(connectionDetails = connectionDetails,
    -                                            resultsDatabaseSchema = resultsDatabaseSchema,
    -                                            jsonFilePath = jsonFilePath)
    -
    -
    -

    -Viewing Results

    -

    Launching Dashboard as Shiny App

    -
    DataQualityDashboard::viewDqDashboard(jsonPath = file.path(getwd(), outputFolder, cdmSourceName, sprintf("results_%s.json", cdmSourceName)))
    -

    Launching on a web server

    -

    If you have npm installed:

    -
      -
    1. Install http-server:
    2. -
    -
    npm install -g http-server
    -
      -
    1. Rename the json file to results.json and place it in inst/shinyApps/www

    2. -
    3. Go to inst/shinyApps/www, then run:

    4. -
    -
    http-server
    -

    A results JSON file for the Synthea synthetic dataset will be shown. You can view your results by replacing the results.json file with your file (with name results.json).

    -
    -
    -

    -View checks

    -

    To see description of checks using R, execute the command below:

    -
    View(read.csv(system.file("csv","OMOP_CDMv5.3.1_Check_Descriptions.csv",package="DataQualityDashboard"),as.is=T))
    -
    -
    - - - -
    - - - - -
    - - - - - - diff --git a/docs/articles/SqlOnly.html b/docs/articles/SqlOnly.html index 47dec90d..af89889a 100644 --- a/docs/articles/SqlOnly.html +++ b/docs/articles/SqlOnly.html @@ -5,13 +5,13 @@ -SqlOnly • DataQualityDashboard +Running the DQD in SqlOnly mode • DataQualityDashboard - +

    Description

    diff --git a/docs/articles/Thresholds.html b/docs/articles/Thresholds.html index c2de633c..8f53e490 100644 --- a/docs/articles/Thresholds.html +++ b/docs/articles/Thresholds.html @@ -33,7 +33,7 @@ DataQualityDashboard - 2.5.0 + 2.6.0
    @@ -59,22 +59,61 @@ + + @@ -109,7 +148,7 @@

    Failure Thresholds and How to Change Them

    Clair Blacketer

    -

    2023-11-04

    +

    2024-02-21

    Source: vignettes/Thresholds.rmd @@ -118,14 +157,10 @@

    2023-11-04

    -

    DQD Failure Thresholds

    -

    As described in the introduction +

    As described in the introduction to the tool, the Data Quality Dashboard works by systematically applying 20 data quality check types to a database by leveraging the structure of the OMOP Common Data Model. This process results in over @@ -169,7 +204,7 @@

    Step 1: Find and copy the contro OMOP_CDMvx.x.x_Table_Level.csv: This file has a list of all tables in the CDM version and any checks to be performed at this level as well as the failure thresholds associated. Right now only -the checktype measurePersonCompleteness +the checktype measurePersonCompleteness is considered a table level check. If you would like to change the failure thresholds for the measurePersonCompleteness check copy this file to a location the R instance can access. @@ -177,7 +212,7 @@

    Step 1: Find and copy the contro OMOP_CDMvx.x.x_Field_Level.csv: This file has a list of all tables and fields in the CDM version and any checks to be performed at this level as well as the failure thresholds associated. -The majority of the check +The majority of the check types run by the DQD are field level checks. If you would like to change the failure thresholds for any of these checks copy this file to a location the R instance can access. An example of this file is seen in @@ -191,7 +226,7 @@

    Step 1: Find and copy the contro OMOP_CDMvx.x.x_Concept_Level.csv: This file has a list of all concepts and any checks to be performed on that concept. For example, there are checks that evaluate biologically plausible ranges -for measurement values, like plausibleValueLow. +for measurement values, like plausibleValueLow. If you would like to change the failure thresholds for any of these checks copy this file to a location the R instance can access. @@ -202,14 +237,14 @@

    Step 2: Turn On/Off Chec

    Using the field level file as an example, when you open it there will be two columns listing the tables and fields in the OMOP CDM, as seen in figure 1. Moving horizontally through the file there will be a column -named for each of the check +named for each of the check types available to run at the field level. At the intersection of each check type and CDM field will be a cell with either a ‘Yes’ or ‘No’ value. A ‘Yes’ indicates that the check type will be run for that specific table and field. For example in figure 1 there is a ‘Yes’ in the isRequired column for the field person_id in the PERSON table. This -means that the isRequired +means that the isRequired check will be run, substituting person_id for cdmFieldName and PERSON for cdmTableName.

    So instead of the generic check type: The number and percent of @@ -264,7 +299,7 @@

    Step 2a: Documenting

    Step 3: Run the DQD Using the Updated Thresholds

    -

    Follow the instructions on the Getting +

    Follow the instructions on the Getting Started page to set the parameters to run the Data Quality Dashboard. When running the execute function, point the package to the updated threshold files as shown in the example below. To do this, The diff --git a/docs/articles/checkIndex.html b/docs/articles/checkIndex.html new file mode 100644 index 00000000..0055bc4d --- /dev/null +++ b/docs/articles/checkIndex.html @@ -0,0 +1,255 @@ + + + + + + + +Index • DataQualityDashboard + + + + + + + + + + + + +

    +
    + + + + +
    +
    + + + + +

    This section contains detailed descriptions of the data quality +checks included in the DataQualityDashboard package. Each check is +described on its own page; click on the check name in the list below or +in the dropdown menu above to navigate to the check’s documentation +page.

    +

    N.B. This section is currently under development. A documentation +page is not yet available for all checks. The links below will be +updated as more pages are added. In the meantime, see the Check +Type Descriptions page for a brief description of each +check.

    +
    +

    General guidance +

    +
      +
    • These documentation pages are intended to provide a detailed +description of each check and guidance for users on how to interpret the +results of each check
    • +
    • Guidance is provided for both ETL developers and OMOP +CDM users (e.g. analysts, data managers, etc). CDM users are +strongly encouraged to work with their ETL development team, if +possible, to understand and address any check failures attributable to +ETL design. However, guidance is also provided in case this is not +possible
    • +
    • In some cases, SQL snippets are provided to help investigate the +cause of a check failure. These snippets are written in OHDSI SQL and +can be rendered to run against your OMOP CDM using the SQLRender package. +As always, it is also recommended to utilize the “violated rows” SQL +(indicated by the comment lines /*violatedRowsBegin*/ and +/*violatedRowsEnd*/) from the SQL query displayed in the +DQD results viewer for a given check to inspect rows that failed the +check
    • +
    +
    +
    +

    Checks +

    +
      +
    • cdmTable
    • +
    • cdmField
    • +
    • cdmDatatype
    • +
    • isPrimaryKey
    • +
    • isForeignKey
    • +
    • isRequired
    • +
    • fkDomain
    • +
    • fkClass
    • +
    • measurePersonCompleteness (PAGE UNDER CONSTRUCTION)
    • +
    • measureConditionEraCompleteness (PAGE UNDER CONSTRUCTION)
    • +
    • isStandardValidConcept (PAGE UNDER CONSTRUCTION)
    • +
    • measureValueCompleteness (PAGE UNDER CONSTRUCTION)
    • +
    • standardConceptRecordCompleteness (PAGE UNDER CONSTRUCTION)
    • +
    • sourceConceptRecordCompleteness (PAGE UNDER CONSTRUCTION)
    • +
    • sourceValueCompleteness (PAGE UNDER CONSTRUCTION)
    • +
    • plausibleValueLow (PAGE UNDER CONSTRUCTION)
    • +
    • plausibleValueHigh (PAGE UNDER CONSTRUCTION)
    • +
    • plausibleTemporalAfter (PAGE UNDER CONSTRUCTION)
    • +
    • plausibleDuringLife (PAGE UNDER CONSTRUCTION)
    • +
    • withinVisitDates (PAGE UNDER CONSTRUCTION)
    • +
    • plausibleAfterBirth
    • +
    • plausibleBeforeDeath (PAGE UNDER CONSTRUCTION)
    • +
    • plausibleStartBeforeEnd (PAGE UNDER CONSTRUCTION)
    • +
    • plausibleGender (PAGE UNDER CONSTRUCTION)
    • +
    • plausibleUnitConceptIds (PAGE UNDER CONSTRUCTION)
    • +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/cdmDatatype.html b/docs/articles/checks/cdmDatatype.html new file mode 100644 index 00000000..460bf175 --- /dev/null +++ b/docs/articles/checks/cdmDatatype.html @@ -0,0 +1,277 @@ + + + + + + + +cdmDatatype • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: Field check
    Context: Verification
    Category: Conformance
    Subcategory: Value
    Severity: Fatal 💀

    +
    +
    +

    Description +

    +

    The number and percent of cdmFieldName values in the +cdmTableName that are not the expected data type based +on the specification.

    +
    +
    +

    Definition +

    +

    At present this check only verifies that integer fields contain +integers.

    +
      +
    • +Numerator: In some SQL dialects, the numerator of the check +will count non-null values that are non-numeric, or are numeric but +contain a decimal point. In others, it will count non-null values that +contain any non-digit character
    • +
    • +Denominator: The total number of records in the table
    • +
    • +Related CDM Convention(s): Column datatypes in CDM table +specs +
    • +
    • +CDM Fields/Tables: By default, this check runs on all +tables & fields in the CDM
    • +
    • +Default Threshold Value: 0%
    • +
    +
    +
    +

    User Guidance +

    +

    This check failure must be resolved. OHDSI tools & analyses +expect integer columns to be integers and will throw errors and/or +suffer performance issues if these columns are of the wrong type.

    +

    A failure in this check likely means that the column was created with +the incorrect datatype (e.g., in an empty target table); that the data +being loaded into the column is of the wrong type (e.g., in a “CREATE +TABLE AS”); or that the wrong data was loaded into the column in error +(e.g., mis-mapped in ETL).

    +

    Check the datatype of the column in your database’s +information/system tables. It should match the datatype listed for the +column in the CDM specification.

    +
    +

    Violated rows query +

    +

    You may also use the “violated rows” SQL query to inspect the +violating rows and help diagnose the potential root cause of the +issue:

    +
    SELECT  
    +  '@cdmTableName.@cdmFieldName' AS violating_field,  
    +  cdmTable.*  
    +FROM @cdmDatabaseSchema.@cdmTableName cdmTable 
    +WHERE  
    +  (ISNUMERIC(cdmTable.@cdmFieldName) = 0  
    +    OR (ISNUMERIC(cdmTable.@cdmFieldName) = 1  
    +      AND CHARINDEX('.', CAST(ABS(cdmTable.@cdmFieldName) AS varchar)) != 0)) 
    +  AND cdmTable.@cdmFieldName IS NOT NULL 
    +
    +
    +

    ETL Developer +

    +

    If the data does not look as expected (e.g., dates in an integer +column), trace back to your ETL code to determine the appropriate fix. +If the data looks as expected but the column is the wrong type (e.g., +string integers in an integer column), update the part of your ETL that +creates the table to reflect the correct datatype for the column.

    +
    +
    +

    Data User +

    +

    If your data supplier is unwilling or unable to fix the issue, you +should consider changing the type of the column yourself before using +the dataset (though it’s probably a good idea to inspect the column +contents first to make sure the data appear as expected - i.e., that +this is not a case of the wrong source data being inserted into the +column).

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/cdmField.html b/docs/articles/checks/cdmField.html new file mode 100644 index 00000000..150fcb2e --- /dev/null +++ b/docs/articles/checks/cdmField.html @@ -0,0 +1,266 @@ + + + + + + + +cdmField • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: Field check
    Context: Verification
    Category: Conformance
    Subcategory: Relational
    Severity: Fatal 💀

    +
    +
    +

    Description +

    +

    A yes or no value indicating if the cdmFieldName +field is present in the cdmTableName table.

    +
    +
    +

    Definition +

    +

    This check verifies if a column is present as specified in the CDM +specification for the relevant CDM version.

    +
      +
    • +Numerator: If the field is present, the numerator of the +check result will be 0; if the field is absent the check will throw an +error
    • +
    • +Denominator: The denominator is always a placeholder value +of 1
    • +
    • +Related CDM Convention(s): Listed columns in CDM table +specs +
    • +
    • +CDM Fields/Tables: By default, this check runs on all +tables & fields in the CDM
    • +
    • +Default Threshold Value: 0%
    • +
    +
    +
    +

    User Guidance +

    +

    This check failure must be resolved to avoid errors in downstream +tools/analyses. OHDSI tools assume a complete set of OMOP CDM tables and +columns, as may anyone designing an analysis on OMOP data. Even if you +don’t intend to populate a column, it should still be present in the +database.

    +

    There are 3 possible causes for this check failure:

    +
      +
    • The wrong CDM version was specified in +executeDqChecks +
    • +
    • The column does not exist in the table
    • +
    • The column has the wrong name
    • +
    +

    Before taking any action in your ETL code, make sure the CDM version +you specified when running executeDqChecks matches the +version of your CDM. Some columns were renamed between CDM versions 5.3 +and 5.4 so it’s important you’re running DQD with the correct +configuration. If the versions do match, there is most likely +an issue with the ETL.

    +
    +

    ETL Developers +

    +

    To resolve the failure, you will need to amend the code/process that +creates the table (e.g. DDL script). Make sure you know whether the +column is missing altogether or if it has the wrong name. In the latter +case, the column should be renamed or replaced with a correctly named +column. Reference the CDM +documentation to confirm correct column naming.

    +
    +
    +

    Data Users +

    +

    Missing columns must be added to the CDM even if they are empty. If a +column has the wrong name, rename it or create a new column with the +correct name and migrate the other column’s data there.

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/cdmTable.html b/docs/articles/checks/cdmTable.html new file mode 100644 index 00000000..21ed7e87 --- /dev/null +++ b/docs/articles/checks/cdmTable.html @@ -0,0 +1,266 @@ + + + + + + + +cdmTable • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: Table check
    Context: Verification
    Category: Conformance
    Subcategory: Relational
    Severity: Fatal 💀

    +
    +
    +

    Description +

    +

    A yes or no value indicating if the cdmTable table +is present in the database.

    +
    +
    +

    Definition +

    +

    This check verifies if a table is present as specified in the CDM +specification for the relevant CDM version.

    +
      +
    • +Numerator: If the table is present, the numerator of the +check result will be 0; if the table is absent the check will throw an +error
    • +
    • +Denominator: The denominator is always a placeholder value +of 1
    • +
    • +Related CDM Convention(s): Listed tables in CDM table +specs +
    • +
    • +CDM Fields/Tables: By default, this check runs on all +tables in the CDM
    • +
    • +Default Threshold Value: 0%
    • +
    +
    +
    +

    User Guidance +

    +

    This check failure must be resolved to avoid errors in downstream +tools/analyses. OHDSI tools assume a complete set of OMOP CDM tables, as +may anyone designing an analysis on OMOP data. Even if you don’t intend +to populate a table, it should still be present in the database.

    +

    There are 3 possible causes for this check failure:

    +
      +
    • The wrong CDM version was specified in +executeDqChecks +
    • +
    • The table does not exist in the database
    • +
    • The table has the wrong name
    • +
    +

    Before taking any action to investigate/fix the failure, make sure +the CDM version you specified when running executeDqChecks +matches the version of your CDM. Some tables were added between CDM +versions 5.3 and 5.4 so it’s important you’re running DQD with the +correct configuration. If the versions do match, there is most +likely an issue with the ETL.

    +
    +

    ETL Developers +

    +

    To resolve the failure, you will need to amend the code/process that +creates the table (e.g. DDL script). Make sure you know whether the +table is missing altogether or if it has the wrong name. In the latter +case, the table should be renamed/replaced with the correctly named +table. Reference the CDM documentation to confirm correct table +naming.

    +
    +
    +

    Data Users +

    +

    Missing tables must be added to the CDM even if they are empty. This +can be done using the CDM DDL scripts available in the CommonDataModel GitHub +repo. If a table has the wrong name, rename it or create a new table +with the correct name and migrate the other table’s data there.

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/fkClass.html b/docs/articles/checks/fkClass.html new file mode 100644 index 00000000..e34c6957 --- /dev/null +++ b/docs/articles/checks/fkClass.html @@ -0,0 +1,288 @@ + + + + + + + +fkClass • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: Field check
    Context: Verification
    Category: Conformance
    Subcategory: Computational
    Severity: CDM convention ⚠

    +
    +
    +

    Description +

    +

    The number and percent of records that have a value in the +cdmFieldName field in the cdmTableName +table that do not conform to the fkClass class.

    +
    +
    +

    Definition +

    +

    There is the occasional field in the OMOP CDM that expects not only +concepts of a certain domain, but of a certain concept class as well. +The best example is the drug_concept_id field in the +DRUG_ERA table. Drug eras represent the span of time a +person was exposed to a particular drug ingredient, so all +concepts in DRUG_ERA.drug_concept_id must be of the drug +domain and ingredient class.

    +
      +
    • +Numerator: The number of rows in the table where the +standard concept ID field contains a concept that does not conform to +the specified concept_class_id. This numerator specifically excludes +concept_id 0
    • +
    • +Denominator: The total number of rows in the specified cdm +table. This denominator includes rows with concept_id 0
    • +
    • +Related CDM Convention(s): This check is specific to DRUG_ERA +and DOSE_ERA +as the drug_concept_ids in these tables must be +ingredients, which are denoted by the concept class ‘ingredient’
    • +
    • +CDM Fields/Tables: This check is designed to be run on the +drug_concept_id field in the DRUG_ERA and DOSE_ERA +tables
    • +
    • +Default Threshold Value: 0%
    • +
    +
    +
    +

    User Guidance +

    +

    This check identifies whether records with the correct concepts were +written to the correct tables as derived from drug_exposure. If +incorrect concepts are allowed to persist, a study package could run on +the DRUG_ERA and DOSE_ERA tables but may not produce expected +results.

    +
    +

    Violated rows query +

    +

    You may inspect the violating rows using the following query:

    +
    -- @cdmTableName.@cdmFieldName is either drug_era.drug_concept_id or dose_era.drug_concept_id
    +
    +SELECT 
    +  '@cdmTableName.@cdmFieldName' AS violating_field, 
    +  co.concept_class_id AS violating_class,
    +    cdmTable.* 
    +FROM @cdmDatabaseSchema.@cdmTableName cdmTable
    +    LEFT JOIN @vocabDatabaseSchema.concept co ON cdmTable.@cdmFieldName = co.concept_id
    +WHERE co.concept_id != 0 
    +  AND (co.concept_class_id != 'ingredient') 
    +
    +
    +

    ETL Developers +

    +

    Recommended actions:

    +
      +
    • Identify the specific concepts in the table that have an incorrect +concept_class_id
    • +
    • Investigate the ETL process that builds the specified era tables. +Likely there is an error that is letting records through with the +incorrect concept_class_id
    • +
    • Ultimately the ETL code should be fixed so that the correct concepts +are identified, or the offending records should be removed
    • +
    +
    +
    +

    Data Users +

    +

    Few options are available to correct this error without amending the +ETL code that populated your OMOP CDM. If this check is failing it means +that there is likely an error in the ETL process that builds the era +tables. The DRUG_ERA table is used often in network studies and is meant +to identify periods of time where a person is exposed to a specific drug +ingredient, allowing for up to 30 days between exposures. If there are +records in the DRUG_ERA tables that are not mapped to their +ingredient-level ancestor then cohorts and analyses that make use of the +DRUG_ERA table will run but they will return unexpected or erroneous +results. You may consider dropping the offending rows if you know that +they are not needed for analysis, but do so at your own risk.

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/fkDomain.html b/docs/articles/checks/fkDomain.html new file mode 100644 index 00000000..8782d393 --- /dev/null +++ b/docs/articles/checks/fkDomain.html @@ -0,0 +1,285 @@ + + + + + + + +fkDomain • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: Field check
    Context: Verification
    Category: Conformance
    Subcategory: Value
    Severity: CDM convention ⚠

    +
    +
    +

    Description +

    +

    The number and percent of records that have a value in the +cdmFieldName field in the cdmTableName +table that do not conform to the fkDomain domain.

    +
    +
    +

    Definition +

    +

    It is often the case that standard concept fields in the OMOP CDM +should belong to a certain domain. All possible domains are listed in +the vocabulary table DOMAIN and the expected domain for CDM fields are +listed as part of the CDM documentation. For example, all concepts in +the field PERSON.gender_concept_id should conform to the gender +domain.

    +
      +
    • +Numerator: The number of rows in the table where the +standard concept ID field contains a concept that does not conform to +the specified domain_id. This numerator specifically +excludes concept_id 0
    • +
    • +Denominator: The total number of rows in the table. This +denominator includes rows with concept_id 0
    • +
    • +Related CDM Convention(s): FK Domain flag in CDM table +specs +
    • +
    • +CDM Fields/Tables: This check runs on all standard concept +ID fields (e.g. condition_concept_id; +gender_concept_id; etc.)
    • +
    • +Default Threshold Value: 0%
    • +
    +
    +
    +

    User Guidance +

    +

    OHDSI tools and analyses assume that standard concepts in event +tables and demographic data conform to the relevant domain. If incorrect +concepts are allowed to persist, a study package could run on this table +but may not produce expected results.

    +

    To assess the impacted rows/tables, you may run a query like the one +below:

    +
    +

    Violated rows query +

    +
    -- @cdmTableName.@cdmFieldName is the standard concept ID field in the table
    +-- @cdmTableName.@cdmTablePk is the primary key field in the table
    +
    +SELECT 
    +  concept.concept_id, 
    +  concept.domain_id, 
    +  concept.concept_name, 
    +  concept.concept_code, 
    +  COUNT(DISTINCT @cdmTableName.@cdmTablePk), 
    +  COUNT(DISTINCT @cdmTableName.person_id) 
    +FROM @cdmDatabaseSchema.@cdmTableName cdmTable 
    +  LEFT JOIN @vocabSchema.concept on @cdmTableName.@cdmFieldName = concept.concept_id   
    +    AND concept.domain_id != {fkDomain} AND concept.concept_id != 0 
    +GROUP BY concept.concept_id, concept.domain_id, concept.concept_name, concept.concept_code
    +
    +
    +

    ETL Developers +

    +

    Recommended actions: - Identify the specific concepts in the table +that have an incorrect domain_id - Investigate the ETL +process that moves records to the tables based on the standard concept +ID domain. Likely there is an error that is letting records through with +the incorrect domain_id - Ultimately the ETL process should +be improved so that the correct rows are moved to the correct tables +based on their domain

    +
    +
    +

    Data Users +

    +

    If this check is failing it means that there is likely an error in +the ETL process that builds the domain tables. If there are records in a +table with standard concepts in the wrong domain then cohorts and +analyses will run but they will return unexpected or erroneous +results.

    +

    You may characterize the potential impact of the erroneous domain +sorting on your analysis by running a query like the one above. Use the +results to see what concepts in a table were incorrectly sorted, and how +many events/patients are impacted.

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/isForeignKey.html b/docs/articles/checks/isForeignKey.html new file mode 100644 index 00000000..5cc06cb6 --- /dev/null +++ b/docs/articles/checks/isForeignKey.html @@ -0,0 +1,307 @@ + + + + + + + +isForeignKey • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: Field check
    Context: Verification
    Category: Conformance
    Subcategory: Relational
    Severity: Fatal 💀

    +
    +
    +

    Description +

    +

    The number and percent of records that have a value in the +cdmFieldName field in the cdmTableName +table that does not exist in the fkTableName table.

    +
    +
    +

    Definition +

    +

    This check will make sure that all foreign keys as specified in the +CDM version have a value in the related primary key field. While this +issue should generally be prevented by foreign key database constraints, +some database management systems such as Redshift do not enforce such +constraints.

    +
      +
    • +Numerator: The number of non-null values in the foreign key +column that do not exist in its corresponding primary key column
    • +
    • +Denominator: The total number of records in the table
    • +
    • +Related CDM Convention(s): Foreign Key flag in CDM table +specs +
    • +
    • +CDM Fields/Tables: By default, this check runs on foreign +key columns in the CDM
    • +
    • +Default Threshold Value: 0%
    • +
    +
    +
    +

    User Guidance +

    +

    This check failure must be resolved. Failures in various fields could +impact analysis in many different ways, for example:

    +
      +
    • If some important event or qualifier (for example, type concept) is +encoded by a non-existent concept, it can’t be included in a concept set +or be a part of cohort definition or feature
    • +
    • If an event is linked to a non-existent person, it can’t be included +in any cohort definition or analysis
    • +
    • If an event is linked to a non-existent visit, it will be missed in +visit-level cohort definition logic
    • +
    +

    Many CDM columns are foreign keys to the concept_id +column in the CONCEPT table. See below for suggested +investigation steps for concept ID-related foreign key check +failures:

    +
      +
    • An x_concept_id missing from the CONCEPT table might be +the result of an error in SOURCE_TO_CONCEPT_MAP; you may +check it this way:
    • +
    +
    +

    Violated rows query +

    +
    SELECT *
    +FROM @vocabSchema.source_to_concept_map 
    +  LEFT JOIN @vocabSchema.concept ON concept.concept_id = source_to_concept_map.target_concept_id
    +WHERE concept.concept_id IS NULL;
    +
      +
    • Other types of concept-related errors can be investigated by +inspecting the source values for impacted rows as follows:
    • +
    +
    -- @cdmTableName.@cdmFieldName is the x_concept_id or x_source_concept_id field in a CDM table
    +-- Inspect the contents of the x_source_value field to investigate the source of the error
    +
    +SELECT 
    +  '@cdmTableName.@cdmFieldName' AS violating_field,  
    +  cdmTable.*,
    +  COUNT(*) OVER(PARTITION BY '@cdmTableName.@cdmFieldName') AS num_violations_per_concept
    +FROM @cdmSchema.@cdmTableName  
    +  LEFT JOIN @vocabSchema.concept on @cdmTableName.@cdmFieldName = concept.concept_id  
    +WHERE concept.concept_id IS NULL
    +ORDER BY num_violations_per_concept DESC; 
    +
      +
    • 2-billion concepts are a common source of foreign key issues; for +example, a check failure may arise if these concepts are used in some +tables but not fully represented in all relevant vocabulary tables +(CONCEPT, CONCEPT_RELATIONSHIP, etc.)
    • +
    • Similarly, make sure to check any hard-coded concept mappings in the +ETL as a potential source of the issue
    • +
    +

    When an entry is missing from one of the other CDM tables (LOCATION, +PERSON, PROVIDER, VISIT_DETAIL, VISIT_OCCURRENCE, PAYER_PLAN_PERIOD, +NOTE, CARE_SITE, EPISODE), this likely originates from binding / key +generation errors in the ETL.

    +
    +
    +

    ETL Developers +

    +

    As above, mapping or binding logic needs to be amended in your ETL in +order to resolve this error.

    +
    +
    +

    Data Users +

    +

    Few options are available to correct this error without amending the +ETL code that populated your OMOP CDM. If a limited proportion of rows +are impacted, you could consider dropping them from your database; +however, do so at your own risk and only if you are confident that doing +so will not have a significant impact on the downstream use cases of +your CDM. A less aggressive approach could be to retain the affected +rows and document the scope of their impact (in order to resolve the +check failure, nullable values can be set to NULL and non-nullable +concept ID values to 0). However, it is strongly recommended to pursue +resolution further upstream in the ETL.

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/isPrimaryKey.html b/docs/articles/checks/isPrimaryKey.html new file mode 100644 index 00000000..c8286df8 --- /dev/null +++ b/docs/articles/checks/isPrimaryKey.html @@ -0,0 +1,277 @@ + + + + + + + +isPrimaryKey • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: Field check
    Context: Verification
    Category: Conformance
    Subcategory: Relational
    Severity: Fatal 💀

    +
    +
    +

    Description +

    +

    The number and percent of records that have a duplicate value in the +cdmFieldName field of the +cdmTableName.

    +
    +
    +

    Definition +

    +

    This check will make sure that all primary keys as specified in the +CDM version are truly unique keys. While this issue should generally be +prevented by primary key database constraints, some database management +systems such as Redshift do not enforce these constraints.

    +
      +
    • +Numerator: The number of values in the column that appear +in more than 1 row
    • +
    • +Denominator: The total number of rows in the table
    • +
    • +Related CDM Convention(s): Primary Key flag in CDM table +specs +
    • +
    • +CDM Fields/Tables: By default, this check runs on all +primary key columns in the CDM
    • +
    • +Default Threshold Value: 0%
    • +
    +
    +
    +

    User Guidance +

    +

    Multiple values for a primary key must be corrected. Failure to have +unique values for a primary key will result in incorrect results being +returned for queries that use these fields. This is especially true for +joins - joins on columns where multiple records are found where a single +record is assumed will result in inflation of the result set +(“fanning”). Also, some analytic frameworks may raise errors if more +than one record is found for an entity expected to be unique.

    +
    +

    Violated rows query +

    +
    SELECT 
    +  '@cdmTableName.@cdmFieldName' AS violating_field,  
    +  cdmTable.*,
    +  COUNT_BIG(*) OVER (PARTITION BY @cdmTableName.@cdmFieldName) AS dupe_count
    +FROM @cdmDatabaseSchema.@cdmTableName
    +WHERE dupe_count > 1
    +ORDER BY dupe_count DESC;
    +
    +
    +

    ETL Developers +

    +

    In some cases, a primary key error could arise from a 1:1 +relationship modeled in the CDM that is modeled as a 1:n relationship in +the source system. For example, a single person could have multiple +patient identifiers in a source system. In most cases the multiple +records need to be collapsed into a single record.

    +

    Deduplication and merging of duplicate patient datasets is a +non-trivial process, and the intent of the multiple patient records +needs be ascertained prior to making design decisions. For example, +multiple records could exist for the same patient in a claims system who +was covered by the insurer during one period as a member of a first +group and then later re-entered the system as new member of a different +group (e.g. new employer). In other cases multiple records could +indicate updates to the original record and the latest record could be +considered the “correct” information.

    +
    +
    +

    Data Users +

    +

    Whenever possible, the ETL developer / data provider should be +involved in resolving a primary key error as this represents a critical +failure in the ETL process. Depending on the nature of the error, you +may be able to remove duplicate rows from a table to resolve the error; +however, proceed at your own risk as these duplicates could be the sign +of a deeper issue that needs to be resolved further upstream.

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/isRequired.html b/docs/articles/checks/isRequired.html new file mode 100644 index 00000000..7d4bc222 --- /dev/null +++ b/docs/articles/checks/isRequired.html @@ -0,0 +1,294 @@ + + + + + + + +isRequired • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: Field check
    Context: Validation
    Category: Conformance
    Subcategory: Relational
    Severity: Fatal 💀

    +
    +
    +

    Description +

    +

    The number and percent of records with a NULL value in the +cdmFieldName of the cdmTableName that +is considered not nullable

    +
    +
    +

    Definition +

    +

    This check is meant to ensure that all NOT NULL constraints specified +in the CDM version are followed.

    +
      +
    • +Numerator: The number of rows with a NULL value in the +column
    • +
    • +Denominator: The total number of rows in the table
    • +
    • +Related CDM Convention(s): “Required” flag in CDM table +specs +
    • +
    • +CDM Fields/Tables: By default, this check runs on all +Required fields in the CDM
    • +
    • +Default Threshold Value: 0%
    • +
    +
    +
    +

    User Guidance +

    +

    A failure in this check means that NULL values have ended up in a +column which should not contain any NULL values. There is a wide variety +of potential causes for this issue depending on the column in question; +your source data; and your ETL code. Regardless of its cause, it is +mandatory to fix the issue by ensuring there are no failures of this +check – OHDSI tools/analyses expect required columns to be non-NULL in +all rows.

    +
    +

    Violated rows query +

    +
    SELECT 
    +  '@cdmTableName.@cdmFieldName' AS violating_field, 
    +  cdmTable.* 
    +FROM @schema.@cdmTableName cdmTable
    +WHERE cdmTable.@cdmFieldName IS NULL
    +
    +
    +

    ETL Developers +

    +

    Recommended actions:

    +
      +
    • To catch this issue further upstream, consider adding a not-null +constraint on the column in your database (if possible)
    • +
    • Fill in the missing values: +
        +
      • In some columns, placeholder values are acceptable to replace +missing values. For example, in rows for which there is no +x_source_value or no standard concept mapping, the value 0 should be +placed in the x_concept_id column
      • +
      • Similarly, the CDM documentation suggests derivation/imputation +strategies for certain columns. For example, the visit_end_date column +is required but several options for deriving a placeholder are provided: +https://ohdsi.github.io/CommonDataModel/cdm54.html#VISIT_OCCURRENCE. +Consult the documentation for similar conventions on other columns
      • +
      • For missing values in columns in which it is not acceptable to add a +placeholder or derived value (i.e. primary & foreign keys other than +concept IDs), there is likely a corresponding ETL error which needs to +be fixed
      • +
      +
    • +
    • If you are unable to fill in the missing value for a record +according to the CDM conventions, it is best to remove the record from +your database. It is recommended to document this action for data users, +especially if you need to do this for more than a handful of records +and/or if there is a pattern to the missing data
    • +
    +
    +
    +

    Data Users +

    +

    This is a critical failure as it can impact joins and calculations +involving required fields which assume all values are non-NULL. Events +missing a concept, start date, or person ID will not be able to be +included in cohorts. Rows missing a primary key violate fundamental +database integrity principles and could cause a host of downstream +issues. It is also possible that some tools or analysis code have +assumptions around the availability of data in required columns which +may throw errors due to missing values.

    +

    If your data provider is unable or unwilling to address the issue and +only a small proportion of rows are affected, proceed at your own risk +with the dataset. If you do so, it is a best practice to interrogate +whether the affected rows could have played any role in your analysis. +If a large proportion of rows are affected, the dataset should not be +used until the issue is fixed.

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/isStandardValidConcept.html b/docs/articles/checks/isStandardValidConcept.html new file mode 100644 index 00000000..0c2c66e7 --- /dev/null +++ b/docs/articles/checks/isStandardValidConcept.html @@ -0,0 +1,235 @@ + + + + + + + +isStandardValidConcept • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: FIELD
    Context: Verification
    Category: Conformance
    Subcategory: Value
    Severity:

    +
    +
    +

    Description +

    +

    The number and percent of records that do not have a standard, valid +concept in the @cdmFieldName field in the +@cdmTableName table.

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/measureConditionEraCompleteness.html b/docs/articles/checks/measureConditionEraCompleteness.html new file mode 100644 index 00000000..d0287690 --- /dev/null +++ b/docs/articles/checks/measureConditionEraCompleteness.html @@ -0,0 +1,234 @@ + + + + + + + +measureConditionEraCompleteness • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: TABLE
    Context: Validation
    Category: Completeness
    Subcategory:
    Severity:

    +
    +
    +

    Description +

    +

    The number and Percent of persons that does not have condition_era +built successfully, for all persons in condition_occurrence

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/measurePersonCompleteness.html b/docs/articles/checks/measurePersonCompleteness.html new file mode 100644 index 00000000..0f30c9fd --- /dev/null +++ b/docs/articles/checks/measurePersonCompleteness.html @@ -0,0 +1,235 @@ + + + + + + + +measurePersonCompleteness • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: TABLE
    Context: Validation
    Category: Completeness
    Subcategory:
    Severity:

    +
    +
    +

    Description +

    +

    The number and percent of persons in the CDM that do not have at +least one record in the @cdmTableName +table

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/measureValueCompleteness.html b/docs/articles/checks/measureValueCompleteness.html new file mode 100644 index 00000000..c6785694 --- /dev/null +++ b/docs/articles/checks/measureValueCompleteness.html @@ -0,0 +1,233 @@ + + + + + + + +measureValueCompleteness • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: FIELD
    Context: Verification
    Category: Completeness
    Subcategory:
    Severity:

    +
    +
    +

    Description +

    +

    The number and percent of records with a NULL value in the @cdmFieldName of the @cdmTableName.

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/plausibleAfterBirth.html b/docs/articles/checks/plausibleAfterBirth.html new file mode 100644 index 00000000..9e98b267 --- /dev/null +++ b/docs/articles/checks/plausibleAfterBirth.html @@ -0,0 +1,321 @@ + + + + + + + +plausibleAfterBirth • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: Field check
    Context: Verification
    Category: Plausibility
    Subcategory: Temporal
    Severity: Characterization ✔

    +
    +
    +

    Description +

    +

    The number and percent of records with a date value in the +cdmFieldName field of the cdmTableName +table that occurs prior to birth.

    +
    +
    +

    Definition +

    +

    This check verifies that events happen after birth. This check is +only run on fields where the PLAUSIBLE_AFTER_BIRTH +parameter is set to Yes. The birthdate is taken from +the person table, either the birth_datetime or +composed from year_of_birth, month_of_birth, +day_of_birth (taking 1st month/1st day if missing).

    +
      +
    • +Numerator: The number of records with a non-null date value +that happen prior to birth
    • +
    • +Denominator: The total number of records in the table with +a non-null date value
    • +
    • +Related CDM Convention(s): -Not linked to a +convention-
    • +
    • +CDM Fields/Tables: By default, this check runs on all date +and datetime fields
    • +
    • +Default Threshold Value: 1%
    • +
    +
    +
    +

    User Guidance +

    +

    There might be valid reasons why a record has a date value that +occurs prior to birth. For example, prenatal observations might be +captured or procedures on the mother might be added to the file of the +child. Therefore, some failing records are expected and the default +threshold of 1% accounts for that.

    +

    However, if more records violate this check, there might be an issue +with incorrect birthdates or events with a default date. It is +recommended to investigate the records that fail this check to determine +the cause of the error and set proper dates. If it is impossible to fix, +then implement one of these:

    +
      +
    • Aggressive: Remove all patients who have at least one record before +birth (if the birthdate of this patient is unreliable).
    • +
    • Less aggressive: Remove all rows that happen before birth. Probably +this should be chosen as a conventional approach for data clean up (if +the event dates are unreliable).
    • +
    • Conservative: Keep the records as is (if the date is actually valid, +for e.g. prenatal observations).
    • +
    +

    Make sure to clearly document the choices in your ETL +specification.

    +
    +

    Violated rows query +

    +

    You may also use the “violated rows” SQL query to inspect the +violating rows and help diagnose the potential root cause of the +issue:

    +
    SELECT 
    +    p.birth_datetime, 
    +    cdmTable.*
    +FROM @cdmDatabaseSchema.@cdmTableName cdmTable
    +    JOIN @cdmDatabaseSchema.person p ON cdmTable.person_id = p.person_id
    +WHERE cdmTable.@cdmFieldName < p.birth_datetime, 
    +

    or, when birth_datetime is missing change to year, month, day +columns:

    +
    SELECT 
    +    p.year_of_birth, 
    +    p.month_of_birth, 
    +    p.day_of_birth, 
    +    cdmTable.*
    +FROM @cdmDatabaseSchema.@cdmTableName cdmTable
    +    JOIN @cdmDatabaseSchema.person p ON cdmTable.person_id = p.person_id
    +WHERE cdmTable.@cdmFieldName < CAST(CONCAT(
    +        p.year_of_birth,
    +        COALESCE(
    +            RIGHT('0' + CAST(p.month_of_birth AS VARCHAR), 2),
    +            '01'
    +        ),
    +        COALESCE(
    +            RIGHT('0' + CAST(p.day_of_birth AS VARCHAR), 2),
    +            '01'
    +        )
    +    ) AS DATE)
    +

    Also, the length of the time interval between these dates might give +you a hint of why the problem appears.

    +
    select 
    +    date_difference, 
    +    COUNT(*)
    +FROM (
    +    SELECT DATEDIFF(
    +        DAY, 
    +        @cdmFieldName, 
    +        COALESCE(
    +            CAST(p.birth_datetime AS DATE),
    +            CAST(CONCAT(p.year_of_birth,'-01-01') AS DATE))
    +        ) AS date_difference
    +    FROM @cdmTableName ct
    +        JOIN person p ON ct.person_id = p.person_id 
    +) cte
    +WHERE date_difference > 0
    +GROUP BY date_difference
    +ORDER BY COUNT(*) DESC
    +;
    +
    +
    +

    ETL Developers +

    +

    As above, if the number of failing records is high, it is recommended +to investigate the records that fail this check to determine the +underlying cause of the error.

    +
    +
    +

    Data Users +

    +

    For most studies, violating records will have limited impact on data +use. However, this check should be especially considered for studies +involving neonatals and/or pregnancy.

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/plausibleBeforeDeath.html b/docs/articles/checks/plausibleBeforeDeath.html new file mode 100644 index 00000000..0bd9d373 --- /dev/null +++ b/docs/articles/checks/plausibleBeforeDeath.html @@ -0,0 +1,233 @@ + + + + + + + +plausibleBeforeDeath • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: FIELD
    Context: Verification
    Category: Plausibility
    Subcategory: Temporal
    Severity:

    +
    +
    +

    Description +

    +

    The number and percent of records with a date value in the @cdmFieldName field of the @cdmTableName table that occurs after death.

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/plausibleDuringLife.html b/docs/articles/checks/plausibleDuringLife.html new file mode 100644 index 00000000..13d69cf0 --- /dev/null +++ b/docs/articles/checks/plausibleDuringLife.html @@ -0,0 +1,234 @@ + + + + + + + +plausibleDuringLife • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: FIELD
    Context: Verification
    Category: Plausibility
    Subcategory: Temporal
    Severity:

    +
    +
    +

    Description +

    +

    If yes, the number and percent of records with a date value in the +@cdmFieldName field of the @cdmTableName table that occurs after death.

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/plausibleGender.html b/docs/articles/checks/plausibleGender.html new file mode 100644 index 00000000..8a2fb53a --- /dev/null +++ b/docs/articles/checks/plausibleGender.html @@ -0,0 +1,235 @@ + + + + + + + +plausibleGender • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: CONCEPT
    Context: Validation
    Category: Plausibility
    Subcategory: Atemporal
    Severity:

    +
    +
    +

    Description +

    +

    For a CONCEPT_ID @conceptId (@conceptName), the number and percent of records +associated with patients with an implausible gender (correct gender = +@plausibleGender).

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/plausibleStartBeforeEnd.html b/docs/articles/checks/plausibleStartBeforeEnd.html new file mode 100644 index 00000000..8fa475ea --- /dev/null +++ b/docs/articles/checks/plausibleStartBeforeEnd.html @@ -0,0 +1,234 @@ + + + + + + + +plausibleStartBeforeEnd • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: FIELD
    Context: Verification
    Category: Plausibility
    Subcategory: Temporal
    Severity:

    +
    +
    +

    Description +

    +

    The number and percent of records with a value in the @cdmFieldName field of the @cdmTableName that occurs after the date in the +@plausibleStartBeforeEndFieldName.

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/plausibleTemporalAfter.html b/docs/articles/checks/plausibleTemporalAfter.html new file mode 100644 index 00000000..09b65ae4 --- /dev/null +++ b/docs/articles/checks/plausibleTemporalAfter.html @@ -0,0 +1,236 @@ + + + + + + + +plausibleTemporalAfter • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: FIELD
    Context: Verification
    Category: Plausibility
    Subcategory: Temporal
    Severity:

    +
    +
    +

    Description +

    +

    The number and percent of records with a value in the @cdmFieldName field of the @cdmTableName that occurs prior to the date in +the @plausibleTemporalAfterFieldName field +of the @plausibleTemporalAfterTableName +table.

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/plausibleUnitConceptIds.html b/docs/articles/checks/plausibleUnitConceptIds.html new file mode 100644 index 00000000..330eca58 --- /dev/null +++ b/docs/articles/checks/plausibleUnitConceptIds.html @@ -0,0 +1,234 @@ + + + + + + + +plausibleUnitConceptIds • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: CONCEPT
    Context: Verification
    Category: Plausibility
    Subcategory: Atemporal
    Severity:

    +
    +
    +

    Description +

    +

    The number and percent of records for a given CONCEPT_ID @conceptId (@conceptName) with implausible units (i.e., +UNIT_CONCEPT_ID NOT IN (@plausibleUnitConceptIds)).

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/plausibleValueHigh.html b/docs/articles/checks/plausibleValueHigh.html new file mode 100644 index 00000000..282b1def --- /dev/null +++ b/docs/articles/checks/plausibleValueHigh.html @@ -0,0 +1,233 @@ + + + + + + + +plausibleValueHigh • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: FIELD
    Context: Verification
    Category: Plausibility
    Subcategory: Atemporal
    Severity:

    +
    +
    +

    Description +

    +

    The number and percent of records with a value in the @cdmFieldName field of the @cdmTableName table greater than @plausibleValueHigh.

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/plausibleValueLow.html b/docs/articles/checks/plausibleValueLow.html new file mode 100644 index 00000000..b2bd7c25 --- /dev/null +++ b/docs/articles/checks/plausibleValueLow.html @@ -0,0 +1,233 @@ + + + + + + + +plausibleValueLow • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: FIELD
    Context: Verification
    Category: Plausibility
    Subcategory: Atemporal
    Severity:

    +
    +
    +

    Description +

    +

    The number and percent of records with a value in the @cdmFieldName field of the @cdmTableName table less than @plausibleValueLow.

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/sourceConceptRecordCompleteness.html b/docs/articles/checks/sourceConceptRecordCompleteness.html new file mode 100644 index 00000000..7d2fd34f --- /dev/null +++ b/docs/articles/checks/sourceConceptRecordCompleteness.html @@ -0,0 +1,234 @@ + + + + + + + +sourceConceptRecordCompleteness • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: FIELD
    Context: Verification
    Category: Completeness
    Subcategory:
    Severity:

    +
    +
    +

    Description +

    +

    The number and percent of records with a value of 0 in the source +concept field @cdmFieldName in the @cdmTableName table.

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/sourceValueCompleteness.html b/docs/articles/checks/sourceValueCompleteness.html new file mode 100644 index 00000000..292b0307 --- /dev/null +++ b/docs/articles/checks/sourceValueCompleteness.html @@ -0,0 +1,233 @@ + + + + + + + +sourceValueCompleteness • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: FIELD
    Context: Verification
    Category: Completeness
    Subcategory:
    Severity:

    +
    +
    +

    Description +

    +

    The number and percent of distinct source values in the @cdmFieldName field of the @cdmTableName table mapped to 0.

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/standardConceptRecordCompleteness.html b/docs/articles/checks/standardConceptRecordCompleteness.html new file mode 100644 index 00000000..ebde749e --- /dev/null +++ b/docs/articles/checks/standardConceptRecordCompleteness.html @@ -0,0 +1,234 @@ + + + + + + + +standardConceptRecordCompleteness • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: FIELD
    Context: Verification
    Category: Completeness
    Subcategory:
    Severity:

    +
    +
    +

    Description +

    +

    The number and percent of records with a value of 0 in the standard +concept field @cdmFieldName in the @cdmTableName table.

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/checks/withinVisitDates.html b/docs/articles/checks/withinVisitDates.html new file mode 100644 index 00000000..98dd00f1 --- /dev/null +++ b/docs/articles/checks/withinVisitDates.html @@ -0,0 +1,234 @@ + + + + + + + +withinVisitDates • DataQualityDashboard + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + +
    +

    Summary +

    +

    Level: FIELD
    Context: Verification
    Category: Conformance
    Subcategory:
    Severity:

    +
    +
    +

    Description +

    +

    The number and percent of records not within one week on either side +of the corresponding visit occurrence start and end date

    +
    +
    +

    Definition +

    +
      +
    • +Numerator:
    • +
    • +Denominator:
    • +
    • +Related CDM Convention(s):
    • +
    • +CDM Fields/Tables:
    • +
    • +Default Threshold Value:
    • +
    +
    +
    +

    User Guidance +

    +
    +

    Violated rows query +

    +
    +
    +
    +

    ETL Developers +

    +
    +
    +

    Data Users +

    +
    +
    +
    + + + +
    + + + +
    + +
    +

    +

    Site built with pkgdown 2.0.7.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/articles/index.html b/docs/articles/index.html index fb48c266..610430a2 100644 --- a/docs/articles/index.html +++ b/docs/articles/index.html @@ -17,7 +17,7 @@ DataQualityDashboard - 2.5.0 + 2.6.0
    @@ -41,22 +41,59 @@ +
  • @@ -89,7 +126,7 @@

    All vignettes

    Add a New Data Quality Check
    -
    Check Status Descriptions
    +
    Check Status Definitions
    Data Quality Check Type Definitions
    @@ -97,10 +134,62 @@

    All vignettes

    Running the DQD on a Cohort
    -
    SqlOnly
    +
    Running the DQD in SqlOnly mode
    Failure Thresholds and How to Change Them
    +
    Index
    +
    +
    cdmDatatype
    +
    +
    cdmField
    +
    +
    cdmTable
    +
    +
    fkClass
    +
    +
    fkDomain
    +
    +
    isForeignKey
    +
    +
    isPrimaryKey
    +
    +
    isRequired
    +
    +
    isStandardValidConcept
    +
    +
    measureConditionEraCompleteness
    +
    +
    measurePersonCompleteness
    +
    +
    measureValueCompleteness
    +
    +
    plausibleAfterBirth
    +
    +
    plausibleBeforeDeath
    +
    +
    plausibleDuringLife
    +
    +
    plausibleGender
    +
    +
    plausibleStartBeforeEnd
    +
    +
    plausibleTemporalAfter
    +
    +
    plausibleUnitConceptIds
    +
    +
    plausibleValueHigh
    +
    +
    plausibleValueLow
    +
    +
    sourceConceptRecordCompleteness
    +
    +
    sourceValueCompleteness
    +
    +
    standardConceptRecordCompleteness
    +
    +
    withinVisitDates
    +
  • diff --git a/docs/authors.html b/docs/authors.html index 30f2df9a..74140d12 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -17,7 +17,7 @@ DataQualityDashboard - 2.5.0 + 2.6.0 @@ -41,22 +41,59 @@ +
  • diff --git a/docs/check_statuses.html b/docs/check_statuses.html deleted file mode 100644 index 10217970..00000000 --- a/docs/check_statuses.html +++ /dev/null @@ -1,137 +0,0 @@ - -DQD check statuses • DataQualityDashboard - - -
    -
    - - - -
    -
    - - -
    - -
    -

    Introduction

    -

    In the DataQualityDashboard v2, new check statuses were introduced: Error and Not Applicable. These were introduced to more accurately reflect the quality of data contained in a CDM instance, addressing scenarios where pass/fail is not appropriate. The new set of mutually exclusive status states are listed below in priority order:

    -
    • Is Error: if a SQL error occurred during execution

    • -
    • Not Applicable: if DQ check is not applicable for reasons explained in the section below

    • -
    • Failed: — if percent violating rows is greater than the threshold

    • -
    • Passed: — if percent violating rows is smaller than the threshold

    • -
    -
    -

    Not Applicable

    -

    The results of a DQ check may not be applicable to a given CDM instance depending on the implementation and content of the instance. For example, the DQ check for plausible values of HbA1c lab results would pass with no violations even if there were no results for that lab test in the database. It is not uncommon to have > 1000 DQ checks that do not apply to a given CDM instance. The results from DQ checks that are not applicable skew to overall results. Listed below are the scenarios for which a DQ check result is flagged as Not_applicable:

    -
    1. If the cdmTable DQ check determines that a table does not exist in the database, then all DQ checks (except cdm_table) addressing that table are flagged as Not_applicable.

    2. -
    3. If a table exists but is empty, then all field level and concept level checks for that table are flagged as Not_applicable, except for cdmField checks, which evaluates if the field is defined or not. A cdmField check is marked as not_applicable if the CDM table it refers to does not exist (tested by cdmTable). An empty table is detected when the measureValueCompleteness DQ check for any of the fields in the table returns a denominator count = 0 (NUM_DENOMINATOR_ROWS=0).

    4. -
    5. -

      If a field is not populated, then all field level and concept level checks except for measureValueCompleteness and isRequired are flagged as Not_applicable.

      -
      1. A field is not populated if the measureValueCompleteness DQ check finds denominator count > 0 and number of violated rows = denominator count (NUM_DENOMINATOR_ROWS > 0 AND NUM_DENOMINATOR_ROWS = NUM_VIOLATED_ROWS).

      2. -
      3. -

        The measureValueCompleteness check is marked as not applicable if:

        -
        1. The CDM table it refers to does not exist or is empty.

        2. -
        3. The CDM field it refers to does not exist.

        4. -
      4. -
      5. -

        The isRequired check is marked as not applicable if:

        -
        1. The CDM table it refers to does not exist or is empty.

        2. -
        3. The CDM field it refers to does not exist.

        4. -
      6. -
    6. -
    7. -

      Flagging a Concept_ID level DQ check as Not_applicable depends on whether the DQ check logic includes a UNIT_CONCEPT_ID. There are two scenarios for DQ checks evaluating specific Concept_ids.

      -
      1. The DQ check does not include a UNIT_CONCEPT_ID (value is null). A DQ check is flagged as Not_applicable if there are no instances of the Concept_ID in the table/field. E.g. plausibility checks for specific conditions and gender. Both pregnancy and male do not have UNIT_CONCEPT_IDs.

      2. -
      3. The DQ check includes a UNIT_CONCEPT_ID. A DQ check is flagged as Not_applicable if there are no instances of both concept and unit concept IDs in the table/field. E.g. all DQ checks referencing the concept_ID for HbA1c lab results expressed in mg/dl units will be flagged as Not_applicable if there are no instances of that concept_ID in the table/field addressed by the DQ check.

      4. -
    8. -
    -
    - -
    - - - -
    - - - -
    - -
    -

    Site built with pkgdown 2.0.6.

    -
    - -
    - - - - - - - - diff --git a/docs/index.html b/docs/index.html index fe3503a6..5aec50bd 100644 --- a/docs/index.html +++ b/docs/index.html @@ -33,7 +33,7 @@ DataQualityDashboard - 2.5.0 + 2.6.0 @@ -59,22 +59,61 @@ +
  • + @@ -128,7 +167,7 @@

    OverviewThe number and percent of records with a value in the year_of_birth field of the PERSON table less than 1850.

    And, since it is parameterized, we can similarly apply it to DRUG_EXPOSURE.days_supply:

    The number and percent of records with a value in the days_supply field of the DRUG_EXPOSURE table less than 0.

    -

    Version 1 of the tool includes 24 different check types organized into Kahn contexts and categories. Additionally, each data quality check type is considered either a table check, field check, or concept-level check. Table-level checks are those evaluating the table at a high-level without reference to individual fields, or those that span multiple event tables. These include checks making sure required tables are present or that at least some of the people in the PERSON table have records in the event tables. Field-level checks are those related to specific fields in a table. The majority of the check types in version 1 are field-level checks. These include checks evaluating primary key relationship and those investigating if the concepts in a field conform to the specified domain. Concept-level checks are related to individual concepts. These include checks looking for gender-specific concepts in persons of the wrong gender and plausible values for measurement-unit pairs. For a detailed description and definition of each check type please click here.

    +

    Version 1 of the tool includes 24 different check types organized into Kahn contexts and categories. Additionally, each data quality check type is considered either a table check, field check, or concept-level check. Table-level checks are those evaluating the table at a high-level without reference to individual fields, or those that span multiple event tables. These include checks making sure required tables are present or that at least some of the people in the PERSON table have records in the event tables. Field-level checks are those related to specific fields in a table. The majority of the check types in version 1 are field-level checks. These include checks evaluating primary key relationship and those investigating if the concepts in a field conform to the specified domain. Concept-level checks are related to individual concepts. These include checks looking for gender-specific concepts in persons of the wrong gender and plausible values for measurement-unit pairs. For a detailed description and definition of each check type please click here.

    After systematically applying the 24 check types to an OMOP CDM version approximately 4,000 individual data quality checks are resolved, run against the database, and evaluated based on a pre-specified threshold. The R package then creates a json object that is read into an RShiny application to view the results.

    @@ -241,7 +280,7 @@

    Installation

    User Documentation

    -

    Documentation can be found on the package website.

    +

    Documentation can be found on the package website.

    PDF versions of the documentation are also available: