diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml new file mode 100644 index 00000000..d00813f0 --- /dev/null +++ b/.github/workflows/sonar.yml @@ -0,0 +1,20 @@ +name: Sonar scan +on: + push: + branches: + - master + pull_request: + types: [opened, synchronize, reopened] +jobs: + sonarcloud: + name: SonarCloud + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: SonarCloud Scan + uses: SonarSource/sonarcloud-github-action@master + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 8ab3f3b6..c7c7858d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,7 @@ .pnp.js # testing -/coverage +# /coverage # production /build @@ -37,5 +37,5 @@ cache cypress/videos .scannerwork -sonar-project.properties +# sonar-project.properties react-app-tester \ No newline at end of file diff --git a/coverage/clover.xml b/coverage/clover.xml new file mode 100644 index 00000000..827b687c --- /dev/null +++ b/coverage/clover.xml @@ -0,0 +1,5524 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css new file mode 100644 index 00000000..f418035b --- /dev/null +++ b/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js new file mode 100644 index 00000000..a59c718b --- /dev/null +++ b/coverage/lcov-report/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another + // match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements.item(currentIndex).classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center', + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to + // navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/lcov-report/components/GlobalContext.tsx.html b/coverage/lcov-report/components/GlobalContext.tsx.html new file mode 100644 index 00000000..5d50d21e --- /dev/null +++ b/coverage/lcov-report/components/GlobalContext.tsx.html @@ -0,0 +1,522 @@ + + + + + + Code coverage report for components/GlobalContext.tsx + + + + + + + + + +
+
+

All files / components GlobalContext.tsx

+
+ +
+ 19.86% + Statements + 29/146 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 19.86% + Lines + 29/146 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +1471x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x + 
/* eslint-disable react/prop-types */
+import { TimelineProps as PropsModel } from '@models/TimelineModel';
+import {
+  getDefaultButtonTexts,
+  getDefaultClassNames,
+  getDefaultThemeOrDark,
+  getSlideShowType,
+} from '@utils/index';
+import {
+  createContext,
+  FunctionComponent,
+  useCallback,
+  useMemo,
+  useState,
+} from 'react';
+ 
+const GlobalContext = createContext<
+  PropsModel & { toggleDarkMode?: () => void }
+>({});
+ 
+type ContextProps = PropsModel & {
+  toggleDarkMode?: () => void;
+};
+ 
+const GlobalContextProvider: FunctionComponent<Partial<PropsModel>> = (
+  props,
+) => {
+  const {
+    cardHeight = 200,
+    cardLess = false,
+    flipLayout,
+    items = [],
+    theme,
+    buttonTexts,
+    classNames,
+    mode = 'VERTICAL_ALTERNATING',
+    fontSizes,
+    textOverlay,
+    darkMode,
+    slideShow,
+    onThemeChange,
+    mediaSettings,
+    mediaHeight = 200,
+    contentDetailsHeight = 10,
+  } = props;
+
+  const [isDarkMode, setIsDarkMode] = useState(darkMode);
+
+  const newCardHeight = useMemo(
+    () => Math.max(contentDetailsHeight || 0 + mediaHeight || 0, cardHeight),
+    [],
+  );
+
+  const newContentDetailsHeight = useMemo(() => {
+    const detailsHeightApprox = Math.round(newCardHeight * 0.75);
+    return contentDetailsHeight > newCardHeight
+      ? Math.min(contentDetailsHeight, detailsHeightApprox)
+      : Math.max(contentDetailsHeight, detailsHeightApprox);
+  }, [newCardHeight]);
+
+  const toggleDarkMode = useCallback(() => {
+    setIsDarkMode(!isDarkMode);
+    onThemeChange?.();
+  }, [isDarkMode]);
+
+  const defaultProps = useMemo(
+    () =>
+      Object.assign<ContextProps, ContextProps, ContextProps>(
+        {},
+        {
+          borderLessCards: false,
+          cardHeight: newCardHeight,
+          cardLess: false,
+          disableAutoScrollOnClick: false,
+          disableClickOnCircle: false,
+          enableBreakPoint: true,
+          enableDarkToggle: false,
+          focusActiveItemOnLoad: false,
+          lineWidth: 3,
+          mediaHeight: 200,
+          nestedCardHeight: 150,
+          scrollable: {
+            scrollbar: false,
+          },
+          showAllCardsHorizontal: false,
+          showProgressOnSlideshow: slideShow,
+          slideItemDuration: 2000,
+          slideShowType: getSlideShowType(mode),
+          textOverlay: false,
+          timelinePointDimension: 16,
+          timelinePointShape: 'circle',
+          titleDateFormat: 'MMM DD, YYYY',
+          uniqueId: 'react-chrono',
+          useReadMore: true,
+          verticalBreakPoint: 1028,
+        },
+        {
+          ...props,
+          activeItemIndex: flipLayout ? items?.length - 1 : 0,
+          buttonTexts: {
+            ...getDefaultButtonTexts(),
+            ...buttonTexts,
+          },
+          cardHeight: cardLess ? cardHeight || 80 : cardHeight,
+          classNames: {
+            ...getDefaultClassNames(),
+            ...classNames,
+          },
+          contentDetailsHeight: newContentDetailsHeight,
+          darkMode: isDarkMode,
+          fontSizes: {
+            cardSubtitle: '0.85rem',
+            cardText: '1rem',
+            cardTitle: '1rem',
+            title: '1rem',
+            ...fontSizes,
+          },
+          mediaSettings: {
+            align: mode === 'VERTICAL' && !textOverlay ? 'left' : 'center',
+            imageFit: 'cover',
+            ...mediaSettings,
+          },
+          theme: {
+            ...getDefaultThemeOrDark(isDarkMode),
+            ...theme,
+          },
+          toggleDarkMode,
+        },
+      ),
+    [newContentDetailsHeight, newCardHeight, isDarkMode, toggleDarkMode],
+  );
+
+  const { children } = props;
+
+  return (
+    <GlobalContext.Provider
+      value={{ ...defaultProps, darkMode: isDarkMode, toggleDarkMode }}
+    >
+      {children}
+    </GlobalContext.Provider>
+  );
+};
+ 
+export default GlobalContextProvider;
+ 
+export { GlobalContext };
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/common/styles/index.html b/coverage/lcov-report/components/common/styles/index.html new file mode 100644 index 00000000..25676c1f --- /dev/null +++ b/coverage/lcov-report/components/common/styles/index.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for components/common/styles + + + + + + + + + +
+
+

All files components/common/styles

+
+ +
+ 100% + Statements + 19/19 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 19/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.ts +
+
100%19/19100%3/3100%2/2100%19/19
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/common/styles/index.ts.html b/coverage/lcov-report/components/common/styles/index.ts.html new file mode 100644 index 00000000..fadd49d4 --- /dev/null +++ b/coverage/lcov-report/components/common/styles/index.ts.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for components/common/styles/index.ts + + + + + + + + + +
+
+

All files / components/common/styles index.ts

+
+ +
+ 100% + Statements + 19/19 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 19/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +201x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { css } from 'styled-components';
+ 
+export const ScrollBar = css`
+  scrollbar-color: ${(p) => p.theme?.primary} default;
+  scrollbar-width: thin;
+ 
+  &::-webkit-scrollbar {
+    width: 0.3em;
+  }
+ 
+  &::-webkit-scrollbar-track {
+    box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.2);
+  }
+ 
+  &::-webkit-scrollbar-thumb {
+    background-color: ${(p) => p.theme?.primary};
+    outline: 1px solid ${(p) => p.theme?.primary};
+  }
+`;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/common/test/index.html b/coverage/lcov-report/components/common/test/index.html new file mode 100644 index 00000000..4688cfc9 --- /dev/null +++ b/coverage/lcov-report/components/common/test/index.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for components/common/test + + + + + + + + + +
+
+

All files components/common/test

+
+ +
+ 100% + Statements + 83/83 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 14.28% + Functions + 1/7 +
+ + +
+ 100% + Lines + 83/83 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.tsx +
+
100%83/83100%1/114.28%1/7100%83/83
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/common/test/index.tsx.html b/coverage/lcov-report/components/common/test/index.tsx.html new file mode 100644 index 00000000..a155fc10 --- /dev/null +++ b/coverage/lcov-report/components/common/test/index.tsx.html @@ -0,0 +1,333 @@ + + + + + + Code coverage report for components/common/test/index.tsx + + + + + + + + + +
+
+

All files / components/common/test index.tsx

+
+ +
+ 100% + Statements + 83/83 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 14.28% + Functions + 1/7 +
+ + +
+ 100% + Lines + 83/83 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +841x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +41x +41x +41x +41x +41x +41x +41x +41x + 
import { TimelineProps } from '@models/TimelineModel';
+import { render, RenderResult } from '@testing-library/react';
+import { ReactElement } from 'react';
+import { GlobalContext } from '../../GlobalContext';
+ 
+export const providerProps: TimelineProps = {
+  buttonTexts: {
+    dark: 'dark',
+    first: 'first',
+    last: 'last',
+    light: 'light',
+    next: 'next',
+    play: 'start slideshow',
+    previous: 'previous',
+    stop: 'stop slideshow',
+  },
+  classNames: {
+    card: 'card',
+    cardMedia: 'card-media',
+    cardSubTitle: 'card-subtitle',
+    cardText: 'card-text',
+    cardTitle: 'card-title',
+    controls: 'controls',
+    title: 'title',
+  },
+  darkMode: false,
+  enableDarkToggle: true,
+  fontSizes: {
+    cardSubtitle: '0.85rem',
+    cardText: '1rem',
+    cardTitle: '1.25rem',
+    title: '1.5rem',
+  },
+  mediaHeight: 200,
+  mode: 'VERTICAL_ALTERNATING',
+  scrollable: {
+    scrollbar: false,
+  },
+  showAllCardsHorizontal: false,
+  showProgressOnSlideshow: false,
+  slideItemDuration: 2000,
+  slideShowType: 'reveal',
+  textOverlay: false,
+  theme: {
+    cardBgColor: '#fff',
+    cardDetailsBackGround: '#ffffff',
+    cardDetailsColor: '#000',
+    cardSubtitleColor: '#000',
+    cardTitleColor: '#000',
+    detailsColor: '#000',
+    primary: '#0f52ba',
+    secondary: '#ffdf00',
+    titleColor: '#0f52ba',
+    titleColorActive: '#0f52ba',
+  },
+  timelinePointDimension: 16,
+  timelinePointShape: 'circle',
+  titleDateFormat: 'MMM DD, YYYY',
+  useReadMore: true,
+};
+ 
+export const commonProps = {
+  disableLeft: false,
+  disableRight: false,
+  onFirst: () => {},
+  onLast: () => {},
+  onNext: () => {},
+  onPrevious: () => {},
+  onReplay: () => {},
+  onToggleDarkMode: () => {},
+  slideShowEnabled: false,
+  slideShowRunning: false,
+};
+ 
+export const customRender = (
+  ui: ReactElement,
+  { providerProps, ...renderOptions }: any,
+): RenderResult => {
+  return render(
+    <GlobalContext.Provider value={providerProps}>{ui}</GlobalContext.Provider>,
+    renderOptions,
+  );
+};
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/common/themes/index.html b/coverage/lcov-report/components/common/themes/index.html new file mode 100644 index 00000000..e7288cc5 --- /dev/null +++ b/coverage/lcov-report/components/common/themes/index.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for components/common/themes + + + + + + + + + +
+
+

All files components/common/themes

+
+ +
+ 100% + Statements + 41/41 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 41/41 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.ts +
+
100%41/41100%0/0100%0/0100%41/41
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/common/themes/index.ts.html b/coverage/lcov-report/components/common/themes/index.ts.html new file mode 100644 index 00000000..17961898 --- /dev/null +++ b/coverage/lcov-report/components/common/themes/index.ts.html @@ -0,0 +1,207 @@ + + + + + + Code coverage report for components/common/themes/index.ts + + + + + + + + + +
+
+

All files / components/common/themes index.ts

+
+ +
+ 100% + Statements + 41/41 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 41/41 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +421x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { Theme } from '@models/Theme';
+ 
+export const defaultTheme: Theme = {
+  cardBgColor: '#ffffff',
+  cardDetailsBackGround: '#ffffff',
+  cardDetailsColor: '#000',
+  cardMediaBgColor: '#f5f5f5',
+  cardSubtitleColor: '#000',
+  cardTitleColor: '#007FFF',
+  detailsColor: '#000',
+  iconBackgroundColor: '#007FFF',
+  nestedCardBgColor: '#f5f5f5',
+  nestedCardDetailsBackGround: '#f5f5f5',
+  nestedCardDetailsColor: '#000',
+  nestedCardSubtitleColor: '#000',
+  nestedCardTitleColor: '#000',
+  primary: '#007FFF',
+  secondary: '#ffdf00',
+  titleColor: '#007FFF',
+  titleColorActive: '#007FFF',
+};
+ 
+export const darkTheme: Theme = {
+  cardBgColor: '#191919',
+  cardDetailsBackGround: '#191919',
+  cardDetailsColor: '#ffff0f',
+  cardMediaBgColor: '#2f2f2f',
+  cardSubtitleColor: '#ffffff',
+  cardTitleColor: '#007FFF',
+  detailsColor: '#ffffff',
+  iconBackgroundColor: '#007FFF',
+  nestedCardBgColor: '#333333',
+  nestedCardDetailsBackGround: '#333333',
+  nestedCardDetailsColor: '#ffffff',
+  nestedCardSubtitleColor: '#ffffff',
+  nestedCardTitleColor: '#ffffff',
+  primary: '#007FFF',
+  secondary: '#ffdf00',
+  titleColor: '#007FFF',
+  titleColorActive: '#007FFF',
+};
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/effects/index.html b/coverage/lcov-report/components/effects/index.html new file mode 100644 index 00000000..86bae8cd --- /dev/null +++ b/coverage/lcov-report/components/effects/index.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for components/effects + + + + + + + + + +
+
+

All files components/effects

+
+ +
+ 43.28% + Statements + 58/134 +
+ + +
+ 90% + Branches + 9/10 +
+ + +
+ 33.33% + Functions + 1/3 +
+ + +
+ 43.28% + Lines + 58/134 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
useMatchMedia.ts +
+
95.65%44/4690%9/1050%1/295.65%44/46
useNewScrollPosition.ts +
+
15.9%14/88100%0/00%0/115.9%14/88
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/effects/useMatchMedia.ts.html b/coverage/lcov-report/components/effects/useMatchMedia.ts.html new file mode 100644 index 00000000..719cf651 --- /dev/null +++ b/coverage/lcov-report/components/effects/useMatchMedia.ts.html @@ -0,0 +1,222 @@ + + + + + + Code coverage report for components/effects/useMatchMedia.ts + + + + + + + + + +
+
+

All files / components/effects useMatchMedia.ts

+
+ +
+ 95.65% + Statements + 44/46 +
+ + +
+ 90% + Branches + 9/10 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 95.65% + Lines + 44/46 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +471x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +4x +4x +4x +3x +1x +1x +2x +2x +2x +2x +2x +3x +1x +1x +2x +2x +2x +2x +2x +2x +4x +4x +4x +4x +  +  +4x +4x +4x +4x + 
/**
+ * The useMatchMedia hook takes a media query string, a callback function, and an enabled boolean.
+ * It returns a boolean indicating if the media query matches the current viewport and executes the callback if it does.
+ *
+ * @param {string} query - The media query string to match against.
+ * @param {() => void} [cb] - Optional callback function to be executed if the media query matches.
+ * @param {boolean} [enabled=true] - Whether the hook is enabled or not.
+ * @returns {boolean} - Whether the media query matches the current viewport.
+ */
+import { useEffect, useState } from 'react';
+ 
+export const useMatchMedia = (
+  query: string,
+  cb?: () => void,
+  enabled = true,
+) => {
+  const [matches, setMatches] = useState<boolean>(false);
+ 
+  useEffect(() => {
+    if (!enabled) {
+      return;
+    }
+ 
+    const media = window.matchMedia(query);
+    const listener = () => setMatches(media.matches);
+ 
+    // Check initial match and update state if necessary
+    if (media.matches !== matches) {
+      setMatches(media.matches);
+    }
+ 
+    media.addEventListener('change', listener);
+ 
+    return () => {
+      media.removeEventListener('change', listener);
+    };
+  }, [query, enabled]);
+ 
+  useEffect(() => {
+    if (matches && cb) {
+      cb();
+    }
+  }, [matches, cb]);
+ 
+  return matches;
+};
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/effects/useNewScrollPosition.ts.html b/coverage/lcov-report/components/effects/useNewScrollPosition.ts.html new file mode 100644 index 00000000..a7f0fed5 --- /dev/null +++ b/coverage/lcov-report/components/effects/useNewScrollPosition.ts.html @@ -0,0 +1,348 @@ + + + + + + Code coverage report for components/effects/useNewScrollPosition.ts + + + + + + + + + +
+
+

All files / components/effects useNewScrollPosition.ts

+
+ +
+ 15.9% + Statements + 14/88 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 15.9% + Lines + 14/88 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +891x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x + 
import { Scroll } from '@models/TimelineHorizontalModel';
+import { TimelineMode } from '@models/TimelineModel';
+import { useMemo, useState } from 'react';
+ 
+/**
+ * Hook to calculate the new scroll position based on the given mode and item width.
+ *
+ * @param {TimelineMode} mode - The mode of the timeline (HORIZONTAL, VERTICAL, or VERTICAL_ALTERNATING).
+ * @param {number} [itemWidth] - Optional item width for horizontal mode.
+ * @returns {[number, (e: HTMLElement, s: Partial<Scroll>) => void]} - The new offset and a function to compute the new offset.
+ */
+const useNewScrollPosition = (
+  mode: TimelineMode,
+  itemWidth?: number,
+): [number, (e: HTMLElement, s: Partial<Scroll>) => void] => {
+  // State to hold the new offset value
+  const [newOffset, setOffset] = useState(0);
+
+  // Memoized function to compute the new offset value
+  const computeNewOffset = useMemo(
+    () => (parent: HTMLElement, scroll: Partial<Scroll>) => {
+      // Destructuring relevant properties from parent and scroll
+      const { clientWidth, scrollLeft, scrollTop, clientHeight } = parent;
+      const { pointOffset, pointWidth, contentHeight, contentOffset } = scroll;
+
+      // Handling horizontal mode
+      if (mode === 'HORIZONTAL' && itemWidth && pointWidth && pointOffset) {
+        // Calculating right boundaries for container and circular element
+        const contrRight = scrollLeft + clientWidth;
+        const circRight = pointOffset + pointWidth;
+
+        // Checking if the element is fully visible
+        const isVisible = pointOffset >= scrollLeft && circRight <= contrRight;
+
+        // Checking if the element is partially visible
+        const isPartiallyVisible =
+          (pointOffset < scrollLeft && circRight > scrollLeft) ||
+          (circRight > contrRight && pointOffset < contrRight);
+
+        // Calculating gaps from left and right
+        const leftGap = pointOffset - scrollLeft;
+        const rightGap = contrRight - pointOffset;
+
+        // Setting offset based on visibility and gap conditions
+        if (
+          !(isVisible || isPartiallyVisible) ||
+          (leftGap <= itemWidth && leftGap >= 0) ||
+          (rightGap <= itemWidth && rightGap >= 0)
+        ) {
+          setOffset(pointOffset - itemWidth);
+        }
+      } else if (mode === 'VERTICAL' || mode === 'VERTICAL_ALTERNATING') {
+        // Handling vertical modes
+        if (contentOffset && contentHeight) {
+          // Calculating bottom boundaries for container and circular element
+          const contrBottom = scrollTop + clientHeight;
+          const circBottom = contentOffset + contentHeight;
+
+          // Checking if the element is fully visible
+          const isVisible =
+            contentOffset >= scrollTop && circBottom <= contrBottom;
+
+          // Checking if the element is partially visible
+          const isPartiallyVisible =
+            (contentOffset < scrollTop && circBottom > scrollTop) ||
+            (circBottom > contrBottom && contentOffset < contrBottom);
+
+          // Calculating new offset
+          const nOffset = contentOffset - contentHeight;
+          const notVisible = !isVisible || isPartiallyVisible;
+
+          // Setting offset based on visibility conditions
+          if (notVisible && nOffset + contentHeight < contrBottom) {
+            setOffset(nOffset + Math.round(contentHeight / 2));
+          } else if (notVisible) {
+            setOffset(nOffset);
+          }
+        }
+      }
+    },
+    [mode, itemWidth], // Dependencies for useMemo
+  );
+
+  // Returning the new offset and the function to compute it
+  return [newOffset, computeNewOffset];
+};
+ 
+export default useNewScrollPosition;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/chev-left.tsx.html b/coverage/lcov-report/components/icons/chev-left.tsx.html new file mode 100644 index 00000000..edff2feb --- /dev/null +++ b/coverage/lcov-report/components/icons/chev-left.tsx.html @@ -0,0 +1,144 @@ + + + + + + Code coverage report for components/icons/chev-left.tsx + + + + + + + + + +
+
+

All files / components/icons chev-left.tsx

+
+ +
+ 100% + Statements + 20/20 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +211x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +1x +1x +1x + 
import React from 'react';
+ 
+const ChevronLeft: React.FunctionComponent = () => (
+  <svg
+    xmlns="http://www.w3.org/2000/svg"
+    width="24"
+    height="24"
+    viewBox="0 0 24 24"
+    fill="none"
+    stroke="currentColor"
+    strokeWidth="2"
+    strokeLinecap="round"
+    strokeLinejoin="round"
+    className="feather feather-chevron-left"
+  >
+    <polyline points="15 18 9 12 15 6"></polyline>
+  </svg>
+);
+ 
+export default ChevronLeft;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/chev-right.tsx.html b/coverage/lcov-report/components/icons/chev-right.tsx.html new file mode 100644 index 00000000..43e3c441 --- /dev/null +++ b/coverage/lcov-report/components/icons/chev-right.tsx.html @@ -0,0 +1,144 @@ + + + + + + Code coverage report for components/icons/chev-right.tsx + + + + + + + + + +
+
+

All files / components/icons chev-right.tsx

+
+ +
+ 100% + Statements + 20/20 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +211x +1x +1x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +1x +1x +1x + 
import React from 'react';
+ 
+const ChevronRightIcon: React.FunctionComponent = () => (
+  <svg
+    xmlns="http://www.w3.org/2000/svg"
+    width="24"
+    height="24"
+    viewBox="0 0 24 24"
+    fill="none"
+    stroke="currentColor"
+    strokeWidth="2"
+    strokeLinecap="round"
+    strokeLinejoin="round"
+    className="feather feather-chevron-right"
+  >
+    <polyline points="9 18 15 12 9 6"></polyline>
+  </svg>
+);
+ 
+export default ChevronRightIcon;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/chevs-left.tsx.html b/coverage/lcov-report/components/icons/chevs-left.tsx.html new file mode 100644 index 00000000..1a1ee912 --- /dev/null +++ b/coverage/lcov-report/components/icons/chevs-left.tsx.html @@ -0,0 +1,147 @@ + + + + + + Code coverage report for components/icons/chevs-left.tsx + + + + + + + + + +
+
+

All files / components/icons chevs-left.tsx

+
+ +
+ 100% + Statements + 21/21 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 21/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +221x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +1x +1x +1x + 
import React from 'react';
+ 
+const ChevronLeft: React.FunctionComponent = () => (
+  <svg
+    xmlns="http://www.w3.org/2000/svg"
+    width="24"
+    height="24"
+    viewBox="0 0 24 24"
+    fill="none"
+    stroke="currentColor"
+    strokeWidth="2"
+    strokeLinecap="round"
+    strokeLinejoin="round"
+    className="feather feather-chevrons-left"
+  >
+    <polyline points="11 17 6 12 11 7"></polyline>
+    <polyline points="18 17 13 12 18 7"></polyline>
+  </svg>
+);
+ 
+export default ChevronLeft;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/chevs-right.tsx.html b/coverage/lcov-report/components/icons/chevs-right.tsx.html new file mode 100644 index 00000000..a27eea52 --- /dev/null +++ b/coverage/lcov-report/components/icons/chevs-right.tsx.html @@ -0,0 +1,147 @@ + + + + + + Code coverage report for components/icons/chevs-right.tsx + + + + + + + + + +
+
+

All files / components/icons chevs-right.tsx

+
+ +
+ 100% + Statements + 21/21 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 21/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +221x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +1x +1x +1x + 
import React from 'react';
+ 
+const ChevronRightIcon: React.FunctionComponent = () => (
+  <svg
+    xmlns="http://www.w3.org/2000/svg"
+    width="24"
+    height="24"
+    viewBox="0 0 24 24"
+    fill="none"
+    stroke="currentColor"
+    strokeWidth="2"
+    strokeLinecap="round"
+    strokeLinejoin="round"
+    className="feather feather-chevrons-right"
+  >
+    <polyline points="13 17 18 12 13 7"></polyline>
+    <polyline points="6 17 11 12 6 7"></polyline>
+  </svg>
+);
+ 
+export default ChevronRightIcon;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/close.tsx.html b/coverage/lcov-report/components/icons/close.tsx.html new file mode 100644 index 00000000..9dc58cce --- /dev/null +++ b/coverage/lcov-report/components/icons/close.tsx.html @@ -0,0 +1,150 @@ + + + + + + Code coverage report for components/icons/close.tsx + + + + + + + + + +
+
+

All files / components/icons close.tsx

+
+ +
+ 18.18% + Statements + 4/22 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 18.18% + Lines + 4/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +231x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x + 
import * as React from "react"
+ 
+function SvgComponent() {
+  return (
+    <svg
+      xmlns="http://www.w3.org/2000/svg"
+      width={24}
+      height={24}
+      viewBox="0 0 24 24"
+      fill="none"
+      stroke="currentColor"
+      strokeWidth={2}
+      strokeLinecap="round"
+      strokeLinejoin="round"
+      className="prefix__feather prefix__feather-x"
+    >
+      <path d="M18 6L6 18M6 6l12 12" />
+    </svg>
+  )
+}
+ 
+export default SvgComponent
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/index.html b/coverage/lcov-report/components/icons/index.html new file mode 100644 index 00000000..682c1607 --- /dev/null +++ b/coverage/lcov-report/components/icons/index.html @@ -0,0 +1,325 @@ + + + + + + Code coverage report for components/icons + + + + + + + + + +
+
+

All files components/icons

+
+ +
+ 69.25% + Statements + 187/270 +
+ + +
+ 100% + Branches + 8/8 +
+ + +
+ 57.14% + Functions + 8/14 +
+ + +
+ 69.25% + Lines + 187/270 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
chev-left.tsx +
+
100%20/20100%1/1100%1/1100%20/20
chev-right.tsx +
+
100%20/20100%1/1100%1/1100%20/20
chevs-left.tsx +
+
100%21/21100%1/1100%1/1100%21/21
chevs-right.tsx +
+
100%21/21100%1/1100%1/1100%21/21
close.tsx +
+
18.18%4/22100%0/00%0/118.18%4/22
index.tsx +
+
100%9/9100%0/0100%0/0100%9/9
maximize.tsx +
+
100%17/17100%1/1100%1/1100%17/17
menu.tsx +
+
18.18%4/22100%0/00%0/118.18%4/22
minimize.tsx +
+
31.25%5/16100%0/00%0/131.25%5/16
minus.tsx +
+
100%16/16100%1/1100%1/1100%16/16
moon.tsx +
+
100%16/16100%1/1100%1/1100%16/16
plus.tsx +
+
31.25%5/16100%0/00%0/131.25%5/16
replay-icon.tsx +
+
100%19/19100%1/1100%1/1100%19/19
stop.tsx +
+
29.41%5/17100%0/00%0/129.41%5/17
sun.tsx +
+
27.77%5/18100%0/00%0/127.77%5/18
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/index.tsx.html b/coverage/lcov-report/components/icons/index.tsx.html new file mode 100644 index 00000000..a95f0f58 --- /dev/null +++ b/coverage/lcov-report/components/icons/index.tsx.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for components/icons/index.tsx + + + + + + + + + +
+
+

All files / components/icons index.tsx

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x + 
export { default as ChevronLeft } from './chev-left';
+export { default as ChevronRight } from './chev-right';
+export { default as MaximizeIcon } from './maximize';
+export { default as MinimizeIcon } from './minimize';
+export { default as MinusIcon } from './minus';
+export { default as MoonIcon } from './moon';
+export { default as PlusIcon } from './plus';
+export { default as StopIcon } from "./stop";
+export { default as SunIcon } from './sun';
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/maximize.tsx.html b/coverage/lcov-report/components/icons/maximize.tsx.html new file mode 100644 index 00000000..4b479b56 --- /dev/null +++ b/coverage/lcov-report/components/icons/maximize.tsx.html @@ -0,0 +1,135 @@ + + + + + + Code coverage report for components/icons/maximize.tsx + + + + + + + + + +
+
+

All files / components/icons maximize.tsx

+
+ +
+ 100% + Statements + 17/17 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 17/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +181x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x + 
 
+const SvgComponent = () => (
+  <svg
+    xmlns="http://www.w3.org/2000/svg"
+    viewBox="0 0 24 24"
+    fill="none"
+    stroke="currentColor"
+    strokeWidth={2}
+    strokeLinecap="round"
+    strokeLinejoin="round"
+    className="feather feather-maximize-2"
+  >
+    <path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7" />
+  </svg>
+)
+ 
+export default SvgComponent
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/menu.tsx.html b/coverage/lcov-report/components/icons/menu.tsx.html new file mode 100644 index 00000000..6dd5c1b5 --- /dev/null +++ b/coverage/lcov-report/components/icons/menu.tsx.html @@ -0,0 +1,150 @@ + + + + + + Code coverage report for components/icons/menu.tsx + + + + + + + + + +
+
+

All files / components/icons menu.tsx

+
+ +
+ 18.18% + Statements + 4/22 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 18.18% + Lines + 4/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +231x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x + 
import * as React from "react"
+ 
+function SvgComponent() {
+  return (
+    <svg
+      xmlns="http://www.w3.org/2000/svg"
+      width={24}
+      height={24}
+      viewBox="0 0 24 24"
+      fill="none"
+      stroke="currentColor"
+      strokeWidth={2}
+      strokeLinecap="round"
+      strokeLinejoin="round"
+      className="prefix__feather prefix__feather-menu"
+    >
+      <path d="M3 12h18M3 6h18M3 18h18" />
+    </svg>
+  )
+}
+ 
+export default SvgComponent
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/minimize.tsx.html b/coverage/lcov-report/components/icons/minimize.tsx.html new file mode 100644 index 00000000..9d5ca38b --- /dev/null +++ b/coverage/lcov-report/components/icons/minimize.tsx.html @@ -0,0 +1,132 @@ + + + + + + Code coverage report for components/icons/minimize.tsx + + + + + + + + + +
+
+

All files / components/icons minimize.tsx

+
+ +
+ 31.25% + Statements + 5/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 31.25% + Lines + 5/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +171x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x + 
 
+const SvgComponent = () => (
+  <svg
+    xmlns="http://www.w3.org/2000/svg"
+    viewBox="0 0 24 24"
+    fill="none"
+    stroke="currentColor"
+    strokeWidth={2}
+    strokeLinecap="round"
+    strokeLinejoin="round"
+  >
+    <path d="M4 14h6v6M20 10h-6V4M14 10l7-7M3 21l7-7" />
+  </svg>
+)
+ 
+export default SvgComponent
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/minus.tsx.html b/coverage/lcov-report/components/icons/minus.tsx.html new file mode 100644 index 00000000..0fc40d44 --- /dev/null +++ b/coverage/lcov-report/components/icons/minus.tsx.html @@ -0,0 +1,132 @@ + + + + + + Code coverage report for components/icons/minus.tsx + + + + + + + + + +
+
+

All files / components/icons minus.tsx

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +171x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x + 
 
+const SvgComponent = () => (
+  <svg
+    xmlns="http://www.w3.org/2000/svg"
+    viewBox="0 0 24 24"
+    fill="none"
+    stroke="currentColor"
+    strokeWidth={2}
+    strokeLinecap="round"
+    strokeLinejoin="round"
+  >
+    <path d="M5 12h14" />
+  </svg>
+)
+ 
+export default SvgComponent
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/moon.tsx.html b/coverage/lcov-report/components/icons/moon.tsx.html new file mode 100644 index 00000000..6e75465d --- /dev/null +++ b/coverage/lcov-report/components/icons/moon.tsx.html @@ -0,0 +1,132 @@ + + + + + + Code coverage report for components/icons/moon.tsx + + + + + + + + + +
+
+

All files / components/icons moon.tsx

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +171x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +1x +1x +1x + 
 
+const SvgComponent = () => (
+  <svg
+    xmlns="http://www.w3.org/2000/svg"
+    fill="none"
+    stroke="currentColor"
+    strokeWidth={2}
+    strokeLinecap="round"
+    strokeLinejoin="round"
+    viewBox="0 0 24 24"
+  >
+    <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" />
+  </svg>
+)
+ 
+export default SvgComponent
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/plus.tsx.html b/coverage/lcov-report/components/icons/plus.tsx.html new file mode 100644 index 00000000..af0dd19d --- /dev/null +++ b/coverage/lcov-report/components/icons/plus.tsx.html @@ -0,0 +1,132 @@ + + + + + + Code coverage report for components/icons/plus.tsx + + + + + + + + + +
+
+

All files / components/icons plus.tsx

+
+ +
+ 31.25% + Statements + 5/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 31.25% + Lines + 5/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +171x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x + 
 
+const SvgComponent = () => (
+  <svg
+    xmlns="http://www.w3.org/2000/svg"
+    viewBox="0 0 24 24"
+    fill="none"
+    stroke="currentColor"
+    strokeWidth={2}
+    strokeLinecap="round"
+    strokeLinejoin="round"
+  >
+    <path d="M12 5v14M5 12h14" />
+  </svg>
+)
+ 
+export default SvgComponent
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/replay-icon.tsx.html b/coverage/lcov-report/components/icons/replay-icon.tsx.html new file mode 100644 index 00000000..a9988031 --- /dev/null +++ b/coverage/lcov-report/components/icons/replay-icon.tsx.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for components/icons/replay-icon.tsx + + + + + + + + + +
+
+

All files / components/icons replay-icon.tsx

+
+ +
+ 100% + Statements + 19/19 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 19/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +201x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import React from 'react';
+ 
+const ReplayIcon: React.FunctionComponent = () => (
+  <svg
+    xmlns="http://www.w3.org/2000/svg"
+    width="24"
+    height="24"
+    viewBox="0 0 24 24"
+    fill="none"
+    stroke="currentColor"
+    strokeWidth="2"
+    strokeLinecap="round"
+    strokeLinejoin="round"
+  >
+    <polygon points="5 3 19 12 5 21 5 3"></polygon>
+  </svg>
+);
+ 
+export default ReplayIcon;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/stop.tsx.html b/coverage/lcov-report/components/icons/stop.tsx.html new file mode 100644 index 00000000..67a0921f --- /dev/null +++ b/coverage/lcov-report/components/icons/stop.tsx.html @@ -0,0 +1,135 @@ + + + + + + Code coverage report for components/icons/stop.tsx + + + + + + + + + +
+
+

All files / components/icons stop.tsx

+
+ +
+ 29.41% + Statements + 5/17 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 29.41% + Lines + 5/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +181x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x + 
 
+const SvgComponent = () => (
+  <svg
+    xmlns="http://www.w3.org/2000/svg"
+    fill="none"
+    stroke="currentColor"
+    strokeWidth={2}
+    strokeLinecap="round"
+    strokeLinejoin="round"
+    viewBox="0 0 24 24"
+  >
+    <circle cx={12} cy={12} r={10} />
+    <path d="M9 9h6v6H9z" />
+  </svg>
+)
+ 
+export default SvgComponent
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/icons/sun.tsx.html b/coverage/lcov-report/components/icons/sun.tsx.html new file mode 100644 index 00000000..ba9b0b10 --- /dev/null +++ b/coverage/lcov-report/components/icons/sun.tsx.html @@ -0,0 +1,138 @@ + + + + + + Code coverage report for components/icons/sun.tsx + + + + + + + + + +
+
+

All files / components/icons sun.tsx

+
+ +
+ 27.77% + Statements + 5/18 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 27.77% + Lines + 5/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +191x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x + 
 
+const SvgComponent = () => (
+  <svg
+    xmlns="http://www.w3.org/2000/svg"
+    viewBox="0 0 24 24"
+    fill="none"
+    stroke="currentColor"
+    strokeWidth={2}
+    strokeLinecap="round"
+    strokeLinejoin="round"
+    className="feather feather-sun"
+  >
+    <circle cx={12} cy={12} r={5} />
+    <path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42" />
+  </svg>
+)
+ 
+export default SvgComponent
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/index.html b/coverage/lcov-report/components/index.html new file mode 100644 index 00000000..5f68cb48 --- /dev/null +++ b/coverage/lcov-report/components/index.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for components + + + + + + + + + +
+
+

All files components

+
+ +
+ 19.86% + Statements + 29/146 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 19.86% + Lines + 29/146 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
GlobalContext.tsx +
+
19.86%29/146100%0/00%0/119.86%29/146
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/memoized/index.html b/coverage/lcov-report/components/timeline-elements/memoized/index.html new file mode 100644 index 00000000..228c7f63 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/memoized/index.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for components/timeline-elements/memoized + + + + + + + + + +
+
+

All files components/timeline-elements/memoized

+
+ +
+ 95.97% + Statements + 167/174 +
+ + +
+ 80.64% + Branches + 25/31 +
+ + +
+ 33.33% + Functions + 1/3 +
+ + +
+ 95.97% + Lines + 167/174 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.tsx +
+
95.97%167/17480.64%25/3133.33%1/395.97%167/174
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/memoized/index.tsx.html b/coverage/lcov-report/components/timeline-elements/memoized/index.tsx.html new file mode 100644 index 00000000..15e307cf --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/memoized/index.tsx.html @@ -0,0 +1,606 @@ + + + + + + Code coverage report for components/timeline-elements/memoized/index.tsx + + + + + + + + + +
+
+

All files / components/timeline-elements/memoized index.tsx

+
+ +
+ 95.97% + Statements + 167/174 +
+ + +
+ 80.64% + Branches + 25/31 +
+ + +
+ 33.33% + Functions + 1/3 +
+ + +
+ 95.97% + Lines + 167/174 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +1751x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +23x +23x +23x +23x +23x +23x +23x +23x +23x +23x +23x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +3x +3x +3x +13x +13x +16x +16x +7x +23x +1x +1x +1x +1x +1x +21x +17x +17x +17x +17x +17x +17x +17x +17x +17x +17x +4x +1x +  +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +2x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +2x +1x +1x +1x +1x +1x +1x +17x +17x +17x +17x +17x +17x +17x +17x +17x +6x +3x +3x +17x +17x +17x +17x +17x +17x +17x +16x +17x +1x +1x +17x +17x +17x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +14x +17x +1x +  +  +  +  +1x +1x +1x +1x +1x + 
import cls from 'classnames';
+import React, { memo, useCallback, useMemo } from 'react';
+import { hexToRGBA } from '../../../utils';
+import { MaximizeIcon, MinimizeIcon, MinusIcon, PlusIcon } from '../../icons';
+import {
+  CardSubTitle,
+  CardTitle,
+  CardTitleAnchor,
+} from '../timeline-card-content/timeline-card-content.styles';
+import {
+  ExpandButton,
+  ShowHideTextButton,
+} from '../timeline-card-media/timeline-card-media-buttons';
+import { DetailsTextWrapper } from './../timeline-card-media/timeline-card-media.styles';
+import {
+  Content,
+  DetailsTextMemoModel,
+  ExpandButtonModel,
+  ShowHideTextButtonModel,
+  Title,
+} from './memoized-model';
+ 
+const TitleMemo = ({
+  title,
+  url,
+  theme,
+  color,
+  dir,
+  active,
+  fontSize = '1rem',
+  classString = '',
+  padding = false,
+}: Title) => {
+  return title ? (
+    <CardTitle
+      className={cls(active ? 'active' : '', { [classString]: true })}
+      theme={theme}
+      style={{ color }}
+      dir={dir}
+      $fontSize={fontSize}
+      data-class={classString}
+      $padding={padding}
+    >
+      {url ? (
+        <CardTitleAnchor href={url} target="_blank" rel="noreferrer">
+          {title}
+        </CardTitleAnchor>
+      ) : (
+        title
+      )}
+    </CardTitle>
+  ) : null;
+};
+ 
+TitleMemo.displayName = 'Timeline Title';
+ 
+const SubTitleMemo = React.memo<Content>(
+  ({ content, color, dir, theme, fontSize, classString, padding }: Content) =>
+    content ? (
+      <CardSubTitle
+        style={{ color }}
+        dir={dir}
+        theme={theme}
+        $fontSize={fontSize}
+        className={cls('card-sub-title', classString)}
+        $padding={padding}
+      >
+        {content}
+      </CardSubTitle>
+    ) : null,
+  (prev, next) =>
+    prev.theme?.cardSubtitleColor === next.theme?.cardSubtitleColor,
+);
+ 
+SubTitleMemo.displayName = 'Timeline Content';
+ 
+export const ExpandButtonMemo = memo<ExpandButtonModel>(
+  ({ theme, expanded, onExpand, textOverlay }: ExpandButtonModel) => {
+    const label = useMemo(() => {
+      return expanded ? 'Minimize' : 'Maximize';
+    }, [expanded]);
+ 
+    return textOverlay ? (
+      <ExpandButton
+        onPointerDown={onExpand}
+        onKeyDown={(ev) => ev.key === 'Enter' && onExpand?.(ev)}
+        theme={theme}
+        aria-expanded={expanded}
+        tabIndex={0}
+        aria-label={label}
+        title={label}
+      >
+        {expanded ? <MinimizeIcon /> : <MaximizeIcon />}
+      </ExpandButton>
+    ) : null;
+  },
+  (prev, next) => prev.expanded === next.expanded,
+);
+ 
+ExpandButtonMemo.displayName = 'Expand Button';
+ 
+export const ShowOrHideTextButtonMemo = memo<ShowHideTextButtonModel>(
+  ({ textOverlay, onToggle, theme, show }: ShowHideTextButtonModel) => {
+    const label = useMemo(() => {
+      return show ? 'Hide Text' : 'Show Text';
+    }, [show]);
+ 
+    return textOverlay ? (
+      <ShowHideTextButton
+        onPointerDown={onToggle}
+        theme={theme}
+        tabIndex={0}
+        onKeyDown={(ev) => ev.key === 'Enter' && onToggle?.(ev)}
+        aria-label={label}
+        title={label}
+      >
+        {show ? <MinusIcon /> : <PlusIcon />}
+      </ShowHideTextButton>
+    ) : null;
+  },
+);
+ 
+ShowOrHideTextButtonMemo.displayName = 'Show Hide Text Button';
+ 
+const DetailsTextMemo = memo<DetailsTextMemoModel>(
+  ({
+    theme,
+    show,
+    expand,
+    textOverlay,
+    text,
+    height,
+    onRender,
+  }: DetailsTextMemoModel) => {
+    const onTextRef = useCallback((node: HTMLDivElement) => {
+      if (node) {
+        onRender?.(node.clientHeight);
+      }
+    }, []);
+ 
+    const Text = text;
+ 
+    const background = useMemo(() => {
+      const bg = theme?.cardDetailsBackGround || '';
+      if (bg) {
+        return hexToRGBA(bg, 0.8);
+      } else {
+        return bg;
+      }
+    }, [theme?.cardDetailsBackGround]);
+ 
+    return textOverlay ? (
+      <DetailsTextWrapper
+        ref={onTextRef}
+        // height={expand ? height : 0}
+        $expandFull={expand}
+        theme={theme}
+        $show={show}
+        background={background}
+      >
+        <Text />
+      </DetailsTextWrapper>
+    ) : null;
+  },
+  (prev, next) =>
+    prev.height === next.height &&
+    prev.show === next.show &&
+    prev.expand === next.expand &&
+    JSON.stringify(prev.theme) === JSON.stringify(next.theme),
+);
+ 
+DetailsTextMemo.displayName = 'Details Text';
+ 
+export { TitleMemo, SubTitleMemo, DetailsTextMemo };
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-card-content/card-animations.styles.ts.html b/coverage/lcov-report/components/timeline-elements/timeline-card-content/card-animations.styles.ts.html new file mode 100644 index 00000000..a6412498 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-card-content/card-animations.styles.ts.html @@ -0,0 +1,219 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-card-content/card-animations.styles.ts + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-card-content card-animations.styles.ts

+
+ +
+ 100% + Statements + 45/45 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 45/45 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +461x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { keyframes } from 'styled-components';
+ 
+export const reveal = keyframes`
+  0% {
+    opacity: 0;
+    transform: scale(0.95);
+  }
+  100% {
+    opacity: 1;
+    transform: scale(1);
+  }
+`;
+ 
+export const slideInFromTop = keyframes`
+  0% {
+    opacity: 0;
+    transform: translateY(-50%);
+  }
+  100% {
+    opacity: 1;
+    transform: translateY(0);
+  }
+`;
+ 
+export const slideInFromLeft = keyframes`
+  0% {
+    opacity: 0;
+    transform: translateX(-50%);
+  }
+  100% {
+    opacity: 1;
+    transform: translateX(0);
+  }
+`;
+ 
+export const slideFromRight = keyframes`
+  0% {
+    opacity: 0;
+    transform: translateX(50%);
+  }
+  100% {
+    opacity: 1;
+    transform: translateX(0);
+  }
+`;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-card-content/content-footer.tsx.html b/coverage/lcov-report/components/timeline-elements/timeline-card-content/content-footer.tsx.html new file mode 100644 index 00000000..fdb79561 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-card-content/content-footer.tsx.html @@ -0,0 +1,438 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-card-content/content-footer.tsx + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-card-content content-footer.tsx

+
+ +
+ 96.61% + Statements + 114/118 +
+ + +
+ 92.85% + Branches + 13/14 +
+ + +
+ 66.66% + Functions + 2/3 +
+ + +
+ 96.61% + Lines + 114/118 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +1191x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +1x +1x +1x +1x +13x +13x +13x +13x +13x +13x +13x +13x +3x +3x +3x +3x +  +  +  +  +3x +3x +3x +3x +3x +3x +3x +3x +3x +10x +13x +13x +2x +2x +2x +2x +2x +2x +2x +2x +2x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +1x +1x + 
import { TimelineMode } from '@models/TimelineModel';
+import { FunctionComponent, PointerEvent, useContext, useMemo } from 'react';
+import { GlobalContext } from '../../GlobalContext';
+import ChevronIcon from '../../icons/chev-right';
+import { ContentFooterProps } from './header-footer.model';
+import {
+  ChevronIconWrapper,
+  ShowMore,
+  SlideShowProgressBar,
+  TriangleIconWrapper,
+} from './timeline-card-content.styles';
+ 
+/**
+ * ContentFooter
+ *
+ * A functional component that renders the footer of the timeline card.
+ * It displays the read more/less button, progress bar, and triangle icon.
+ * The read more/less button appears only if the content is large.
+ * The progress bar and triangle icon are displayed only if the card is in slideshow mode.
+ *
+ * @property {boolean} showProgressBar - Determines if progress bar should be displayed.
+ * @property {Function} onExpand - Function called when expanding content.
+ * @property {string} triangleDir - Direction of the triangle icon.
+ * @property {boolean} showMore - Determines if 'read more' should be displayed.
+ * @property {boolean} textContentIsLarge - Determines if text content is large.
+ * @property {boolean} showReadMore - Determines if 'read more' button should be displayed.
+ * @property {number} remainInterval - Remaining interval for progress bar.
+ * @property {boolean} paused - Determines if progress is paused.
+ * @property {number} startWidth - Starting width of progress bar.
+ * @property {boolean} canShow - Determines if the element can be shown.
+ * @property {React.RefObject} progressRef - Ref to the progress bar.
+ * @property {boolean} isNested - Determines if component is nested.
+ * @property {boolean} isResuming - Determines if slideshow is resuming.
+ *
+ * @returns {JSX.Element} ContentFooter component.
+ */
+const ContentFooter: FunctionComponent<ContentFooterProps> = ({
+  showProgressBar,
+  onExpand,
+  triangleDir,
+  showMore,
+  textContentIsLarge,
+  showReadMore,
+  remainInterval,
+  paused,
+  startWidth,
+  canShow,
+  progressRef,
+  isNested,
+  isResuming,
+}) => {
+  const { mode, theme } = useContext(GlobalContext);
+ 
+  const canShowTriangleIcon = useMemo(() => {
+    return (
+      !isNested &&
+      (['VERTICAL', 'VERTICAL_ALTERNATING'] as TimelineMode[]).some(
+        (m) => m === mode,
+      )
+    );
+  }, [mode, isNested]);
+ 
+  const handleClick = (ev: PointerEvent) => {
+    ev.stopPropagation();
+    ev.preventDefault();
+    onExpand();
+  };
+ 
+  const canShowMore = useMemo(() => {
+    return showReadMore && textContentIsLarge;
+  }, [showReadMore, textContentIsLarge]);
+ 
+  return (
+    <>
+      {canShowMore ? (
+        <ShowMore
+          className="show-more"
+          onPointerDown={handleClick}
+          onKeyUp={(event) => {
+            if (event.key === 'Enter') {
+              onExpand();
+            }
+          }}
+          show={canShow ? 'true' : 'false'}
+          theme={theme}
+          tabIndex={0}
+        >
+          {<span>{showMore ? 'read less' : 'read more'}</span>}
+          <ChevronIconWrapper collapsed={showMore ? 'true' : 'false'}>
+            <ChevronIcon />
+          </ChevronIconWrapper>
+        </ShowMore>
+      ) : null}
+ 
+      {showProgressBar && (
+        <SlideShowProgressBar
+          color={theme?.primary}
+          $duration={remainInterval}
+          $paused={paused}
+          ref={progressRef}
+          $startWidth={startWidth}
+          role="progressbar"
+          $resuming={isResuming}
+        ></SlideShowProgressBar>
+      )}
+ 
+      {canShowTriangleIcon && (
+        <TriangleIconWrapper
+          dir={triangleDir}
+          theme={theme}
+          offset={-8}
+        ></TriangleIconWrapper>
+      )}
+    </>
+  );
+};
+ 
+export { ContentFooter };
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-card-content/content-header.tsx.html b/coverage/lcov-report/components/timeline-elements/timeline-card-content/content-header.tsx.html new file mode 100644 index 00000000..88586ec2 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-card-content/content-header.tsx.html @@ -0,0 +1,243 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-card-content/content-header.tsx + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-card-content content-header.tsx

+
+ +
+ 100% + Statements + 53/53 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 53/53 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +541x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +9x +9x +9x +9x +9x +9x +9x +3x +3x +3x +3x +3x +3x +3x +9x +9x +9x +3x +3x +3x +3x +3x +3x +9x +9x +9x +9x +1x +1x +1x +1x +1x +1x + 
import { FunctionComponent, memo, useContext } from 'react';
+import { GlobalContext } from '../../GlobalContext';
+import { SubTitleMemo, TitleMemo } from '../memoized';
+import { ContentHeaderProps } from './header-footer.model';
+import { TimelineCardHeader } from './timeline-card-content.styles';
+ 
+/**
+ * ContentHeader component
+ * This component renders the header of the timeline card including the title and subtitle.
+ * It doesn't render the title and subtitle if the card has media.
+ * The title and subtitle are memoized to prevent unnecessary re-renders.
+ *
+ * @property {string} title - The title of the card.
+ * @property {string} url - The URL of the card.
+ * @property {boolean} media - Indicates whether the card has media or not.
+ * @property {string} content - The main content of the card.
+ * @returns {JSX.Element} The ContentHeader component.
+ */
+const ContentHeader: FunctionComponent<ContentHeaderProps> = memo(
+  ({ title, url, media, content }: ContentHeaderProps) => {
+    // Using context to get global values
+    const { fontSizes, classNames, theme } = useContext(GlobalContext);
+ 
+    return (
+      <TimelineCardHeader>
+        {/* Render title if there is no media */}
+        {!media && (
+          <TitleMemo
+            title={title}
+            theme={theme}
+            url={url}
+            fontSize={fontSizes?.cardTitle}
+            classString={classNames?.cardTitle}
+          />
+        )}
+        {/* Render subtitle if there is no media */}
+        {!media && (
+          <SubTitleMemo
+            content={content}
+            theme={theme}
+            fontSize={fontSizes?.cardSubtitle}
+            classString={classNames?.cardSubTitle}
+          />
+        )}
+      </TimelineCardHeader>
+    );
+  },
+);
+ 
+// Setting display name for easier debugging
+ContentHeader.displayName = 'ContentHeader';
+ 
+export { ContentHeader };
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-card-content/details-text.tsx.html b/coverage/lcov-report/components/timeline-elements/timeline-card-content/details-text.tsx.html new file mode 100644 index 00000000..79898a82 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-card-content/details-text.tsx.html @@ -0,0 +1,324 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-card-content/details-text.tsx + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-card-content details-text.tsx

+
+ +
+ 98.75% + Statements + 79/80 +
+ + +
+ 33.33% + Branches + 1/3 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 98.75% + Lines + 79/80 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +811x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +  +8x +8x +8x +8x +8x +8x +8x +8x +8x +1x +1x +1x +1x +1x + 
import { ReactNode, forwardRef, useContext } from 'react';
+import { TimelineContentDetailsWrapper } from './timeline-card-content.styles';
+import { GlobalContext } from '../../GlobalContext';
+import { TimelineContentModel } from '@models/TimelineContentModel';
+import { getTextOrContent } from './text-or-content';
+ 
+type DetailsTextProps = Pick<
+  TimelineContentModel,
+  'detailedText' | 'timelineContent'
+> & {
+  cardActualHeight?: number;
+  contentDetailsClass?: string;
+  customContent?: ReactNode;
+  detailsHeight?: number;
+  gradientColor?: string;
+  showMore?: boolean;
+};
+ 
+const DetailsText = forwardRef<HTMLDivElement, DetailsTextProps>(
+  (prop, ref) => {
+    const {
+      showMore,
+      cardActualHeight,
+      detailsHeight,
+      gradientColor,
+      customContent,
+      timelineContent,
+      detailedText,
+      contentDetailsClass,
+    } = prop;
+ 
+    const {
+      useReadMore,
+      borderLessCards,
+      contentDetailsHeight,
+      textOverlay,
+      theme,
+    } = useContext(GlobalContext);
+ 
+    const TextContent = getTextOrContent({
+      detailedText,
+      showMore,
+      theme,
+      timelineContent,
+    });
+ 
+    return (
+      <>
+        {/* detailed text */}
+        <TimelineContentDetailsWrapper
+          aria-expanded={showMore}
+          className={contentDetailsClass}
+          $customContent={!!customContent}
+          ref={ref}
+          theme={theme}
+          $useReadMore={useReadMore}
+          $borderLess={borderLessCards}
+          $showMore={showMore}
+          $cardHeight={!textOverlay ? cardActualHeight : null}
+          $contentHeight={detailsHeight}
+          height={contentDetailsHeight}
+          $textOverlay={textOverlay}
+          $gradientColor={gradientColor}
+        >
+          {customContent ? (
+            customContent
+          ) : (
+            <TextContent
+              {...{ detailedText, showMore, theme, timelineContent }}
+            />
+          )}
+        </TimelineContentDetailsWrapper>
+      </>
+    );
+  },
+);
+ 
+DetailsText.displayName = 'Details Text';
+ 
+export { DetailsText };
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-card-content/index.html b/coverage/lcov-report/components/timeline-elements/timeline-card-content/index.html new file mode 100644 index 00000000..9215defd --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-card-content/index.html @@ -0,0 +1,205 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-card-content + + + + + + + + + +
+
+

All files components/timeline-elements/timeline-card-content

+
+ +
+ 86.17% + Statements + 1041/1208 +
+ + +
+ 67.58% + Branches + 98/145 +
+ + +
+ 90.32% + Functions + 28/31 +
+ + +
+ 86.17% + Lines + 1041/1208 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
card-animations.styles.ts +
+
100%45/45100%0/0100%0/0100%45/45
content-footer.tsx +
+
96.61%114/11892.85%13/1466.66%2/396.61%114/118
content-header.tsx +
+
100%53/53100%3/3100%0/0100%53/53
details-text.tsx +
+
98.75%79/8033.33%1/3100%0/098.75%79/80
text-or-content.tsx +
+
83.82%57/6857.14%4/7100%1/183.82%57/68
timeline-card-content.styles.ts +
+
88.14%342/38870.31%45/6496.15%25/2688.14%342/388
timeline-card-content.tsx +
+
76.97%351/45659.25%32/540%0/176.97%351/456
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-card-content/text-or-content.tsx.html b/coverage/lcov-report/components/timeline-elements/timeline-card-content/text-or-content.tsx.html new file mode 100644 index 00000000..feaae7b3 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-card-content/text-or-content.tsx.html @@ -0,0 +1,288 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-card-content/text-or-content.tsx + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-card-content text-or-content.tsx

+
+ +
+ 83.82% + Statements + 57/68 +
+ + +
+ 57.14% + Branches + 4/7 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 83.82% + Lines + 57/68 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +691x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +16x +16x +16x +16x +16x +16x +16x +8x +8x +8x +8x +8x +8x +  +8x +8x +8x +  +  +  +  +  +  +  +  +  +  +8x +8x +8x +8x +8x +6x +6x +6x +6x +6x +6x +6x +2x +8x +8x +16x +16x +16x +16x +16x +16x +1x +1x + 
import { TimelineContentModel } from '@models/TimelineContentModel';
+import { ForwardRefExoticComponent, forwardRef, useContext } from 'react';
+import { GlobalContext } from '../../GlobalContext';
+import {
+  TimelineSubContent,
+  TimelineContentDetails,
+} from './timeline-card-content.styles';
+ 
+export type TextOrContentModel = Pick<
+  TimelineContentModel,
+  'timelineContent' | 'theme' | 'detailedText'
+> & {
+  showMore?: boolean;
+};
+ 
+const getTextOrContent: (
+  p: TextOrContentModel,
+) => ForwardRefExoticComponent<TextOrContentModel> = ({
+  timelineContent,
+  theme,
+  detailedText,
+  showMore,
+}) => {
+  const TextOrContent = forwardRef<HTMLParagraphElement, TextOrContentModel>(
+    (prop, ref) => {
+      // const { timelineContent, theme, detailedText, showMore } = prop;
+      const isTextArray = Array.isArray(detailedText);
+ 
+      const { fontSizes, classNames } = useContext(GlobalContext);
+ 
+      if (timelineContent) {
+        return <div ref={ref}>{timelineContent}</div>;
+      } else {
+        let textContent = null;
+        if (isTextArray) {
+          textContent = (detailedText as string[]).map((text, index) => (
+            <TimelineSubContent
+              key={index}
+              fontSize={fontSizes?.cardText}
+              className={classNames?.cardText}
+              theme={theme}
+            >
+              {text}
+            </TimelineSubContent>
+          ));
+        } else {
+          textContent = detailedText;
+        }
+ 
+        return textContent ? (
+          <TimelineContentDetails
+            className={showMore ? 'active' : ''}
+            ref={ref}
+            theme={theme}
+          >
+            {textContent}
+          </TimelineContentDetails>
+        ) : null;
+      }
+    },
+  );
+ 
+  TextOrContent.displayName = 'Text Or Content';
+ 
+  return TextOrContent;
+};
+ 
+export { getTextOrContent };
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-card-content/timeline-card-content.styles.ts.html b/coverage/lcov-report/components/timeline-elements/timeline-card-content/timeline-card-content.styles.ts.html new file mode 100644 index 00000000..5055d6b9 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-card-content/timeline-card-content.styles.ts.html @@ -0,0 +1,1248 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-card-content/timeline-card-content.styles.ts + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-card-content timeline-card-content.styles.ts

+
+ +
+ 88.14% + Statements + 342/388 +
+ + +
+ 70.31% + Branches + 45/64 +
+ + +
+ 96.15% + Functions + 25/26 +
+ + +
+ 88.14% + Lines + 342/388 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +3891x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +8x +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +8x +  +  +8x +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +1x +1x +8x +  +  +  +  +  +  +8x +8x +  +  +  +  +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +8x +8x +1x +1x +8x +8x +8x +8x +8x +8x +8x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +8x +8x +8x +8x +8x +8x +8x +  +  +  +  +  +  +  +  +  +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +1x +1x +1x +1x +1x +2x +1x +1x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { Theme } from '@models/Theme';
+import { TimelineProps } from '@models/TimelineModel';
+import styled, { css, keyframes } from 'styled-components';
+import { linearGradient } from '../timeline-card-media/timeline-card-media.styles';
+import {
+  reveal,
+  slideFromRight,
+  slideInFromLeft,
+  slideInFromTop,
+} from './card-animations.styles';
+ 
+type ContentT = Pick<
+  TimelineProps,
+  'theme' | 'slideShow' | 'mode' | 'borderLessCards'
+>;
+ 
+export const TimelineItemContentWrapper = styled.section<
+  {
+    $active?: boolean;
+    $borderLessCards?: TimelineProps['borderLessCards'];
+    $branchDir?: string;
+    $isNested?: boolean;
+    $maxWidth?: number;
+    $minHeight?: number;
+    $noMedia?: boolean;
+    $slideShow?: TimelineProps['slideShow'];
+    $slideShowActive?: boolean;
+    $slideShowType?: TimelineProps['slideShowType'];
+    $textOverlay?: boolean;
+  } & ContentT
+>`
+  align-items: flex-start;
+  background: ${(p) => p.theme.cardBgColor};
+  border-radius: 4px;
+  display: flex;
+  position: absolute;
+  ${({ borderLessCards }) =>
+    !borderLessCards
+      ? `filter: drop-shadow(0 0 1px rgba(0, 0, 0, 0.3))`
+      : 'none'};
+  flex-direction: column;
+  justify-content: flex-start;
+  line-height: 1.5em;
+  margin: ${(p) => (p.mode === 'HORIZONTAL' ? '0 auto' : '')};
+  max-width: ${(p) => p.$maxWidth}px;
+  min-height: ${(p) => p.$minHeight}px;
+  position: relative;
+  text-align: left;
+  width: 98%;
+  z-index: 0;
+ 
+  ${(p) =>
+    p.$isNested
+      ? css`
+          background: ${p.theme.nestedCardBgColor};
+          box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1);
+        `
+      : css``}
+ 
+  height: ${(p) => (p.$textOverlay ? '0' : '')};
+ 
+  &:focus {
+    outline: 1px solid ${(p) => p.theme?.primary};
+  }
+ 
+  ${(p) => {
+    if (p.$slideShowActive && p.$active) {
+      if (p.$slideShowType === 'slide_in') {
+        return css`
+          animation: ${slideInFromTop} 0.5s ease-in-out;
+        `;
+      } else if (
+        p.$slideShowType === 'slide_from_sides' &&
+        p.$branchDir === 'left'
+      ) {
+        return css`
+          animation: ${slideInFromLeft} 0.5s ease-in-out;
+        `;
+      } else if (
+        p.$slideShowType === 'slide_from_sides' &&
+        p.$branchDir === 'right'
+      ) {
+        return css`
+          animation: ${slideFromRight} 0.5s ease-in-out;
+        `;
+      } else {
+        return css`
+          animation: ${reveal} 0.5s ease-in-out;
+        `;
+      }
+    }
+  }}
+ 
+  ${(p) => {
+    if (p.$slideShowActive && p.$active) {
+      return css`
+        opacity: 1;
+        animation-timing-function: ease-in-out;
+        animation-duration: 0.5s;
+      `;
+    }
+ 
+    if (p.$slideShowActive && !p.$active) {
+      return css`
+        opacity: 0;
+      `;
+    }
+  }}
+`;
+ 
+export const TimelineCardHeader = styled.header`
+  width: 100%;
+  padding: 0.5rem 0.5rem 0 0.5rem;
+`;
+ 
+export const CardSubTitle = styled.h2<{
+  $fontSize?: string;
+  $padding?: boolean;
+  dir?: string;
+  theme?: Theme;
+}>`
+  color: ${(p) => p.theme.cardSubtitleColor};
+  font-size: ${(p) => p.$fontSize};
+  font-weight: 600;
+  margin: 0;
+  text-align: left;
+  width: 97%;
+  padding: ${(p) => (p.$padding ? '0.5rem 0 0.5rem 0.5rem;' : '')};
+`;
+ 
+export const CardTitle = styled.h1<{
+  $fontSize: string;
+  $padding?: boolean;
+  dir?: string;
+  theme: Theme;
+}>`
+  color: ${(p) => p.theme.cardTitleColor};
+  font-size: ${(p) => p.$fontSize};
+  font-weight: 600;
+  margin: 0;
+  text-align: left;
+  width: 95%;
+  padding: ${(p) => (p.$padding ? '0.25rem 0 0.25rem 0.5rem;' : '')} &.active {
+    color: ${(p) => p.theme.primary};
+  }
+`;
+ 
+export const CardTitleAnchor = styled.a`
+  color: inherit;
+ 
+  &:active {
+    color: inherit;
+  }
+`;
+ 
+export const TimelineContentDetails = styled.p<{ theme?: Theme }>`
+  font-size: 0.85rem;
+  font-weight: 400;
+  margin: 0;
+  width: 100%;
+  color: ${(p) => p.theme.cardDetailsColor};
+`;
+ 
+export const TimelineSubContent = styled.span<{
+  fontSize?: string;
+  theme?: Theme;
+}>`
+  margin-bottom: 0.5rem;
+  display: block;
+  font-size: ${(p) => p.fontSize};
+  color: ${(p) => p.theme.cardDetailsColor};
+`;
+ 
+export const TimelineContentDetailsWrapper = styled.div<{
+  $borderLess?: boolean;
+  $cardHeight?: number | null;
+  $contentHeight?: number;
+  $customContent?: boolean;
+  $gradientColor?: string | null;
+  $showMore?: boolean;
+  $textOverlay?: boolean;
+  $useReadMore?: boolean;
+  branchDir?: string;
+  height?: number;
+  theme?: Theme;
+}>`
+  align-items: center;
+  display: flex;
+  flex-direction: column;
+  margin: 0 auto;
+  margin-top: 0.5em;
+  margin-bottom: 0.5em;
+  position: relative;
+  ${({ $useReadMore, $customContent, $showMore, height = 0, $textOverlay }) =>
+    $useReadMore && !$customContent && !$showMore && !$textOverlay
+      ? `max-height: ${height}px;`
+      : ''}
+  ${({
+    $cardHeight = 0,
+    $contentHeight = 0,
+    height = 0,
+    $showMore,
+    $textOverlay,
+  }) =>
+    $showMore && !$textOverlay
+      ? `max-height: ${($cardHeight || 0) + ($contentHeight || 0) - height}px;`
+      : ''}
+  overflow-x: hidden;
+  overflow-y: auto;
+  scrollbar-color: ${(p) => p.theme?.primary} default;
+  scrollbar-width: thin;
+  transition: max-height 0.25s ease-in-out;
+  width: ${(p) =>
+    p.$borderLess ? 'calc(100% - 0.5rem)' : 'calc(95% - 0.5rem)'};
+  padding: 0.25rem 0.25rem;
+ 
+  $${({
+      height = 0,
+      $cardHeight = 0,
+      $contentHeight = 0,
+      $showMore,
+      $useReadMore,
+    }) =>
+      $showMore && $useReadMore && $cardHeight
+        ? css`
+            animation: ${keyframes`
+            0% {
+              max-height: ${height}px;
+            }
+            100% {
+             max-height: ${$cardHeight + $contentHeight - height}px;
+            }
+          `} 0.25s ease-in-out;
+          `
+        : ''}
+    &::-webkit-scrollbar {
+    width: 0.3em;
+  }
+ 
+  &::-webkit-scrollbar-track {
+    box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.2);
+  }
+ 
+  &::-webkit-scrollbar-thumb {
+    background-color: ${(p) => p.theme?.primary};
+    outline: 1px solid ${(p) => p.theme?.primary};
+  }
+ 
+  &.show-less {
+    scrollbar-width: none;
+ 
+    &::-webkit-scrollbar {
+      width: 0;
+    }
+    overflow: hidden;
+  }
+ 
+  --rc-gradient-color: ${(p) => p.$gradientColor};
+  ${linearGradient}
+`;
+ 
+export const ShowMore = styled.button<{
+  show?: 'true' | 'false';
+  theme?: Theme;
+}>`
+  align-items: center;
+  align-self: flex-end;
+  border-radius: 4px;
+  cursor: pointer;
+  display: ${(p) => (p.show === 'true' ? 'flex' : 'none')};
+  font-size: 0.75rem;
+  justify-self: flex-end;
+  margin-bottom: 0.5em;
+  margin-left: 0.5em;
+  margin-right: 0.5em;
+  margin-top: auto;
+  padding: 0.25em;
+  color: ${(p) => p.theme.primary};
+  border: 0;
+  background: none;
+ 
+  &:hover {
+    text-decoration: underline;
+  }
+`;
+ 
+const slideAnimation = (start?: number, end?: number) => keyframes`
+  0% {
+    width: ${start}px;
+  }
+  100% {
+    width: ${end}px;
+  }
+`;
+ 
+export const SlideShowProgressBar = styled.span<{
+  $color?: string;
+  $duration?: number;
+  $paused?: boolean;
+  $resuming?: boolean;
+  $startWidth?: number;
+}>`
+  background: ${(p) => p.color};
+  bottom: -0.75em;
+  display: block;
+  height: 4px;
+  left: 50%;
+  transform: translateX(-50%);
+  position: absolute;
+  border-radius: 2px;
+ 
+  ${(p) => {
+    if (p.$paused) {
+      return css`
+        left: 50%;
+        transform: translateX(-50%);
+      `;
+    }
+  }}
+ 
+  ${(p) => {
+    if (!p.$paused && p.$startWidth && p.$startWidth > 0) {
+      return css`
+        animation: ${slideAnimation(p.$startWidth, 0)} ${p.$duration}ms ease-in;
+        animation-play-state: running;
+      `;
+    } else {
+      return css`
+        animation-play-state: paused;
+        width: ${p.$startWidth}px;
+      `;
+    }
+  }}
+ 
+  svg {
+    position: absolute;
+    left: 0;
+    top: 0;
+    width: 100%;
+  }
+`;
+ 
+export const ChevronIconWrapper = styled.span<{ collapsed?: 'true' | 'false' }>`
+  align-items: center;
+  display: flex;
+  height: 1.25em;
+  justify-content: center;
+  margin-left: 0.2em;
+  margin-top: 0.2em;
+  width: 1.25em;
+  ${(p) =>
+    p.collapsed === 'false'
+      ? `
+      transform: rotate(90deg);
+  `
+      : `transform: rotate(-90deg)`};
+ 
+  svg {
+    height: 100%;
+    width: 100%;
+  }
+`;
+ 
+export const TriangleIconWrapper = styled.span<{
+  dir?: string;
+  offset?: number;
+  theme?: Theme;
+}>`
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 1.5rem;
+  height: 1.5rem;
+  position: absolute;
+  top: calc(50%);
+  background: ${(p) => p.theme.cardBgColor};
+  transform: translateY(-50%) rotate(225deg);
+  z-index: -1;
+ 
+  & svg {
+    width: 100%;
+    height: 100%;
+    fill: #fff;
+  }
+ 
+  ${(p) =>
+    p.dir === 'left' ? `right: ${p.offset}px;` : `left: ${p.offset}px;`};
+`;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-card-content/timeline-card-content.tsx.html b/coverage/lcov-report/components/timeline-elements/timeline-card-content/timeline-card-content.tsx.html new file mode 100644 index 00000000..2bbd464d --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-card-content/timeline-card-content.tsx.html @@ -0,0 +1,1452 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-card-content/timeline-card-content.tsx + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-card-content timeline-card-content.tsx

+
+ +
+ 76.97% + Statements + 351/456 +
+ + +
+ 59.25% + Branches + 32/54 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 76.97% + Lines + 351/456 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +4571x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +8x +20x +20x +20x +20x +20x +20x +8x +20x +20x +20x +8x +8x +8x +8x +8x +20x +20x +20x +8x +6x +6x +20x +20x +20x +20x +16x +8x +8x +8x +16x +  +  +8x +8x +8x +8x +8x +8x +16x +20x +20x +20x +20x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +20x +20x +20x +8x +  +  +20x +20x +20x +20x +  +  +  +  +  +  +  +  +  +  +  +  +  +20x +20x +20x +20x +  +  +  +  +  +  +  +  +  +  +  +  +  +20x +20x +20x +8x +  +  +8x +8x +  +  +  +8x +8x +8x +  +  +8x +8x +8x +8x +20x +20x +20x +8x +  +  +20x +20x +20x +8x +  +  +20x +20x +20x +8x +20x +20x +20x +20x +20x +20x +8x +20x +20x +20x +20x +20x +20x +20x +20x +  +  +  +  +  +  +  +  +  +  +  +20x +20x +20x +20x +20x +8x +8x +8x +8x +20x +20x +20x +20x +20x +8x +8x +8x +  +8x +8x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +8x +  +8x +8x +8x +  +  +20x +20x +20x +  +  +  +  +20x +20x +20x +8x +  +  +  +  +  +  +8x +20x +20x +20x +20x +20x +20x +20x +20x +8x +8x +  +8x +  +8x +20x +20x +20x +20x +8x +20x +20x +20x +8x +8x +8x +8x +8x +8x +20x +20x +20x +8x +8x +8x +  +  +  +  +  +  +  +  +  +  +8x +8x +8x +8x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +18x +18x +18x +18x +18x +18x +18x +2x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +  +  +  +  +  +  +  +  +  +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +1x +1x +1x +1x +1x + 
import { TimelineContentModel } from '@models/TimelineContentModel';
+import { MediaState } from '@models/TimelineMediaModel';
+import { hexToRGBA } from '@utils/index';
+import cls from 'classnames';
+import React, {
+  useCallback,
+  useContext,
+  useEffect,
+  useMemo,
+  useRef,
+  useState,
+} from 'react';
+import { GlobalContext } from '../../GlobalContext';
+import Timeline from '../../timeline/timeline';
+import CardMedia from '../timeline-card-media/timeline-card-media';
+import { ContentFooter } from './content-footer';
+import { ContentHeader } from './content-header';
+import { TimelineItemContentWrapper } from './timeline-card-content.styles';
+import { getTextOrContent } from './text-or-content';
+import { DetailsText } from './details-text';
+ 
+const TimelineCardContent: React.FunctionComponent<TimelineContentModel> =
+  React.memo(
+    ({
+      active,
+      content,
+      detailedText,
+      id,
+      media,
+      onShowMore,
+      slideShowActive,
+      onElapsed,
+      theme,
+      title,
+      onClick,
+      customContent,
+      hasFocus,
+      flip,
+      branchDir,
+      url,
+      timelineContent,
+      items,
+      isNested,
+      nestedCardHeight,
+    }: TimelineContentModel) => {
+      const [showMore, setShowMore] = useState(false);
+      const detailsRef = useRef<HTMLDivElement | null>(null);
+      const containerRef = useRef<HTMLDivElement | null>(null);
+      const progressRef = useRef<HTMLDivElement | null>(null);
+ 
+      const containerWidth = useRef<number>(0);
+      const slideShowElapsed = useRef(0);
+      const timerRef = useRef(0);
+      const startTime = useRef<Date>();
+      const [paused, setPaused] = useState(false);
+      const isFirstRender = useRef(true);
+ 
+      const [remainInterval, setRemainInterval] = useState(0);
+      const [startWidth, setStartWidth] = useState(0);
+      const [textContentLarge, setTextContentLarge] = useState(false);
+ 
+      const [cardActualHeight, setCardActualHeight] = useState(0);
+      const [detailsHeight, setDetailsHeight] = useState(0);
+      const [hasBeenActivated, setHasBeenActivated] = useState(false);
+      const [isResuming, setIsResuming] = useState(false);
+ 
+      const {
+        mode,
+        cardHeight,
+        slideItemDuration = 2000,
+        useReadMore,
+        cardWidth,
+        borderLessCards,
+        disableAutoScrollOnClick,
+        classNames,
+        textOverlay,
+        slideShowType,
+        showProgressOnSlideshow,
+      } = useContext(GlobalContext);
+ 
+      // If the media is a video, we don't show the progress bar.
+      // If the media is an image, we show the progress bar if the
+      // showProgressOnSlideshow flag is set.
+      const canShowProgressBar = useMemo(() => {
+        return active && slideShowActive && showProgressOnSlideshow;
+      }, [active, slideShowActive]);
+ 
+      // This function returns a boolean value that indicates whether the user
+      // can see more information about the item. The detailed text is only
+      // available if the user has expanded the row.
+      const canShowMore = useMemo(() => {
+        return !!detailedText;
+      }, [detailedText]);
+ 
+      useEffect(() => {
+        const detailsEle = detailsRef.current;
+ 
+        if (detailsEle) {
+          detailsEle.scrollTop = 0;
+        }
+      }, [showMore]);
+ 
+      useEffect(() => {
+        if (active) {
+          setHasBeenActivated(true);
+        }
+      }, [active]);
+ 
+      const onContainerRef = useCallback(
+        (node: HTMLElement) => {
+          if (node === null) {
+            return;
+          }
+          const detailsEle = detailsRef.current;
+          if (!detailsEle) {
+            return;
+          }
+          const { scrollHeight, offsetTop } = detailsEle;
+          containerWidth.current = node.clientWidth;
+          setStartWidth(containerWidth.current);
+          setCardActualHeight(scrollHeight);
+          setDetailsHeight(detailsEle.offsetHeight);
+          setTextContentLarge(scrollHeight + offsetTop > node.clientHeight);
+        },
+        [detailsRef.current],
+      );
+ 
+      const setupTimer = useCallback((interval: number) => {
+        if (!slideItemDuration) {
+          return;
+        }
+
+        setRemainInterval(interval);
+
+        startTime.current = new Date();
+
+        setPaused(false);
+
+        timerRef.current = window.setTimeout(() => {
+          // clear the timer and move to the next card
+          window.clearTimeout(timerRef.current);
+          setPaused(true);
+          setStartWidth(0);
+          setRemainInterval(slideItemDuration);
+          id && onElapsed && onElapsed(id);
+        }, interval);
+      }, []);
+ 
+      useEffect(() => {
+        if (timerRef.current && !slideShowActive) {
+          window.clearTimeout(timerRef.current);
+        }
+      }, [slideShowActive]);
+ 
+      // pause the slide show
+      const tryHandlePauseSlideshow = useCallback(() => {
+        if (active && slideShowActive) {
+          window.clearTimeout(timerRef.current);
+          setPaused(true);
+
+          if (startTime.current) {
+            const elapsed: any = +new Date() - +startTime.current;
+            slideShowElapsed.current = elapsed;
+          }
+
+          if (progressRef.current) {
+            setStartWidth(progressRef.current.clientWidth);
+          }
+        }
+      }, [active, slideShowActive]);
+ 
+      // resumes the slide show
+      const tryHandleResumeSlideshow = useCallback(() => {
+        if (active && slideShowActive) {
+          if (!slideItemDuration) {
+            return;
+          }
+          const remainingInterval =
+            slideItemDuration - slideShowElapsed.current;
+
+          setPaused(false);
+
+          if (remainingInterval > 0) {
+            setupTimer(remainingInterval);
+          }
+        }
+      }, [active, slideShowActive, slideItemDuration]);
+ 
+      useEffect(() => {
+        if (!slideItemDuration) {
+          return;
+        }
+        // setup the timer
+        if (active && slideShowActive) {
+          setStartWidth(containerWidth.current);
+          setupTimer(slideItemDuration);
+        }
+ 
+        // disabled autofocus on active
+        if (active && hasFocus) {
+          containerRef.current && containerRef.current.focus();
+        }
+ 
+        if (!slideShowActive) {
+          setHasBeenActivated(false);
+        }
+      }, [active, slideShowActive]);
+ 
+      useEffect(() => {
+        if (hasFocus && active) {
+          containerRef.current && containerRef.current.focus();
+        }
+      }, [hasFocus, active]);
+ 
+      useEffect(() => {
+        if (!paused && !isFirstRender.current) {
+          setIsResuming(true);
+        }
+      }, [paused, startWidth]);
+ 
+      useEffect(() => {
+        isFirstRender.current = false;
+      }, []);
+ 
+      // This code is used to determine whether the read more button should be shown.
+      // It is only shown if the useReadMore prop is true, the detailedText is non-null,
+      // and the customContent prop is false.
+      const canShowReadMore = useMemo(() => {
+        return useReadMore && detailedText && !customContent;
+      }, []);
+ 
+      // decorate the comments
+      // This function is triggered when the media state changes. If the slideshow is
+      // active, and the media state changes to paused, this function will call
+      // tryHandlePauseSlideshow(), which will pause the slideshow.
+      const handleMediaState = useCallback(
+        (state: MediaState) => {
+          if (!slideShowActive) {
+            return;
+          }
+          if (state.playing) {
+            tryHandlePauseSlideshow();
+          } else if (state.paused) {
+            if (paused && id && onElapsed) {
+              onElapsed(id);
+            }
+          }
+        },
+        [paused, slideShowActive],
+      );
+ 
+      const contentClass = useMemo(
+        () =>
+          cls(
+            active ? 'timeline-card-content active' : 'timeline-card-content ',
+            classNames?.card,
+          ),
+        [active],
+      );
+ 
+      const contentDetailsClass = useMemo(
+        () =>
+          cls(
+            !showMore && !customContent && useReadMore
+              ? 'show-less card-description'
+              : 'card-description',
+            classNames?.cardText,
+          ),
+        [showMore, customContent],
+      );
+ 
+      /**
+       * Calculate the minimum height of the card. If the card has a text overlay and
+       * media, the minimum height is equal to the card height. If the card is not
+       * nested, the minimum height is equal to the card height. If the card is nested,
+       * the minimum height is equal to the nested card height.
+       */
+      const cardMinHeight = useMemo(() => {
+        if (textOverlay && media) {
+          return cardHeight;
+        } else if (!isNested) {
+          return cardHeight;
+        } else {
+          return nestedCardHeight;
+        }
+      }, []);
+ 
+      const handleExpandDetails = useCallback(() => {
+        if ((active && paused) || !slideShowActive) {
+          setShowMore(!showMore);
+          onShowMore();
+        }
+      }, [active, paused, slideShowActive, showMore]);
+ 
+      const triangleDir = useMemo(() => {
+        if (flip) {
+          if (branchDir === 'right') {
+            return 'left';
+          } else {
+            return 'right';
+          }
+        }
+        return branchDir;
+      }, [branchDir, flip]);
+ 
+      // Get the background color for the gradient, which is either the
+      // cardDetailsBackGround or nestedCardDetailsBackGround theme variable,
+      // based on whether the card is nested or not. If we are showing more
+      // content, the background color should be null, so that there is no
+      // gradient.
+      const gradientColor = useMemo(() => {
+        const bgToUse = !isNested
+          ? theme?.cardBgColor
+          : theme?.nestedCardDetailsBackGround;
+        return !showMore && textContentLarge
+          ? hexToRGBA(bgToUse || '#ffffff', 0.8)
+          : null;
+      }, [textContentLarge, showMore, theme?.cardDetailsBackGround, isNested]);
+ 
+      // This code checks whether the textOverlay and items props are truthy. If so, then it returns false. Otherwise, it returns true.
+      const canShowDetailsText = useMemo(() => {
+        return !textOverlay && !items?.length;
+      }, [items?.length]);
+ 
+      const TextOrContent = useMemo(() => {
+        return getTextOrContent({
+          detailedText,
+          showMore,
+          theme,
+          timelineContent,
+        });
+      }, [showMore, timelineContent, theme, detailedText]);
+ 
+      const handlers = useMemo(() => {
+        if (!isNested) {
+          return {
+            onPointerDown: (ev: React.PointerEvent) => {
+              ev.stopPropagation();
+              if (
+                !slideShowActive &&
+                onClick &&
+                id &&
+                !disableAutoScrollOnClick
+              ) {
+                onClick(id);
+              }
+            },
+            onPointerEnter: tryHandlePauseSlideshow,
+            onPointerLeave: tryHandleResumeSlideshow,
+          };
+        }
+      }, [tryHandlePauseSlideshow, tryHandleResumeSlideshow]);
+ 
+      return (
+        <TimelineItemContentWrapper
+          className={contentClass}
+          $minHeight={cardMinHeight}
+          $maxWidth={cardWidth}
+          mode={mode}
+          $noMedia={!media}
+          {...handlers}
+          ref={onContainerRef}
+          tabIndex={!isNested ? 0 : -1}
+          theme={theme}
+          $borderLessCards={borderLessCards}
+          $textOverlay={textOverlay}
+          $active={hasBeenActivated}
+          $slideShowType={slideShowType}
+          $slideShowActive={slideShowActive}
+          $branchDir={branchDir}
+          $isNested={isNested}
+        >
+          {title && !textOverlay ? (
+            <ContentHeader
+              title={title}
+              theme={theme}
+              url={url}
+              media={media}
+              content={content}
+            />
+          ) : null}
+ 
+          {/* render media video or image */}
+          {media && (
+            <CardMedia
+              active={active}
+              cardHeight={cardHeight}
+              content={content}
+              hideMedia={showMore}
+              id={id}
+              media={media}
+              onMediaStateChange={handleMediaState}
+              slideshowActive={slideShowActive}
+              theme={theme}
+              title={title}
+              url={url}
+              startWidth={startWidth}
+              detailsText={TextOrContent}
+              paused={paused}
+              remainInterval={remainInterval}
+              showProgressBar={canShowProgressBar}
+              triangleDir={triangleDir}
+              resuming={isResuming}
+              progressRef={progressRef}
+            />
+          )}
+ 
+          {canShowDetailsText ? (
+            <DetailsText
+              showMore={showMore}
+              gradientColor={gradientColor}
+              detailedText={detailedText}
+              customContent={customContent}
+              timelineContent={timelineContent}
+              contentDetailsClass={contentDetailsClass}
+              cardActualHeight={cardActualHeight}
+              detailsHeight={detailsHeight}
+              ref={detailsRef}
+            />
+          ) : (
+            <Timeline
+              items={items}
+              mode={'VERTICAL'}
+              enableOutline={false}
+              hideControls
+              nestedCardHeight={nestedCardHeight}
+              isChild
+            />
+          )}
+ 
+          {(!textOverlay || !media) && (
+            <ContentFooter
+              theme={theme}
+              progressRef={progressRef}
+              startWidth={startWidth}
+              textContentIsLarge={textContentLarge}
+              remainInterval={remainInterval}
+              paused={paused}
+              triangleDir={triangleDir}
+              showProgressBar={canShowProgressBar}
+              showReadMore={canShowReadMore}
+              onExpand={handleExpandDetails}
+              canShow={canShowMore}
+              showMore={showMore}
+              isNested={isNested}
+              isResuming={isResuming}
+            />
+          )}
+        </TimelineItemContentWrapper>
+      );
+    },
+  );
+ 
+TimelineCardContent.displayName = 'TimelineCardContent';
+ 
+export default TimelineCardContent;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-card-media/index.html b/coverage/lcov-report/components/timeline-elements/timeline-card-media/index.html new file mode 100644 index 00000000..b2d570c8 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-card-media/index.html @@ -0,0 +1,145 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-card-media + + + + + + + + + +
+
+

All files components/timeline-elements/timeline-card-media

+
+ +
+ 89.65% + Statements + 624/696 +
+ + +
+ 77.14% + Branches + 81/105 +
+ + +
+ 85.71% + Functions + 18/21 +
+ + +
+ 89.65% + Lines + 624/696 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
timeline-card-media-buttons.tsx +
+
100%48/48100%1/1100%0/0100%48/48
timeline-card-media.styles.ts +
+
92.43%220/23880%44/55100%17/1792.43%220/238
timeline-card-media.tsx +
+
86.82%356/41073.46%36/4925%1/486.82%356/410
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-card-media/timeline-card-media-buttons.tsx.html b/coverage/lcov-report/components/timeline-elements/timeline-card-media/timeline-card-media-buttons.tsx.html new file mode 100644 index 00000000..5f7098f1 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-card-media/timeline-card-media-buttons.tsx.html @@ -0,0 +1,228 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-card-media/timeline-card-media-buttons.tsx + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-card-media timeline-card-media-buttons.tsx

+
+ +
+ 100% + Statements + 48/48 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 48/48 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +491x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { Theme } from '@models/Theme';
+import styled, { css } from 'styled-components';
+ 
+const Button = css`
+  align-items: center;
+  background: none;
+  // background: rgba(0, 0, 0, 0.1);
+  border-radius: 50%;
+  border: none;
+  cursor: pointer;
+  display: flex;
+  height: 1.5rem;
+  justify-content: center;
+  padding: 0;
+  width: 1.5rem;
+  margin: 0 0.25rem;
+  background: ${(p) => p.theme?.primary};
+  color: #fff;
+ 
+  svg {
+    width: 70%;
+    height: 70%;
+  }
+`;
+ 
+export const ExpandButton = styled.button<{
+  // expandFull?: boolean;
+  theme: Theme;
+}>`
+  ${Button}
+`;
+ 
+export const ShowHideTextButton = styled.button<{
+  showText?: boolean;
+  theme: Theme;
+}>`
+  ${Button}
+`;
+ 
+export const ButtonWrapper = styled.ul`
+  display: flex;
+  flex-direction: row;
+  justify-content: flex-end;
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  margin-left: auto;
+`;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-card-media/timeline-card-media.styles.ts.html b/coverage/lcov-report/components/timeline-elements/timeline-card-media/timeline-card-media.styles.ts.html new file mode 100644 index 00000000..d1ac781b --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-card-media/timeline-card-media.styles.ts.html @@ -0,0 +1,798 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-card-media/timeline-card-media.styles.ts + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-card-media timeline-card-media.styles.ts

+
+ +
+ 92.43% + Statements + 220/238 +
+ + +
+ 80% + Branches + 44/55 +
+ + +
+ 100% + Functions + 17/17 +
+ + +
+ 92.43% + Lines + 220/238 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +2391x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +16x +1x +1x +1x +16x +15x +  +  +  +15x +15x +15x +15x +15x +15x +16x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +16x +16x +16x +16x +16x +16x +16x +1x +1x +1x +1x +1x +16x +  +  +  +  +  +  +16x +16x +  +  +  +  +  +  +16x +16x +2x +2x +2x +2x +2x +2x +16x +1x +1x +16x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +14x +14x +1x +1x +1x +16x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +1x +1x +1x +3x +2x +2x +2x +2x +3x +1x +1x +3x +3x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { Theme } from '@models/Theme';
+import { TimelineMode } from '@models/TimelineModel';
+import styled, { css } from 'styled-components';
+import { ScrollBar } from '../../common/styles';
+ 
+export const linearGradient = css`
+  &::after {
+    content: '';
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    height: 2rem;
+    background: linear-gradient(
+      0deg,
+      var(--rc-gradient-color) 0%,
+      rgba(255, 255, 255, 0) 100%
+    );
+  }
+`;
+ 
+export const MediaWrapper = styled.div<{
+  $active?: boolean;
+  $cardHeight?: number;
+  $slideShowActive?: boolean;
+  $textOverlay?: boolean;
+  align?: 'left' | 'right' | 'center';
+  dir?: string;
+  mode?: TimelineMode;
+  theme?: Theme;
+}>`
+  align-items: flex-start;
+  align-self: center;
+  background: ${(p) => (!p.$textOverlay ? p.theme?.cardMediaBgColor : 'none')};
+  border-radius: 4px;
+  flex-direction: row;
+  height: ${(p) => (p.$textOverlay ? 'calc(100% - 1em)' : '0')};
+  padding: 0.5em;
+  // pointer-events: ${(p) => (!p.$active && p.$slideShowActive ? 'none' : '')};
+  position: relative;
+  text-align: ${(p) => p.align};
+  width: calc(100% - 1em);
+ 
+  ${(p) => (p.$cardHeight ? `min-height: ${p.$cardHeight}px;` : '')};
+  ${(p) => {
+    if (p.mode === 'HORIZONTAL') {
+      return `
+        justify-content: flex-start;
+      `;
+    } else {
+      if (p.dir === 'left') {
+        return `
+        justify-content: flex-start;
+      `;
+      } else {
+        return `
+        justify-content: flex-end;
+      `;
+      }
+    }
+  }}
+`;
+ 
+export const CardImage = styled.img<{
+  $enableBorderRadius?: boolean;
+  $visible?: boolean;
+  dir?: string;
+  fit?: string;
+  mode?: TimelineMode;
+}>`
+  flex: 4;
+  justify-self: center;
+  margin-left: auto;
+  margin-right: auto;
+  height: 100%;
+  width: 100%;
+  object-fit: ${(p) => p.fit || 'cover'};
+  object-position: center;
+  visibility: ${(p) => (p.$visible ? 'visible' : 'hidden')};
+  border-radius: ${(p) => (p.$enableBorderRadius ? '6px' : '0')};
+`;
+ 
+export const CardVideo = styled.video<{ height?: number }>`
+  max-width: 100%;
+  max-height: 100%;
+  margin-left: auto;
+  margin-right: auto;
+`;
+ 
+export const MediaDetailsWrapper = styled.div<{
+  $absolutePosition?: boolean;
+  $borderLessCard?: boolean;
+  $expandFull?: boolean;
+  $expandable?: boolean;
+  $gradientColor?: string | null;
+  $showText?: boolean;
+  $textInMedia?: boolean;
+  mode?: TimelineMode;
+  theme?: Theme;
+}>`
+  bottom: 0;
+  left: 0;
+  right: 0;
+  margin-right: auto;
+  width: ${(p) => {
+    switch (p.mode) {
+      case 'HORIZONTAL':
+      case 'VERTICAL':
+      case 'VERTICAL_ALTERNATING':
+        return `calc(90% - 0rem)`;
+    }
+  }};
+  display: flex;
+  flex-direction: column;
+  flex: 1;
+  overflow: hidden;
+  ${(p) => {
+    if (p.$textInMedia && p.$expandFull) {
+      return css`
+        height: 100%;
+        width: 100%;
+        border: 0;
+      `;
+    }
+ 
+    if (!p.$showText) {
+      return css`
+        height: 15%;
+        box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.2);
+        border-radius: 10px;
+      `;
+    }
+ 
+    if (p.$textInMedia && p.$expandable) {
+      return css`
+        box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.2);
+        border-radius: 10px;
+        height: 50%;
+      `;
+    }
+  }}
+  position: ${(p) => (p.$absolutePosition ? 'absolute' : 'relative')};
+  ${(p) =>
+    p.$absolutePosition
+      ? `
+    left: 50%;
+    bottom: ${p.$expandFull ? '0%' : ' 5%'};
+    transform: translateX(-50%);
+    background: ${
+      p.$showText ? p.theme?.cardDetailsBackGround : p.theme?.cardBgColor
+    };
+    // backdrop-filter: blur(1px);
+    padding: 0.25rem;
+    ${p.$showText ? `overflow: auto;` : `overflow: hidden;`}
+    transition: height 0.25s ease-out, width 0.25s ease-out, bottom 0.25s ease-out, background 0.25s ease-out;
+  `
+      : ``}
+ 
+  ${({ $borderLessCard }) =>
+    $borderLessCard
+      ? `border-radius: 6px; box-shadow: 0 0 10px 0 rgba(0,0,0,0.2);`
+      : ``}
+  --rc-gradient-color: ${(p) => p.$gradientColor};
+  ${(p) => (p.$gradientColor ? linearGradient : null)}
+`;
+ 
+export const ErrorMessage = styled.span`
+  color: #a3a3a3;
+  left: 50%;
+  position: absolute;
+  text-align: center;
+  top: 50%;
+  transform: translateY(-50%) translateX(-50%);
+`;
+ 
+export const IFrameVideo = styled.iframe`
+  position: relative;
+  height: 100%;
+  width: 100%;
+`;
+ 
+export const DetailsTextWrapper = styled.div<{
+  $expandFull?: boolean;
+  $show?: boolean;
+  background: string;
+  theme?: Theme;
+}>`
+  align-self: center;
+  display: flex;
+  transition: height 0.5s ease;
+  width: calc(100%);
+  background: ${(p) => p.background};
+  color: ${(p) => p.theme?.cardDetailsColor};
+  padding: 0.5rem;
+  border-bottom-left-radius: 8px;
+  border-bottom-right-radius: 8px;
+  position: relative;
+  align-items: flex-start;
+  justify-content: center;
+ 
+  ${ScrollBar}
+ 
+  ${(p) => {
+    if (p.$expandFull) {
+      return `
+        overflow: auto;
+      `;
+    } else {
+      return `
+        overflow: hidden;
+      `;
+    }
+  }}
+ 
+  ${(p) =>
+    p.$show
+      ? `
+    height: 100%;`
+      : `
+    height: 0;
+  `}
+ 
+  ${(p) => !p.$expandFull && linearGradient}
+`;
+ 
+export const CardMediaHeader = styled.div`
+  padding: 0.5rem 0 0.5rem 0.5rem;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+`;
+ 
+export const ImageWrapper = styled.div<{ height?: number }>`
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  border-radius: 6px;
+`;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-card-media/timeline-card-media.tsx.html b/coverage/lcov-report/components/timeline-elements/timeline-card-media/timeline-card-media.tsx.html new file mode 100644 index 00000000..0423bbe8 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-card-media/timeline-card-media.tsx.html @@ -0,0 +1,1314 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-card-media/timeline-card-media.tsx + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-card-media timeline-card-media.tsx

+
+ +
+ 86.82% + Statements + 356/410 +
+ + +
+ 73.46% + Branches + 36/49 +
+ + +
+ 25% + Functions + 1/4 +
+ + +
+ 86.82% + Lines + 356/410 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +4111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +  +  +16x +16x +7x +7x +16x +9x +9x +9x +16x +16x +16x +16x +  +16x +16x +16x +16x +  +  +  +  +  +  +  +  +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +  +  +  +  +  +16x +16x +  +  +  +  +  +16x +16x +  +  +  +  +  +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +2x +  +  +16x +16x +16x +16x +16x +  +  +  +  +  +16x +16x +16x +16x +16x +16x +16x +16x +  +  +  +  +  +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +2x +16x +14x +14x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +14x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +  +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +2x +  +  +  +  +16x +16x +16x +14x +14x +  +  +16x +16x +16x +  +  +  +  +  +  +  +  +  +16x +16x +16x +2x +2x +2x +2x +2x +2x +2x +14x +16x +16x +16x +16x +16x +1x +1x +1x +1x + 
import { CardMediaModel } from '@models/TimelineMediaModel';
+import { hexToRGBA } from '@utils/index';
+import cls from 'classnames';
+import React, {
+  FunctionComponent,
+  memo,
+  useCallback,
+  useContext,
+  useEffect,
+  useMemo,
+  useRef,
+  useState,
+} from 'react';
+import { GlobalContext } from '../../GlobalContext';
+import {
+  DetailsTextMemo,
+  ExpandButtonMemo,
+  ShowOrHideTextButtonMemo,
+  SubTitleMemo,
+  TitleMemo,
+} from '../memoized';
+import {
+  SlideShowProgressBar,
+  TriangleIconWrapper,
+} from '../timeline-card-content/timeline-card-content.styles';
+import { ButtonWrapper } from './timeline-card-media-buttons';
+import {
+  CardImage,
+  CardMediaHeader,
+  CardVideo,
+  ErrorMessage,
+  IFrameVideo,
+  ImageWrapper,
+  MediaDetailsWrapper,
+  MediaWrapper,
+} from './timeline-card-media.styles';
+ 
+interface ErrorMessageModel {
+  message: string;
+}
+ 
+const CardMedia: React.FunctionComponent<CardMediaModel> = ({
+  active,
+  id,
+  onMediaStateChange,
+  title,
+  content,
+  media,
+  slideshowActive,
+  url,
+  detailsText,
+  showProgressBar,
+  remainInterval,
+  startWidth,
+  paused,
+  triangleDir,
+  resuming,
+  progressRef,
+}: CardMediaModel) => {
+  const videoRef = useRef<HTMLVideoElement>(null);
+  const [loadFailed, setLoadFailed] = useState(false);
+  const moreRef = useRef(null);
+  const [detailsHeight, setDetailsHeight] = useState(0);
+  const [expandDetails, setExpandDetails] = useState(false);
+  const [showText, setShowText] = useState(true);
+  const [mediaLoaded, setMediaLoaded] = useState(false);
+ 
+  const {
+    mode,
+    fontSizes,
+    classNames,
+    mediaHeight,
+    borderLessCards,
+    textOverlay,
+    theme,
+    cardHeight,
+    mediaSettings,
+  } = useContext(GlobalContext);
+ 
+  useEffect(() => {
+    if (!videoRef) {
+      return;
+    }
+ 
+    if (active) {
+      // play the video when active
+      videoRef.current && videoRef.current.play();
+    } else {
+      // pause the video when not active
+      videoRef.current && videoRef.current.pause();
+    }
+  }, [active]);
+ 
+  // This function will be invoked when the user has finished loading media
+  const handleMediaLoaded = useCallback(() => {
+    setMediaLoaded(true);
+  }, []);
+ 
+  // This code creates a function to handle errors when loading the video.
+  const handleError = useCallback(() => {
+    // create a function to handle errors
+    setLoadFailed(true); // set the loadFailed variable to true
+    onMediaStateChange({
+      // call the onMediaStateChange function
+      id,
+      paused: false,
+      playing: false,
+    });
+  }, [onMediaStateChange, id]); // add the onMediaStateChange and id variables as dependencies to the function
+ 
+  const ErrorMessageMem: FunctionComponent<ErrorMessageModel> = memo(
+    ({ message }: ErrorMessageModel) => <ErrorMessage>{message}</ErrorMessage>,
+  );
+ 
+  // Checks if the media source url is a YouTube video.
+  // Returns a boolean.
+  const isYouTube = useMemo(
+    () =>
+      /^(https?\:\/\/)?(www\.youtube\.com|youtu\.?be)\/.+$/.test(
+        media.source.url,
+      ),
+    [],
+  );
+ 
+  /**
+   * @function IFrameVideo
+   * @description
+   * The IFrameVideo component is used to display an iframe with a YouTube video.
+   * @returns {IFrameVideo} - Returns the iframe with the YouTube video.
+   */
+  const IFrameYouTube = useMemo(() => {
+    // Create an iframe with the YouTube video
+    const iframe = (
+      <IFrameVideo
+        frameBorder="0"
+        allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
+        allowFullScreen
+        src={`${media.source.url}${
+          active ? '?autoplay=1&enablejsapi=1' : '?enablejsapi=1'
+        }`}
+        title={media.name}
+      />
+    );
+ 
+    // When the YouTube video is active, return the iframe
+    return iframe;
+  }, [active]);
+ 
+  const Video = useMemo(() => {
+    return (
+      <CardVideo
+        controls
+        autoPlay={active}
+        ref={videoRef}
+        onLoadedData={handleMediaLoaded}
+        data-testid="rc-video"
+        onPlay={() =>
+          onMediaStateChange({
+            id,
+            paused: false,
+            playing: true,
+          })
+        }
+        onPause={() =>
+          onMediaStateChange({
+            id,
+            paused: true,
+            playing: false,
+          })
+        }
+        onEnded={() =>
+          onMediaStateChange({
+            id,
+            paused: false,
+            playing: false,
+          })
+        }
+        onError={handleError}
+      >
+        <source src={media.source.url}></source>
+      </CardVideo>
+    );
+  }, [active]);
+ 
+  const Image = useMemo(() => {
+    return (
+      <CardImage
+        src={media.source.url}
+        mode={mode}
+        onLoad={handleMediaLoaded}
+        onError={handleError}
+        $visible={mediaLoaded}
+        alt={media.name}
+        loading={'lazy'}
+        $enableBorderRadius={borderLessCards}
+        role="img"
+        fit={mediaSettings?.imageFit}
+      />
+    );
+  }, [mediaLoaded, borderLessCards]);
+ 
+  ErrorMessageMem.displayName = 'Error Message';
+ 
+  // This code calculates the height of the Details component and passes it to
+  // the setDetailsHeight function.
+  const onDetailsTextRef = useCallback((height?: number) => {
+    if (height) {
+      setDetailsHeight(height);
+    }
+  }, []);
+ 
+  /* Toggle the expand details state on pointer or keyboard event */
+  const toggleExpand = useCallback(
+    (ev: React.PointerEvent | React.KeyboardEvent) => {
+      // ev.preventDefault();
+      // ev.stopPropagation();
+      setExpandDetails((prev) => !prev);
+      setShowText(true);
+    },
+    [],
+  );
+ 
+  // This function is used to toggle the text between hidden and visible.
+  // It is used to show the text of the article excerpt when the user
+  // clicks on the "show more" button.
+  const toggleText = useCallback(
+    (ev: React.PointerEvent | React.KeyboardEvent) => {
+      // ev.preventDefault();
+      // ev.stopPropagation();
+      setExpandDetails(false);
+      setShowText((prev) => !prev);
+    },
+    [],
+  );
+ 
+  // checks if the arrow should be shown
+  const canShowArrow = useMemo(
+    () =>
+      (mode === 'VERTICAL' || mode === 'VERTICAL_ALTERNATING') && textOverlay,
+    [],
+  );
+ 
+  // checks if we can display the detailed text
+  const canShowTextMemo = useMemo(
+    () => showText && !!detailsText,
+    [showText, detailsText],
+  );
+ 
+  // checks if the text content should be shown
+  const canShowTextContent = useMemo(
+    () => title || content || detailsText,
+    [title, content, detailsText],
+  );
+ 
+  const canExpand = useMemo(
+    () => textOverlay && !!detailsText,
+    [content, detailsText],
+  );
+ 
+  const gradientColor = useMemo(
+    () => hexToRGBA(theme?.cardDetailsBackGround || '', 0.8),
+    [theme?.cardDetailsBackGround],
+  );
+ 
+  const canShowGradient = useMemo(
+    () => !expandDetails && showText && textOverlay,
+    [expandDetails, showText],
+  );
+ 
+  const getCardHeight = useMemo(() => {
+    if (textOverlay) {
+      return cardHeight;
+    } else {
+      return mediaHeight;
+    }
+  }, []);
+ 
+  const TextContent = useMemo(() => {
+    return (
+      <MediaDetailsWrapper
+        mode={mode}
+        $absolutePosition={textOverlay}
+        $textInMedia={textOverlay}
+        ref={moreRef}
+        theme={theme}
+        $expandFull={expandDetails}
+        $showText={showText}
+        $expandable={canExpand}
+        $gradientColor={canShowGradient ? gradientColor : null}
+      >
+        <CardMediaHeader>
+          <TitleMemo
+            title={title}
+            theme={theme}
+            active={active}
+            url={url}
+            fontSize={fontSizes?.cardTitle}
+            classString={classNames?.cardTitle}
+          />
+          {canExpand ? (
+            <ButtonWrapper>
+              <ShowOrHideTextButtonMemo
+                onToggle={toggleText}
+                show={showText}
+                textOverlay
+                theme={theme}
+              />
+              <ExpandButtonMemo
+                theme={theme}
+                expanded={expandDetails}
+                onExpand={toggleExpand}
+                textOverlay
+              />
+            </ButtonWrapper>
+          ) : null}
+        </CardMediaHeader>
+        {showText && (
+          <SubTitleMemo
+            content={content}
+            fontSize={fontSizes?.cardSubtitle}
+            classString={classNames?.cardSubTitle}
+            padding
+            theme={theme}
+          />
+        )}
+        {canShowTextMemo ? (
+          <>
+            <DetailsTextMemo
+              theme={theme}
+              show={showText}
+              expand={expandDetails}
+              text={detailsText}
+              onRender={onDetailsTextRef}
+              textOverlay={textOverlay}
+            />
+          </>
+        ) : null}
+      </MediaDetailsWrapper>
+    );
+  }, [
+    showText,
+    expandDetails,
+    canShowTextMemo,
+    gradientColor,
+    title,
+    JSON.stringify(theme),
+  ]);
+ 
+  const canShowProgressBar = useMemo(
+    () => showProgressBar && textOverlay,
+    [showProgressBar, textOverlay],
+  );
+ 
+  return (
+    <>
+      <MediaWrapper
+        theme={theme}
+        $active={active}
+        mode={mode}
+        $slideShowActive={slideshowActive}
+        className={cls('card-media-wrapper', classNames?.cardMedia)}
+        $cardHeight={getCardHeight}
+        align={mediaSettings?.align}
+        $textOverlay={textOverlay}
+      >
+        {media.type === 'VIDEO' &&
+          !isYouTube &&
+          (!loadFailed ? (
+            Video
+          ) : (
+            <ErrorMessageMem message="Failed to load the video" />
+          ))}
+        {media.type === 'VIDEO' && isYouTube && IFrameYouTube}
+        {media.type === 'IMAGE' &&
+          (!loadFailed ? (
+            <ImageWrapper height={mediaHeight}>{Image}</ImageWrapper>
+          ) : (
+            <ErrorMessageMem message="Failed to load the image." />
+          ))}
+ 
+        {canShowProgressBar ? (
+          <SlideShowProgressBar
+            color={theme?.primary}
+            $duration={remainInterval}
+            $paused={paused}
+            ref={progressRef}
+            $startWidth={startWidth}
+            role="progressbar"
+            $resuming={resuming}
+          ></SlideShowProgressBar>
+        ) : null}
+ 
+        {canShowArrow ? (
+          <TriangleIconWrapper
+            dir={triangleDir}
+            theme={theme}
+            offset={-15}
+            role="img"
+            data-testid="arrow-icon"
+          ></TriangleIconWrapper>
+        ) : null}
+      </MediaWrapper>
+      {canShowTextContent ? TextContent : null}
+    </>
+  );
+};
+ 
+CardMedia.displayName = 'Card Media';
+ 
+export default CardMedia;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-card/index.html b/coverage/lcov-report/components/timeline-elements/timeline-card/index.html new file mode 100644 index 00000000..fbaca53f --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-card/index.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-card + + + + + + + + + +
+
+

All files components/timeline-elements/timeline-card

+
+ +
+ 96.81% + Statements + 334/345 +
+ + +
+ 62.16% + Branches + 23/37 +
+ + +
+ 91.66% + Functions + 11/12 +
+ + +
+ 96.81% + Lines + 334/345 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
timeline-horizontal-card.styles.ts +
+
97.33%146/15063.63%14/22100%9/997.33%146/150
timeline-horizontal-card.tsx +
+
96.41%188/19560%9/1566.66%2/396.41%188/195
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-card/timeline-horizontal-card.styles.ts.html b/coverage/lcov-report/components/timeline-elements/timeline-card/timeline-horizontal-card.styles.ts.html new file mode 100644 index 00000000..9d5e4f9e --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-card/timeline-horizontal-card.styles.ts.html @@ -0,0 +1,534 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-card/timeline-horizontal-card.styles.ts + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-card timeline-horizontal-card.styles.ts

+
+ +
+ 97.33% + Statements + 146/150 +
+ + +
+ 63.63% + Branches + 14/22 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 97.33% + Lines + 146/150 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +1511x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +18x +18x +18x +  +  +  +  +18x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { Theme } from '@models/Theme';
+import styled, { keyframes } from 'styled-components';
+ 
+export const Wrapper = styled.div`
+  align-items: center;
+  border: 1px solid transparent;
+  display: flex;
+  justify-content: center;
+  position: relative;
+  width: 100%;
+  height: 100%;
+ 
+  &.vertical {
+    justify-content: flex-start;
+  }
+`;
+ 
+export const Item = styled.div``;
+ 
+const show = keyframes`
+  from {
+    opacity: 0;
+  }
+  to {
+    opacity: 1;
+  }
+`;
+ 
+export const ShapeWrapper = styled.div`
+  /* height: 100%; */
+  align-items: center;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  width: 5em;
+`;
+ 
+type ShapeModel = {
+  $timelinePointShape?: 'circle' | 'square' | 'diamond';
+  dimension?: number;
+  theme?: Theme;
+};
+ 
+const ShapeBorderStyle = (p: Pick<ShapeModel, '$timelinePointShape'>) => {
+  if (p.$timelinePointShape === 'circle') {
+    return 'border-radius: 50%;';
+  } else if (p.$timelinePointShape === 'square') {
+    return 'border-radius: 2px;';
+  } else if (p.$timelinePointShape === 'diamond') {
+    return `border-radius: 0;`;
+  }
+};
+ 
+export const Shape = styled.div<ShapeModel>`
+  ${ShapeBorderStyle}
+  cursor: pointer;
+  height: ${(p) => p.dimension}px;
+  width: ${(p) => p.dimension}px;
+  transform: ${(p) =>
+    p.$timelinePointShape === 'diamond' ? 'rotate(45deg)' : ''};
+ 
+  &.active {
+    &.using-icon {
+      /* transform: scale(1.75); */
+    }
+    &:not(.using-icon) {
+      transform: ${(p) =>
+        p.$timelinePointShape === 'diamond' ? 'rotate(45deg)' : ''};
+    }
+ 
+    &::after {
+      ${ShapeBorderStyle}
+      content: '';
+      display: block;
+      height: ${(p) => (p.dimension ? Math.round(p.dimension * 0.75) : 20)}px;
+      width: ${(p) => (p.dimension ? Math.round(p.dimension * 0.75) : 20)}px;
+      left: 50%;
+      position: absolute;
+      top: 50%;
+      transform: translateY(-50%) translateX(-50%);
+      z-index: -1;
+    }
+  }
+ 
+  &:not(.using-icon) {
+    background: ${(p: ShapeModel) => p.theme?.primary};
+ 
+    &.active {
+      background: ${(p: ShapeModel) => p.theme?.secondary};
+      border: ${(p) => (p.dimension ? Math.round(p.dimension * 0.2) : '3')}px
+        solid ${(p: ShapeModel) => p.theme?.primary};
+    }
+ 
+    &.in-active {
+    }
+  }
+ 
+  &.using-icon {
+    background: ${(p) => p.theme?.iconBackgroundColor};
+    display: flex;
+    align-items: center;
+    justify-content: center;
+ 
+    img {
+      max-width: 90%;
+      max-height: 90%;
+    }
+  }
+`;
+ 
+export const TimelineTitleContainer = styled.div`
+  display: flex;
+  align-items: center;
+  justify-content: flex-start;
+ 
+  &.vertical {
+    margin-bottom: 1em;
+  }
+ 
+  &.horizontal {
+    position: absolute;
+    top: 0;
+  }
+`;
+ 
+export const TimelineContentContainer = styled.div<{
+  $active?: boolean;
+  $cardWidth?: number;
+  $highlight?: boolean;
+  position?: string;
+  theme?: Theme;
+}>`
+  align-items: flex-start;
+  animation: ${show} 0.25s ease-in;
+ 
+  outline: 2px solid
+    ${(p) => (p.$highlight && p.$active ? p.theme?.primary : 'transparent')};
+ 
+  margin: 1rem;
+ 
+  &.horizontal {
+    min-width: ${(p) => p.$cardWidth}px;
+  }
+ 
+  &.vertical {
+    width: calc(100% - 5em);
+    margin-left: auto;
+    flex-direction: column;
+  }
+`;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-card/timeline-horizontal-card.tsx.html b/coverage/lcov-report/components/timeline-elements/timeline-card/timeline-horizontal-card.tsx.html new file mode 100644 index 00000000..c65e1a21 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-card/timeline-horizontal-card.tsx.html @@ -0,0 +1,669 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-card/timeline-horizontal-card.tsx + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-card timeline-horizontal-card.tsx

+
+ +
+ 96.41% + Statements + 188/195 +
+ + +
+ 60% + Branches + 9/15 +
+ + +
+ 66.66% + Functions + 2/3 +
+ + +
+ 96.41% + Lines + 188/195 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +1961x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +  +  +  +  +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +  +  +  +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +1x +1x + 
import { TimelineCardModel } from '@models/TimelineItemModel';
+import cls from 'classnames';
+import React, {
+  useCallback,
+  useContext,
+  useEffect,
+  useMemo,
+  useRef,
+} from 'react';
+import ReactDOM from 'react-dom';
+import { GlobalContext } from '../../GlobalContext';
+import TimelineCardContent from '../timeline-card-content/timeline-card-content';
+import TimelineItemTitle from '../timeline-item-title/timeline-card-title';
+import {
+  Shape,
+  ShapeWrapper,
+  TimelineContentContainer,
+  TimelineTitleContainer,
+  Wrapper,
+} from './timeline-horizontal-card.styles';
+ 
+const TimelineCard: React.FunctionComponent<TimelineCardModel> = ({
+  active,
+  autoScroll,
+  cardDetailedText,
+  cardSubtitle,
+  cardTitle,
+  url,
+  id,
+  media,
+  onClick,
+  onElapsed,
+  slideShowRunning,
+  title,
+  wrapperId,
+  customContent,
+  hasFocus,
+  iconChild,
+  timelineContent,
+  cardWidth,
+  isNested,
+  nestedCardHeight,
+  items,
+}: TimelineCardModel) => {
+  const circleRef = useRef<HTMLDivElement>(null);
+  const wrapperRef = useRef<HTMLDivElement>(null);
+  const contentRef = useRef<HTMLDivElement>(null);
+ 
+  const {
+    mode,
+    cardPositionHorizontal: position,
+    timelinePointDimension,
+    disableClickOnCircle,
+    cardLess,
+    showAllCardsHorizontal,
+    classNames,
+    theme,
+    timelinePointShape,
+  } = useContext(GlobalContext);
+ 
+  const handleClick = () => {
+    if (!disableClickOnCircle && onClick && !slideShowRunning) {
+      onClick(id);
+    }
+  };
+ 
+  useEffect(() => {
+    if (active) {
+      const circle = circleRef.current;
+      const wrapper = wrapperRef.current;
+ 
+      if (circle && wrapper) {
+        const circleOffsetLeft = circle.offsetLeft;
+        const wrapperOffsetLeft = wrapper.offsetLeft;
+ 
+        autoScroll?.({
+          pointOffset: circleOffsetLeft + wrapperOffsetLeft,
+          pointWidth: circle.clientWidth,
+        });
+      }
+    }
+  }, [active, autoScroll, mode]);
+ 
+  const handleOnShowMore = useCallback(() => {}, []);
+ 
+  const modeLower = useMemo(() => mode?.toLowerCase(), [mode]);
+ 
+  const containerClass = useMemo(
+    () =>
+      cls(
+        'timeline-horz-card-wrapper',
+        modeLower,
+        position === 'TOP' ? 'bottom' : 'top',
+        showAllCardsHorizontal ? 'show-all' : '',
+      ),
+    [mode, position],
+  );
+ 
+  const titleClass = useMemo(() => cls(modeLower, position), []);
+ 
+  const circleClass = useMemo(
+    () =>
+      cls(
+        'timeline-circle',
+        { 'using-icon': !!iconChild },
+        modeLower,
+        active ? 'active' : 'in-active',
+      ),
+    [active],
+  );
+ 
+  const Content = useMemo(() => {
+    return (
+      <TimelineContentContainer
+        className={containerClass}
+        ref={contentRef}
+        id={`timeline-card-${id}`}
+        theme={theme}
+        $active={active}
+        $highlight={showAllCardsHorizontal}
+        tabIndex={0}
+        $cardWidth={cardWidth}
+      >
+        <TimelineCardContent
+          content={cardSubtitle}
+          active={active}
+          title={cardTitle}
+          url={url}
+          detailedText={cardDetailedText}
+          onShowMore={handleOnShowMore}
+          theme={theme}
+          slideShowActive={slideShowRunning}
+          media={media}
+          onElapsed={onElapsed}
+          id={id}
+          customContent={customContent}
+          hasFocus={hasFocus}
+          onClick={onClick}
+          timelineContent={timelineContent}
+          isNested={isNested}
+          nestedCardHeight={nestedCardHeight}
+          items={items}
+        />
+      </TimelineContentContainer>
+    );
+  }, [active, slideShowRunning, JSON.stringify(theme)]);
+ 
+  const showTimelineContent = () => {
+    const ele = document.getElementById(wrapperId);
+ 
+    if (ele) {
+      return ReactDOM.createPortal(Content, ele);
+    }
+  };
+ 
+  const canShowTimelineContent = useMemo(
+    () => (active && !cardLess) || showAllCardsHorizontal,
+    [active, cardLess, showAllCardsHorizontal],
+  );
+ 
+  return (
+    <Wrapper ref={wrapperRef} className={modeLower} data-testid="timeline-item">
+      {canShowTimelineContent && showTimelineContent()}
+ 
+      <ShapeWrapper>
+        <Shape
+          className={circleClass}
+          onClick={handleClick}
+          ref={circleRef}
+          data-testid="timeline-circle"
+          theme={theme}
+          aria-label={title}
+          dimension={timelinePointDimension}
+          $timelinePointShape={timelinePointShape}
+        >
+          {iconChild ? iconChild : null}
+        </Shape>
+      </ShapeWrapper>
+ 
+      <TimelineTitleContainer
+        className={titleClass}
+        data-testid="timeline-title"
+      >
+        <TimelineItemTitle
+          title={title}
+          active={active}
+          theme={theme}
+          classString={classNames?.title}
+        />
+      </TimelineTitleContainer>
+    </Wrapper>
+  );
+};
+ 
+export default TimelineCard;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-control/index.html b/coverage/lcov-report/components/timeline-elements/timeline-control/index.html new file mode 100644 index 00000000..305434fa --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-control/index.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-control + + + + + + + + + +
+
+

All files components/timeline-elements/timeline-control

+
+ +
+ 98% + Statements + 294/300 +
+ + +
+ 42.85% + Branches + 18/42 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 98% + Lines + 294/300 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
timeline-control.styles.ts +
+
100%85/8587.5%7/8100%2/2100%85/85
timeline-control.tsx +
+
97.2%209/21532.35%11/34100%1/197.2%209/215
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-control/timeline-control.styles.ts.html b/coverage/lcov-report/components/timeline-elements/timeline-control/timeline-control.styles.ts.html new file mode 100644 index 00000000..2ddc530c --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-control/timeline-control.styles.ts.html @@ -0,0 +1,339 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-control/timeline-control.styles.ts + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-control timeline-control.styles.ts

+
+ +
+ 100% + Statements + 85/85 +
+ + +
+ 87.5% + Branches + 7/8 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 85/85 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +861x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +21x +16x +16x +21x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { Theme } from '@models/Theme';
+import { TimelineMode } from '@models/TimelineModel';
+import styled from 'styled-components';
+ 
+export const TimelineNavWrapper = styled.ul<{ theme?: Theme }>`
+  background: rgba(229, 229, 229, 0.85);
+  border-radius: 25px;
+  display: flex;
+  list-style: none;
+  padding: 0.25em 0.25em;
+`;
+ 
+export const TimelineNavItem = styled.li<{ $disable?: boolean }>`
+  padding: 0.1em;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  ${(p) => (p.$disable ? 'pointer-events: none; filter: opacity(0.7)' : '')};
+`;
+ 
+export const TimelineNavButton = styled.button<{
+  mode?: TimelineMode;
+  rotate?: 'TRUE' | 'FALSE';
+  theme?: Theme;
+}>`
+  align-items: center;
+  background: ${(p) => p.theme.primary};
+  border-radius: 50%;
+  border: 0;
+  color: #fff;
+  cursor: pointer;
+  display: flex;
+  filter: drop-shadow(0 0 5px rgba(0, 0, 0, 0.25));
+  height: 20px;
+  justify-content: center;
+  margin: 0 0.2em;
+  padding: 0;
+  transition: all 0.1s ease-in;
+  width: 20px;
+ 
+  transform: ${(p) => {
+    if (p.rotate === 'TRUE') {
+      return `rotate(90deg)`;
+    }
+  }};
+ 
+  &:active {
+    filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.25));
+    transform: ${(p) => (p.rotate === 'TRUE' ? 'rotate(90deg)' : '')} scale(0.9);
+  }
+ 
+  svg {
+    width: 80%;
+    height: 80%;
+  }
+`;
+ 
+export const TimelineControlContainer = styled.div`
+  align-items: center;
+  display: flex;
+  justify-content: center;
+`;
+ 
+export const ControlButton = styled.button<{ theme?: Theme }>`
+  align-items: center;
+  background: ${(p) => p.theme.primary};
+  border-radius: 50%;
+  cursor: pointer;
+  display: flex;
+  height: 2em;
+  justify-content: center;
+  margin-left: 0.5em;
+  width: 2em;
+  outline: 0;
+  color: #fff;
+ 
+  svg {
+    width: 80%;
+    height: 80%;
+  }
+`;
+ 
+export const MediaToggle = styled(ControlButton)``;
+ 
+export const ReplayWrapper = styled(ControlButton)``;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-control/timeline-control.tsx.html b/coverage/lcov-report/components/timeline-elements/timeline-control/timeline-control.tsx.html new file mode 100644 index 00000000..6c5531ed --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-control/timeline-control.tsx.html @@ -0,0 +1,729 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-control/timeline-control.tsx + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-control timeline-control.tsx

+
+ +
+ 97.2% + Statements + 209/215 +
+ + +
+ 32.35% + Branches + 11/34 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 97.2% + Lines + 209/215 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +2161x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +  +  +  +  +  +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +  +4x +4x +4x +4x +1x +1x +1x +1x + 
import { TimelineControlModel } from '@models/TimelineControlModel';
+import cls from 'classnames';
+import React, { useCallback, useContext, useMemo } from 'react';
+import { GlobalContext } from '../../GlobalContext';
+import { MoonIcon, StopIcon, SunIcon } from '../../icons';
+import ChevronLeft from '../../icons/chev-left';
+import ChevronRightIcon from '../../icons/chev-right';
+import ChevronsLeftIcon from '../../icons/chevs-left';
+import ChevronsRightIcon from '../../icons/chevs-right';
+import ReplayIcon from '../../icons/replay-icon';
+import {
+  TimelineControlContainer,
+  TimelineNavButton,
+  TimelineNavItem,
+  TimelineNavWrapper,
+} from './timeline-control.styles';
+ 
+/**
+ * TimelineControl component
+ * Provides navigation controls for a timeline, including next, previous, first, last, and slideshow buttons.
+ * Optionally supports flipping the layout and dark mode toggle.
+ *
+ * @property {function} onNext - Function to go to the next item.
+ * @property {function} onPrevious - Function to go to the previous item.
+ * @property {function} onFirst - Function to jump to the first item.
+ * @property {function} onLast - Function to jump to the last item.
+ * @property {boolean} disableLeft - Whether to disable the left navigation buttons.
+ * @property {boolean} disableRight - Whether to disable the right navigation buttons.
+ * @property {boolean} slideShowRunning - Whether the slideshow is currently running.
+ * @property {function} onReplay - Function to restart the slideshow.
+ * @property {boolean} slideShowEnabled - Whether the slideshow feature is enabled.
+ * @property {function} onToggleDarkMode - Function to toggle dark mode (if enabled).
+ * @property {boolean} isDark - Whether dark mode is currently active.
+ * @property {function} onPaused - Function to pause the slideshow (if running).
+ * @returns {JSX.Element} The TimelineControl component.
+ */
+const TimelineControl: React.FunctionComponent<TimelineControlModel> = ({
+  onNext,
+  onPrevious,
+  onFirst,
+  onLast,
+  disableLeft,
+  disableRight,
+  slideShowRunning,
+  onReplay,
+  slideShowEnabled,
+  onToggleDarkMode,
+  isDark,
+  onPaused,
+}: TimelineControlModel) => {
+  const { mode, flipLayout, theme, buttonTexts, classNames, enableDarkToggle } =
+    useContext(GlobalContext);
+ 
+  const rotate = useMemo(() => mode !== 'HORIZONTAL', [mode]);
+ 
+  const flippedHorizontally = useMemo(
+    () => flipLayout && mode === 'HORIZONTAL',
+    [],
+  );
+ 
+  const canDisableLeft = useMemo(
+    () => disableLeft || slideShowRunning,
+    [disableLeft, slideShowRunning],
+  );
+ 
+  const canDisableRight = useMemo(
+    () => disableRight || slideShowRunning,
+    [disableRight, slideShowRunning],
+  );
+ 
+  const handlePlayOrPause = useCallback(() => {
+    if (slideShowRunning) {
+      onPaused?.();
+    } else {
+      onReplay?.();
+    }
+  }, [slideShowRunning]);
+ 
+  const previousTitle = useMemo(
+    () => (flipLayout ? buttonTexts?.next : buttonTexts?.previous),
+    [flipLayout],
+  );
+ 
+  const nextTitle = useMemo(
+    () => (flipLayout ? buttonTexts?.previous : buttonTexts?.next),
+    [flipLayout],
+  );
+ 
+  const playOrPauseTile = useMemo(
+    () => (slideShowRunning ? buttonTexts?.stop : buttonTexts?.play),
+    [slideShowRunning],
+  );
+ 
+  const jumpToLastTitle = useMemo(
+    () => (flipLayout ? buttonTexts?.first : buttonTexts?.last),
+    [flipLayout],
+  );
+ 
+  const jumpToFirstTitle = useMemo(
+    () => (flipLayout ? buttonTexts?.last : buttonTexts?.first),
+    [flipLayout],
+  );
+ 
+  return (
+    <TimelineControlContainer>
+      <TimelineNavWrapper
+        className={cls('timeline-controls', classNames?.controls)}
+      >
+        {/* jump to first */}
+        <TimelineNavItem $disable={canDisableLeft}>
+          <TimelineNavButton
+            mode={mode}
+            theme={theme}
+            onClick={flippedHorizontally ? onLast : onFirst}
+            title={jumpToFirstTitle}
+            aria-label={jumpToFirstTitle}
+            aria-disabled={disableLeft}
+            aria-controls="timeline-main-wrapper"
+            tabIndex={!disableLeft ? 0 : -1}
+            rotate={rotate ? 'TRUE' : 'FALSE'}
+          >
+            <ChevronsLeftIcon />
+          </TimelineNavButton>
+        </TimelineNavItem>
+ 
+        {/* previous */}
+        <TimelineNavItem $disable={canDisableLeft}>
+          <TimelineNavButton
+            mode={mode}
+            theme={theme}
+            onClick={flippedHorizontally ? onNext : onPrevious}
+            title={previousTitle}
+            aria-label={previousTitle}
+            aria-disabled={disableLeft}
+            aria-controls="timeline-main-wrapper"
+            tabIndex={!disableLeft ? 0 : -1}
+            rotate={rotate ? 'TRUE' : 'FALSE'}
+          >
+            <ChevronLeft />
+          </TimelineNavButton>
+        </TimelineNavItem>
+ 
+        {/* next */}
+        <TimelineNavItem $disable={canDisableRight}>
+          <TimelineNavButton
+            mode={mode}
+            theme={theme}
+            onClick={flippedHorizontally ? onPrevious : onNext}
+            title={nextTitle}
+            aria-label={nextTitle}
+            aria-disabled={disableRight}
+            aria-controls="timeline-main-wrapper"
+            rotate={rotate ? 'TRUE' : 'FALSE'}
+            tabIndex={!disableRight ? 0 : -1}
+          >
+            <ChevronRightIcon />
+          </TimelineNavButton>
+        </TimelineNavItem>
+ 
+        {/* jump to last */}
+        <TimelineNavItem $disable={canDisableRight}>
+          <TimelineNavButton
+            mode={mode}
+            theme={theme}
+            onClick={flippedHorizontally ? onFirst : onLast}
+            title={jumpToLastTitle}
+            aria-label={jumpToLastTitle}
+            aria-disabled={disableRight}
+            aria-controls="timeline-main-wrapper"
+            tabIndex={!disableRight ? 0 : -1}
+            rotate={rotate ? 'TRUE' : 'FALSE'}
+          >
+            <ChevronsRightIcon />
+          </TimelineNavButton>
+        </TimelineNavItem>
+ 
+        {/* slideshow button */}
+        <TimelineNavItem>
+          {slideShowEnabled && (
+            <TimelineNavButton
+              theme={theme}
+              onClick={handlePlayOrPause}
+              title={playOrPauseTile}
+              tabIndex={0}
+              aria-controls="timeline-main-wrapper"
+              aria-label={playOrPauseTile}
+            >
+              {slideShowRunning ? <StopIcon /> : <ReplayIcon />}
+            </TimelineNavButton>
+          )}
+        </TimelineNavItem>
+ 
+        {/* dark toggle button */}
+        {enableDarkToggle ? (
+          <TimelineNavItem $disable={slideShowRunning}>
+            <TimelineNavButton
+              theme={theme}
+              onClick={onToggleDarkMode}
+              title={isDark ? buttonTexts?.light : buttonTexts?.dark}
+              tabIndex={0}
+              aria-controls="timeline-main-wrapper"
+              aria-label={isDark ? buttonTexts?.light : buttonTexts?.dark}
+            >
+              {isDark ? <SunIcon /> : <MoonIcon />}
+            </TimelineNavButton>
+          </TimelineNavItem>
+        ) : null}
+      </TimelineNavWrapper>
+    </TimelineControlContainer>
+  );
+};
+ 
+TimelineControl.displayName = 'Timeline Control';
+ 
+export default TimelineControl;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-item-title/index.html b/coverage/lcov-report/components/timeline-elements/timeline-item-title/index.html new file mode 100644 index 00000000..23646f0b --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-item-title/index.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-item-title + + + + + + + + + +
+
+

All files components/timeline-elements/timeline-item-title

+
+ +
+ 100% + Statements + 73/73 +
+ + +
+ 88.88% + Branches + 16/18 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 100% + Lines + 73/73 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
timeline-card-title.styles.ts +
+
100%24/2485.71%12/14100%5/5100%24/24
timeline-card-title.tsx +
+
100%49/49100%4/4100%1/1100%49/49
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-item-title/timeline-card-title.styles.ts.html b/coverage/lcov-report/components/timeline-elements/timeline-item-title/timeline-card-title.styles.ts.html new file mode 100644 index 00000000..3e239657 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-item-title/timeline-card-title.styles.ts.html @@ -0,0 +1,156 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-item-title/timeline-card-title.styles.ts + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-item-title timeline-card-title.styles.ts

+
+ +
+ 100% + Statements + 24/24 +
+ + +
+ 85.71% + Branches + 12/14 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 100% + Lines + 24/24 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +251x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { Theme } from '@models/Theme';
+import styled from 'styled-components';
+ 
+export const TitleWrapper = styled.div<{
+  $fontSize?: string;
+  $hide?: boolean;
+  align?: string;
+  theme?: Theme;
+}>`
+  border-radius: 0.2rem;
+  font-size: ${(p) => (p.$fontSize ? p.$fontSize : '1rem')};
+  font-weight: 600;
+  overflow: hidden;
+  padding: 0.25rem;
+  visibility: ${(p) => (p.$hide ? 'hidden' : 'visible')};
+  text-align: ${(p) => (p.align ? p.align : '')};
+  color: ${(p) => (p.theme ? p.theme.titleColor : '')};
+ 
+  &.active {
+    background: ${(p) => p.theme?.secondary};
+    color: ${(p) =>
+      p.theme?.titleColorActive ? p.theme?.titleColorActive : p.theme?.primary};
+  }
+`;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-item-title/timeline-card-title.tsx.html b/coverage/lcov-report/components/timeline-elements/timeline-item-title/timeline-card-title.tsx.html new file mode 100644 index 00000000..16d56d01 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-item-title/timeline-card-title.tsx.html @@ -0,0 +1,231 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-item-title/timeline-card-title.tsx + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-item-title timeline-card-title.tsx

+
+ +
+ 100% + Statements + 49/49 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 49/49 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +501x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +1x +1x + 
import { TitleModel } from '@models/TimelineCardTitleModel';
+import cls from 'classnames';
+import React, { useContext, useMemo } from 'react';
+import { GlobalContext } from '../../GlobalContext';
+import { TitleWrapper } from './timeline-card-title.styles';
+ 
+/**
+ * TimelineItemTitle component
+ * This component renders the title of a timeline item and applies appropriate styling based on the given props.
+ *
+ * @property {string} title - The text of the title.
+ * @property {boolean} active - Indicates whether the title is active or not.
+ * @property {Theme} theme - The theme object, used for styling.
+ * @property {string} align - The alignment of the title.
+ * @property {string} classString - Additional CSS classes for the title.
+ * @returns {JSX.Element} The TimelineItemTitle component.
+ */
+const TimelineItemTitle: React.FunctionComponent<TitleModel> = ({
+  title,
+  active,
+  theme,
+  align,
+  classString,
+}: TitleModel) => {
+  const TITLE_CLASS = 'timeline-item-title'; // Base class name for the title
+ 
+  // Computed class name for the title, combining base class, active state, and additional classes
+  const titleClass = useMemo(
+    () => cls(TITLE_CLASS, active ? 'active' : '', classString),
+    [active, classString],
+  );
+ 
+  // Get font size from global context
+  const { fontSizes } = useContext(GlobalContext);
+ 
+  return (
+    <TitleWrapper
+      className={titleClass}
+      theme={theme}
+      $hide={!title}
+      align={align}
+      $fontSize={fontSizes?.title}
+    >
+      {title}
+    </TitleWrapper>
+  );
+};
+ 
+export default TimelineItemTitle;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-outline/index.html b/coverage/lcov-report/components/timeline-elements/timeline-outline/index.html new file mode 100644 index 00000000..37dd98cb --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-outline/index.html @@ -0,0 +1,145 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-outline + + + + + + + + + +
+
+

All files components/timeline-elements/timeline-outline

+
+ +
+ 73.68% + Statements + 238/323 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 73.68% + Lines + 238/323 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
timeline-outline-item-list.tsx +
+
64.58%31/48100%0/00%0/164.58%31/48
timeline-outline.styles.ts +
+
93.93%155/165100%0/00%0/793.93%155/165
timeline-outline.tsx +
+
47.27%52/110100%1/10%0/147.27%52/110
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-outline/timeline-outline-item-list.tsx.html b/coverage/lcov-report/components/timeline-elements/timeline-outline/timeline-outline-item-list.tsx.html new file mode 100644 index 00000000..328d5723 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-outline/timeline-outline-item-list.tsx.html @@ -0,0 +1,228 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-outline/timeline-outline-item-list.tsx + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-outline timeline-outline-item-list.tsx

+
+ +
+ 64.58% + Statements + 31/48 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 64.58% + Lines + 31/48 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +491x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x + 
import { Theme } from '@models/Theme';
+import {
+  List,
+  ListItem,
+  ListItemBullet,
+  ListItemName,
+} from './timeline-outline.styles';
+import { FunctionComponent } from 'react';
+import { TimelineOutlineItem } from './timeline-outline';
+ 
+interface OutlineItemListModel {
+  handleSelection: (index: number, id?: string) => void;
+  items: TimelineOutlineItem[];
+  theme: Theme;
+}
+ 
+/**
+ * OutlineItemList component
+ * This component is responsible for rendering the outline list of items.
+ * It takes a list of items, a theme, and a selection handler function as props,
+ * and maps through the items to render each one within the list.
+ *
+ * @property {TimelineOutlineItem[]} items - The items to be displayed in the list.
+ * @property {Theme} theme - The theme object, used for styling.
+ * @property {function} handleSelection - The callback to be invoked when an item is selected.
+ * @returns {JSX.Element} The rendered OutlineItemList component.
+ */
+const OutlineItemList: FunctionComponent<OutlineItemListModel> = ({
+  items,
+  handleSelection,
+  theme,
+}) => (
+  <List>
+    {items.map((item, index) => (
+      <ListItem
+        key={item.id}
+        onPointerDown={() => handleSelection(index, item.id)}
+      >
+        <ListItemBullet theme={theme} selected={item.selected}></ListItemBullet>
+        <ListItemName theme={theme} selected={item.selected}>
+          {item.name}
+        </ListItemName>
+      </ListItem>
+    ))}
+  </List>
+);
+ 
+export { OutlineItemList };
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-outline/timeline-outline.styles.ts.html b/coverage/lcov-report/components/timeline-elements/timeline-outline/timeline-outline.styles.ts.html new file mode 100644 index 00000000..2e0ba347 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-outline/timeline-outline.styles.ts.html @@ -0,0 +1,579 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-outline/timeline-outline.styles.ts + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-outline timeline-outline.styles.ts

+
+ +
+ 93.93% + Statements + 155/165 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 93.93% + Lines + 155/165 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +1661x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x + 
import { Theme } from '@models/Theme';
+import styled, { keyframes } from 'styled-components';
+import { OutlinePosition } from './timeline-outline';
+ 
+const open = keyframes`
+  from {
+    width: 30px;
+    height: 30px;
+  }
+ 
+  to: {
+    width: 200px;
+    height: 50%;
+  }
+  `;
+ 
+const close = keyframes`
+  from {
+    width: 200px;
+    height: 50%;
+  }
+ 
+  to: {
+    width: 30px;
+    height: 30px;
+  }
+`;
+ 
+export const OutlineWrapper = styled.div<{
+  open?: boolean;
+  position?: OutlinePosition;
+}>`
+  animation: ${(p) => (p.open ? open : close)};
+  animation-duration: 0.2s;
+  animation-timing-function: ease-in;
+  background: rgba(255, 255, 255, 0.98);
+  border: 1px solid ${(p) => (p.open ? '#f5f5f5' : 'none')};
+  height: 50%;
+  position: absolute;
+  top: 1rem;
+  width: 100%;
+  z-index: 9000;
+  ${(p) =>
+    p.position === OutlinePosition.left ? `left: 1rem;` : `right: 3rem;`};
+  ${(p) =>
+    p.open
+      ? `
+    width: 200px;
+    height: 50%;
+    box-shadow: 0 5px 10px 2px rgba(0,0,0,0.2);
+    overflow-y: auto;`
+      : `width: 30px; height: 30px;`};
+`;
+ 
+export const OutlinePane = styled.aside<{ open?: boolean }>`
+  align-items: center;
+  border-radius: 4px;
+  display: flex;
+  justify-content: center;
+`;
+ 
+export const OutlineButton = styled.button<{
+  open?: boolean;
+  position?: OutlinePosition;
+  theme?: Theme;
+}>`
+  align-items: center;
+  align-self: flex-end;
+  background: #fff;
+  border-radius: 4px;
+  border: 0;
+  box-shadow: ${(p) => (!p.open ? '0 0 10px 2px rgba(0,0,0,0.2)' : 'none')};
+  cursor: pointer;
+  display: flex;
+  height: 30px;
+  justify-content: center;
+  padding: 0;
+  width: 30px;
+ 
+  ${(p) =>
+    p.position === OutlinePosition.left
+      ? 'margin-right: auto;'
+      : 'margin-left: auto;'};
+ 
+  & svg {
+    width: 70%;
+    height: 70%;
+  }
+ 
+  & svg path {
+    color: ${(p) => p.theme.primary};
+  }
+`;
+ 
+export const List = styled.ul`
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+  list-style: none;
+  margin: 0;
+  overflow-y: auto;
+  padding: 0;
+  width: 80%;
+`;
+ 
+export const ListItem = styled.li`
+  align-items: center;
+  display: flex;
+  font-size: 0.9rem;
+  justify-content: flex-start;
+  margin: 0.75rem 0;
+  cursor: pointer;
+  position: relative;
+ 
+  &:not(:last-child)::after {
+    content: '';
+    display: block;
+    width: 100%;
+    position: absolute;
+    height: 1px;
+    background: #ddd;
+    left: 0;
+    right: 0;
+    margin: 0 auto;
+    bottom: -50%;
+  }
+`;
+ 
+export const ListItemName = styled.span<{ selected?: boolean; theme?: Theme }>`
+  font-size: 0.75rem;
+  color: ${(p) => (p.selected ? p.theme.primary : '')};
+  padding-left: 0.25rem;
+ 
+  &:hover {
+    color: ${(p) => p.theme.primary};
+  }
+`;
+ 
+export const ListItemBullet = styled.span<{
+  selected?: boolean;
+  theme?: Theme;
+}>`
+  align-items: center;
+  display: flex;
+  justify-content: center;
+  margin-right: 1rem;
+  position: relative;
+ 
+  &::after {
+    content: '';
+    display: block;
+    position: absolute;
+    width: 8px;
+    height: 8px;
+    border-radius: 50%;
+    background: ${(p) =>
+      p.selected ? `${p.theme.secondary}` : `${p.theme.primary}`};
+    left: 0;
+    margin: 0 auto;
+    border: ${(p) =>
+      p.selected
+        ? `2px solid ${p.theme.secondary}`
+        : `2px solid ${p.theme.primary}`};
+  }
+`;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-elements/timeline-outline/timeline-outline.tsx.html b/coverage/lcov-report/components/timeline-elements/timeline-outline/timeline-outline.tsx.html new file mode 100644 index 00000000..746307f0 --- /dev/null +++ b/coverage/lcov-report/components/timeline-elements/timeline-outline/timeline-outline.tsx.html @@ -0,0 +1,414 @@ + + + + + + Code coverage report for components/timeline-elements/timeline-outline/timeline-outline.tsx + + + + + + + + + +
+
+

All files / components/timeline-elements/timeline-outline timeline-outline.tsx

+
+ +
+ 47.27% + Statements + 52/110 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 47.27% + Lines + 52/110 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +1111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x + 
import { Theme } from '@models/Theme';
+import { TimelineMode } from '@models/TimelineModel';
+import React, {
+  useCallback,
+  useContext,
+  useEffect,
+  useMemo,
+  useState,
+} from 'react';
+import { GlobalContext } from '../../GlobalContext';
+import CloseIcon from '../../icons/close';
+import MenuIcon from '../../icons/menu';
+import {
+  OutlineButton,
+  OutlinePane,
+  OutlineWrapper,
+} from './timeline-outline.styles';
+import { OutlineItemList } from './timeline-outline-item-list';
+ 
+export enum OutlinePosition {
+  'left',
+  'right',
+}
+ 
+interface TimelineOutlineModel {
+  items?: TimelineOutlineItem[];
+  mode?: TimelineMode;
+  onSelect?: (index: number) => void;
+  theme?: Theme;
+}
+ 
+export interface TimelineOutlineItem {
+  id?: string;
+  name?: string;
+  selected?: boolean;
+}
+ 
+/**
+ * TimelineOutline component
+ * This component renders the outline pane of a timeline, including a list of items and corresponding selection functionality.
+ * It provides an interface to toggle the outline pane and select items within the timeline.
+ * The component leverages memoization to prevent unnecessary re-renders and optimizes the rendering process.
+ *
+ * @property {TimelineOutlineItem[]} items - The items to be displayed in the outline.
+ * @property {TimelineMode} mode - The mode of the timeline which determines the outline position.
+ * @property {function} onSelect - The callback to be invoked when an item is selected.
+ * @property {Theme} theme - The theme object, used for styling.
+ * @returns {JSX.Element} The TimelineOutline component.
+ */
+const TimelineOutline: React.FC<TimelineOutlineModel> = ({
+  items = [],
+  onSelect,
+  mode,
+  theme,
+}: TimelineOutlineModel) => {
+  const [openPane, setOpenPane] = useState(false);
+  const [showList, setShowList] = useState(false);
+
+  const { theme: globalTheme } = useContext(GlobalContext);
+  const mergedTheme = theme || globalTheme;
+
+  const togglePane = useCallback(() => setOpenPane((prev) => !prev), []);
+
+  const position = useMemo(
+    () =>
+      mode === 'VERTICAL' || mode === 'VERTICAL_ALTERNATING'
+        ? OutlinePosition.right
+        : OutlinePosition.left,
+    [mode],
+  );
+
+  useEffect(() => {
+    if (openPane) {
+      setShowList(true);
+    } else {
+      setShowList(false);
+    }
+  }, [openPane]);
+
+  const handleSelection = useCallback(
+    (index: number, id?: string) => {
+      if (onSelect) onSelect(index);
+    },
+    [onSelect],
+  );
+
+  return (
+    <OutlineWrapper position={position} open={openPane}>
+      <OutlineButton
+        onPointerDown={togglePane}
+        theme={mergedTheme}
+        open={openPane}
+        position={position}
+      >
+        {openPane ? <CloseIcon /> : <MenuIcon />}
+      </OutlineButton>
+      <OutlinePane open={openPane}>
+        {showList && (
+          <OutlineItemList
+            items={items}
+            handleSelection={handleSelection}
+            theme={mergedTheme}
+          />
+        )}
+      </OutlinePane>
+    </OutlineWrapper>
+  );
+};
+ 
+export { TimelineOutline };
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-horizontal/index.html b/coverage/lcov-report/components/timeline-horizontal/index.html new file mode 100644 index 00000000..2fbdff65 --- /dev/null +++ b/coverage/lcov-report/components/timeline-horizontal/index.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for components/timeline-horizontal + + + + + + + + + +
+
+

All files components/timeline-horizontal

+
+ +
+ 47.05% + Statements + 64/136 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 47.05% + Lines + 64/136 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
timeline-horizontal.styles.ts +
+
100%35/35100%0/0100%0/0100%35/35
timeline-horizontal.tsx +
+
28.71%29/101100%0/00%0/128.71%29/101
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-horizontal/timeline-horizontal.styles.ts.html b/coverage/lcov-report/components/timeline-horizontal/timeline-horizontal.styles.ts.html new file mode 100644 index 00000000..077a3f57 --- /dev/null +++ b/coverage/lcov-report/components/timeline-horizontal/timeline-horizontal.styles.ts.html @@ -0,0 +1,189 @@ + + + + + + Code coverage report for components/timeline-horizontal/timeline-horizontal.styles.ts + + + + + + + + + +
+
+

All files / components/timeline-horizontal timeline-horizontal.styles.ts

+
+ +
+ 100% + Statements + 35/35 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 35/35 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +361x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import styled from 'styled-components';
+ 
+export const TimelineHorizontalWrapper = styled.ul<{ flipLayout?: boolean }>`
+  display: flex;
+  list-style: none;
+  margin: 0;
+  width: 100%;
+  direction: ${(p) => (p.flipLayout ? 'rtl' : 'ltr')};
+ 
+  &.vertical {
+    flex-direction: column;
+  }
+  &.horizontal {
+    flex-direction: row;
+  }
+`;
+ 
+export const TimelineItemWrapper = styled.li<{ width: number }>`
+  width: ${(p) => p.width}px;
+  visibility: hidden;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 150px;
+  flex-direction: column;
+ 
+  &.vertical {
+    margin-bottom: 2rem;
+    width: 100%;
+  }
+ 
+  &.visible {
+    visibility: visible;
+  }
+`;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-horizontal/timeline-horizontal.tsx.html b/coverage/lcov-report/components/timeline-horizontal/timeline-horizontal.tsx.html new file mode 100644 index 00000000..cbc0c5cf --- /dev/null +++ b/coverage/lcov-report/components/timeline-horizontal/timeline-horizontal.tsx.html @@ -0,0 +1,387 @@ + + + + + + Code coverage report for components/timeline-horizontal/timeline-horizontal.tsx + + + + + + + + + +
+
+

All files / components/timeline-horizontal timeline-horizontal.tsx

+
+ +
+ 28.71% + Statements + 29/101 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 28.71% + Lines + 29/101 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +1021x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x + 
import { TimelineHorizontalModel } from '@models/TimelineHorizontalModel';
+import cls from 'classnames';
+import React, { ReactNode, useContext, useMemo } from 'react';
+import { GlobalContext } from '../GlobalContext';
+import TimelineCard from '../timeline-elements/timeline-card/timeline-horizontal-card';
+import {
+  TimelineHorizontalWrapper,
+  TimelineItemWrapper,
+} from './timeline-horizontal.styles';
+ 
+/**
+ * TimelineHorizontal
+ * @property {TimelineHorizontalModel} items - The items to be displayed in the timeline.
+ * @property {(item: TimelineItem) => void} handleItemClick - Function to handle item click.
+ * @property {boolean} autoScroll - Whether to auto-scroll the timeline.
+ * @property {string} wrapperId - The ID of the wrapper element.
+ * @property {boolean} slideShowRunning - Whether the slideshow is running.
+ * @property {() => void} onElapsed - Function to handle elapsed time.
+ * @property {React.ReactNode} contentDetailsChildren - The children nodes for content details.
+ * @property {boolean} hasFocus - Whether the timeline has focus.
+ * @property {React.ReactNode} iconChildren - The children nodes for icons.
+ * @property {number} nestedCardHeight - The height of the nested card.
+ * @property {boolean} isNested - Whether the card is nested.
+ * @returns {JSX.Element} The TimelineHorizontal component.
+ */
+ 
+const TimelineHorizontal: React.FunctionComponent<TimelineHorizontalModel> = ({
+  items,
+  handleItemClick,
+  autoScroll,
+  wrapperId,
+  slideShowRunning,
+  onElapsed,
+  contentDetailsChildren: children,
+  hasFocus,
+  iconChildren,
+  nestedCardHeight,
+  isNested,
+}: TimelineHorizontalModel) => {
+  const {
+    mode = 'HORIZONTAL',
+    itemWidth = 200,
+    cardHeight,
+    flipLayout,
+    showAllCardsHorizontal,
+    theme,
+    cardWidth,
+  } = useContext(GlobalContext);
+
+  // Memoize the wrapper class to avoid unnecessary re-renders
+  const wrapperClass = useMemo(
+    () =>
+      cls(
+        mode.toLowerCase(),
+        'timeline-horizontal-container',
+        showAllCardsHorizontal ? 'show-all-cards-horizontal' : '',
+      ),
+    [mode, showAllCardsHorizontal],
+  );
+
+  const iconChildColln = React.Children.toArray(iconChildren);
+
+  return (
+    <TimelineHorizontalWrapper
+      className={wrapperClass}
+      flipLayout={flipLayout}
+      data-testid="timeline-collection"
+    >
+      {items.map((item, index) => (
+        <TimelineItemWrapper
+          key={item.id}
+          width={itemWidth}
+          className={cls(
+            item.visible ? 'visible' : '',
+            'timeline-horz-item-container',
+          )}
+        >
+          <TimelineCard
+            {...item}
+            onClick={handleItemClick}
+            autoScroll={autoScroll}
+            wrapperId={wrapperId}
+            theme={theme}
+            slideShowRunning={slideShowRunning}
+            cardHeight={cardHeight}
+            onElapsed={onElapsed}
+            customContent={children ? (children as ReactNode[])[index] : null}
+            hasFocus={hasFocus}
+            iconChild={iconChildColln[index]}
+            active={item.active}
+            cardWidth={cardWidth}
+            isNested={isNested}
+            nestedCardHeight={nestedCardHeight}
+          />
+        </TimelineItemWrapper>
+      ))}
+    </TimelineHorizontalWrapper>
+  );
+};
+ 
+export default TimelineHorizontal;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-vertical/index.html b/coverage/lcov-report/components/timeline-vertical/index.html new file mode 100644 index 00000000..19d4e365 --- /dev/null +++ b/coverage/lcov-report/components/timeline-vertical/index.html @@ -0,0 +1,175 @@ + + + + + + Code coverage report for components/timeline-vertical + + + + + + + + + +
+
+

All files components/timeline-vertical

+
+ +
+ 80.11% + Statements + 548/684 +
+ + +
+ 55.76% + Branches + 29/52 +
+ + +
+ 83.33% + Functions + 10/12 +
+ + +
+ 80.11% + Lines + 548/684 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
timeline-point.tsx +
+
92.36%121/13160%6/100%0/192.36%121/131
timeline-vertical-item.tsx +
+
96.17%226/23533.33%4/12100%1/196.17%226/235
timeline-vertical-shape.styles.ts +
+
100%50/50100%11/11100%4/4100%50/50
timeline-vertical.styles.ts +
+
84.61%121/14342.1%8/19100%5/584.61%121/143
timeline-vertical.tsx +
+
24%30/125100%0/00%0/124%30/125
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-vertical/timeline-point.tsx.html b/coverage/lcov-report/components/timeline-vertical/timeline-point.tsx.html new file mode 100644 index 00000000..ea0571fb --- /dev/null +++ b/coverage/lcov-report/components/timeline-vertical/timeline-point.tsx.html @@ -0,0 +1,477 @@ + + + + + + Code coverage report for components/timeline-vertical/timeline-point.tsx + + + + + + + + + +
+
+

All files / components/timeline-vertical timeline-point.tsx

+
+ +
+ 92.36% + Statements + 121/131 +
+ + +
+ 60% + Branches + 6/10 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 92.36% + Lines + 121/131 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +1321x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +  +3x +3x +3x +3x +3x +3x +3x +3x +  +  +  +  +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +  +  +  +  +  +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x + 
import { TimelinePointModel } from '@models/TimelineVerticalModel';
+import cls from 'classnames';
+import React, { memo, useContext, useEffect, useMemo, useRef } from 'react';
+import { GlobalContext } from '../GlobalContext';
+import { Shape } from '../timeline-elements/timeline-card/timeline-horizontal-card.styles';
+import {
+  TimelinePointContainer,
+  TimelinePointWrapper,
+} from './timeline-vertical-shape.styles';
+ 
+/**
+ * TimelinePoint
+ * @property {string} className - The class name for the component.
+ * @property {string} id - The id of the timeline point.
+ * @property {() => void} onClick - Function to handle click event.
+ * @property {boolean} active - Whether the timeline point is active.
+ * @property {() => void} onActive - Function to handle active event.
+ * @property {boolean} slideShowRunning - Whether the slideshow is running.
+ * @property {React.ReactNode} iconChild - The icon child nodes.
+ * @property {number} timelinePointDimension - The dimension of the timeline point.
+ * @property {number} lineWidth - The width of the line.
+ * @property {boolean} disableClickOnCircle - Whether the click on circle is disabled.
+ * @property {boolean} cardLess - Whether the card is less.
+ * @returns {JSX.Element} The TimelinePoint component.
+ */
+const TimelinePoint: React.FunctionComponent<TimelinePointModel> = memo(
+  (props: TimelinePointModel) => {
+    const {
+      className,
+      id,
+      onClick,
+      active,
+      onActive,
+      slideShowRunning,
+      iconChild,
+      timelinePointDimension,
+      lineWidth,
+      disableClickOnCircle,
+      cardLess,
+    } = props;
+ 
+    const circleRef = useRef<HTMLDivElement>(null);
+    const { theme, focusActiveItemOnLoad, timelinePointShape } =
+      useContext(GlobalContext);
+ 
+    const isFirstRender = useRef(true);
+ 
+    // Determine if onActive can be invoked
+    const canInvokeOnActive = useMemo(() => {
+      if (focusActiveItemOnLoad) {
+        return active;
+      } else {
+        return active && !isFirstRender.current;
+      }
+    }, [active]);
+ 
+    // Invoke onActive if conditions are met
+    useEffect(() => {
+      if (canInvokeOnActive) {
+        const circle = circleRef.current;
+
+        circle && onActive(circle.offsetTop);
+      }
+    }, [canInvokeOnActive, active]);
+ 
+    // Determine circle class
+    const circleClass = useMemo(
+      () =>
+        cls({
+          active,
+          'using-icon': !!iconChild,
+        }),
+      [active, iconChild],
+    );
+ 
+    // Determine click handler props
+    const clickHandlerProps = useMemo(
+      () =>
+        !disableClickOnCircle && {
+          onClick: (ev: React.MouseEvent) => {
+            ev.stopPropagation();
+            if (id && onClick && !slideShowRunning) {
+              onClick(id);
+            }
+          },
+        },
+      [id, onClick, slideShowRunning, disableClickOnCircle],
+    );
+ 
+    // Update isFirstRender flag after first render
+    useEffect(() => {
+      if (isFirstRender.current) {
+        isFirstRender.current = false;
+      }
+    }, []);
+ 
+    return (
+      <TimelinePointWrapper
+        width={lineWidth}
+        bg={theme && theme.primary}
+        className={className}
+        data-testid="tree-leaf"
+        role="button"
+        $cardLess={cardLess}
+      >
+        <TimelinePointContainer
+          className={`${className} timeline-vertical-circle`}
+          {...clickHandlerProps}
+          ref={circleRef}
+          role="button"
+          data-testid="tree-leaf-click"
+          aria-label="select timeline"
+        >
+          <Shape
+            className={circleClass}
+            theme={theme}
+            dimension={timelinePointDimension}
+            $timelinePointShape={timelinePointShape}
+          >
+            {iconChild ? iconChild : null}
+          </Shape>
+        </TimelinePointContainer>
+      </TimelinePointWrapper>
+    );
+  },
+  (prev, next) => prev.active === next.active,
+);
+ 
+TimelinePoint.displayName = 'TimelinePoint';
+ 
+export { TimelinePoint };
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-vertical/timeline-vertical-item.tsx.html b/coverage/lcov-report/components/timeline-vertical/timeline-vertical-item.tsx.html new file mode 100644 index 00000000..b555976b --- /dev/null +++ b/coverage/lcov-report/components/timeline-vertical/timeline-vertical-item.tsx.html @@ -0,0 +1,789 @@ + + + + + + Code coverage report for components/timeline-vertical/timeline-vertical-item.tsx + + + + + + + + + +
+
+

All files / components/timeline-vertical timeline-vertical-item.tsx

+
+ +
+ 96.17% + Statements + 226/235 +
+ + +
+ 33.33% + Branches + 4/12 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 96.17% + Lines + 226/235 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +2361x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +  +  +  +  +2x +2x +2x +2x +2x +  +  +  +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +2x +2x +2x +2x +2x +1x +1x +1x +1x + 
import { VerticalItemModel } from '@models/TimelineVerticalModel';
+import cls from 'classnames';
+import React, { useCallback, useContext, useMemo, useRef } from 'react';
+import { GlobalContext } from '../GlobalContext';
+import TimelineCard from '../timeline-elements/timeline-card-content/timeline-card-content';
+import TimelineItemTitle from '../timeline-elements/timeline-item-title/timeline-card-title';
+import { TimelinePoint } from './timeline-point';
+import {
+  TimelineCardContentWrapper,
+  TimelineTitleWrapper,
+  VerticalItemWrapper,
+} from './timeline-vertical.styles';
+ 
+/**
+ * VerticalItem
+ * @property {boolean} active - Whether the vertical item is active.
+ * @property {boolean} alternateCards - Whether to alternate cards.
+ * @property {string} cardDetailedText - The detailed text of the card.
+ * @property {string} cardSubtitle - The subtitle of the card.
+ * @property {string} cardTitle - The title of the card.
+ * @property {string} url - The URL of the card.
+ * @property {string} className - The class name for the component.
+ * @property {React.ReactNode} contentDetailsChildren - The content details children nodes.
+ * @property {React.ReactNode} iconChild - The icon child nodes.
+ * @property {boolean} hasFocus - Whether the vertical item has focus.
+ * @property {string} id - The id of the vertical item.
+ * @property {React.ReactNode} media - The media nodes.
+ * @property {() => void} onActive - Function to handle active event.
+ * @property {() => void} onClick - Function to handle click event.
+ * @property {() => void} onElapsed - Function to handle elapsed event.
+ * @property {boolean} slideShowRunning - Whether the slideshow is running.
+ * @property {string} title - The title of the vertical item.
+ * @property {boolean} visible - Whether the vertical item is visible.
+ * @property {React.ReactNode} timelineContent - The timeline content nodes.
+ * @property {Array} items - The items of the vertical item.
+ * @property {boolean} isNested - Whether the vertical item is nested.
+ * @property {number} nestedCardHeight - The height of the nested card.
+ * @returns {JSX.Element} The VerticalItem component.
+ */
+const VerticalItem: React.FunctionComponent<VerticalItemModel> = (
+  props: VerticalItemModel,
+) => {
+  const contentRef = useRef<HTMLDivElement>(null);
+ 
+  const {
+    active,
+    alternateCards,
+    cardDetailedText,
+    cardSubtitle,
+    cardTitle,
+    url,
+    className,
+    contentDetailsChildren,
+    iconChild,
+    hasFocus,
+    id,
+    media,
+    onActive,
+    onClick,
+    onElapsed,
+    slideShowRunning,
+    title,
+    visible,
+    timelineContent,
+    items,
+    isNested,
+    nestedCardHeight,
+  } = props;
+ 
+  const {
+    cardHeight,
+    mode,
+    flipLayout,
+    timelinePointDimension,
+    lineWidth,
+    disableClickOnCircle,
+    cardLess,
+    theme,
+    classNames,
+    textOverlay,
+    mediaHeight,
+  } = useContext(GlobalContext);
+ 
+  // handler for onActive
+  const handleOnActive = useCallback(
+    (offset: number) => {
+      if (contentRef.current) {
+        const { offsetTop, clientHeight } = contentRef.current;
+        onActive(offsetTop + offset, offsetTop, clientHeight);
+      }
+    },
+    [onActive],
+  );
+ 
+  // handler for read more
+  const handleShowMore = useCallback(() => {
+    setTimeout(() => {
+      handleOnActive(0);
+    }, 100);
+  }, [handleOnActive]);
+ 
+  // timeline title
+  const Title = useMemo(() => {
+    return (
+      <TimelineTitleWrapper
+        className={className}
+        $alternateCards={alternateCards}
+        mode={mode}
+        $hide={!title}
+        $flip={flipLayout}
+      >
+        <TimelineItemTitle
+          title={title}
+          active={active}
+          theme={theme}
+          align={flipLayout ? 'left' : 'right'}
+          classString={classNames?.title}
+        />
+      </TimelineTitleWrapper>
+    );
+  }, [
+    active,
+    title,
+    className,
+    alternateCards,
+    mode,
+    flipLayout,
+    theme,
+    classNames,
+  ]);
+ 
+  const verticalItemClass = useMemo(
+    () =>
+      cls({ [className]: true }, 'vertical-item-row', visible ? 'visible' : ''),
+    [className, visible],
+  );
+ 
+  const contentClass = cls('card-content-wrapper', visible ? 'visible' : '', {
+    [className]: true,
+  });
+ 
+  // timeline circle
+  const TimelinePointMemo = useMemo(
+    () => (
+      <TimelinePoint
+        active={active}
+        alternateCards={alternateCards}
+        className={className}
+        id={id}
+        mode={mode}
+        onActive={handleOnActive}
+        onClick={onClick}
+        slideShowRunning={slideShowRunning}
+        iconChild={iconChild}
+        timelinePointDimension={timelinePointDimension}
+        lineWidth={lineWidth}
+        disableClickOnCircle={disableClickOnCircle}
+        cardLess={cardLess}
+      />
+    ),
+    [
+      slideShowRunning,
+      active,
+      alternateCards,
+      className,
+      id,
+      mode,
+      handleOnActive,
+      onClick,
+      iconChild,
+      timelinePointDimension,
+      lineWidth,
+      disableClickOnCircle,
+      cardLess,
+    ],
+  );
+ 
+  return (
+    <VerticalItemWrapper
+      $alternateCards={alternateCards}
+      $cardHeight={isNested ? nestedCardHeight : cardHeight}
+      className={verticalItemClass}
+      data-testid="vertical-item-row"
+      key={id}
+      ref={contentRef}
+      $cardLess={cardLess}
+      role="listitem"
+      $isNested={isNested}
+      theme={theme}
+    >
+      {/* title */}
+      {!isNested ? Title : null}
+ 
+      {/* card section */}
+      <TimelineCardContentWrapper
+        className={contentClass}
+        $alternateCards={alternateCards}
+        $noTitle={!title}
+        $flip={flipLayout}
+        height={textOverlay ? mediaHeight : cardHeight}
+      >
+        {!cardLess ? (
+          // <span></span>
+          <TimelineCard
+            active={active}
+            branchDir={className}
+            content={cardSubtitle}
+            customContent={contentDetailsChildren}
+            detailedText={cardDetailedText}
+            hasFocus={hasFocus}
+            id={id}
+            media={media}
+            onClick={onClick}
+            onElapsed={onElapsed}
+            onShowMore={handleShowMore}
+            slideShowActive={slideShowRunning}
+            theme={theme}
+            title={cardTitle}
+            url={url}
+            flip={flipLayout}
+            timelineContent={timelineContent}
+            items={items}
+            isNested={isNested}
+            nestedCardHeight={nestedCardHeight}
+          />
+        ) : null}
+      </TimelineCardContentWrapper>
+      {!isNested ? TimelinePointMemo : null}
+    </VerticalItemWrapper>
+  );
+};
+ 
+VerticalItem.displayName = 'VerticalItem';
+ 
+export default VerticalItem;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-vertical/timeline-vertical-shape.styles.ts.html b/coverage/lcov-report/components/timeline-vertical/timeline-vertical-shape.styles.ts.html new file mode 100644 index 00000000..fa719fe3 --- /dev/null +++ b/coverage/lcov-report/components/timeline-vertical/timeline-vertical-shape.styles.ts.html @@ -0,0 +1,234 @@ + + + + + + Code coverage report for components/timeline-vertical/timeline-vertical-shape.styles.ts + + + + + + + + + +
+
+

All files / components/timeline-vertical timeline-vertical-shape.styles.ts

+
+ +
+ 100% + Statements + 50/50 +
+ + +
+ 100% + Branches + 11/11 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 50/50 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +511x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import styled from 'styled-components';
+ 
+export const TimelinePointWrapper = styled.div<{
+  $cardLess?: boolean;
+  bg?: string;
+  width?: number;
+}>`
+  align-items: center;
+  display: flex;
+  justify-content: center;
+  position: relative;
+  width: ${(p) => (p.$cardLess ? '5%' : '10%')};
+ 
+  &.left {
+    order: 2;
+  }
+ 
+  &.right {
+    order: 1;
+  }
+ 
+  &::before {
+    background: ${(p) => p.bg};
+    width: ${(p) => (p.width ? `${p.width}px` : '4px')};
+    height: 2rem;
+    position: absolute;
+    content: '';
+    display: block;
+    left: 50%;
+    top: -1rem;
+    transform: translateY(-50%) translateX(-50%);
+  }
+ 
+  &::after {
+    background: ${(p) => p.bg};
+    content: '';
+    display: block;
+    height: 100%;
+    left: 50%;
+    position: absolute;
+    width: ${(p) => (p.width ? `${p.width}px` : '4px')};
+    z-index: 0;
+    transform: translateX(-50%);
+  }
+`;
+ 
+export const TimelinePointContainer = styled.div`
+  position: relative;
+  z-index: 1;
+`;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-vertical/timeline-vertical.styles.ts.html b/coverage/lcov-report/components/timeline-vertical/timeline-vertical.styles.ts.html new file mode 100644 index 00000000..093a6d8e --- /dev/null +++ b/coverage/lcov-report/components/timeline-vertical/timeline-vertical.styles.ts.html @@ -0,0 +1,513 @@ + + + + + + Code coverage report for components/timeline-vertical/timeline-vertical.styles.ts + + + + + + + + + +
+
+

All files / components/timeline-vertical timeline-vertical.styles.ts

+
+ +
+ 84.61% + Statements + 121/143 +
+ + +
+ 42.1% + Branches + 8/19 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 84.61% + Lines + 121/143 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +1441x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +  +2x +  +2x +2x +2x +2x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +  +2x +2x +2x +1x +1x +1x + 
import { Theme } from '@models/Theme';
+import { TimelineMode } from '@models/TimelineModel';
+import styled, { css, keyframes } from 'styled-components';
+ 
+export const TimelineVerticalWrapper = styled.div`
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+  padding: 1em;
+  outline: 0;
+`;
+ 
+const animateVisible = keyframes`
+  from {
+    opacity: 0;
+    visibility: hidden;
+  }
+  to {
+    opacity: 1;
+    visibility: visible;
+  }
+`;
+ 
+export const VerticalItemWrapper = styled.div<{
+  $alternateCards?: boolean;
+  $cardHeight?: number;
+  $cardLess?: boolean;
+  $isNested?: boolean;
+  theme?: Theme;
+}>`
+  display: flex;
+  position: relative;
+  visibility: hidden;
+  width: 100%;
+  align-items: stretch;
+  justify-content: center;
+  margin: 1rem 0;
+ 
+  &.left {
+    margin-right: auto;
+  }
+  &.right {
+    margin-left: auto;
+  }
+ 
+  &.visible {
+    visibility: visible;
+  }
+ 
+  ${(p) =>
+    p.$isNested
+      ? css`
+          position: relative;
+
+          &:not(:last-child)::after {
+            content: '';
+            position: absolute;
+            width: 2px;
+            height: 2rem;
+            background: ${(p) => p.theme.primary};
+            left: 50%;
+            transform: translateX(-50%);
+            bottom: -2rem;
+          }
+        `
+      : css``}
+`;
+ 
+export const TimelineCardContentWrapper = styled.div<{
+  $alternateCards?: boolean;
+  $cardLess?: boolean;
+  $flip?: boolean;
+  $noTitle?: boolean;
+  height?: number;
+}>`
+  visibility: hidden;
+  position: relative;
+  display: flex;
+  align-items: center;
+  ${(p) => {
+    if (p.$alternateCards) {
+      return `width: 50%;`;
+    } else if (p.$noTitle) {
+      return `width: 95%;`;
+    } else {
+      return `width: 75%;`;
+    }
+  }}
+  ${(p) => {
+    if (!p.$flip) {
+      return `
+        &.left {
+          order: 1;
+          justify-content: flex-end;
+        }
+        &.right {
+          order: 3;
+          justify-content: flex-start;
+        }
+      `;
+    } else {
+      return `
+        justify-content: flex-end;
+        &.left {
+          order: 3;
+        }
+        &.right {
+          order: 1;
+        }
+      `;
+    }
+  }}
+    &.visible {
+    visibility: visible;
+    animation: ${animateVisible} 0.25s ease-in;
+  }
+`;
+ 
+export const TimelineTitleWrapper = styled.div<{
+  $alternateCards?: boolean;
+  $flip?: boolean;
+  $hide?: boolean;
+  mode?: TimelineMode;
+}>`
+  align-items: center;
+  display: ${(p) => (p.$hide && p.mode === 'VERTICAL' ? 'none' : 'flex')};
+  ${(p) => (p.$alternateCards ? 'width: 50%' : 'width: 15%')};
+ 
+  &.left {
+    justify-content: ${(p) => (p.$flip ? 'flex-end' : 'flex-start')};
+    order: ${(p) => (p.$flip && p.mode === 'VERTICAL_ALTERNATING' ? '1' : '3')};
+  }
+ 
+  &.right {
+    ${(p) =>
+      p.$flip
+        ? `
+      order: 3;
+      justify-content: flex-start;`
+        : `order: 1;
+    justify-content: flex-end;`};
+  }
+`;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline-vertical/timeline-vertical.tsx.html b/coverage/lcov-report/components/timeline-vertical/timeline-vertical.tsx.html new file mode 100644 index 00000000..ec63bec2 --- /dev/null +++ b/coverage/lcov-report/components/timeline-vertical/timeline-vertical.tsx.html @@ -0,0 +1,459 @@ + + + + + + Code coverage report for components/timeline-vertical/timeline-vertical.tsx + + + + + + + + + +
+
+

All files / components/timeline-vertical timeline-vertical.tsx

+
+ +
+ 24% + Statements + 30/125 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 24% + Lines + 30/125 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +1261x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x + 
import { TimelineVerticalModel } from '@models/TimelineVerticalModel';
+import React, { useCallback, useMemo } from 'react';
+import { TimelineOutline } from '../timeline-elements/timeline-outline/timeline-outline';
+import TimelineVerticalItem from './timeline-vertical-item';
+import { TimelineVerticalWrapper } from './timeline-vertical.styles';
+ 
+/**
+ * TimelineVertical
+ * @property {boolean} alternateCards - Whether to alternate cards.
+ * @property {() => void} autoScroll - Function to handle auto scroll.
+ * @property {React.ReactNode} contentDetailsChildren - The content details children nodes.
+ * @property {boolean} enableOutline - Whether to enable outline.
+ * @property {boolean} hasFocus - Whether the timeline has focus.
+ * @property {React.ReactNode} iconChildren - The icon children nodes.
+ * @property {Array} items - The items of the timeline.
+ * @property {string} mode - The mode of the timeline.
+ * @property {() => void} onClick - Function to handle click event.
+ * @property {() => void} onElapsed - Function to handle elapsed event.
+ * @property {() => void} onOutlineSelection - Function to handle outline selection.
+ * @property {boolean} slideShowRunning - Whether the slideshow is running.
+ * @property {Object} theme - The theme of the timeline.
+ * @property {boolean} cardLess - Whether the card is less.
+ * @property {number} nestedCardHeight - The height of the nested card.
+ * @returns {JSX.Element} The TimelineVertical component.
+ */
+const TimelineVertical: React.FunctionComponent<TimelineVerticalModel> = ({
+  alternateCards = true,
+  autoScroll,
+  contentDetailsChildren,
+  enableOutline,
+  hasFocus,
+  iconChildren,
+  items,
+  mode,
+  onClick,
+  onElapsed,
+  onOutlineSelection,
+  slideShowRunning,
+  theme,
+  cardLess,
+  nestedCardHeight,
+}: TimelineVerticalModel) => {
+  // check if the timeline that has become active is visible.
+  // if not auto scroll the content and bring it to the view.
+  const handleOnActive = useCallback(
+    (offset: number, wrapperOffset: number, height: number) => {
+      autoScroll({
+        contentHeight: height,
+        contentOffset: wrapperOffset,
+        pointOffset: offset,
+      });
+    },
+    [autoScroll],
+  );
+
+  // todo remove this
+  const handleOnShowMore = useCallback(() => {}, []);
+
+  const outlineItems = useMemo(
+    () =>
+      items.map((item) => ({
+        id: Math.random().toString(16).slice(2),
+        name: item.title,
+      })),
+    [items],
+  );
+
+  return (
+    <TimelineVerticalWrapper data-testid="tree-main" role="list">
+      {enableOutline && (
+        <TimelineOutline
+          theme={theme}
+          mode={mode}
+          items={outlineItems}
+          onSelect={onOutlineSelection}
+        />
+      )}
+      {items.map((item, index) => {
+        let className = '';
+
+        // in tree mode alternate cards position
+        if (alternateCards) {
+          className = index % 2 === 0 ? 'left' : 'right';
+        } else {
+          className = 'right';
+        }
+
+        const contentDetails =
+          (contentDetailsChildren &&
+            (contentDetailsChildren as React.ReactNode[])[index]) ||
+          null;
+
+        const customIcon = Array.isArray(iconChildren)
+          ? iconChildren[index]
+          : index === 0
+          ? iconChildren
+          : null;
+
+        return (
+          <TimelineVerticalItem
+            {...item}
+            alternateCards={alternateCards}
+            className={className}
+            contentDetailsChildren={contentDetails}
+            iconChild={customIcon}
+            hasFocus={hasFocus}
+            index={index}
+            key={item.id}
+            onActive={handleOnActive}
+            onClick={onClick}
+            onElapsed={onElapsed}
+            onShowMore={handleOnShowMore}
+            slideShowRunning={slideShowRunning}
+            cardLess={cardLess}
+            nestedCardHeight={nestedCardHeight}
+          />
+        );
+      })}
+    </TimelineVerticalWrapper>
+  );
+};
+ 
+TimelineVertical.displayName = 'TimelineVertical';
+ 
+export default TimelineVertical;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline/index.html b/coverage/lcov-report/components/timeline/index.html new file mode 100644 index 00000000..299d9a63 --- /dev/null +++ b/coverage/lcov-report/components/timeline/index.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for components/timeline + + + + + + + + + +
+
+

All files components/timeline

+
+ +
+ 25.36% + Statements + 156/615 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 25.36% + Lines + 156/615 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
timeline.style.ts +
+
81.87%122/149100%0/00%0/381.87%122/149
timeline.tsx +
+
7.29%34/466100%0/00%0/17.29%34/466
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline/timeline.style.ts.html b/coverage/lcov-report/components/timeline/timeline.style.ts.html new file mode 100644 index 00000000..21be13c5 --- /dev/null +++ b/coverage/lcov-report/components/timeline/timeline.style.ts.html @@ -0,0 +1,531 @@ + + + + + + Code coverage report for components/timeline/timeline.style.ts + + + + + + + + + +
+
+

All files / components/timeline timeline.style.ts

+
+ +
+ 81.87% + Statements + 122/149 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 81.87% + Lines + 122/149 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +1501x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { Theme } from '@models/Theme';
+import { TimelineMode } from '@models/TimelineModel';
+import styled from 'styled-components';
+import { ScrollBar } from '../common/styles';
+ 
+export const Wrapper = styled.div<{
+  $hideControls?: boolean;
+  cardPositionHorizontal?: 'TOP' | 'BOTTOM';
+}>`
+  display: flex;
+  flex-direction: column;
+  /* cannot remove this */
+  height: 100%;
+ 
+  &:focus {
+    outline: 0;
+  }
+ 
+  overflow: hidden;
+  position: relative;
+  width: 100%;
+ 
+  ${(p) =>
+    p.cardPositionHorizontal === 'TOP' && !p.$hideControls
+      ? `
+    & > div:nth-of-type(1) {
+      order: 2;
+    }
+    & > div:nth-of-type(2) {
+      order: 3;
+    }
+    & > div:nth-of-type(3) {
+      order: 1;
+    }
+  `
+      : ''};
+ 
+  ${(p) =>
+    p.cardPositionHorizontal === 'TOP' && p.$hideControls
+      ? `
+    & > div:nth-of-type(1) {
+      order: 2;
+    }
+    & > div:nth-of-type(2) {
+      order: 1;
+    }
+  `
+      : ''};
+ 
+  &.horizontal {
+    justify-content: flex-start;
+  }
+ 
+  &.js-focus-visible :focus:not(.focus-visible) {
+    outline: 0;
+  }
+ 
+  &.js-focus-visible .focus-visible {
+    outline: 2px solid #528deb;
+  }
+`;
+ 
+export const TimelineMainWrapper = styled.div<{
+  $scrollable?: boolean | { scrollbar: boolean };
+  mode?: TimelineMode;
+  theme?: Theme;
+}>`
+  align-items: flex-start;
+  display: flex;
+  justify-content: center;
+  overflow-y: auto;
+  overflow-x: hidden;
+  overscroll-behavior: contain;
+  ${(p) => (p.mode === 'HORIZONTAL' ? 'position: relative' : '')};
+  scroll-behavior: smooth;
+  width: 100%;
+ 
+  ${ScrollBar}
+ 
+  &.horizontal {
+    min-height: 150px;
+  }
+ 
+  padding: ${({ $scrollable }) => (!$scrollable ? '0 1rem 0' : '')};
+`;
+ 
+export const TimelineMain = styled.div`
+  align-items: center;
+  display: flex;
+  left: 0;
+  top: 50%;
+  position: absolute;
+  transition: all 0.2s ease;
+  transform: translate(0, -50%);
+ 
+  &.vertical {
+    align-items: flex-start;
+    height: 100%;
+    justify-content: flex-start;
+    width: 100%;
+  }
+`;
+ 
+export const Outline = styled.div<{ color?: string; height?: number }>`
+  background: ${(p) => p.color};
+  height: ${(p) => `${p.height}px`};
+  left: 0;
+  margin-left: auto;
+  margin-right: auto;
+  position: absolute;
+  right: 0;
+  width: 100%;
+`;
+ 
+export const TimelineControlContainer = styled.div<{
+  active?: boolean;
+  mode?: TimelineMode;
+}>`
+  align-items: center;
+  display: flex;
+  justify-content: center;
+  min-height: 3rem;
+ 
+  filter: ${(p) => {
+    if (p.active) {
+      return `opacity(1);`;
+    } else {
+      return `opacity(0.9);`;
+    }
+  }};
+ 
+  &.hide {
+    visibility: hidden;
+  }
+ 
+  &.show {
+    visibility: visible;
+  }
+`;
+ 
+export const TimelineContentRender = styled.div<{ $showAllCards?: boolean }>`
+  margin-left: auto;
+  margin-right: auto;
+  width: 98%;
+  display: flex;
+  align-items: flex-start;
+  justify-content: ${(p) => (p.$showAllCards ? 'flex-start' : 'center')};
+  overflow-x: hidden;
+`;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/components/timeline/timeline.tsx.html b/coverage/lcov-report/components/timeline/timeline.tsx.html new file mode 100644 index 00000000..e9bd62c7 --- /dev/null +++ b/coverage/lcov-report/components/timeline/timeline.tsx.html @@ -0,0 +1,1482 @@ + + + + + + Code coverage report for components/timeline/timeline.tsx + + + + + + + + + +
+
+

All files / components/timeline timeline.tsx

+
+ +
+ 7.29% + Statements + 34/466 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 7.29% + Lines + 34/466 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +4671x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x + 
import { Scroll } from '@models/TimelineHorizontalModel';
+import { TimelineCardModel } from '@models/TimelineItemModel';
+import { TimelineModel } from '@models/TimelineModel';
+import { uniqueID as genUniqueID } from '@utils/index';
+import cls from 'classnames';
+import 'focus-visible';
+import React, {
+  useCallback,
+  useContext,
+  useEffect,
+  useMemo,
+  useRef,
+  useState,
+} from 'react';
+import { GlobalContext } from '../GlobalContext';
+import { useMatchMedia } from '../effects/useMatchMedia';
+import useNewScrollPosition from '../effects/useNewScrollPosition';
+import TimelineControl from '../timeline-elements/timeline-control/timeline-control';
+import TimelineHorizontal from '../timeline-horizontal/timeline-horizontal';
+import TimelineVertical from '../timeline-vertical/timeline-vertical';
+import {
+  Outline,
+  TimelineContentRender,
+  TimelineControlContainer,
+  TimelineMain,
+  TimelineMainWrapper,
+  Wrapper,
+} from './timeline.style';
+ 
+const Timeline: React.FunctionComponent<TimelineModel> = (
+  props: TimelineModel,
+) => {
+  // de-structure the props
+  const {
+    activeTimelineItem,
+    contentDetailsChildren,
+    iconChildren,
+    items = [],
+    onFirst,
+    onLast,
+    onNext,
+    onPrevious,
+    onRestartSlideshow,
+    onTimelineUpdated,
+    onItemSelected,
+    onOutlineSelection,
+    slideShowEnabled,
+    slideShowRunning,
+    mode = 'HORIZONTAL',
+    enableOutline = false,
+    hideControls = false,
+    nestedCardHeight,
+    isChild = false,
+    onPaused,
+    uniqueId,
+    noUniqueId,
+  } = props;
+
+  const {
+    cardPositionHorizontal,
+    disableNavOnKey,
+    flipLayout,
+    itemWidth = 200,
+    lineWidth,
+    onScrollEnd,
+    scrollable = true,
+    showAllCardsHorizontal,
+    theme,
+    darkMode,
+    toggleDarkMode,
+    verticalBreakPoint = 768,
+    enableBreakPoint,
+  } = useContext(GlobalContext);
+
+  const [newOffSet, setNewOffset] = useNewScrollPosition(mode, itemWidth);
+  const observer = useRef<IntersectionObserver | null>(null);
+  const [hasFocus, setHasFocus] = useState(false);
+  const horizontalContentRef = useRef<HTMLDivElement | null>(null);
+  const [timelineMode, setTimelineMode] = useState(mode);
+
+  // const activeItemIndex = useRef<number>(activeTimelineItem);
+
+  // reference to the timeline
+  const timelineMainRef = useRef<HTMLDivElement>(null);
+
+  const canScrollTimeline = useMemo(() => {
+    if (!slideShowRunning) {
+      if (typeof scrollable === 'boolean') {
+        return scrollable;
+      }
+
+      if (typeof scrollable === 'object' && scrollable.scrollbar) {
+        return scrollable.scrollbar;
+      }
+    }
+  }, [slideShowRunning, scrollable]);
+
+  const id = useRef(
+    `react-chrono-timeline-${noUniqueId ? uniqueId : genUniqueID()}`,
+  );
+
+  useMatchMedia(
+    `(min-width: 100px) and (max-width: ${verticalBreakPoint}px)`,
+    () => {
+      if (mode === 'VERTICAL_ALTERNATING') {
+        setTimelineMode('VERTICAL');
+      }
+    },
+    enableBreakPoint,
+  );
+
+  useMatchMedia(
+    `(min-width: ${verticalBreakPoint + 1}px)`,
+    () => {
+      setTimelineMode(mode);
+    },
+    enableBreakPoint,
+  );
+
+  // handlers for navigation
+  const handleNext = useCallback(() => {
+    hasFocus && onNext?.();
+  }, [hasFocus, onNext]);
+
+  const handlePrevious = useCallback(
+    () => hasFocus && onPrevious?.(),
+    [hasFocus, onPrevious],
+  );
+
+  const handleFirst = useCallback(() => {
+    hasFocus && onFirst?.();
+  }, [hasFocus, onFirst]);
+
+  const handleLast = useCallback(
+    () => hasFocus && onLast?.(),
+    [hasFocus, onLast],
+  );
+
+  // handler for keyboard navigation
+  const handleKeySelection = useCallback(
+    (event: React.KeyboardEvent<HTMLDivElement>) => {
+      const { key } = event;
+
+      if (mode === 'HORIZONTAL' && key === 'ArrowRight') {
+        flipLayout ? handlePrevious() : handleNext();
+      } else if (mode === 'HORIZONTAL' && key === 'ArrowLeft') {
+        flipLayout ? handleNext() : handlePrevious();
+      } else if (
+        (mode === 'VERTICAL' || mode === 'VERTICAL_ALTERNATING') &&
+        key === 'ArrowDown'
+      ) {
+        handleNext();
+      } else if (
+        (mode === 'VERTICAL' || mode === 'VERTICAL_ALTERNATING') &&
+        key === 'ArrowUp'
+      ) {
+        handlePrevious();
+      } else if (key === 'Home') {
+        handleFirst();
+      } else if (key === 'End') {
+        handleLast();
+      }
+    },
+    [handleNext, handlePrevious, handleLast],
+  );
+
+  const handleTimelineItemClick = (itemId?: string, isSlideShow?: boolean) => {
+    if (itemId) {
+      for (let idx = 0; idx < items.length; idx++) {
+        if (items[idx].id === itemId) {
+          if (isSlideShow && idx < items.length - 1) {
+            onTimelineUpdated?.(idx + 1);
+          } else {
+            onTimelineUpdated?.(idx);
+          }
+          break;
+        }
+      }
+
+      // const selectedItem = items.find((item) => item.id === itemId);
+
+      // if (selectedItem) {
+      //   onItemSelected?.(selectedItem);
+      // }
+    }
+  };
+
+  useEffect(() => {
+    const activeItem = items[activeTimelineItem || 0];
+
+    if (items.length && activeItem) {
+      // const item = items[activeItem];
+      onItemSelected?.(activeItem);
+
+      if (mode === 'HORIZONTAL') {
+        const card = horizontalContentRef.current?.querySelector(
+          `#timeline-card-${activeItem.id}`,
+        );
+
+        const cardRect = card?.getBoundingClientRect();
+        const contentRect =
+          horizontalContentRef.current?.getBoundingClientRect();
+
+        if (cardRect && contentRect) {
+          const { width: cardWidth, left: cardLeft } = cardRect;
+          const { width: contentWidth, left: contentLeft } = contentRect;
+          setTimeout(() => {
+            const ele = horizontalContentRef.current as HTMLElement;
+            ele.style.scrollBehavior = 'smooth';
+            ele.scrollLeft +=
+              cardLeft - contentLeft + cardWidth / 2 - contentWidth / 2;
+          }, 100);
+        }
+      }
+    }
+  }, [activeTimelineItem, items.length]);
+
+  const handleScroll = (scroll: Partial<Scroll>) => {
+    const element = timelineMainRef.current;
+    if (element) {
+      setNewOffset(element, scroll);
+    }
+  };
+
+  useEffect(() => {
+    const ele = timelineMainRef.current;
+    if (!ele) {
+      return;
+    }
+    if (mode === 'HORIZONTAL') {
+      ele.scrollLeft = Math.max(newOffSet, 0);
+    } else {
+      ele.scrollTop = newOffSet;
+    }
+  }, [newOffSet]);
+
+  useEffect(() => {
+    // setup observer for the timeline elements
+    setTimeout(() => {
+      const element = timelineMainRef.current;
+
+      if (element) {
+        const childElements = element.querySelectorAll('.vertical-item-row');
+        Array.from(childElements).forEach((elem) => {
+          if (observer.current) {
+            observer.current.observe(elem);
+          }
+        });
+      }
+    }, 0);
+
+    const toggleMedia = (elem: HTMLElement, state: string) => {
+      elem
+        .querySelectorAll('img,video')
+        .forEach(
+          (ele) =>
+            ((ele as HTMLElement).style.visibility =
+              state === 'hide' ? 'hidden' : 'visible'),
+        );
+    };
+
+    if (mode !== 'HORIZONTAL') {
+      observer.current = new IntersectionObserver(
+        (entries) => {
+          entries.forEach((entry) => {
+            const element = entry.target as HTMLDivElement;
+            if (entry.isIntersecting) {
+              // show img and video when visible.
+              toggleMedia(element, 'show');
+            } else {
+              // hide img and video when not visible.
+              toggleMedia(element, 'hide');
+              // pause YouTube embeds
+              element.querySelectorAll('iframe').forEach((element) => {
+                element.contentWindow?.postMessage(
+                  '{"event":"command","func":"stopVideo","args":""}',
+                  '*',
+                );
+              });
+            }
+          });
+        },
+        {
+          root: timelineMainRef.current,
+          threshold: 0,
+        },
+      );
+    }
+
+    return () => {
+      if (observer.current) {
+        observer.current.disconnect();
+      }
+    };
+    // eslint-disable-next-line
+  }, []);
+
+  const handleKeyDown = useCallback(
+    (evt: React.KeyboardEvent<HTMLDivElement>) => {
+      if (!disableNavOnKey && !slideShowRunning) {
+        setHasFocus(true);
+        handleKeySelection(evt);
+      }
+    },
+    [disableNavOnKey, slideShowRunning, handleKeySelection],
+  );
+
+  const wrapperClass = useMemo(() => {
+    return cls(mode.toLocaleLowerCase(), {
+      'focus-visible': !isChild,
+      'js-focus-visible': !isChild,
+    });
+  }, [mode, isChild]);
+
+  return (
+    <Wrapper
+      // tabIndex={0}
+      onKeyDown={handleKeyDown}
+      className={wrapperClass}
+      cardPositionHorizontal={cardPositionHorizontal}
+      onMouseDown={() => {
+        setHasFocus(true);
+      }}
+      $hideControls={hideControls}
+      onKeyUp={(evt) => {
+        if (evt.key === 'Escape') {
+          onPaused?.();
+        }
+      }}
+    >
+      <TimelineMainWrapper
+        ref={timelineMainRef}
+        $scrollable={canScrollTimeline}
+        className={`${mode.toLowerCase()} timeline-main-wrapper`}
+        id="timeline-main-wrapper"
+        theme={theme}
+        mode={mode}
+        onScroll={(ev) => {
+          const target = ev.target as HTMLElement;
+          let scrolled = 0;
+
+          if (mode === 'VERTICAL' || mode === 'VERTICAL_ALTERNATING') {
+            scrolled = target.scrollTop + target.clientHeight;
+
+            if (target.scrollHeight - scrolled < 1) {
+              onScrollEnd?.();
+            }
+          } else {
+            scrolled = target.scrollLeft + target.offsetWidth;
+
+            if (target.scrollWidth === scrolled) {
+              onScrollEnd?.();
+            }
+          }
+        }}
+      >
+        {/* VERTICAL ALTERNATING */}
+        {timelineMode === 'VERTICAL_ALTERNATING' ? (
+          <TimelineVertical
+            activeTimelineItem={activeTimelineItem}
+            autoScroll={handleScroll}
+            contentDetailsChildren={contentDetailsChildren}
+            hasFocus={hasFocus}
+            iconChildren={iconChildren}
+            items={items as TimelineCardModel[]}
+            mode={timelineMode}
+            onClick={handleTimelineItemClick}
+            onElapsed={(itemId?: string) =>
+              handleTimelineItemClick(itemId, true)
+            }
+            onOutlineSelection={onOutlineSelection}
+            slideShowRunning={slideShowRunning}
+            theme={theme}
+            enableOutline={enableOutline}
+            nestedCardHeight={nestedCardHeight}
+          />
+        ) : null}
+
+        {/* HORIZONTAL */}
+        {timelineMode === 'HORIZONTAL' ? (
+          <TimelineMain className={mode.toLowerCase()}>
+            <Outline color={theme && theme.primary} height={lineWidth} />
+            <TimelineHorizontal
+              autoScroll={handleScroll}
+              contentDetailsChildren={contentDetailsChildren}
+              handleItemClick={handleTimelineItemClick}
+              hasFocus={hasFocus}
+              iconChildren={iconChildren}
+              items={items as TimelineCardModel[]}
+              mode={timelineMode}
+              onElapsed={(itemId?: string) =>
+                handleTimelineItemClick(itemId, true)
+              }
+              slideShowRunning={slideShowRunning}
+              wrapperId={id.current}
+              nestedCardHeight={nestedCardHeight}
+            />
+          </TimelineMain>
+        ) : null}
+
+        {/* VERTICAL */}
+        {timelineMode === 'VERTICAL' ? (
+          <TimelineVertical
+            activeTimelineItem={activeTimelineItem}
+            alternateCards={false}
+            autoScroll={handleScroll}
+            contentDetailsChildren={contentDetailsChildren}
+            hasFocus={hasFocus}
+            iconChildren={iconChildren}
+            items={items as TimelineCardModel[]}
+            mode={mode}
+            onClick={handleTimelineItemClick}
+            onElapsed={(itemId?: string) =>
+              handleTimelineItemClick(itemId, true)
+            }
+            onOutlineSelection={onOutlineSelection}
+            slideShowRunning={slideShowRunning}
+            theme={theme}
+            enableOutline={enableOutline}
+            nestedCardHeight={nestedCardHeight}
+          />
+        ) : null}
+      </TimelineMainWrapper>
+
+      {/* Timeline Controls */}
+      {!hideControls && (
+        <TimelineControlContainer mode={mode}>
+          <TimelineControl
+            disableLeft={
+              flipLayout
+                ? activeTimelineItem === items.length - 1
+                : activeTimelineItem === 0
+            }
+            disableRight={
+              flipLayout
+                ? activeTimelineItem === 0
+                : activeTimelineItem === items.length - 1
+            }
+            id={id.current}
+            onFirst={handleFirst}
+            onLast={handleLast}
+            onNext={handleNext}
+            onPrevious={handlePrevious}
+            onReplay={onRestartSlideshow}
+            slideShowEnabled={slideShowEnabled}
+            slideShowRunning={slideShowRunning}
+            isDark={darkMode}
+            onToggleDarkMode={toggleDarkMode}
+            onPaused={onPaused}
+          />
+        </TimelineControlContainer>
+      )}
+
+      {/* placeholder to render timeline content for horizontal mode */}
+      <TimelineContentRender
+        id={id.current}
+        $showAllCards={showAllCardsHorizontal}
+        ref={horizontalContentRef}
+      />
+    </Wrapper>
+  );
+};
+ 
+Timeline.displayName = 'Timeline';
+ 
+export default Timeline;
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov-report/favicon.png b/coverage/lcov-report/favicon.png new file mode 100644 index 00000000..c1525b81 Binary files /dev/null and b/coverage/lcov-report/favicon.png differ diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html new file mode 100644 index 00000000..6f96707e --- /dev/null +++ b/coverage/lcov-report/index.html @@ -0,0 +1,355 @@ + + + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 75.7% + Statements + 4023/5314 +
+ + +
+ 69.8% + Branches + 326/467 +
+ + +
+ 70.37% + Functions + 95/135 +
+ + +
+ 75.7% + Lines + 4023/5314 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
components +
+
19.86%29/146100%0/00%0/119.86%29/146
components/common/styles +
+
100%19/19100%3/3100%2/2100%19/19
components/common/test +
+
100%83/83100%1/114.28%1/7100%83/83
components/common/themes +
+
100%41/41100%0/0100%0/0100%41/41
components/effects +
+
43.28%58/13490%9/1033.33%1/343.28%58/134
components/icons +
+
69.25%187/270100%8/857.14%8/1469.25%187/270
components/timeline +
+
25.36%156/615100%0/00%0/425.36%156/615
components/timeline-elements/memoized +
+
95.97%167/17480.64%25/3133.33%1/395.97%167/174
components/timeline-elements/timeline-card +
+
96.81%334/34562.16%23/3791.66%11/1296.81%334/345
components/timeline-elements/timeline-card-content +
+
86.17%1041/120867.58%98/14590.32%28/3186.17%1041/1208
components/timeline-elements/timeline-card-media +
+
89.65%624/69677.14%81/10585.71%18/2189.65%624/696
components/timeline-elements/timeline-control +
+
98%294/30042.85%18/42100%3/398%294/300
components/timeline-elements/timeline-item-title +
+
100%73/7388.88%16/18100%6/6100%73/73
components/timeline-elements/timeline-outline +
+
73.68%238/323100%1/10%0/973.68%238/323
components/timeline-horizontal +
+
47.05%64/136100%0/00%0/147.05%64/136
components/timeline-vertical +
+
80.11%548/68455.76%29/5283.33%10/1280.11%548/684
utils +
+
100%67/67100%14/14100%6/6100%67/67
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css new file mode 100644 index 00000000..b317a7cd --- /dev/null +++ b/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js new file mode 100644 index 00000000..6ab87b2a --- /dev/null +++ b/coverage/lcov-report/prettify.js @@ -0,0 +1,1008 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION = true; +(function () { + var h = ['break,continue,do,else,for,if,return,while']; + var u = [ + h, + 'auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile', + ]; + var p = [ + u, + 'catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof', + ]; + var l = [ + p, + 'alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where', + ]; + var x = [ + p, + 'abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient', + ]; + var R = [ + x, + 'as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var', + ]; + var r = + 'all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes'; + var w = [ + p, + 'debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN', + ]; + var s = + 'caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END'; + var I = [ + h, + 'and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None', + ]; + var f = [ + h, + 'alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END', + ]; + var H = [h, 'case,done,elif,esac,eval,fi,function,in,local,set,then,until']; + var A = [l, R, w, s + I, f, H]; + var e = + /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/; + var C = 'str'; + var z = 'kwd'; + var j = 'com'; + var O = 'typ'; + var G = 'lit'; + var L = 'pun'; + var F = 'pln'; + var m = 'tag'; + var E = 'dec'; + var J = 'src'; + var P = 'atn'; + var n = 'atv'; + var N = 'nocode'; + var M = + '(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*'; + function k(Z) { + var ad = 0; + var S = false; + var ac = false; + for (var V = 0, U = Z.length; V < U; ++V) { + var ae = Z[V]; + if (ae.ignoreCase) { + ac = true; + } else { + if ( + /[a-z]/i.test( + ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''), + ) + ) { + S = true; + ac = false; + break; + } + } + } + var Y = { b: 8, t: 9, n: 10, v: 11, f: 12, r: 13 }; + function ab(ah) { + var ag = ah.charCodeAt(0); + if (ag !== 92) { + return ag; + } + var af = ah.charAt(1); + ag = Y[af]; + if (ag) { + return ag; + } else { + if ('0' <= af && af <= '7') { + return parseInt(ah.substring(1), 8); + } else { + if (af === 'u' || af === 'x') { + return parseInt(ah.substring(2), 16); + } else { + return ah.charCodeAt(1); + } + } + } + } + function T(af) { + if (af < 32) { + return (af < 16 ? '\\x0' : '\\x') + af.toString(16); + } + var ag = String.fromCharCode(af); + if (ag === '\\' || ag === '-' || ag === '[' || ag === ']') { + ag = '\\' + ag; + } + return ag; + } + function X(am) { + var aq = am + .substring(1, am.length - 1) + .match( + new RegExp( + '\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]', + 'g', + ), + ); + var ak = []; + var af = []; + var ao = aq[0] === '^'; + for (var ar = ao ? 1 : 0, aj = aq.length; ar < aj; ++ar) { + var ah = aq[ar]; + if (/\\[bdsw]/i.test(ah)) { + ak.push(ah); + } else { + var ag = ab(ah); + var al; + if (ar + 2 < aj && '-' === aq[ar + 1]) { + al = ab(aq[ar + 2]); + ar += 2; + } else { + al = ag; + } + af.push([ag, al]); + if (!(al < 65 || ag > 122)) { + if (!(al < 65 || ag > 90)) { + af.push([Math.max(65, ag) | 32, Math.min(al, 90) | 32]); + } + if (!(al < 97 || ag > 122)) { + af.push([Math.max(97, ag) & ~32, Math.min(al, 122) & ~32]); + } + } + } + } + af.sort(function (av, au) { + return av[0] - au[0] || au[1] - av[1]; + }); + var ai = []; + var ap = [NaN, NaN]; + for (var ar = 0; ar < af.length; ++ar) { + var at = af[ar]; + if (at[0] <= ap[1] + 1) { + ap[1] = Math.max(ap[1], at[1]); + } else { + ai.push((ap = at)); + } + } + var an = ['[']; + if (ao) { + an.push('^'); + } + an.push.apply(an, ak); + for (var ar = 0; ar < ai.length; ++ar) { + var at = ai[ar]; + an.push(T(at[0])); + if (at[1] > at[0]) { + if (at[1] + 1 > at[0]) { + an.push('-'); + } + an.push(T(at[1])); + } + } + an.push(']'); + return an.join(''); + } + function W(al) { + var aj = al.source.match( + new RegExp( + '(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)', + 'g', + ), + ); + var ah = aj.length; + var an = []; + for (var ak = 0, am = 0; ak < ah; ++ak) { + var ag = aj[ak]; + if (ag === '(') { + ++am; + } else { + if ('\\' === ag.charAt(0)) { + var af = +ag.substring(1); + if (af && af <= am) { + an[af] = -1; + } + } + } + } + for (var ak = 1; ak < an.length; ++ak) { + if (-1 === an[ak]) { + an[ak] = ++ad; + } + } + for (var ak = 0, am = 0; ak < ah; ++ak) { + var ag = aj[ak]; + if (ag === '(') { + ++am; + if (an[am] === undefined) { + aj[ak] = '(?:'; + } + } else { + if ('\\' === ag.charAt(0)) { + var af = +ag.substring(1); + if (af && af <= am) { + aj[ak] = '\\' + an[am]; + } + } + } + } + for (var ak = 0, am = 0; ak < ah; ++ak) { + if ('^' === aj[ak] && '^' !== aj[ak + 1]) { + aj[ak] = ''; + } + } + if (al.ignoreCase && S) { + for (var ak = 0; ak < ah; ++ak) { + var ag = aj[ak]; + var ai = ag.charAt(0); + if (ag.length >= 2 && ai === '[') { + aj[ak] = X(ag); + } else { + if (ai !== '\\') { + aj[ak] = ag.replace(/[a-zA-Z]/g, function (ao) { + var ap = ao.charCodeAt(0); + return '[' + String.fromCharCode(ap & ~32, ap | 32) + ']'; + }); + } + } + } + } + return aj.join(''); + } + var aa = []; + for (var V = 0, U = Z.length; V < U; ++V) { + var ae = Z[V]; + if (ae.global || ae.multiline) { + throw new Error('' + ae); + } + aa.push('(?:' + W(ae) + ')'); + } + return new RegExp(aa.join('|'), ac ? 'gi' : 'g'); + } + function a(V) { + var U = /(?:^|\s)nocode(?:\s|$)/; + var X = []; + var T = 0; + var Z = []; + var W = 0; + var S; + if (V.currentStyle) { + S = V.currentStyle.whiteSpace; + } else { + if (window.getComputedStyle) { + S = document.defaultView + .getComputedStyle(V, null) + .getPropertyValue('white-space'); + } + } + var Y = S && 'pre' === S.substring(0, 3); + function aa(ab) { + switch (ab.nodeType) { + case 1: + if (U.test(ab.className)) { + return; + } + for (var ae = ab.firstChild; ae; ae = ae.nextSibling) { + aa(ae); + } + var ad = ab.nodeName; + if ('BR' === ad || 'LI' === ad) { + X[W] = '\n'; + Z[W << 1] = T++; + Z[(W++ << 1) | 1] = ab; + } + break; + case 3: + case 4: + var ac = ab.nodeValue; + if (ac.length) { + if (!Y) { + ac = ac.replace(/[ \t\r\n]+/g, ' '); + } else { + ac = ac.replace(/\r\n?/g, '\n'); + } + X[W] = ac; + Z[W << 1] = T; + T += ac.length; + Z[(W++ << 1) | 1] = ab; + } + break; + } + } + aa(V); + return { sourceCode: X.join('').replace(/\n$/, ''), spans: Z }; + } + function B(S, U, W, T) { + if (!U) { + return; + } + var V = { sourceCode: U, basePos: S }; + W(V); + T.push.apply(T, V.decorations); + } + var v = /\S/; + function o(S) { + var V = undefined; + for (var U = S.firstChild; U; U = U.nextSibling) { + var T = U.nodeType; + V = T === 1 ? (V ? S : U) : T === 3 ? (v.test(U.nodeValue) ? S : V) : V; + } + return V === S ? undefined : V; + } + function g(U, T) { + var S = {}; + var V; + (function () { + var ad = U.concat(T); + var ah = []; + var ag = {}; + for (var ab = 0, Z = ad.length; ab < Z; ++ab) { + var Y = ad[ab]; + var ac = Y[3]; + if (ac) { + for (var ae = ac.length; --ae >= 0; ) { + S[ac.charAt(ae)] = Y; + } + } + var af = Y[1]; + var aa = '' + af; + if (!ag.hasOwnProperty(aa)) { + ah.push(af); + ag[aa] = null; + } + } + ah.push(/[\0-\uffff]/); + V = k(ah); + })(); + var X = T.length; + var W = function (ah) { + var Z = ah.sourceCode, + Y = ah.basePos; + var ad = [Y, F]; + var af = 0; + var an = Z.match(V) || []; + var aj = {}; + for (var ae = 0, aq = an.length; ae < aq; ++ae) { + var ag = an[ae]; + var ap = aj[ag]; + var ai = void 0; + var am; + if (typeof ap === 'string') { + am = false; + } else { + var aa = S[ag.charAt(0)]; + if (aa) { + ai = ag.match(aa[1]); + ap = aa[0]; + } else { + for (var ao = 0; ao < X; ++ao) { + aa = T[ao]; + ai = ag.match(aa[1]); + if (ai) { + ap = aa[0]; + break; + } + } + if (!ai) { + ap = F; + } + } + am = ap.length >= 5 && 'lang-' === ap.substring(0, 5); + if (am && !(ai && typeof ai[1] === 'string')) { + am = false; + ap = J; + } + if (!am) { + aj[ag] = ap; + } + } + var ab = af; + af += ag.length; + if (!am) { + ad.push(Y + ab, ap); + } else { + var al = ai[1]; + var ak = ag.indexOf(al); + var ac = ak + al.length; + if (ai[2]) { + ac = ag.length - ai[2].length; + ak = ac - al.length; + } + var ar = ap.substring(5); + B(Y + ab, ag.substring(0, ak), W, ad); + B(Y + ab + ak, al, q(ar, al), ad); + B(Y + ab + ac, ag.substring(ac), W, ad); + } + } + ah.decorations = ad; + }; + return W; + } + function i(T) { + var W = [], + S = []; + if (T.tripleQuotedStrings) { + W.push([ + C, + /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/, + null, + '\'"', + ]); + } else { + if (T.multiLineStrings) { + W.push([ + C, + /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/, + null, + '\'"`', + ]); + } else { + W.push([ + C, + /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/, + null, + '"\'', + ]); + } + } + if (T.verbatimStrings) { + S.push([C, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]); + } + var Y = T.hashComments; + if (Y) { + if (T.cStyleComments) { + if (Y > 1) { + W.push([j, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']); + } else { + W.push([ + j, + /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/, + null, + '#', + ]); + } + S.push([ + C, + /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/, + null, + ]); + } else { + W.push([j, /^#[^\r\n]*/, null, '#']); + } + } + if (T.cStyleComments) { + S.push([j, /^\/\/[^\r\n]*/, null]); + S.push([j, /^\/\*[\s\S]*?(?:\*\/|$)/, null]); + } + if (T.regexLiterals) { + var X = + '/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/'; + S.push(['lang-regex', new RegExp('^' + M + '(' + X + ')')]); + } + var V = T.types; + if (V) { + S.push([O, V]); + } + var U = ('' + T.keywords).replace(/^ | $/g, ''); + if (U.length) { + S.push([ + z, + new RegExp('^(?:' + U.replace(/[\s,]+/g, '|') + ')\\b'), + null, + ]); + } + W.push([F, /^\s+/, null, ' \r\n\t\xA0']); + S.push( + [G, /^@[a-z_$][a-z_$@0-9]*/i, null], + [O, /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null], + [F, /^[a-z_$][a-z_$@0-9]*/i, null], + [ + G, + new RegExp( + '^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*', + 'i', + ), + null, + '0123456789', + ], + [F, /^\\[\s\S]?/, null], + [L, /^.[^\s\w\.$@\'\"\`\/\#\\]*/, null], + ); + return g(W, S); + } + var K = i({ + keywords: A, + hashComments: true, + cStyleComments: true, + multiLineStrings: true, + regexLiterals: true, + }); + function Q(V, ag) { + var U = /(?:^|\s)nocode(?:\s|$)/; + var ab = /\r\n?|\n/; + var ac = V.ownerDocument; + var S; + if (V.currentStyle) { + S = V.currentStyle.whiteSpace; + } else { + if (window.getComputedStyle) { + S = ac.defaultView + .getComputedStyle(V, null) + .getPropertyValue('white-space'); + } + } + var Z = S && 'pre' === S.substring(0, 3); + var af = ac.createElement('LI'); + while (V.firstChild) { + af.appendChild(V.firstChild); + } + var W = [af]; + function ae(al) { + switch (al.nodeType) { + case 1: + if (U.test(al.className)) { + break; + } + if ('BR' === al.nodeName) { + ad(al); + if (al.parentNode) { + al.parentNode.removeChild(al); + } + } else { + for (var an = al.firstChild; an; an = an.nextSibling) { + ae(an); + } + } + break; + case 3: + case 4: + if (Z) { + var am = al.nodeValue; + var aj = am.match(ab); + if (aj) { + var ai = am.substring(0, aj.index); + al.nodeValue = ai; + var ah = am.substring(aj.index + aj[0].length); + if (ah) { + var ak = al.parentNode; + ak.insertBefore(ac.createTextNode(ah), al.nextSibling); + } + ad(al); + if (!ai) { + al.parentNode.removeChild(al); + } + } + } + break; + } + } + function ad(ak) { + while (!ak.nextSibling) { + ak = ak.parentNode; + if (!ak) { + return; + } + } + function ai(al, ar) { + var aq = ar ? al.cloneNode(false) : al; + var ao = al.parentNode; + if (ao) { + var ap = ai(ao, 1); + var an = al.nextSibling; + ap.appendChild(aq); + for (var am = an; am; am = an) { + an = am.nextSibling; + ap.appendChild(am); + } + } + return aq; + } + var ah = ai(ak.nextSibling, 0); + for (var aj; (aj = ah.parentNode) && aj.nodeType === 1; ) { + ah = aj; + } + W.push(ah); + } + for (var Y = 0; Y < W.length; ++Y) { + ae(W[Y]); + } + if (ag === (ag | 0)) { + W[0].setAttribute('value', ag); + } + var aa = ac.createElement('OL'); + aa.className = 'linenums'; + var X = Math.max(0, (ag - 1) | 0) || 0; + for (var Y = 0, T = W.length; Y < T; ++Y) { + af = W[Y]; + af.className = 'L' + ((Y + X) % 10); + if (!af.firstChild) { + af.appendChild(ac.createTextNode('\xA0')); + } + aa.appendChild(af); + } + V.appendChild(aa); + } + function D(ac) { + var aj = /\bMSIE\b/.test(navigator.userAgent); + var am = /\n/g; + var al = ac.sourceCode; + var an = al.length; + var V = 0; + var aa = ac.spans; + var T = aa.length; + var ah = 0; + var X = ac.decorations; + var Y = X.length; + var Z = 0; + X[Y] = an; + var ar, aq; + for (aq = ar = 0; aq < Y; ) { + if (X[aq] !== X[aq + 2]) { + X[ar++] = X[aq++]; + X[ar++] = X[aq++]; + } else { + aq += 2; + } + } + Y = ar; + for (aq = ar = 0; aq < Y; ) { + var at = X[aq]; + var ab = X[aq + 1]; + var W = aq + 2; + while (W + 2 <= Y && X[W + 1] === ab) { + W += 2; + } + X[ar++] = at; + X[ar++] = ab; + aq = W; + } + Y = X.length = ar; + var ae = null; + while (ah < T) { + var af = aa[ah]; + var S = aa[ah + 2] || an; + var ag = X[Z]; + var ap = X[Z + 2] || an; + var W = Math.min(S, ap); + var ak = aa[ah + 1]; + var U; + if (ak.nodeType !== 1 && (U = al.substring(V, W))) { + if (aj) { + U = U.replace(am, '\r'); + } + ak.nodeValue = U; + var ai = ak.ownerDocument; + var ao = ai.createElement('SPAN'); + ao.className = X[Z + 1]; + var ad = ak.parentNode; + ad.replaceChild(ao, ak); + ao.appendChild(ak); + if (V < S) { + aa[ah + 1] = ak = ai.createTextNode(al.substring(W, S)); + ad.insertBefore(ak, ao.nextSibling); + } + } + V = W; + if (V >= S) { + ah += 2; + } + if (V >= ap) { + Z += 2; + } + } + } + var t = {}; + function c(U, V) { + for (var S = V.length; --S >= 0; ) { + var T = V[S]; + if (!t.hasOwnProperty(T)) { + t[T] = U; + } else { + if (window.console) { + console.warn('cannot override language handler %s', T); + } + } + } + } + function q(T, S) { + if (!(T && t.hasOwnProperty(T))) { + T = /^\s*]*(?:>|$)/], + [j, /^<\!--[\s\S]*?(?:-\->|$)/], + ['lang-', /^<\?([\s\S]+?)(?:\?>|$)/], + ['lang-', /^<%([\s\S]+?)(?:%>|$)/], + [L, /^(?:<[%?]|[%?]>)/], + ['lang-', /^]*>([\s\S]+?)<\/xmp\b[^>]*>/i], + ['lang-js', /^]*>([\s\S]*?)(<\/script\b[^>]*>)/i], + ['lang-css', /^]*>([\s\S]*?)(<\/style\b[^>]*>)/i], + ['lang-in.tag', /^(<\/?[a-z][^<>]*>)/i], + ], + ), + ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl'], + ); + c( + g( + [ + [F, /^[\s]+/, null, ' \t\r\n'], + [n, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '"\''], + ], + [ + [m, /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i], + [P, /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i], + ['lang-uq.val', /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/], + [L, /^[=<>\/]+/], + ['lang-js', /^on\w+\s*=\s*\"([^\"]+)\"/i], + ['lang-js', /^on\w+\s*=\s*\'([^\']+)\'/i], + ['lang-js', /^on\w+\s*=\s*([^\"\'>\s]+)/i], + ['lang-css', /^style\s*=\s*\"([^\"]+)\"/i], + ['lang-css', /^style\s*=\s*\'([^\']+)\'/i], + ['lang-css', /^style\s*=\s*([^\"\'>\s]+)/i], + ], + ), + ['in.tag'], + ); + c(g([], [[n, /^[\s\S]+/]]), ['uq.val']); + c(i({ keywords: l, hashComments: true, cStyleComments: true, types: e }), [ + 'c', + 'cc', + 'cpp', + 'cxx', + 'cyc', + 'm', + ]); + c(i({ keywords: 'null,true,false' }), ['json']); + c( + i({ + keywords: R, + hashComments: true, + cStyleComments: true, + verbatimStrings: true, + types: e, + }), + ['cs'], + ); + c(i({ keywords: x, cStyleComments: true }), ['java']); + c(i({ keywords: H, hashComments: true, multiLineStrings: true }), [ + 'bsh', + 'csh', + 'sh', + ]); + c( + i({ + keywords: I, + hashComments: true, + multiLineStrings: true, + tripleQuotedStrings: true, + }), + ['cv', 'py'], + ); + c( + i({ + keywords: s, + hashComments: true, + multiLineStrings: true, + regexLiterals: true, + }), + ['perl', 'pl', 'pm'], + ); + c( + i({ + keywords: f, + hashComments: true, + multiLineStrings: true, + regexLiterals: true, + }), + ['rb'], + ); + c(i({ keywords: w, cStyleComments: true, regexLiterals: true }), ['js']); + c( + i({ + keywords: r, + hashComments: 3, + cStyleComments: true, + multilineStrings: true, + tripleQuotedStrings: true, + regexLiterals: true, + }), + ['coffee'], + ); + c(g([], [[C, /^[\s\S]+/]]), ['regex']); + function d(V) { + var U = V.langExtension; + try { + var S = a(V.sourceNode); + var T = S.sourceCode; + V.sourceCode = T; + V.spans = S.spans; + V.basePos = 0; + q(U, T)(V); + D(V); + } catch (W) { + if ('console' in window) { + console.log(W && W.stack ? W.stack : W); + } + } + } + function y(W, V, U) { + var S = document.createElement('PRE'); + S.innerHTML = W; + if (U) { + Q(S, U); + } + var T = { langExtension: V, numberLines: U, sourceNode: S }; + d(T); + return S.innerHTML; + } + function b(ad) { + function Y(af) { + return document.getElementsByTagName(af); + } + var ac = [Y('pre'), Y('code'), Y('xmp')]; + var T = []; + for (var aa = 0; aa < ac.length; ++aa) { + for (var Z = 0, V = ac[aa].length; Z < V; ++Z) { + T.push(ac[aa][Z]); + } + } + ac = null; + var W = Date; + if (!W.now) { + W = { + now: function () { + return +new Date(); + }, + }; + } + var X = 0; + var S; + var ab = /\blang(?:uage)?-([\w.]+)(?!\S)/; + var ae = /\bprettyprint\b/; + function U() { + var ag = window.PR_SHOULD_USE_CONTINUATION ? W.now() + 250 : Infinity; + for (; X < T.length && W.now() < ag; X++) { + var aj = T[X]; + var ai = aj.className; + if (ai.indexOf('prettyprint') >= 0) { + var ah = ai.match(ab); + var am; + if (!ah && (am = o(aj)) && 'CODE' === am.tagName) { + ah = am.className.match(ab); + } + if (ah) { + ah = ah[1]; + } + var al = false; + for (var ak = aj.parentNode; ak; ak = ak.parentNode) { + if ( + (ak.tagName === 'pre' || + ak.tagName === 'code' || + ak.tagName === 'xmp') && + ak.className && + ak.className.indexOf('prettyprint') >= 0 + ) { + al = true; + break; + } + } + if (!al) { + var af = aj.className.match(/\blinenums\b(?::(\d+))?/); + af = af ? (af[1] && af[1].length ? +af[1] : true) : false; + if (af) { + Q(aj, af); + } + S = { langExtension: ah, sourceNode: aj, numberLines: af }; + d(S); + } + } + } + if (X < T.length) { + setTimeout(U, 250); + } else { + if (ad) { + ad(); + } + } + } + U(); + } + window.prettyPrintOne = y; + window.prettyPrint = b; + window.PR = { + createSimpleLexer: g, + registerLangHandler: c, + sourceDecorator: i, + PR_ATTRIB_NAME: P, + PR_ATTRIB_VALUE: n, + PR_COMMENT: j, + PR_DECLARATION: E, + PR_KEYWORD: z, + PR_LITERAL: G, + PR_NOCODE: N, + PR_PLAIN: F, + PR_PUNCTUATION: L, + PR_SOURCE: J, + PR_STRING: C, + PR_TAG: m, + PR_TYPE: O, + }; +})(); +PR.registerLangHandler( + PR.createSimpleLexer( + [], + [ + [PR.PR_DECLARATION, /^]*(?:>|$)/], + [PR.PR_COMMENT, /^<\!--[\s\S]*?(?:-\->|$)/], + [PR.PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/], + ['lang-', /^<\?([\s\S]+?)(?:\?>|$)/], + ['lang-', /^<%([\s\S]+?)(?:%>|$)/], + ['lang-', /^]*>([\s\S]+?)<\/xmp\b[^>]*>/i], + [ + 'lang-handlebars', + /^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i, + ], + ['lang-js', /^]*>([\s\S]*?)(<\/script\b[^>]*>)/i], + ['lang-css', /^]*>([\s\S]*?)(<\/style\b[^>]*>)/i], + ['lang-in.tag', /^(<\/?[a-z][^<>]*>)/i], + [PR.PR_DECLARATION, /^{{[#^>/]?\s*[\w.][^}]*}}/], + [PR.PR_DECLARATION, /^{{&?\s*[\w.][^}]*}}/], + [PR.PR_DECLARATION, /^{{{>?\s*[\w.][^}]*}}}/], + [PR.PR_COMMENT, /^{{![^}]*}}/], + ], + ), + ['handlebars', 'hbs'], +); +PR.registerLangHandler( + PR.createSimpleLexer( + [[PR.PR_PLAIN, /^[ \t\r\n\f]+/, null, ' \t\r\n\f']], + [ + [ + PR.PR_STRING, + /^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/, + null, + ], + [ + PR.PR_STRING, + /^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/, + null, + ], + ['lang-css-str', /^url\(([^\)\"\']*)\)/i], + [ + PR.PR_KEYWORD, + /^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i, + null, + ], + [ + 'lang-css-kw', + /^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i, + ], + [PR.PR_COMMENT, /^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//], + [PR.PR_COMMENT, /^(?:)/], + [PR.PR_LITERAL, /^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i], + [PR.PR_LITERAL, /^#(?:[0-9a-f]{3}){1,2}/i], + [ + PR.PR_PLAIN, + /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i, + ], + [PR.PR_PUNCTUATION, /^[^\s\w\'\"]+/], + ], + ), + ['css'], +); +PR.registerLangHandler( + PR.createSimpleLexer( + [], + [ + [ + PR.PR_KEYWORD, + /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i, + ], + ], + ), + ['css-kw'], +); +PR.registerLangHandler( + PR.createSimpleLexer([], [[PR.PR_STRING, /^[^\)\"\']+/]]), + ['css-str'], +); diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 00000000..6ed68316 Binary files /dev/null and b/coverage/lcov-report/sort-arrow-sprite.png differ diff --git a/coverage/lcov-report/sorter.js b/coverage/lcov-report/sorter.js new file mode 100644 index 00000000..8eb98ac4 --- /dev/null +++ b/coverage/lcov-report/sorter.js @@ -0,0 +1,188 @@ +/* eslint-disable */ +var addSorting = (function () { + 'use strict'; + var cols, + currentSort = { index: 0, desc: false }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if (row.textContent.toLowerCase().includes(searchValue.toLowerCase())) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string', + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function (a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function (a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function () { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function () { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/lcov-report/utils/index.html b/coverage/lcov-report/utils/index.html new file mode 100644 index 00000000..0cb95a7b --- /dev/null +++ b/coverage/lcov-report/utils/index.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for utils + + + + + + + + + +
+
+

All files utils

+
+ +
+ 100% + Statements + 67/67 +
+ + +
+ 100% + Branches + 14/14 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 100% + Lines + 67/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.ts +
+
100%67/67100%14/14100%6/6100%67/67
+
+
+
+ + + + + + + diff --git a/coverage/lcov-report/utils/index.ts.html b/coverage/lcov-report/utils/index.ts.html new file mode 100644 index 00000000..44acaba7 --- /dev/null +++ b/coverage/lcov-report/utils/index.ts.html @@ -0,0 +1,285 @@ + + + + + + Code coverage report for utils/index.ts + + + + + + + + + +
+
+

All files / utils index.ts

+
+ +
+ 100% + Statements + 67/67 +
+ + +
+ 100% + Branches + 14/14 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 100% + Lines + 67/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +681x +1x +1x +1x +1x +1x +1x +1x +7x +7x +1x +1x +1x +1x +33x +33x +33x +33x +33x +33x +1x +1x +3x +1x +1x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +1x +1x +4x +1x +1x +2x +4x +1x +1x +1x +1x +1x + 
import { SlideShowType, TimelineMode } from '@models/TimelineModel';
+import { darkTheme, defaultTheme } from '../components/common/themes';
+ 
+export const uniqueID = () => {
+  const chars =
+    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+  let autoId = '';
+  for (let i = 0; i < 7; i++) {
+    autoId += chars.charAt(Math.floor(Math.random() * chars.length));
+  }
+  return autoId;
+};
+ 
+export const hexToRGBA = (hex: string, alpha: number): string => {
+  const r = parseInt(hex.slice(1, 3), 16);
+  const g = parseInt(hex.slice(3, 5), 16);
+  const b = parseInt(hex.slice(5, 7), 16);
+ 
+  return `rgba(${r}, ${g}, ${b}, ${alpha})`;
+};
+ 
+export const getDefaultThemeOrDark = (isDark?: boolean) => {
+  if (isDark) {
+    return darkTheme;
+  }
+  return defaultTheme;
+};
+ 
+export const getDefaultClassNames = () => ({
+  card: 'rc-card',
+  cardMedia: 'rc-card-media',
+  cardSubTitle: 'rc-card-subtitle',
+  cardText: 'rc-card-text',
+  cardTitle: 'rc-card-title',
+  controls: 'rc-controls',
+  title: 'rc-title',
+});
+ 
+export const getDefaultButtonTexts = () => ({
+  dark: 'Switch to Dark Mode',
+  first: 'Go to First',
+  last: 'Go to Last',
+  light: 'Switch to Light Mode',
+  next: 'Next',
+  play: 'Play Slideshow',
+  previous: 'Previous',
+  stop: 'Stop Slideshow',
+});
+ 
+//get slidehow type based on mode
+ 
+export const getSlideShowType: (mode: TimelineMode) => SlideShowType = (
+  mode,
+) => {
+  if (mode === 'HORIZONTAL') {
+    return 'reveal';
+  }
+  if (mode === 'VERTICAL') {
+    return 'reveal';
+  }
+ 
+  if (mode === 'VERTICAL_ALTERNATING') {
+    return 'slide_from_sides';
+  }
+ 
+  return 'reveal';
+};
+ 
+ +
+
+ + + + + + + diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 00000000..98976848 --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,6510 @@ +TN: +SF:src\components\GlobalContext.tsx +FN:25,GlobalContextProvider +FNF:1 +FNH:0 +FNDA:0,GlobalContextProvider +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,1 +DA:144,1 +DA:145,1 +DA:146,1 +LF:146 +LH:29 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\common\styles\index.ts +FN:4,Object.defineProperty.enumerable +FN:16,Object.defineProperty.enumerable +FNF:2 +FNH:2 +FNDA:3,Object.defineProperty.enumerable +FNDA:3,Object.defineProperty.enumerable +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +LF:19 +LH:19 +BRDA:4,0,0,3 +BRDA:16,1,0,3 +BRDA:17,2,0,3 +BRF:3 +BRH:3 +end_of_record +TN: +SF:src\components\common\test\index.tsx +FN:65,onFirst +FN:66,onLast +FN:67,onNext +FN:68,onPrevious +FN:69,onReplay +FN:70,onToggleDarkMode +FN:75,customRender +FNF:7 +FNH:1 +FNDA:0,onFirst +FNDA:0,onLast +FNDA:0,onNext +FNDA:0,onPrevious +FNDA:0,onReplay +FNDA:0,onToggleDarkMode +FNDA:41,customRender +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +DA:76,41 +DA:77,41 +DA:78,41 +DA:79,41 +DA:80,41 +DA:81,41 +DA:82,41 +DA:83,41 +LF:83 +LH:83 +BRDA:75,0,0,41 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src\components\common\themes\index.ts +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +LF:41 +LH:41 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\effects\useMatchMedia.ts +FN:12,useMatchMedia +FN:25,listener +FNF:2 +FNH:1 +FNDA:4,useMatchMedia +FNDA:0,listener +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,4 +DA:14,4 +DA:15,4 +DA:16,4 +DA:17,4 +DA:18,4 +DA:19,4 +DA:20,3 +DA:21,1 +DA:22,1 +DA:23,2 +DA:24,2 +DA:25,2 +DA:26,2 +DA:27,2 +DA:28,3 +DA:29,1 +DA:30,1 +DA:31,2 +DA:32,2 +DA:33,2 +DA:34,2 +DA:35,2 +DA:36,2 +DA:37,4 +DA:38,4 +DA:39,4 +DA:40,4 +DA:41,0 +DA:42,0 +DA:43,4 +DA:44,4 +DA:45,4 +DA:46,4 +LF:46 +LH:44 +BRDA:12,0,0,4 +BRDA:19,1,0,3 +BRDA:20,2,0,1 +BRDA:22,3,0,2 +BRDA:28,4,0,1 +BRDA:30,5,0,2 +BRDA:34,6,0,2 +BRDA:39,7,0,4 +BRDA:40,8,0,1 +BRDA:40,9,0,0 +BRF:10 +BRH:9 +end_of_record +TN: +SF:src\components\effects\useNewScrollPosition.ts +FN:12,useNewScrollPosition +FNF:1 +FNH:0 +FNDA:0,useNewScrollPosition +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,1 +DA:88,1 +LF:88 +LH:14 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\icons\chev-left.tsx +FN:3,ChevronLeft +FNF:1 +FNH:1 +FNDA:4,ChevronLeft +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,4 +DA:5,4 +DA:6,4 +DA:7,4 +DA:8,4 +DA:9,4 +DA:10,4 +DA:11,4 +DA:12,4 +DA:13,4 +DA:14,4 +DA:15,4 +DA:16,4 +DA:17,4 +DA:18,1 +DA:19,1 +DA:20,1 +LF:20 +LH:20 +BRDA:3,0,0,4 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src\components\icons\chev-right.tsx +FN:3,ChevronRightIcon +FNF:1 +FNH:1 +FNDA:7,ChevronRightIcon +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,7 +DA:5,7 +DA:6,7 +DA:7,7 +DA:8,7 +DA:9,7 +DA:10,7 +DA:11,7 +DA:12,7 +DA:13,7 +DA:14,7 +DA:15,7 +DA:16,7 +DA:17,7 +DA:18,1 +DA:19,1 +DA:20,1 +LF:20 +LH:20 +BRDA:3,0,0,7 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src\components\icons\chevs-left.tsx +FN:3,ChevronLeft +FNF:1 +FNH:1 +FNDA:4,ChevronLeft +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,4 +DA:5,4 +DA:6,4 +DA:7,4 +DA:8,4 +DA:9,4 +DA:10,4 +DA:11,4 +DA:12,4 +DA:13,4 +DA:14,4 +DA:15,4 +DA:16,4 +DA:17,4 +DA:18,4 +DA:19,1 +DA:20,1 +DA:21,1 +LF:21 +LH:21 +BRDA:3,0,0,4 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src\components\icons\chevs-right.tsx +FN:3,ChevronRightIcon +FNF:1 +FNH:1 +FNDA:4,ChevronRightIcon +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,4 +DA:5,4 +DA:6,4 +DA:7,4 +DA:8,4 +DA:9,4 +DA:10,4 +DA:11,4 +DA:12,4 +DA:13,4 +DA:14,4 +DA:15,4 +DA:16,4 +DA:17,4 +DA:18,4 +DA:19,1 +DA:20,1 +DA:21,1 +LF:21 +LH:21 +BRDA:3,0,0,4 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src\components\icons\close.tsx +FN:3,SvgComponent +FNF:1 +FNH:0 +FNDA:0,SvgComponent +DA:1,1 +DA:2,1 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,1 +DA:22,1 +LF:22 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\icons\index.tsx +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +LF:9 +LH:9 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\icons\maximize.tsx +FN:2,SvgComponent +FNF:1 +FNH:1 +FNDA:2,SvgComponent +DA:1,1 +DA:2,1 +DA:3,2 +DA:4,2 +DA:5,2 +DA:6,2 +DA:7,2 +DA:8,2 +DA:9,2 +DA:10,2 +DA:11,2 +DA:12,2 +DA:13,2 +DA:14,2 +DA:15,1 +DA:16,1 +DA:17,1 +LF:17 +LH:17 +BRDA:2,0,0,2 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src\components\icons\menu.tsx +FN:3,SvgComponent +FNF:1 +FNH:0 +FNDA:0,SvgComponent +DA:1,1 +DA:2,1 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,1 +DA:22,1 +LF:22 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\icons\minimize.tsx +FN:2,SvgComponent +FNF:1 +FNH:0 +FNDA:0,SvgComponent +DA:1,1 +DA:2,1 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,1 +DA:15,1 +DA:16,1 +LF:16 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\icons\minus.tsx +FN:2,SvgComponent +FNF:1 +FNH:1 +FNDA:2,SvgComponent +DA:1,1 +DA:2,1 +DA:3,2 +DA:4,2 +DA:5,2 +DA:6,2 +DA:7,2 +DA:8,2 +DA:9,2 +DA:10,2 +DA:11,2 +DA:12,2 +DA:13,2 +DA:14,1 +DA:15,1 +DA:16,1 +LF:16 +LH:16 +BRDA:2,0,0,2 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src\components\icons\moon.tsx +FN:2,SvgComponent +FNF:1 +FNH:1 +FNDA:4,SvgComponent +DA:1,1 +DA:2,1 +DA:3,4 +DA:4,4 +DA:5,4 +DA:6,4 +DA:7,4 +DA:8,4 +DA:9,4 +DA:10,4 +DA:11,4 +DA:12,4 +DA:13,4 +DA:14,1 +DA:15,1 +DA:16,1 +LF:16 +LH:16 +BRDA:2,0,0,4 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src\components\icons\plus.tsx +FN:2,SvgComponent +FNF:1 +FNH:0 +FNDA:0,SvgComponent +DA:1,1 +DA:2,1 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,1 +DA:15,1 +DA:16,1 +LF:16 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\icons\replay-icon.tsx +FN:3,ReplayIcon +FNF:1 +FNH:1 +FNDA:1,ReplayIcon +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +LF:19 +LH:19 +BRDA:3,0,0,1 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src\components\icons\stop.tsx +FN:2,SvgComponent +FNF:1 +FNH:0 +FNDA:0,SvgComponent +DA:1,1 +DA:2,1 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,1 +DA:16,1 +DA:17,1 +LF:17 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\icons\sun.tsx +FN:2,SvgComponent +FNF:1 +FNH:0 +FNDA:0,SvgComponent +DA:1,1 +DA:2,1 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,1 +DA:17,1 +DA:18,1 +LF:18 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\timeline\timeline.style.ts +FN:23,Object.defineProperty.enumerable +FN:74,__vite_ssr_import_0__.default.div.$scrollable.$scrollable +FN:105,Object.defineProperty.enumerable +FNF:3 +FNH:0 +FNDA:0,Object.defineProperty.enumerable +FNDA:0,__vite_ssr_import_0__.default.div.$scrollable.$scrollable +FNDA:0,Object.defineProperty.enumerable +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,1 +DA:82,1 +DA:83,1 +DA:84,1 +DA:85,1 +DA:86,1 +DA:87,1 +DA:88,1 +DA:89,1 +DA:90,1 +DA:91,1 +DA:92,1 +DA:93,1 +DA:94,1 +DA:95,1 +DA:96,1 +DA:97,1 +DA:98,1 +DA:99,1 +DA:100,1 +DA:101,1 +DA:102,1 +DA:103,1 +DA:104,1 +DA:105,1 +DA:106,1 +DA:107,1 +DA:108,1 +DA:109,1 +DA:110,1 +DA:111,1 +DA:112,1 +DA:113,1 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,1 +DA:118,1 +DA:119,1 +DA:120,1 +DA:121,1 +DA:122,1 +DA:123,1 +DA:124,1 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,1 +DA:132,1 +DA:133,1 +DA:134,1 +DA:135,1 +DA:136,1 +DA:137,1 +DA:138,1 +DA:139,1 +DA:140,1 +DA:141,1 +DA:142,1 +DA:143,1 +DA:144,1 +DA:145,1 +DA:146,1 +DA:147,1 +DA:148,1 +DA:149,1 +LF:149 +LH:122 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\timeline\timeline.tsx +FN:30,Timeline +FNF:1 +FNH:0 +FNDA:0,Timeline +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,1 +DA:464,1 +DA:465,1 +DA:466,1 +LF:466 +LH:34 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\timeline-elements\memoized\index.tsx +FN:23,TitleMemo +FN:86,onKeyDown +FN:113,onKeyDown +FNF:3 +FNH:1 +FNDA:23,TitleMemo +FNDA:0,onKeyDown +FNDA:0,onKeyDown +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,23 +DA:25,23 +DA:26,23 +DA:27,23 +DA:28,23 +DA:29,23 +DA:30,23 +DA:31,23 +DA:32,23 +DA:33,23 +DA:34,23 +DA:35,16 +DA:36,16 +DA:37,16 +DA:38,16 +DA:39,16 +DA:40,16 +DA:41,16 +DA:42,16 +DA:43,16 +DA:44,16 +DA:45,3 +DA:46,3 +DA:47,3 +DA:48,13 +DA:49,13 +DA:50,16 +DA:51,16 +DA:52,7 +DA:53,23 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,21 +DA:60,17 +DA:61,17 +DA:62,17 +DA:63,17 +DA:64,17 +DA:65,17 +DA:66,17 +DA:67,17 +DA:68,17 +DA:69,17 +DA:70,4 +DA:71,1 +DA:72,0 +DA:73,1 +DA:74,1 +DA:75,1 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,2 +DA:80,2 +DA:81,2 +DA:82,2 +DA:83,2 +DA:84,2 +DA:85,2 +DA:86,2 +DA:87,2 +DA:88,2 +DA:89,2 +DA:90,2 +DA:91,2 +DA:92,2 +DA:93,2 +DA:94,2 +DA:95,0 +DA:96,2 +DA:97,1 +DA:98,1 +DA:99,1 +DA:100,1 +DA:101,1 +DA:102,1 +DA:103,1 +DA:104,2 +DA:105,2 +DA:106,2 +DA:107,2 +DA:108,2 +DA:109,2 +DA:110,2 +DA:111,2 +DA:112,2 +DA:113,2 +DA:114,2 +DA:115,2 +DA:116,2 +DA:117,2 +DA:118,2 +DA:119,0 +DA:120,2 +DA:121,1 +DA:122,1 +DA:123,1 +DA:124,1 +DA:125,1 +DA:126,1 +DA:127,17 +DA:128,17 +DA:129,17 +DA:130,17 +DA:131,17 +DA:132,17 +DA:133,17 +DA:134,17 +DA:135,17 +DA:136,6 +DA:137,3 +DA:138,3 +DA:139,17 +DA:140,17 +DA:141,17 +DA:142,17 +DA:143,17 +DA:144,17 +DA:145,17 +DA:146,16 +DA:147,17 +DA:148,1 +DA:149,1 +DA:150,17 +DA:151,17 +DA:152,17 +DA:153,3 +DA:154,3 +DA:155,3 +DA:156,3 +DA:157,3 +DA:158,3 +DA:159,3 +DA:160,3 +DA:161,3 +DA:162,3 +DA:163,14 +DA:164,17 +DA:165,1 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,1 +DA:171,1 +DA:172,1 +DA:173,1 +DA:174,1 +LF:174 +LH:167 +BRDA:23,0,0,23 +BRDA:34,1,0,16 +BRDA:36,2,0,7 +BRDA:36,3,0,9 +BRDA:44,4,0,3 +BRDA:47,5,0,13 +BRDA:51,6,0,7 +BRDA:58,7,0,21 +BRDA:59,8,0,17 +BRDA:69,9,0,4 +BRDA:78,10,0,2 +BRDA:93,11,0,0 +BRDA:94,12,0,0 +BRDA:79,13,0,2 +BRDA:80,14,0,0 +BRDA:103,15,0,2 +BRDA:117,16,0,0 +BRDA:118,17,0,0 +BRDA:104,18,0,2 +BRDA:105,19,0,0 +BRDA:126,20,0,17 +BRDA:150,21,0,16 +BRDA:152,22,0,3 +BRDA:162,23,0,14 +BRDA:135,24,0,6 +BRDA:136,25,0,3 +BRDA:143,26,0,17 +BRDA:144,27,0,16 +BRDA:144,28,0,1 +BRDA:145,29,0,16 +BRDA:147,30,0,1 +BRF:31 +BRH:25 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-card\timeline-horizontal-card.styles.ts +FN:44,ShapeBorderStyle +FN:57,Object.defineProperty.enumerable +FN:58,Object.defineProperty.enumerable +FN:59,Object.defineProperty.enumerable +FN:76,Object.defineProperty.enumerable +FN:86,Object.defineProperty.enumerable +FN:90,Object.defineProperty.enumerable +FN:91,Object.defineProperty.enumerable +FN:137,Object.defineProperty.enumerable +FNF:9 +FNH:9 +FNDA:18,ShapeBorderStyle +FNDA:9,Object.defineProperty.enumerable +FNDA:9,Object.defineProperty.enumerable +FNDA:9,Object.defineProperty.enumerable +FNDA:9,Object.defineProperty.enumerable +FNDA:9,Object.defineProperty.enumerable +FNDA:9,Object.defineProperty.enumerable +FNDA:9,Object.defineProperty.enumerable +FNDA:6,Object.defineProperty.enumerable +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,18 +DA:46,18 +DA:47,18 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,18 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,1 +DA:82,1 +DA:83,1 +DA:84,1 +DA:85,1 +DA:86,1 +DA:87,1 +DA:88,1 +DA:89,1 +DA:90,1 +DA:91,1 +DA:92,1 +DA:93,1 +DA:94,1 +DA:95,1 +DA:96,1 +DA:97,1 +DA:98,1 +DA:99,1 +DA:100,1 +DA:101,1 +DA:102,1 +DA:103,1 +DA:104,1 +DA:105,1 +DA:106,1 +DA:107,1 +DA:108,1 +DA:109,1 +DA:110,1 +DA:111,1 +DA:112,1 +DA:113,1 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,1 +DA:118,1 +DA:119,1 +DA:120,1 +DA:121,1 +DA:122,1 +DA:123,1 +DA:124,1 +DA:125,1 +DA:126,1 +DA:127,1 +DA:128,1 +DA:129,1 +DA:130,1 +DA:131,1 +DA:132,1 +DA:133,1 +DA:134,1 +DA:135,1 +DA:136,1 +DA:137,1 +DA:138,1 +DA:139,1 +DA:140,1 +DA:141,1 +DA:142,1 +DA:143,1 +DA:144,1 +DA:145,1 +DA:146,1 +DA:147,1 +DA:148,1 +DA:149,1 +DA:150,1 +LF:150 +LH:146 +BRDA:44,0,0,18 +BRDA:47,1,0,0 +BRDA:57,2,0,9 +BRDA:58,3,0,9 +BRDA:59,4,0,9 +BRDA:60,5,0,0 +BRDA:67,6,0,9 +BRDA:68,7,0,0 +BRDA:75,8,0,9 +BRDA:75,9,0,0 +BRDA:76,10,0,9 +BRDA:76,11,0,0 +BRDA:86,12,0,9 +BRDA:89,13,0,9 +BRDA:90,14,0,9 +BRDA:90,15,0,0 +BRDA:91,16,0,9 +BRDA:99,17,0,9 +BRDA:137,18,0,6 +BRDA:137,19,0,0 +BRDA:137,20,0,0 +BRDA:142,21,0,6 +BRF:22 +BRH:14 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-card\timeline-horizontal-card.tsx +FN:22,TimelineCard +FN:61,handleClick +FN:148,showTimelineContent +FNF:3 +FNH:2 +FNDA:6,TimelineCard +FNDA:0,handleClick +FNDA:6,showTimelineContent +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,6 +DA:24,6 +DA:25,6 +DA:26,6 +DA:27,6 +DA:28,6 +DA:29,6 +DA:30,6 +DA:31,6 +DA:32,6 +DA:33,6 +DA:34,6 +DA:35,6 +DA:36,6 +DA:37,6 +DA:38,6 +DA:39,6 +DA:40,6 +DA:41,6 +DA:42,6 +DA:43,6 +DA:44,6 +DA:45,6 +DA:46,6 +DA:47,6 +DA:48,6 +DA:49,6 +DA:50,6 +DA:51,6 +DA:52,6 +DA:53,6 +DA:54,6 +DA:55,6 +DA:56,6 +DA:57,6 +DA:58,6 +DA:59,6 +DA:60,6 +DA:61,6 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,6 +DA:67,6 +DA:68,6 +DA:69,6 +DA:70,6 +DA:71,6 +DA:72,6 +DA:73,6 +DA:74,6 +DA:75,6 +DA:76,6 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,6 +DA:81,6 +DA:82,6 +DA:83,6 +DA:84,6 +DA:85,6 +DA:86,6 +DA:87,6 +DA:88,6 +DA:89,6 +DA:90,6 +DA:91,6 +DA:92,6 +DA:93,6 +DA:94,6 +DA:95,6 +DA:96,6 +DA:97,6 +DA:98,6 +DA:99,6 +DA:100,6 +DA:101,6 +DA:102,6 +DA:103,6 +DA:104,6 +DA:105,6 +DA:106,6 +DA:107,6 +DA:108,6 +DA:109,6 +DA:110,6 +DA:111,6 +DA:112,6 +DA:113,6 +DA:114,6 +DA:115,6 +DA:116,6 +DA:117,6 +DA:118,6 +DA:119,6 +DA:120,6 +DA:121,6 +DA:122,6 +DA:123,6 +DA:124,6 +DA:125,6 +DA:126,6 +DA:127,6 +DA:128,6 +DA:129,6 +DA:130,6 +DA:131,6 +DA:132,6 +DA:133,6 +DA:134,6 +DA:135,6 +DA:136,6 +DA:137,6 +DA:138,6 +DA:139,6 +DA:140,6 +DA:141,6 +DA:142,6 +DA:143,6 +DA:144,6 +DA:145,6 +DA:146,6 +DA:147,6 +DA:148,6 +DA:149,6 +DA:150,6 +DA:151,6 +DA:152,6 +DA:153,6 +DA:154,6 +DA:155,6 +DA:156,6 +DA:157,6 +DA:158,6 +DA:159,6 +DA:160,6 +DA:161,6 +DA:162,6 +DA:163,6 +DA:164,6 +DA:165,6 +DA:166,6 +DA:167,6 +DA:168,6 +DA:169,6 +DA:170,6 +DA:171,6 +DA:172,6 +DA:173,6 +DA:174,6 +DA:175,6 +DA:176,6 +DA:177,6 +DA:178,6 +DA:179,6 +DA:180,6 +DA:181,6 +DA:182,6 +DA:183,6 +DA:184,6 +DA:185,6 +DA:186,6 +DA:187,6 +DA:188,6 +DA:189,6 +DA:190,6 +DA:191,6 +DA:192,6 +DA:193,6 +DA:194,1 +DA:195,1 +LF:195 +LH:188 +BRDA:22,0,0,6 +BRDA:176,1,0,0 +BRDA:67,2,0,6 +BRDA:76,3,0,0 +BRDA:86,4,0,6 +BRDA:89,5,0,6 +BRDA:93,6,0,0 +BRDA:94,7,0,0 +BRDA:99,8,0,6 +BRDA:102,9,0,6 +BRDA:107,10,0,0 +BRDA:112,11,0,6 +BRDA:148,12,0,6 +BRDA:157,13,0,6 +BRDA:157,14,0,0 +BRF:15 +BRH:9 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-card-content\card-animations.styles.ts +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +LF:45 +LH:45 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-card-content\content-footer.tsx +FN:37,ContentFooter +FN:63,handleClick +FN:79,onKeyUp +FNF:3 +FNH:2 +FNDA:13,ContentFooter +FNDA:1,handleClick +FNDA:0,onKeyUp +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,13 +DA:39,13 +DA:40,13 +DA:41,13 +DA:42,13 +DA:43,13 +DA:44,13 +DA:45,13 +DA:46,13 +DA:47,13 +DA:48,13 +DA:49,13 +DA:50,13 +DA:51,13 +DA:52,13 +DA:53,13 +DA:54,13 +DA:55,13 +DA:56,13 +DA:57,13 +DA:58,13 +DA:59,13 +DA:60,13 +DA:61,13 +DA:62,13 +DA:63,13 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,13 +DA:69,13 +DA:70,13 +DA:71,13 +DA:72,13 +DA:73,13 +DA:74,13 +DA:75,13 +DA:76,3 +DA:77,3 +DA:78,3 +DA:79,3 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,3 +DA:85,3 +DA:86,3 +DA:87,3 +DA:88,3 +DA:89,3 +DA:90,3 +DA:91,3 +DA:92,3 +DA:93,10 +DA:94,13 +DA:95,13 +DA:96,2 +DA:97,2 +DA:98,2 +DA:99,2 +DA:100,2 +DA:101,2 +DA:102,2 +DA:103,2 +DA:104,2 +DA:105,13 +DA:106,13 +DA:107,13 +DA:108,13 +DA:109,13 +DA:110,13 +DA:111,13 +DA:112,13 +DA:113,13 +DA:114,13 +DA:115,13 +DA:116,13 +DA:117,1 +DA:118,1 +LF:118 +LH:114 +BRDA:37,0,0,13 +BRDA:75,1,0,3 +BRDA:84,2,0,0 +BRDA:88,3,0,1 +BRDA:88,4,0,2 +BRDA:89,5,0,1 +BRDA:89,6,0,2 +BRDA:92,7,0,10 +BRDA:95,8,0,2 +BRDA:54,9,0,13 +BRDA:58,10,0,26 +BRDA:63,11,0,1 +BRDA:69,12,0,13 +BRDA:70,13,0,9 +BRF:14 +BRH:13 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-card-content\content-header.tsx +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,9 +DA:22,9 +DA:23,9 +DA:24,9 +DA:25,9 +DA:26,9 +DA:27,9 +DA:28,3 +DA:29,3 +DA:30,3 +DA:31,3 +DA:32,3 +DA:33,3 +DA:34,3 +DA:35,9 +DA:36,9 +DA:37,9 +DA:38,3 +DA:39,3 +DA:40,3 +DA:41,3 +DA:42,3 +DA:43,3 +DA:44,9 +DA:45,9 +DA:46,9 +DA:47,9 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +LF:53 +LH:53 +BRDA:20,0,0,9 +BRDA:27,1,0,3 +BRDA:37,2,0,3 +BRF:3 +BRH:3 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-card-content\details-text.tsx +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,8 +DA:22,8 +DA:23,8 +DA:24,8 +DA:25,8 +DA:26,8 +DA:27,8 +DA:28,8 +DA:29,8 +DA:30,8 +DA:31,8 +DA:32,8 +DA:33,8 +DA:34,8 +DA:35,8 +DA:36,8 +DA:37,8 +DA:38,8 +DA:39,8 +DA:40,8 +DA:41,8 +DA:42,8 +DA:43,8 +DA:44,8 +DA:45,8 +DA:46,8 +DA:47,8 +DA:48,8 +DA:49,8 +DA:50,8 +DA:51,8 +DA:52,8 +DA:53,8 +DA:54,8 +DA:55,8 +DA:56,8 +DA:57,8 +DA:58,8 +DA:59,8 +DA:60,8 +DA:61,8 +DA:62,8 +DA:63,8 +DA:64,8 +DA:65,8 +DA:66,0 +DA:67,8 +DA:68,8 +DA:69,8 +DA:70,8 +DA:71,8 +DA:72,8 +DA:73,8 +DA:74,8 +DA:75,8 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +LF:80 +LH:79 +BRDA:20,0,0,8 +BRDA:59,1,0,0 +BRDA:65,2,0,0 +BRF:3 +BRH:1 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-card-content\text-or-content.tsx +FN:18,getTextOrContent +FNF:1 +FNH:1 +FNDA:16,getTextOrContent +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,16 +DA:20,16 +DA:21,16 +DA:22,16 +DA:23,16 +DA:24,16 +DA:25,16 +DA:26,8 +DA:27,8 +DA:28,8 +DA:29,8 +DA:30,8 +DA:31,8 +DA:32,0 +DA:33,8 +DA:34,8 +DA:35,8 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,8 +DA:47,8 +DA:48,8 +DA:49,8 +DA:50,8 +DA:51,6 +DA:52,6 +DA:53,6 +DA:54,6 +DA:55,6 +DA:56,6 +DA:57,6 +DA:58,2 +DA:59,8 +DA:60,8 +DA:61,16 +DA:62,16 +DA:63,16 +DA:64,16 +DA:65,16 +DA:66,16 +DA:67,1 +DA:68,1 +LF:68 +LH:57 +BRDA:18,0,0,16 +BRDA:25,1,0,8 +BRDA:31,2,0,0 +BRDA:35,3,0,0 +BRDA:50,4,0,6 +BRDA:52,5,0,0 +BRDA:57,6,0,2 +BRF:7 +BRH:4 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-card-content\timeline-card-content.styles.ts +FN:33,__vite_ssr_import_0__.default.section.borderLessCards.borderLessCards +FN:37,Object.defineProperty.enumerable +FN:44,Object.defineProperty.enumerable +FN:45,Object.defineProperty.enumerable +FN:46,Object.defineProperty.enumerable +FN:52,Object.defineProperty.enumerable +FN:60,Object.defineProperty.enumerable +FN:63,Object.defineProperty.enumerable +FN:66,Object.defineProperty.enumerable +FN:122,Object.defineProperty.enumerable +FN:123,Object.defineProperty.enumerable +FN:137,Object.defineProperty.enumerable +FN:138,Object.defineProperty.enumerable +FN:143,Object.defineProperty.enumerable +FN:170,Object.defineProperty.enumerable +FN:194,__vite_ssr_import_0__.default.div.$cardHeight.$cardHeight +FN:198,__vite_ssr_import_0__.default.div.height.height +FN:210,__vite_ssr_import_0__.default.div.height.height +FN:213,__vite_ssr_import_0__.default.div.height.height +FN:217,Object.defineProperty.enumerable +FN:245,Object.defineProperty.enumerable +FN:246,Object.defineProperty.enumerable +FN:270,Object.defineProperty.enumerable +FN:287,slideAnimation +FN:303,Object.defineProperty.enumerable +FN:376,Object.defineProperty.enumerable +FNF:26 +FNH:25 +FNDA:8,__vite_ssr_import_0__.default.section.borderLessCards.borderLessCards +FNDA:8,Object.defineProperty.enumerable +FNDA:8,Object.defineProperty.enumerable +FNDA:8,Object.defineProperty.enumerable +FNDA:8,Object.defineProperty.enumerable +FNDA:8,Object.defineProperty.enumerable +FNDA:8,Object.defineProperty.enumerable +FNDA:8,Object.defineProperty.enumerable +FNDA:8,Object.defineProperty.enumerable +FNDA:17,Object.defineProperty.enumerable +FNDA:17,Object.defineProperty.enumerable +FNDA:16,Object.defineProperty.enumerable +FNDA:16,Object.defineProperty.enumerable +FNDA:16,Object.defineProperty.enumerable +FNDA:0,Object.defineProperty.enumerable +FNDA:8,__vite_ssr_import_0__.default.div.$cardHeight.$cardHeight +FNDA:8,__vite_ssr_import_0__.default.div.height.height +FNDA:8,__vite_ssr_import_0__.default.div.height.height +FNDA:8,__vite_ssr_import_0__.default.div.height.height +FNDA:8,Object.defineProperty.enumerable +FNDA:8,Object.defineProperty.enumerable +FNDA:8,Object.defineProperty.enumerable +FNDA:3,Object.defineProperty.enumerable +FNDA:1,slideAnimation +FNDA:2,Object.defineProperty.enumerable +FNDA:15,Object.defineProperty.enumerable +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,8 +DA:39,8 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,8 +DA:54,0 +DA:55,0 +DA:56,8 +DA:57,8 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,8 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,8 +DA:93,1 +DA:94,1 +DA:95,8 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,8 +DA:103,8 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,8 +DA:109,1 +DA:110,1 +DA:111,1 +DA:112,1 +DA:113,1 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,1 +DA:118,1 +DA:119,1 +DA:120,1 +DA:121,1 +DA:122,1 +DA:123,1 +DA:124,1 +DA:125,1 +DA:126,1 +DA:127,1 +DA:128,1 +DA:129,1 +DA:130,1 +DA:131,1 +DA:132,1 +DA:133,1 +DA:134,1 +DA:135,1 +DA:136,1 +DA:137,1 +DA:138,1 +DA:139,1 +DA:140,1 +DA:141,1 +DA:142,1 +DA:143,1 +DA:144,1 +DA:145,1 +DA:146,1 +DA:147,1 +DA:148,1 +DA:149,1 +DA:150,1 +DA:151,1 +DA:152,1 +DA:153,1 +DA:154,1 +DA:155,1 +DA:156,1 +DA:157,1 +DA:158,1 +DA:159,1 +DA:160,1 +DA:161,1 +DA:162,1 +DA:163,1 +DA:164,1 +DA:165,1 +DA:166,1 +DA:167,1 +DA:168,1 +DA:169,1 +DA:170,1 +DA:171,1 +DA:172,1 +DA:173,1 +DA:174,1 +DA:175,1 +DA:176,1 +DA:177,1 +DA:178,1 +DA:179,1 +DA:180,1 +DA:181,1 +DA:182,1 +DA:183,1 +DA:184,1 +DA:185,1 +DA:186,1 +DA:187,1 +DA:188,1 +DA:189,1 +DA:190,1 +DA:191,1 +DA:192,1 +DA:193,1 +DA:194,1 +DA:195,8 +DA:196,8 +DA:197,1 +DA:198,1 +DA:199,8 +DA:200,8 +DA:201,8 +DA:202,8 +DA:203,8 +DA:204,8 +DA:205,8 +DA:206,0 +DA:207,1 +DA:208,1 +DA:209,1 +DA:210,1 +DA:211,1 +DA:212,1 +DA:213,1 +DA:214,1 +DA:215,1 +DA:216,1 +DA:217,1 +DA:218,8 +DA:219,8 +DA:220,8 +DA:221,8 +DA:222,8 +DA:223,8 +DA:224,8 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,8 +DA:235,1 +DA:236,1 +DA:237,1 +DA:238,1 +DA:239,1 +DA:240,1 +DA:241,1 +DA:242,1 +DA:243,1 +DA:244,1 +DA:245,1 +DA:246,1 +DA:247,1 +DA:248,1 +DA:249,1 +DA:250,1 +DA:251,1 +DA:252,1 +DA:253,1 +DA:254,1 +DA:255,1 +DA:256,1 +DA:257,1 +DA:258,1 +DA:259,1 +DA:260,1 +DA:261,1 +DA:262,1 +DA:263,1 +DA:264,1 +DA:265,1 +DA:266,1 +DA:267,1 +DA:268,1 +DA:269,1 +DA:270,1 +DA:271,1 +DA:272,1 +DA:273,1 +DA:274,1 +DA:275,1 +DA:276,1 +DA:277,1 +DA:278,1 +DA:279,1 +DA:280,1 +DA:281,1 +DA:282,1 +DA:283,1 +DA:284,1 +DA:285,1 +DA:286,1 +DA:287,1 +DA:288,1 +DA:289,1 +DA:290,1 +DA:291,1 +DA:292,1 +DA:293,1 +DA:294,1 +DA:295,1 +DA:296,1 +DA:297,1 +DA:298,1 +DA:299,1 +DA:300,1 +DA:301,1 +DA:302,1 +DA:303,1 +DA:304,1 +DA:305,1 +DA:306,1 +DA:307,1 +DA:308,1 +DA:309,1 +DA:310,1 +DA:311,1 +DA:312,1 +DA:313,2 +DA:314,1 +DA:315,1 +DA:316,1 +DA:317,1 +DA:318,1 +DA:319,2 +DA:320,1 +DA:321,1 +DA:322,2 +DA:323,1 +DA:324,1 +DA:325,1 +DA:326,1 +DA:327,1 +DA:328,1 +DA:329,1 +DA:330,1 +DA:331,1 +DA:332,1 +DA:333,2 +DA:334,1 +DA:335,1 +DA:336,1 +DA:337,1 +DA:338,1 +DA:339,1 +DA:340,1 +DA:341,1 +DA:342,1 +DA:343,1 +DA:344,1 +DA:345,1 +DA:346,1 +DA:347,1 +DA:348,1 +DA:349,1 +DA:350,1 +DA:351,1 +DA:352,3 +DA:353,2 +DA:354,1 +DA:355,1 +DA:356,1 +DA:357,1 +DA:358,1 +DA:359,1 +DA:360,1 +DA:361,1 +DA:362,1 +DA:363,1 +DA:364,1 +DA:365,1 +DA:366,1 +DA:367,1 +DA:368,1 +DA:369,1 +DA:370,1 +DA:371,1 +DA:372,1 +DA:373,1 +DA:374,1 +DA:375,1 +DA:376,1 +DA:377,1 +DA:378,1 +DA:379,1 +DA:380,1 +DA:381,1 +DA:382,1 +DA:383,1 +DA:384,1 +DA:385,1 +DA:386,1 +DA:387,1 +DA:388,1 +LF:388 +LH:342 +BRDA:33,0,0,8 +BRDA:37,1,0,8 +BRDA:39,2,0,0 +BRDA:44,3,0,8 +BRDA:44,4,0,0 +BRDA:45,5,0,8 +BRDA:46,6,0,8 +BRDA:52,7,0,8 +BRDA:53,8,0,0 +BRDA:60,9,0,8 +BRDA:60,10,0,0 +BRDA:63,11,0,8 +BRDA:66,12,0,8 +BRDA:67,13,0,0 +BRDA:67,14,0,0 +BRDA:94,15,0,8 +BRDA:95,16,0,0 +BRDA:95,17,0,0 +BRDA:103,18,0,0 +BRDA:103,19,0,0 +BRDA:122,20,0,17 +BRDA:123,21,0,17 +BRDA:128,22,0,17 +BRDA:128,23,0,13 +BRDA:128,24,0,4 +BRDA:137,25,0,16 +BRDA:138,26,0,16 +BRDA:143,27,0,16 +BRDA:143,28,0,2 +BRDA:143,29,0,14 +BRDA:144,30,0,16 +BRDA:161,31,0,6 +BRDA:194,32,0,8 +BRDA:196,33,0,0 +BRDA:198,34,0,8 +BRDA:205,35,0,0 +BRDA:205,36,0,0 +BRDA:210,37,0,8 +BRDA:213,38,0,8 +BRDA:214,39,0,0 +BRDA:217,40,0,8 +BRDA:224,41,0,0 +BRDA:224,42,0,0 +BRDA:224,43,0,0 +BRDA:245,44,0,8 +BRDA:246,45,0,8 +BRDA:258,46,0,8 +BRDA:270,47,0,3 +BRDA:270,48,0,0 +BRDA:278,49,0,3 +BRDA:287,50,0,1 +BRDA:303,51,0,2 +BRDA:312,52,0,2 +BRDA:313,53,0,1 +BRDA:321,54,0,2 +BRDA:322,55,0,1 +BRDA:322,56,0,1 +BRDA:322,57,0,1 +BRDA:351,58,0,3 +BRDA:352,59,0,2 +BRDA:353,60,0,1 +BRDA:376,61,0,15 +BRDA:386,62,0,15 +BRDA:387,63,0,0 +BRF:64 +BRH:45 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-card-content\timeline-card-content.tsx +FN:337,onPointerDown +FNF:1 +FNH:0 +FNDA:0,onPointerDown +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,20 +DA:26,20 +DA:27,20 +DA:28,20 +DA:29,20 +DA:30,20 +DA:31,20 +DA:32,20 +DA:33,20 +DA:34,20 +DA:35,20 +DA:36,20 +DA:37,20 +DA:38,20 +DA:39,20 +DA:40,20 +DA:41,20 +DA:42,20 +DA:43,20 +DA:44,20 +DA:45,20 +DA:46,20 +DA:47,20 +DA:48,20 +DA:49,20 +DA:50,20 +DA:51,20 +DA:52,20 +DA:53,20 +DA:54,20 +DA:55,20 +DA:56,20 +DA:57,20 +DA:58,20 +DA:59,20 +DA:60,20 +DA:61,20 +DA:62,20 +DA:63,20 +DA:64,20 +DA:65,20 +DA:66,20 +DA:67,20 +DA:68,20 +DA:69,20 +DA:70,20 +DA:71,20 +DA:72,20 +DA:73,20 +DA:74,20 +DA:75,20 +DA:76,20 +DA:77,20 +DA:78,20 +DA:79,20 +DA:80,20 +DA:81,20 +DA:82,20 +DA:83,20 +DA:84,20 +DA:85,8 +DA:86,20 +DA:87,20 +DA:88,20 +DA:89,20 +DA:90,20 +DA:91,20 +DA:92,8 +DA:93,20 +DA:94,20 +DA:95,20 +DA:96,8 +DA:97,8 +DA:98,8 +DA:99,8 +DA:100,8 +DA:101,20 +DA:102,20 +DA:103,20 +DA:104,8 +DA:105,6 +DA:106,6 +DA:107,20 +DA:108,20 +DA:109,20 +DA:110,20 +DA:111,16 +DA:112,8 +DA:113,8 +DA:114,8 +DA:115,16 +DA:116,0 +DA:117,0 +DA:118,8 +DA:119,8 +DA:120,8 +DA:121,8 +DA:122,8 +DA:123,8 +DA:124,16 +DA:125,20 +DA:126,20 +DA:127,20 +DA:128,20 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,20 +DA:148,20 +DA:149,20 +DA:150,8 +DA:151,0 +DA:152,0 +DA:153,20 +DA:154,20 +DA:155,20 +DA:156,20 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,20 +DA:171,20 +DA:172,20 +DA:173,20 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,20 +DA:188,20 +DA:189,20 +DA:190,8 +DA:191,0 +DA:192,0 +DA:193,8 +DA:194,8 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,8 +DA:199,8 +DA:200,8 +DA:201,0 +DA:202,0 +DA:203,8 +DA:204,8 +DA:205,8 +DA:206,8 +DA:207,20 +DA:208,20 +DA:209,20 +DA:210,8 +DA:211,0 +DA:212,0 +DA:213,20 +DA:214,20 +DA:215,20 +DA:216,8 +DA:217,0 +DA:218,0 +DA:219,20 +DA:220,20 +DA:221,20 +DA:222,8 +DA:223,20 +DA:224,20 +DA:225,20 +DA:226,20 +DA:227,20 +DA:228,20 +DA:229,8 +DA:230,20 +DA:231,20 +DA:232,20 +DA:233,20 +DA:234,20 +DA:235,20 +DA:236,20 +DA:237,20 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,20 +DA:250,20 +DA:251,20 +DA:252,20 +DA:253,20 +DA:254,8 +DA:255,8 +DA:256,8 +DA:257,8 +DA:258,20 +DA:259,20 +DA:260,20 +DA:261,20 +DA:262,20 +DA:263,8 +DA:264,8 +DA:265,8 +DA:266,0 +DA:267,8 +DA:268,8 +DA:269,20 +DA:270,20 +DA:271,20 +DA:272,20 +DA:273,20 +DA:274,20 +DA:275,20 +DA:276,20 +DA:277,20 +DA:278,20 +DA:279,8 +DA:280,0 +DA:281,8 +DA:282,8 +DA:283,8 +DA:284,0 +DA:285,0 +DA:286,20 +DA:287,20 +DA:288,20 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,20 +DA:294,20 +DA:295,20 +DA:296,8 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,8 +DA:304,20 +DA:305,20 +DA:306,20 +DA:307,20 +DA:308,20 +DA:309,20 +DA:310,20 +DA:311,20 +DA:312,8 +DA:313,8 +DA:314,0 +DA:315,8 +DA:316,0 +DA:317,8 +DA:318,20 +DA:319,20 +DA:320,20 +DA:321,20 +DA:322,8 +DA:323,20 +DA:324,20 +DA:325,20 +DA:326,8 +DA:327,8 +DA:328,8 +DA:329,8 +DA:330,8 +DA:331,8 +DA:332,20 +DA:333,20 +DA:334,20 +DA:335,8 +DA:336,8 +DA:337,8 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,8 +DA:349,8 +DA:350,8 +DA:351,8 +DA:352,20 +DA:353,20 +DA:354,20 +DA:355,20 +DA:356,20 +DA:357,20 +DA:358,20 +DA:359,20 +DA:360,20 +DA:361,20 +DA:362,20 +DA:363,20 +DA:364,20 +DA:365,20 +DA:366,20 +DA:367,20 +DA:368,20 +DA:369,20 +DA:370,20 +DA:371,20 +DA:372,20 +DA:373,20 +DA:374,18 +DA:375,18 +DA:376,18 +DA:377,18 +DA:378,18 +DA:379,18 +DA:380,18 +DA:381,2 +DA:382,20 +DA:383,20 +DA:384,20 +DA:385,20 +DA:386,20 +DA:387,20 +DA:388,20 +DA:389,20 +DA:390,20 +DA:391,20 +DA:392,20 +DA:393,20 +DA:394,20 +DA:395,20 +DA:396,20 +DA:397,20 +DA:398,20 +DA:399,20 +DA:400,20 +DA:401,20 +DA:402,20 +DA:403,20 +DA:404,20 +DA:405,20 +DA:406,20 +DA:407,20 +DA:408,20 +DA:409,20 +DA:410,20 +DA:411,20 +DA:412,20 +DA:413,20 +DA:414,20 +DA:415,20 +DA:416,20 +DA:417,20 +DA:418,20 +DA:419,20 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,20 +DA:430,20 +DA:431,20 +DA:432,20 +DA:433,20 +DA:434,20 +DA:435,20 +DA:436,20 +DA:437,20 +DA:438,20 +DA:439,20 +DA:440,20 +DA:441,20 +DA:442,20 +DA:443,20 +DA:444,20 +DA:445,20 +DA:446,20 +DA:447,20 +DA:448,20 +DA:449,20 +DA:450,20 +DA:451,20 +DA:452,1 +DA:453,1 +DA:454,1 +DA:455,1 +DA:456,1 +LF:456 +LH:351 +BRDA:24,0,0,20 +BRDA:323,1,0,0 +BRDA:363,2,0,0 +BRDA:373,3,0,18 +BRDA:373,4,0,18 +BRDA:380,5,0,2 +BRDA:419,6,0,0 +BRDA:431,7,0,0 +BRDA:84,8,0,8 +BRDA:85,9,0,6 +BRDA:85,10,0,0 +BRDA:91,11,0,8 +BRDA:95,12,0,8 +BRDA:103,13,0,8 +BRDA:104,14,0,6 +BRDA:110,15,0,16 +BRDA:111,16,0,8 +BRDA:115,17,0,0 +BRDA:117,18,0,8 +BRDA:149,19,0,8 +BRDA:150,20,0,0 +BRDA:150,21,0,0 +BRDA:189,22,0,8 +BRDA:190,23,0,0 +BRDA:194,24,0,6 +BRDA:194,25,0,0 +BRDA:200,26,0,6 +BRDA:200,27,0,0 +BRDA:209,28,0,8 +BRDA:210,29,0,0 +BRDA:210,30,0,0 +BRDA:215,31,0,8 +BRDA:216,32,0,0 +BRDA:221,33,0,8 +BRDA:228,34,0,8 +BRDA:229,35,0,6 +BRDA:253,36,0,8 +BRDA:255,37,0,6 +BRDA:255,38,0,2 +BRDA:262,39,0,8 +BRDA:265,40,0,0 +BRDA:278,41,0,8 +BRDA:279,42,0,0 +BRDA:279,43,0,0 +BRDA:283,44,0,0 +BRDA:295,45,0,8 +BRDA:296,46,0,0 +BRDA:311,47,0,8 +BRDA:313,48,0,0 +BRDA:315,49,0,0 +BRDA:321,50,0,8 +BRDA:322,51,0,0 +BRDA:325,52,0,8 +BRDA:334,53,0,8 +BRF:54 +BRH:32 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-card-media\timeline-card-media-buttons.tsx +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +LF:48 +LH:48 +BRDA:17,0,0,4 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-card-media\timeline-card-media.styles.ts +FN:34,Object.defineProperty.enumerable +FN:37,Object.defineProperty.enumerable +FN:39,Object.defineProperty.enumerable +FN:41,Object.defineProperty.enumerable +FN:44,Object.defineProperty.enumerable +FN:77,Object.defineProperty.enumerable +FN:79,Object.defineProperty.enumerable +FN:105,__vite_ssr_import_0__.default.div.$borderLessCard.$borderLessCard +FN:117,__vite_ssr_import_0__.default.div.$borderLessCard.$borderLessCard +FN:142,__vite_ssr_import_0__.default.div.$borderLessCard.$borderLessCard +FN:143,__vite_ssr_import_0__.default.div.$borderLessCard.$borderLessCard +FN:159,Object.defineProperty.enumerable +FN:163,Object.defineProperty.enumerable +FN:192,Object.defineProperty.enumerable +FN:193,Object.defineProperty.enumerable +FN:203,Object.defineProperty.enumerable +FN:215,Object.defineProperty.enumerable +FNF:17 +FNH:17 +FNDA:16,Object.defineProperty.enumerable +FNDA:16,Object.defineProperty.enumerable +FNDA:16,Object.defineProperty.enumerable +FNDA:16,Object.defineProperty.enumerable +FNDA:16,Object.defineProperty.enumerable +FNDA:14,Object.defineProperty.enumerable +FNDA:14,Object.defineProperty.enumerable +FNDA:16,__vite_ssr_import_0__.default.div.$borderLessCard.$borderLessCard +FNDA:16,__vite_ssr_import_0__.default.div.$borderLessCard.$borderLessCard +FNDA:16,__vite_ssr_import_0__.default.div.$borderLessCard.$borderLessCard +FNDA:16,__vite_ssr_import_0__.default.div.$borderLessCard.$borderLessCard +FNDA:16,Object.defineProperty.enumerable +FNDA:16,Object.defineProperty.enumerable +FNDA:3,Object.defineProperty.enumerable +FNDA:3,Object.defineProperty.enumerable +FNDA:3,Object.defineProperty.enumerable +FNDA:3,Object.defineProperty.enumerable +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,16 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,16 +DA:51,15 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,15 +DA:56,15 +DA:57,15 +DA:58,15 +DA:59,15 +DA:60,15 +DA:61,16 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,1 +DA:82,1 +DA:83,1 +DA:84,1 +DA:85,1 +DA:86,1 +DA:87,1 +DA:88,1 +DA:89,1 +DA:90,1 +DA:91,1 +DA:92,1 +DA:93,1 +DA:94,1 +DA:95,1 +DA:96,1 +DA:97,1 +DA:98,1 +DA:99,1 +DA:100,1 +DA:101,1 +DA:102,1 +DA:103,1 +DA:104,1 +DA:105,1 +DA:106,16 +DA:107,16 +DA:108,16 +DA:109,16 +DA:110,16 +DA:111,16 +DA:112,16 +DA:113,1 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,1 +DA:118,16 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,16 +DA:126,16 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,16 +DA:134,16 +DA:135,2 +DA:136,2 +DA:137,2 +DA:138,2 +DA:139,2 +DA:140,2 +DA:141,16 +DA:142,1 +DA:143,1 +DA:144,16 +DA:145,2 +DA:146,2 +DA:147,2 +DA:148,2 +DA:149,2 +DA:150,2 +DA:151,2 +DA:152,2 +DA:153,2 +DA:154,2 +DA:155,14 +DA:156,14 +DA:157,1 +DA:158,1 +DA:159,1 +DA:160,16 +DA:161,0 +DA:162,1 +DA:163,1 +DA:164,1 +DA:165,1 +DA:166,1 +DA:167,1 +DA:168,1 +DA:169,1 +DA:170,1 +DA:171,1 +DA:172,1 +DA:173,1 +DA:174,1 +DA:175,1 +DA:176,1 +DA:177,1 +DA:178,1 +DA:179,1 +DA:180,1 +DA:181,1 +DA:182,1 +DA:183,1 +DA:184,1 +DA:185,1 +DA:186,1 +DA:187,1 +DA:188,1 +DA:189,1 +DA:190,1 +DA:191,1 +DA:192,1 +DA:193,1 +DA:194,1 +DA:195,1 +DA:196,1 +DA:197,1 +DA:198,1 +DA:199,1 +DA:200,1 +DA:201,1 +DA:202,1 +DA:203,1 +DA:204,3 +DA:205,1 +DA:206,1 +DA:207,1 +DA:208,3 +DA:209,2 +DA:210,2 +DA:211,2 +DA:212,2 +DA:213,3 +DA:214,1 +DA:215,1 +DA:216,3 +DA:217,3 +DA:218,0 +DA:219,0 +DA:220,1 +DA:221,1 +DA:222,1 +DA:223,1 +DA:224,1 +DA:225,1 +DA:226,1 +DA:227,1 +DA:228,1 +DA:229,1 +DA:230,1 +DA:231,1 +DA:232,1 +DA:233,1 +DA:234,1 +DA:235,1 +DA:236,1 +DA:237,1 +DA:238,1 +LF:238 +LH:220 +BRDA:34,0,0,16 +BRDA:34,1,0,14 +BRDA:34,2,0,2 +BRDA:37,3,0,16 +BRDA:37,4,0,2 +BRDA:37,5,0,14 +BRDA:39,6,0,16 +BRDA:39,7,0,9 +BRDA:39,8,0,0 +BRDA:41,9,0,16 +BRDA:44,10,0,16 +BRDA:44,11,0,14 +BRDA:44,12,0,2 +BRDA:45,13,0,16 +BRDA:46,14,0,1 +BRDA:50,15,0,15 +BRDA:51,16,0,0 +BRDA:77,17,0,14 +BRDA:79,18,0,14 +BRDA:79,19,0,0 +BRDA:80,20,0,14 +BRDA:80,21,0,0 +BRDA:105,22,0,16 +BRDA:107,23,0,1 +BRDA:108,24,0,1 +BRDA:117,25,0,16 +BRDA:118,26,0,2 +BRDA:118,27,0,0 +BRDA:126,28,0,0 +BRDA:134,29,0,2 +BRDA:134,30,0,2 +BRDA:142,31,0,16 +BRDA:142,32,0,2 +BRDA:142,33,0,14 +BRDA:143,34,0,16 +BRDA:144,35,0,2 +BRDA:147,36,0,0 +BRDA:150,37,0,0 +BRDA:154,38,0,0 +BRDA:154,39,0,14 +BRDA:159,40,0,16 +BRDA:160,41,0,0 +BRDA:163,42,0,16 +BRDA:164,43,0,16 +BRDA:164,44,0,2 +BRDA:164,45,0,14 +BRDA:192,46,0,3 +BRDA:193,47,0,3 +BRDA:203,48,0,3 +BRDA:204,49,0,1 +BRDA:208,50,0,2 +BRDA:215,51,0,3 +BRDA:217,52,0,0 +BRDA:223,53,0,3 +BRDA:223,54,0,2 +BRF:55 +BRH:44 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-card-media\timeline-card-media.tsx +FN:42,CardMedia +FN:157,onPlay +FN:164,onPause +FN:171,onEnded +FNF:4 +FNH:1 +FNDA:16,CardMedia +FNDA:0,onPlay +FNDA:0,onPause +FNDA:0,onEnded +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,16 +DA:44,16 +DA:45,16 +DA:46,16 +DA:47,16 +DA:48,16 +DA:49,16 +DA:50,16 +DA:51,16 +DA:52,16 +DA:53,16 +DA:54,16 +DA:55,16 +DA:56,16 +DA:57,16 +DA:58,16 +DA:59,16 +DA:60,16 +DA:61,16 +DA:62,16 +DA:63,16 +DA:64,16 +DA:65,16 +DA:66,16 +DA:67,16 +DA:68,16 +DA:69,16 +DA:70,16 +DA:71,16 +DA:72,16 +DA:73,16 +DA:74,16 +DA:75,16 +DA:76,16 +DA:77,16 +DA:78,16 +DA:79,16 +DA:80,16 +DA:81,16 +DA:82,0 +DA:83,0 +DA:84,16 +DA:85,16 +DA:86,7 +DA:87,7 +DA:88,16 +DA:89,9 +DA:90,9 +DA:91,9 +DA:92,16 +DA:93,16 +DA:94,16 +DA:95,16 +DA:96,0 +DA:97,16 +DA:98,16 +DA:99,16 +DA:100,16 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,16 +DA:110,16 +DA:111,16 +DA:112,16 +DA:113,16 +DA:114,16 +DA:115,16 +DA:116,16 +DA:117,16 +DA:118,16 +DA:119,16 +DA:120,16 +DA:121,16 +DA:122,16 +DA:123,16 +DA:124,16 +DA:125,16 +DA:126,16 +DA:127,16 +DA:128,16 +DA:129,16 +DA:130,16 +DA:131,16 +DA:132,16 +DA:133,16 +DA:134,16 +DA:135,16 +DA:136,16 +DA:137,16 +DA:138,16 +DA:139,16 +DA:140,16 +DA:141,16 +DA:142,16 +DA:143,16 +DA:144,16 +DA:145,16 +DA:146,16 +DA:147,16 +DA:148,16 +DA:149,16 +DA:150,16 +DA:151,16 +DA:152,16 +DA:153,16 +DA:154,16 +DA:155,16 +DA:156,16 +DA:157,16 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,16 +DA:164,16 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,16 +DA:171,16 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,16 +DA:178,16 +DA:179,16 +DA:180,16 +DA:181,16 +DA:182,16 +DA:183,16 +DA:184,16 +DA:185,16 +DA:186,16 +DA:187,16 +DA:188,16 +DA:189,16 +DA:190,16 +DA:191,16 +DA:192,16 +DA:193,16 +DA:194,16 +DA:195,16 +DA:196,16 +DA:197,16 +DA:198,16 +DA:199,16 +DA:200,16 +DA:201,16 +DA:202,16 +DA:203,16 +DA:204,16 +DA:205,16 +DA:206,16 +DA:207,2 +DA:208,0 +DA:209,0 +DA:210,16 +DA:211,16 +DA:212,16 +DA:213,16 +DA:214,16 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,16 +DA:221,16 +DA:222,16 +DA:223,16 +DA:224,16 +DA:225,16 +DA:226,16 +DA:227,16 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,16 +DA:234,16 +DA:235,16 +DA:236,16 +DA:237,16 +DA:238,16 +DA:239,16 +DA:240,16 +DA:241,16 +DA:242,16 +DA:243,16 +DA:244,16 +DA:245,16 +DA:246,16 +DA:247,16 +DA:248,16 +DA:249,16 +DA:250,16 +DA:251,16 +DA:252,16 +DA:253,16 +DA:254,16 +DA:255,16 +DA:256,16 +DA:257,16 +DA:258,16 +DA:259,16 +DA:260,16 +DA:261,16 +DA:262,16 +DA:263,16 +DA:264,16 +DA:265,16 +DA:266,16 +DA:267,16 +DA:268,16 +DA:269,16 +DA:270,16 +DA:271,16 +DA:272,2 +DA:273,16 +DA:274,14 +DA:275,14 +DA:276,16 +DA:277,16 +DA:278,16 +DA:279,16 +DA:280,16 +DA:281,16 +DA:282,16 +DA:283,16 +DA:284,16 +DA:285,16 +DA:286,16 +DA:287,16 +DA:288,16 +DA:289,16 +DA:290,16 +DA:291,16 +DA:292,16 +DA:293,16 +DA:294,16 +DA:295,16 +DA:296,16 +DA:297,16 +DA:298,16 +DA:299,16 +DA:300,16 +DA:301,2 +DA:302,2 +DA:303,2 +DA:304,2 +DA:305,2 +DA:306,2 +DA:307,2 +DA:308,2 +DA:309,2 +DA:310,2 +DA:311,2 +DA:312,2 +DA:313,2 +DA:314,2 +DA:315,14 +DA:316,16 +DA:317,16 +DA:318,16 +DA:319,16 +DA:320,16 +DA:321,16 +DA:322,16 +DA:323,16 +DA:324,16 +DA:325,16 +DA:326,16 +DA:327,16 +DA:328,16 +DA:329,16 +DA:330,16 +DA:331,16 +DA:332,16 +DA:333,16 +DA:334,16 +DA:335,16 +DA:336,16 +DA:337,0 +DA:338,16 +DA:339,16 +DA:340,16 +DA:341,16 +DA:342,16 +DA:343,16 +DA:344,16 +DA:345,16 +DA:346,16 +DA:347,16 +DA:348,16 +DA:349,16 +DA:350,16 +DA:351,16 +DA:352,16 +DA:353,16 +DA:354,16 +DA:355,16 +DA:356,16 +DA:357,16 +DA:358,16 +DA:359,16 +DA:360,16 +DA:361,16 +DA:362,16 +DA:363,16 +DA:364,16 +DA:365,16 +DA:366,16 +DA:367,2 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,16 +DA:373,16 +DA:374,16 +DA:375,14 +DA:376,14 +DA:377,0 +DA:378,0 +DA:379,16 +DA:380,16 +DA:381,16 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,16 +DA:392,16 +DA:393,16 +DA:394,2 +DA:395,2 +DA:396,2 +DA:397,2 +DA:398,2 +DA:399,2 +DA:400,2 +DA:401,14 +DA:402,16 +DA:403,16 +DA:404,16 +DA:405,16 +DA:406,16 +DA:407,1 +DA:408,1 +DA:409,1 +DA:410,1 +LF:410 +LH:356 +BRDA:42,0,0,16 +BRDA:363,1,0,0 +BRDA:366,2,0,2 +BRDA:367,3,0,0 +BRDA:373,4,0,2 +BRDA:373,5,0,2 +BRDA:374,6,0,14 +BRDA:376,7,0,0 +BRDA:381,8,0,0 +BRDA:393,9,0,2 +BRDA:400,10,0,14 +BRDA:403,11,0,0 +BRDA:80,12,0,16 +BRDA:81,13,0,0 +BRDA:85,14,0,7 +BRDA:87,15,0,0 +BRDA:88,16,0,9 +BRDA:90,17,0,0 +BRDA:118,18,0,16 +BRDA:131,19,0,16 +BRDA:139,20,0,7 +BRDA:139,21,0,9 +BRDA:149,22,0,16 +BRDA:185,23,0,16 +BRDA:197,24,0,0 +BRDA:206,25,0,2 +BRDA:207,26,0,0 +BRDA:238,27,0,16 +BRDA:239,28,0,15 +BRDA:245,29,0,16 +BRDA:251,30,0,16 +BRDA:251,31,0,7 +BRDA:251,32,0,4 +BRDA:256,33,0,16 +BRDA:256,34,0,2 +BRDA:261,35,0,16 +BRDA:261,36,0,0 +BRDA:266,37,0,16 +BRDA:270,38,0,16 +BRDA:271,39,0,2 +BRDA:273,40,0,14 +BRDA:278,41,0,16 +BRDA:289,42,0,2 +BRDA:289,43,0,14 +BRDA:300,44,0,2 +BRDA:314,45,0,14 +BRDA:336,46,0,0 +BRDA:350,47,0,16 +BRDA:350,48,0,0 +BRF:49 +BRH:36 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-control\timeline-control.styles.ts +FN:27,Object.defineProperty.enumerable +FN:41,Object.defineProperty.enumerable +FNF:2 +FNH:2 +FNDA:21,Object.defineProperty.enumerable +FNDA:21,Object.defineProperty.enumerable +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,21 +DA:43,16 +DA:44,16 +DA:45,21 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,1 +DA:82,1 +DA:83,1 +DA:84,1 +DA:85,1 +LF:85 +LH:85 +BRDA:18,0,0,24 +BRDA:18,1,0,0 +BRDA:27,2,0,21 +BRDA:41,3,0,21 +BRDA:42,4,0,16 +BRDA:49,5,0,21 +BRDA:49,6,0,16 +BRDA:49,7,0,5 +BRF:8 +BRH:7 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-control\timeline-control.tsx +FN:37,TimelineControl +FNF:1 +FNH:1 +FNDA:4,TimelineControl +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,4 +DA:39,4 +DA:40,4 +DA:41,4 +DA:42,4 +DA:43,4 +DA:44,4 +DA:45,4 +DA:46,4 +DA:47,4 +DA:48,4 +DA:49,4 +DA:50,4 +DA:51,4 +DA:52,4 +DA:53,4 +DA:54,4 +DA:55,4 +DA:56,4 +DA:57,4 +DA:58,4 +DA:59,4 +DA:60,4 +DA:61,4 +DA:62,4 +DA:63,4 +DA:64,4 +DA:65,4 +DA:66,4 +DA:67,4 +DA:68,4 +DA:69,4 +DA:70,4 +DA:71,4 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,4 +DA:78,4 +DA:79,4 +DA:80,4 +DA:81,4 +DA:82,4 +DA:83,4 +DA:84,4 +DA:85,4 +DA:86,4 +DA:87,4 +DA:88,4 +DA:89,4 +DA:90,4 +DA:91,4 +DA:92,4 +DA:93,4 +DA:94,4 +DA:95,4 +DA:96,4 +DA:97,4 +DA:98,4 +DA:99,4 +DA:100,4 +DA:101,4 +DA:102,4 +DA:103,4 +DA:104,4 +DA:105,4 +DA:106,4 +DA:107,4 +DA:108,4 +DA:109,4 +DA:110,4 +DA:111,4 +DA:112,4 +DA:113,4 +DA:114,4 +DA:115,4 +DA:116,4 +DA:117,4 +DA:118,4 +DA:119,4 +DA:120,4 +DA:121,4 +DA:122,4 +DA:123,4 +DA:124,4 +DA:125,4 +DA:126,4 +DA:127,4 +DA:128,4 +DA:129,4 +DA:130,4 +DA:131,4 +DA:132,4 +DA:133,4 +DA:134,4 +DA:135,4 +DA:136,4 +DA:137,4 +DA:138,4 +DA:139,4 +DA:140,4 +DA:141,4 +DA:142,4 +DA:143,4 +DA:144,4 +DA:145,4 +DA:146,4 +DA:147,4 +DA:148,4 +DA:149,4 +DA:150,4 +DA:151,4 +DA:152,4 +DA:153,4 +DA:154,4 +DA:155,4 +DA:156,4 +DA:157,4 +DA:158,4 +DA:159,4 +DA:160,4 +DA:161,4 +DA:162,4 +DA:163,4 +DA:164,4 +DA:165,4 +DA:166,4 +DA:167,4 +DA:168,4 +DA:169,4 +DA:170,4 +DA:171,4 +DA:172,4 +DA:173,4 +DA:174,4 +DA:175,4 +DA:176,4 +DA:177,4 +DA:178,4 +DA:179,4 +DA:180,1 +DA:181,1 +DA:182,1 +DA:183,1 +DA:184,1 +DA:185,1 +DA:186,1 +DA:187,1 +DA:188,1 +DA:189,1 +DA:190,4 +DA:191,4 +DA:192,4 +DA:193,4 +DA:194,4 +DA:195,4 +DA:196,4 +DA:197,4 +DA:198,4 +DA:199,4 +DA:200,4 +DA:201,4 +DA:202,4 +DA:203,4 +DA:204,4 +DA:205,4 +DA:206,4 +DA:207,0 +DA:208,4 +DA:209,4 +DA:210,4 +DA:211,4 +DA:212,1 +DA:213,1 +DA:214,1 +DA:215,1 +LF:215 +LH:209 +BRDA:37,0,0,4 +BRDA:114,1,0,0 +BRDA:119,2,0,0 +BRDA:120,3,0,0 +BRDA:131,4,0,0 +BRDA:136,5,0,0 +BRDA:137,6,0,0 +BRDA:148,7,0,0 +BRDA:153,8,0,0 +BRDA:154,9,0,0 +BRDA:165,10,0,0 +BRDA:170,11,0,0 +BRDA:171,12,0,0 +BRDA:179,13,0,1 +BRDA:188,14,0,0 +BRDA:199,15,0,0 +BRDA:202,16,0,0 +BRDA:204,17,0,0 +BRDA:206,18,0,0 +BRDA:54,19,0,4 +BRDA:57,20,0,4 +BRDA:57,21,0,0 +BRDA:62,22,0,4 +BRDA:67,23,0,4 +BRDA:80,24,0,4 +BRDA:80,25,0,0 +BRDA:85,26,0,4 +BRDA:85,27,0,0 +BRDA:90,28,0,4 +BRDA:90,29,0,0 +BRDA:95,30,0,4 +BRDA:95,31,0,0 +BRDA:100,32,0,4 +BRDA:100,33,0,0 +BRF:34 +BRH:11 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-item-title\timeline-card-title.styles.ts +FN:11,Object.defineProperty.enumerable +FN:15,Object.defineProperty.enumerable +FN:16,Object.defineProperty.enumerable +FN:17,Object.defineProperty.enumerable +FN:20,Object.defineProperty.enumerable +FNF:5 +FNH:5 +FNDA:13,Object.defineProperty.enumerable +FNDA:13,Object.defineProperty.enumerable +FNDA:13,Object.defineProperty.enumerable +FNDA:13,Object.defineProperty.enumerable +FNDA:13,Object.defineProperty.enumerable +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +LF:24 +LH:24 +BRDA:11,0,0,13 +BRDA:11,1,0,0 +BRDA:15,2,0,13 +BRDA:15,3,0,6 +BRDA:15,4,0,7 +BRDA:16,5,0,13 +BRDA:16,6,0,3 +BRDA:16,7,0,10 +BRDA:17,8,0,13 +BRDA:17,9,0,0 +BRDA:20,10,0,13 +BRDA:21,11,0,13 +BRDA:22,12,0,8 +BRDA:22,13,0,5 +BRF:14 +BRH:12 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-item-title\timeline-card-title.tsx +FN:18,TimelineItemTitle +FNF:1 +FNH:1 +FNDA:13,TimelineItemTitle +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,13 +DA:20,13 +DA:21,13 +DA:22,13 +DA:23,13 +DA:24,13 +DA:25,13 +DA:26,13 +DA:27,13 +DA:28,13 +DA:29,13 +DA:30,13 +DA:31,13 +DA:32,13 +DA:33,13 +DA:34,13 +DA:35,13 +DA:36,13 +DA:37,13 +DA:38,13 +DA:39,13 +DA:40,13 +DA:41,13 +DA:42,13 +DA:43,13 +DA:44,13 +DA:45,13 +DA:46,13 +DA:47,13 +DA:48,1 +DA:49,1 +LF:49 +LH:49 +BRDA:18,0,0,13 +BRDA:29,1,0,13 +BRDA:29,2,0,7 +BRDA:29,3,0,6 +BRF:4 +BRH:4 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-outline\timeline-outline-item-list.tsx +FN:28,OutlineItemList +FNF:1 +FNH:0 +FNDA:0,OutlineItemList +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,1 +DA:47,1 +DA:48,1 +LF:48 +LH:31 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-outline\timeline-outline.styles.ts +FN:33,Object.defineProperty.enumerable +FN:37,Object.defineProperty.enumerable +FN:43,Object.defineProperty.enumerable +FN:72,Object.defineProperty.enumerable +FN:80,Object.defineProperty.enumerable +FN:131,Object.defineProperty.enumerable +FN:156,Object.defineProperty.enumerable +FNF:7 +FNH:0 +FNDA:0,Object.defineProperty.enumerable +FNDA:0,Object.defineProperty.enumerable +FNDA:0,Object.defineProperty.enumerable +FNDA:0,Object.defineProperty.enumerable +FNDA:0,Object.defineProperty.enumerable +FNDA:0,Object.defineProperty.enumerable +FNDA:0,Object.defineProperty.enumerable +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,0 +DA:82,0 +DA:83,1 +DA:84,1 +DA:85,1 +DA:86,1 +DA:87,1 +DA:88,1 +DA:89,1 +DA:90,1 +DA:91,1 +DA:92,1 +DA:93,1 +DA:94,1 +DA:95,1 +DA:96,1 +DA:97,1 +DA:98,1 +DA:99,1 +DA:100,1 +DA:101,1 +DA:102,1 +DA:103,1 +DA:104,1 +DA:105,1 +DA:106,1 +DA:107,1 +DA:108,1 +DA:109,1 +DA:110,1 +DA:111,1 +DA:112,1 +DA:113,1 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,1 +DA:118,1 +DA:119,1 +DA:120,1 +DA:121,1 +DA:122,1 +DA:123,1 +DA:124,1 +DA:125,1 +DA:126,1 +DA:127,1 +DA:128,1 +DA:129,1 +DA:130,1 +DA:131,1 +DA:132,1 +DA:133,1 +DA:134,1 +DA:135,1 +DA:136,1 +DA:137,1 +DA:138,1 +DA:139,1 +DA:140,1 +DA:141,1 +DA:142,1 +DA:143,1 +DA:144,1 +DA:145,1 +DA:146,1 +DA:147,1 +DA:148,1 +DA:149,1 +DA:150,1 +DA:151,1 +DA:152,1 +DA:153,1 +DA:154,1 +DA:155,1 +DA:156,1 +DA:157,1 +DA:158,1 +DA:159,1 +DA:160,1 +DA:161,0 +DA:162,0 +DA:163,1 +DA:164,1 +DA:165,1 +LF:165 +LH:155 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\timeline-elements\timeline-outline\timeline-outline.tsx +FN:50,TimelineOutline +FNF:1 +FNH:0 +FNDA:0,TimelineOutline +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,1 +DA:110,1 +LF:110 +LH:52 +BRDA:20,0,0,2 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src\components\timeline-horizontal\timeline-horizontal.styles.ts +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +LF:35 +LH:35 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\timeline-horizontal\timeline-horizontal.tsx +FN:27,TimelineHorizontal +FNF:1 +FNH:0 +FNDA:0,TimelineHorizontal +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,1 +DA:101,1 +LF:101 +LH:29 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\timeline-vertical\timeline-point.tsx +FN:80,onClick +FNF:1 +FNH:0 +FNDA:0,onClick +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,3 +DA:29,3 +DA:30,3 +DA:31,3 +DA:32,3 +DA:33,3 +DA:34,3 +DA:35,3 +DA:36,3 +DA:37,3 +DA:38,3 +DA:39,3 +DA:40,3 +DA:41,3 +DA:42,3 +DA:43,3 +DA:44,3 +DA:45,3 +DA:46,3 +DA:47,3 +DA:48,3 +DA:49,3 +DA:50,3 +DA:51,0 +DA:52,3 +DA:53,3 +DA:54,3 +DA:55,3 +DA:56,3 +DA:57,3 +DA:58,3 +DA:59,3 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,3 +DA:65,3 +DA:66,3 +DA:67,3 +DA:68,3 +DA:69,3 +DA:70,3 +DA:71,3 +DA:72,3 +DA:73,3 +DA:74,3 +DA:75,3 +DA:76,3 +DA:77,3 +DA:78,3 +DA:79,3 +DA:80,3 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,3 +DA:87,3 +DA:88,3 +DA:89,3 +DA:90,3 +DA:91,3 +DA:92,3 +DA:93,3 +DA:94,3 +DA:95,3 +DA:96,3 +DA:97,3 +DA:98,3 +DA:99,3 +DA:100,3 +DA:101,3 +DA:102,3 +DA:103,3 +DA:104,3 +DA:105,3 +DA:106,3 +DA:107,3 +DA:108,3 +DA:109,3 +DA:110,3 +DA:111,3 +DA:112,3 +DA:113,3 +DA:114,3 +DA:115,3 +DA:116,3 +DA:117,3 +DA:118,3 +DA:119,3 +DA:120,3 +DA:121,3 +DA:122,3 +DA:123,3 +DA:124,3 +DA:125,3 +DA:126,1 +DA:127,1 +DA:128,1 +DA:129,1 +DA:130,1 +DA:131,1 +LF:131 +LH:121 +BRDA:27,0,0,3 +BRDA:120,1,0,0 +BRDA:49,2,0,3 +BRDA:50,3,0,0 +BRDA:53,4,0,0 +BRDA:58,5,0,3 +BRDA:59,6,0,0 +BRDA:68,7,0,3 +BRDA:78,8,0,3 +BRDA:91,9,0,3 +BRF:10 +BRH:6 +end_of_record +TN: +SF:src\components\timeline-vertical\timeline-vertical-item.tsx +FN:40,VerticalItem +FNF:1 +FNH:1 +FNDA:2,VerticalItem +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,2 +DA:42,2 +DA:43,2 +DA:44,2 +DA:45,2 +DA:46,2 +DA:47,2 +DA:48,2 +DA:49,2 +DA:50,2 +DA:51,2 +DA:52,2 +DA:53,2 +DA:54,2 +DA:55,2 +DA:56,2 +DA:57,2 +DA:58,2 +DA:59,2 +DA:60,2 +DA:61,2 +DA:62,2 +DA:63,2 +DA:64,2 +DA:65,2 +DA:66,2 +DA:67,2 +DA:68,2 +DA:69,2 +DA:70,2 +DA:71,2 +DA:72,2 +DA:73,2 +DA:74,2 +DA:75,2 +DA:76,2 +DA:77,2 +DA:78,2 +DA:79,2 +DA:80,2 +DA:81,2 +DA:82,2 +DA:83,2 +DA:84,2 +DA:85,2 +DA:86,2 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,2 +DA:93,2 +DA:94,2 +DA:95,2 +DA:96,2 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,2 +DA:101,2 +DA:102,2 +DA:103,2 +DA:104,2 +DA:105,2 +DA:106,2 +DA:107,2 +DA:108,2 +DA:109,2 +DA:110,2 +DA:111,2 +DA:112,2 +DA:113,2 +DA:114,2 +DA:115,2 +DA:116,2 +DA:117,2 +DA:118,2 +DA:119,2 +DA:120,2 +DA:121,2 +DA:122,2 +DA:123,2 +DA:124,2 +DA:125,2 +DA:126,2 +DA:127,2 +DA:128,2 +DA:129,2 +DA:130,2 +DA:131,2 +DA:132,2 +DA:133,2 +DA:134,2 +DA:135,2 +DA:136,2 +DA:137,2 +DA:138,2 +DA:139,2 +DA:140,2 +DA:141,2 +DA:142,2 +DA:143,2 +DA:144,2 +DA:145,2 +DA:146,2 +DA:147,2 +DA:148,2 +DA:149,2 +DA:150,2 +DA:151,2 +DA:152,2 +DA:153,2 +DA:154,2 +DA:155,2 +DA:156,2 +DA:157,2 +DA:158,2 +DA:159,2 +DA:160,2 +DA:161,2 +DA:162,2 +DA:163,2 +DA:164,2 +DA:165,2 +DA:166,2 +DA:167,2 +DA:168,2 +DA:169,2 +DA:170,2 +DA:171,2 +DA:172,2 +DA:173,2 +DA:174,2 +DA:175,2 +DA:176,2 +DA:177,2 +DA:178,2 +DA:179,2 +DA:180,2 +DA:181,2 +DA:182,2 +DA:183,2 +DA:184,2 +DA:185,2 +DA:186,2 +DA:187,2 +DA:188,2 +DA:189,2 +DA:190,2 +DA:191,2 +DA:192,2 +DA:193,2 +DA:194,2 +DA:195,2 +DA:196,2 +DA:197,2 +DA:198,2 +DA:199,2 +DA:200,2 +DA:201,2 +DA:202,2 +DA:203,2 +DA:204,2 +DA:205,2 +DA:206,2 +DA:207,2 +DA:208,2 +DA:209,2 +DA:210,2 +DA:211,2 +DA:212,2 +DA:213,2 +DA:214,2 +DA:215,2 +DA:216,2 +DA:217,2 +DA:218,2 +DA:219,2 +DA:220,2 +DA:221,2 +DA:222,2 +DA:223,2 +DA:224,2 +DA:225,2 +DA:226,0 +DA:227,2 +DA:228,2 +DA:229,2 +DA:230,2 +DA:231,2 +DA:232,1 +DA:233,1 +DA:234,1 +DA:235,1 +LF:235 +LH:226 +BRDA:40,0,0,2 +BRDA:138,1,0,0 +BRDA:181,2,0,0 +BRDA:192,3,0,0 +BRDA:200,4,0,0 +BRDA:225,5,0,0 +BRDA:228,6,0,0 +BRDA:103,7,0,2 +BRDA:116,8,0,0 +BRDA:133,9,0,2 +BRDA:134,10,0,0 +BRDA:144,11,0,2 +BRF:12 +BRH:4 +end_of_record +TN: +SF:src\components\timeline-vertical\timeline-vertical-shape.styles.ts +FN:12,Object.defineProperty.enumerable +FN:23,Object.defineProperty.enumerable +FN:24,Object.defineProperty.enumerable +FN:35,Object.defineProperty.enumerable +FNF:4 +FNH:4 +FNDA:3,Object.defineProperty.enumerable +FNDA:3,Object.defineProperty.enumerable +FNDA:3,Object.defineProperty.enumerable +FNDA:3,Object.defineProperty.enumerable +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +LF:50 +LH:50 +BRDA:12,0,0,3 +BRDA:12,1,0,1 +BRDA:12,2,0,2 +BRDA:23,3,0,3 +BRDA:24,4,0,3 +BRDA:24,5,0,1 +BRDA:24,6,0,2 +BRDA:35,7,0,3 +BRDA:41,8,0,3 +BRDA:41,9,0,1 +BRDA:41,10,0,2 +BRF:11 +BRH:11 +end_of_record +TN: +SF:src\components\timeline-vertical\timeline-vertical.styles.ts +FN:80,Object.defineProperty.enumerable +FN:126,Object.defineProperty.enumerable +FN:127,Object.defineProperty.enumerable +FN:130,Object.defineProperty.enumerable +FN:131,Object.defineProperty.enumerable +FNF:5 +FNH:5 +FNDA:2,Object.defineProperty.enumerable +FNDA:2,Object.defineProperty.enumerable +FNDA:2,Object.defineProperty.enumerable +FNDA:2,Object.defineProperty.enumerable +FNDA:2,Object.defineProperty.enumerable +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,2 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,2 +DA:62,2 +DA:63,2 +DA:64,2 +DA:65,2 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,2 +DA:82,0 +DA:83,2 +DA:84,0 +DA:85,2 +DA:86,2 +DA:87,2 +DA:88,2 +DA:89,1 +DA:90,2 +DA:91,2 +DA:92,2 +DA:93,2 +DA:94,2 +DA:95,2 +DA:96,2 +DA:97,2 +DA:98,2 +DA:99,2 +DA:100,2 +DA:101,2 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,2 +DA:113,1 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,1 +DA:118,1 +DA:119,1 +DA:120,1 +DA:121,1 +DA:122,1 +DA:123,1 +DA:124,1 +DA:125,1 +DA:126,1 +DA:127,1 +DA:128,1 +DA:129,1 +DA:130,1 +DA:131,1 +DA:132,1 +DA:133,1 +DA:134,1 +DA:135,1 +DA:136,2 +DA:137,0 +DA:138,2 +DA:139,2 +DA:140,2 +DA:141,1 +DA:142,1 +DA:143,1 +LF:143 +LH:121 +BRDA:50,0,0,2 +BRDA:51,1,0,0 +BRDA:80,2,0,2 +BRDA:81,3,0,0 +BRDA:83,4,0,0 +BRDA:89,5,0,2 +BRDA:101,6,0,0 +BRDA:126,7,0,2 +BRDA:126,8,0,0 +BRDA:126,9,0,0 +BRDA:127,10,0,2 +BRDA:127,11,0,0 +BRDA:130,12,0,2 +BRDA:130,13,0,0 +BRDA:131,14,0,2 +BRDA:131,15,0,0 +BRDA:131,16,0,0 +BRDA:135,17,0,2 +BRDA:136,18,0,0 +BRF:19 +BRH:8 +end_of_record +TN: +SF:src\components\timeline-vertical\timeline-vertical.tsx +FN:26,TimelineVertical +FNF:1 +FNH:0 +FNDA:0,TimelineVertical +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,1 +DA:123,1 +DA:124,1 +DA:125,1 +LF:125 +LH:30 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\utils\index.ts +FN:4,uniqueID +FN:14,hexToRGBA +FN:22,getDefaultThemeOrDark +FN:29,getDefaultClassNames +FN:39,getDefaultButtonTexts +FN:52,getSlideShowType +FNF:6 +FNH:6 +FNDA:1,uniqueID +FNDA:33,hexToRGBA +FNDA:3,getDefaultThemeOrDark +FNDA:1,getDefaultClassNames +FNDA:1,getDefaultButtonTexts +FNDA:4,getSlideShowType +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,7 +DA:10,7 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,33 +DA:16,33 +DA:17,33 +DA:18,33 +DA:19,33 +DA:20,33 +DA:21,1 +DA:22,1 +DA:23,3 +DA:24,1 +DA:25,1 +DA:26,2 +DA:27,2 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,4 +DA:54,4 +DA:55,4 +DA:56,1 +DA:57,1 +DA:58,4 +DA:59,1 +DA:60,1 +DA:61,2 +DA:62,4 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +LF:67 +LH:67 +BRDA:4,0,0,1 +BRDA:8,1,0,7 +BRDA:14,2,0,33 +BRDA:22,3,0,3 +BRDA:23,4,0,1 +BRDA:25,5,0,2 +BRDA:29,6,0,1 +BRDA:39,7,0,1 +BRDA:52,8,0,4 +BRDA:55,9,0,1 +BRDA:57,10,0,3 +BRDA:58,11,0,1 +BRDA:60,12,0,2 +BRDA:62,13,0,1 +BRF:14 +BRH:14 +end_of_record diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 00000000..144b349c --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,16 @@ +sonar.projectKey=prabhuignoto_react-chrono +sonar.organization=prabhuignoto + +# This is the name and version displayed in the SonarCloud UI. +#sonar.projectName=react-chrono +#sonar.projectVersion=1.0 + +sonar.sources=src +sonar.exclusions=**/node_modules/**,**/*.test.js,**/*.spec.js,**/*.test.jsx,**/*.spec.jsx,**/*.test.ts,**/*.spec.ts,**/*.test.tsx,**/*.spec.tsx,coverage/**,build/**,dist/**,public/**,src/setupTests.js,src/setupTests.ts,src/setupTests.tsx,src/setupTests.jsx,src/setupTests.test.js,src/setupTests.test.ts,src/setupTests.test.tsx,src/setupTests.test.jsx,src/setupTests.spec.js,src/setupTests.spec.ts,src/setupTests.spec.tsx,src/setupTests.spec.jsx,src/serviceWorker.js,src/serviceWorker.ts,src/serviceWorker.tsx,src/serviceWorker.jsx,src/serviceWorker.test.js,src/serviceWorker.test.ts,src/serviceWorker.test.tsx,src/serviceWorker.test.jsx,src/serviceWorker.spec.js,src/serviceWorker.spec.ts,src/serviceWorker.spec.tsx,src/serviceWorker.spec.jsx + + +# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. +#sonar.sources=. + +# Encoding of the source code. Default is default system encoding +#sonar.sourceEncoding=UTF-8 diff --git a/vitest.config.ts b/vitest.config.ts index 67643759..1393615a 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -12,7 +12,7 @@ export default defineConfig({ clean: true, enabled: true, provider: 'v8', - reporter: ['html', 'lcov', 'clover', 'cobertura'], + reporter: ['lcov', 'clover'], reportsDirectory: './coverage', }, environment: 'jsdom',