jekyll-report-dashboard 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: dfa8bb49712438107cedcba73dc2e12b2f973e44184b7741a7b8e7eeb27eb3d3
4
+ data.tar.gz: fd85df1b4a0865ce4e662a71a8efecf15f2c891ac6c5029f37eb51cf35f9cd24
5
+ SHA512:
6
+ metadata.gz: 60ed5d2135f8f7c97ae4e26ad7665e4c6006fe4179f3e3becea3ba6cef155fb61f95452d377f831a008ccd07d08227319a32596ade37458682d211e28968d00e
7
+ data.tar.gz: 2e47a6fe3f85cc2f0442b5ec8c8da0d0f0cc01bff55948fb6a2aa64f5d20eab79095efd8076668d4d78066a1a69ceb5b8c54640b69b897abe1693a818f2640b8
data/404.html ADDED
@@ -0,0 +1,11 @@
1
+ ---
2
+ permalink: /404.html
3
+ layout: default
4
+ ---
5
+
6
+ <div class="my-3 mx-auto max-w-[37.5rem] text-center">
7
+ <h1 class="my-8 text-6xl leading-none tracking-tighter">404</h1>
8
+
9
+ <p><strong>Page not found :(</strong></p>
10
+ <p>The requested page could not be found.</p>
11
+ </div>
@@ -0,0 +1,11 @@
1
+ pass:
2
+ lines: 90
3
+ functions: 85
4
+ statements: 90
5
+ branches: 80
6
+
7
+ fail:
8
+ lines: 70
9
+ functions: 65
10
+ statements: 70
11
+ branches: 60
@@ -0,0 +1,36 @@
1
+ {% if include.total %}
2
+ <!-- if total was included, display the summary -->
3
+ <div class="mt-4 @container flex flex-row gap-2">
4
+ <!-- loop through the keys in total -->
5
+ {% for stat in include.total %}
6
+ <!-- assign the key to name -->
7
+ {% assign name = stat[0] %}
8
+ <!-- the coverage summary includes a field called "branchesTrue", but we want to skip it because it's a duplicate of "branches" -->
9
+ {% if name != "branchesTrue" %}
10
+ <!-- assign the value to values -->
11
+ {% assign values = stat[1] %}
12
+ <div class="w-full px-1 py-2 @md:px-2 @md:py-4 leading-none border rounded-sm border-outline flex flex-col items-center gap-4 @sm:gap-8 @md:gap-10">
13
+ <div class="font-medium text-sm @sm:text-base @md:text-lg @lg:text-xl">
14
+ <!-- Liquid provides a helper method to capitalize text -->
15
+ {{ name | capitalize }}
16
+ </div>
17
+ <!-- use the custom coverage_status filter with the stat name to get the correct styling for the percent -->
18
+ <div class="font-bold text-xl @sm:text-2xl @md:text-3xl @lg:text-4xl {{ values.pct | coverage_status: name }}">
19
+ <!-- Liquid provides a helper method for rounding floats to a number -->
20
+ {{ values.pct | round: 1 }}%
21
+ </div>
22
+ <div class="font-light text-xs @sm:text-base @md:text-base @lg:text-lg">
23
+ {{ values.covered }} / {{ values.total }}
24
+ </div>
25
+ </div>
26
+ {% endif %}
27
+ {% endfor %}
28
+ </div>
29
+ <div class="flex justify-end mt-4 min-h-4">
30
+ <!-- Liquid provides a helper method that will create the link relative to the baseurl set in _config.yml -->
31
+ <a href="{{ '/coverage' | relative_url }}" target="_blank">View Full Report</a>
32
+ </div>
33
+ {% else %}
34
+ <!-- if the total was not included, display a message that there is nothing to display -->
35
+ <div>There is currently no coverage report for {{ include.branch }}.</div>
36
+ {% endif %}
@@ -0,0 +1,35 @@
1
+ <footer class="border-t border-outline">
2
+ <data href="{{ "/" | relative_url }}"></data>
3
+
4
+ <div class="wrapper my-4 sm:grid sm:grid-rows-3">
5
+
6
+ <h2 class="text-lg sm:row-start-1">{{ site.title | escape }}</h2>
7
+
8
+ <div class="text-sm text-secondary sm:row-start-2 sm:row-span-2 sm:grid sm:grid-cols-4">
9
+ <div class="sm:col-start-1">
10
+ <ul class="mb-4 ml-0 list-none sm:m-0">
11
+ <li>
12
+ {%- if site.author -%}
13
+ {{ site.author | escape }}
14
+ {%- else -%}
15
+ {{ site.title | escape }}
16
+ {%- endif -%}
17
+ </li>
18
+ {%- if site.email -%}
19
+ <li>
20
+ <a href="mailto:{{ site.email }}">{{ site.email }}</a>
21
+ </li>
22
+ {%- endif -%}
23
+ </ul>
24
+ </div>
25
+
26
+ <div class="sm:col-start-2"></div>
27
+
28
+ <div class="sm:col-start-3 sm:col-span-2">
29
+ <p>{{- site.description | escape -}}</p>
30
+ </div>
31
+ </div>
32
+
33
+ </div>
34
+
35
+ </footer>
@@ -0,0 +1,6 @@
1
+ <head>
2
+ <meta charset="utf-8">
3
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
4
+ <meta name="viewport" content="width=device-width, initial-scale=1">
5
+ <link rel="stylesheet" href="{{ '/assets/css/styles.css' | relative_url }}">
6
+ </head>
@@ -0,0 +1,40 @@
1
+ <header class="border-t-4 border-t-tertiary border-b border-b-outline" role="banner">
2
+
3
+ <div class="wrapper relative flex flex-row justify-between items-center">
4
+ {%- assign default_paths = site.pages | map: "path" -%}
5
+ {%- assign page_paths = site.nav_pages | default: default_paths -%}
6
+ <a
7
+ class="text-secondary hover:text-primary text-2xl/14 font-light tracking-tighter"
8
+ rel="author"
9
+ href="{{ "/" | relative_url }}">{{ site.title | escape }}</a>
10
+
11
+ {%- if page_paths -%}
12
+ <nav class="absolute top-2 right-4 border border-outline rounded-md bg-light-primary md:relative md:top-auto md:right-auto md:border-none">
13
+ <input
14
+ type="checkbox"
15
+ id="nav-trigger"
16
+ class="hidden peer" />
17
+ <label for="nav-trigger" class="w-9 h-9 z-2 float-right flex justify-center items-center cursor-pointer md:hidden">
18
+ <span class="w-5 h-4 leading-0 md:hidden">
19
+ <svg
20
+ viewBox="0 0 18 15"
21
+ width="18px"
22
+ height="15px"
23
+ class="fill-secondary">
24
+ <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z" />
25
+ </svg>
26
+ </span>
27
+ </label>
28
+
29
+ <div class="hidden clear-both peer-checked:flex flex-col items-end px-4 pb-4 gap-2 md:flex md:flex-row md:p-0 md:gap-5 md:justify-end md:items-center">
30
+ {%- for path in page_paths -%}
31
+ {%- assign my_page = site.pages | where: "path", path | first -%}
32
+ {%- if my_page.title -%}
33
+ <a class="text-primary cursor-pointer leading-[24px]" href="{{ my_page.url | relative_url }}">{{ my_page.title | escape }}</a>
34
+ {%- endif -%}
35
+ {%- endfor -%}
36
+ </div>
37
+ </nav>
38
+ {%- endif -%}
39
+ </div>
40
+ </header>
@@ -0,0 +1,28 @@
1
+ {% if site.data.playwright-reports.branches.size > 0 %}
2
+ <!-- if there are branches in the data, display the summaries for the branches -->
3
+ {% for branch in site.data.playwright-reports.branches %}
4
+ <!-- loop through the branches and assign the key as the branch_name -->
5
+ {% assign branch_name = branch[0] %}
6
+ <!-- capture creates a link using the branch_name -->
7
+ {% capture branch_link %}/playwright-reports/branches/{{branch_name}}{% endcapture %}
8
+ <div class="mt-8 flex flex-row justify-between items-end">
9
+ <h3 class="mb-0">{{ branch_name }}</h3>
10
+ <!-- Liquid provides a helper method that will create the link relative to the baseurl set in _config.yml -->
11
+ <a href="{{ branch_link | relative_url }}">View Previous Runs</a>
12
+ </div>
13
+
14
+ <!-- use the custom key_list filter to get all of the run_ids in the branch, then reverse the list and get the first one -->
15
+ {% assign latest_run_id = site.data.playwright-reports.branches[branch_name] | key_list | reverse | first %}
16
+ {% assign data = site.data.playwright-reports.branches[branch_name][latest_run_id] %}
17
+ <!-- capture creates a link to the actual report file-->
18
+ {% capture report_link %}/playwright-reports/branches/{{branch_name}}/{{latest_run_id}}.html{% endcapture %}
19
+ <!--
20
+ Include the html snippet in `_includes/playwright-summary.html` with the parameters the `branch_name` variable as `branch`,
21
+ the `latest_run_id` variable as `run_id`, the `data` variable as `data`, and the `report_link` variable as `url`.
22
+ -->
23
+ {% include playwright-summary.html branch=branch_name run_id=latest_run_id data=data url=report_link %}
24
+ {% endfor %}
25
+ {% else %}
26
+ <!-- if there are no branches in the data, display a message that there is nothing to display -->
27
+ <div>There are currently no branch reports.</div>
28
+ {% endif %}
@@ -0,0 +1,6 @@
1
+ <div class="min-w-min py-2 px-12 @md:px-2 text-xs text-left @md:text-center border border-outline first:rounded-t-md last:rounded-b-md @md:first:rounded-tr-none @md:first:rounded-l-md @md:last:rounded-bl-none @md:last:rounded-r-md">
2
+ <span>{{ include.label }}</span>
3
+ <span class="ml-2 min-w-4 px-2 inline @sm:block @md:inline text-center bg-highlight border border-transparent rounded-3xl">
4
+ {{ include.value }}
5
+ </span>
6
+ </div>
@@ -0,0 +1,51 @@
1
+ {% if include.data %}
2
+ <!-- use the custom normalize_playwright filter to get the status, total number of tests, errors, and test statistics from the data -->
3
+ {% assign results = include.data | normalize_playwright %}
4
+ <!-- if the data was included, display the summary -->
5
+ <div class="@container flex flex-col mb-8">
6
+ <div class="mt-4 py-1 @sm:py-2 px-2 @sm:px-4 font-light text-[0.6rem] @sm:text-xs text-tertiary border border-outline border-b-0 rounded-t-md bg-highlight flex flex-row justify-between">
7
+ <!-- if the run_id was included, display it in the header of the summary -->
8
+ {% if include.run_id %}
9
+ <!-- capture also creates strings with variables, create the url back to the run -->
10
+ {% capture run_link %}{{ site.github_url }}/actions/runs/{{ include.run_id }}{% endcapture %}
11
+ <!-- no relative_url necessary here because the link it outside of the app -->
12
+ <span>Run Id: <a href="{{ run_link }}" target="_blank">{{ include.run_id }}</a></span>
13
+ {% else %}
14
+ <span></span>
15
+ {% endif %}
16
+ <!-- Liquid provides a helper method for formatting dates -->
17
+ <span>Run At: {{ results.startTime | date: "%Y-%m-%d %H:%M %Z" }}</span>
18
+ </div>
19
+ <div class="pt-2 @sm:pt-4 pb-1 @sm:pb-2 text-xs @sm:text-sm leading-normal border border-outline rounded-b-md flex items-center justify-around">
20
+ <!-- style the icon according to the report status and use the custom status_icon filter to return the correct svg -->
21
+ <span class="w-10 @sm:w-12 h-10 @sm:h-12 {{results.status}}">{{ results.status | status_icon }}</span>
22
+ <div class="py-1 @md:py-2 w-2/3 @sm:w-4/5">
23
+ {% if results.status == "warn" %}
24
+ <!-- if there are errors, there won't be any test statistics, so only display the errors -->
25
+ <div class="py-1 @md:py-2 px-0 font-mono flex flex-col gap-4">
26
+ {% for error in results.errors %}
27
+ <!-- loop through the errors and display the messages -->
28
+ <div class="py-1 @md:py-2 px-2 @md:px-4 border rounded-md border-outline flex flex-wrap">{{ error.message }}</div>
29
+ {% endfor %}
30
+ </div>
31
+ {% else %}
32
+ <!-- if there are no errors, display the test statistics -->
33
+ <div class="min-w-full font-medium leading-8 grid grid-cols-1 grid-rows-5 @lg:grid-cols-5 @lg:grid-rows-1 justify-center">
34
+ {% include playwright-stat.html label="All" value=results.total %}
35
+ {% include playwright-stat.html label="Passed" value=results.expected %}
36
+ {% include playwright-stat.html label="Failed" value=results.unexpected %}
37
+ {% include playwright-stat.html label="Flaky" value=results.flaky %}
38
+ {% include playwright-stat.html label="Skipped" value=results.skipped %}
39
+ </div>
40
+ {% endif %}
41
+
42
+ <!-- Liquid provides a helper method that will create the link relative to the baseurl set in _config.yml -->
43
+ <span class="pt-1 @sm:pt-2 float-right min-h-4 text-xs @sm:text-sm"><a href="{{ include.url | relative_url }}" target="_blank">View Full Report</a></span>
44
+ </div>
45
+ </div>
46
+ </div>
47
+ {% else %}
48
+ <!-- if the data was not included, display a message that there is nothing to display -->
49
+
50
+ <div>There is currently no report for {{ include.branch }}</div>
51
+ {% endif %}
@@ -0,0 +1,29 @@
1
+ <article class="@container border border-outline rounded-sm p-4 my-8">
2
+ <header class="block mb-8">
3
+ <a class="text-primary font-semibold leading-14" href="{{ include.post.html_url }}">
4
+ <h1 class="text-3xl md:text-4xl font-semibold leading-14">{{ include.post.tag | escape }}</h1>
5
+ </a>
6
+ <div class="text-sm text-tertiary border-b border-outline pb-6 leading-normal break-words flex flex-row flex-wrap items-end">
7
+ <div class="mr-6 mb-2">
8
+ {% if include.post.author_avatar %}
9
+ <img class="h-5 w-5 rounded-sm inline-block box-border leading-none overflow-hidden align-middle" src="{{ include.post.author_avatar }}" alt="@{{ include.post.author }}" />
10
+ {% endif %}
11
+ {% if include.post.author_link %}
12
+ <a class="decoration-inherit text-current font-bold" href="{{ include.post.author_link }}">{{ include.post.author }}</a>
13
+ {% else %}
14
+ <span class="font-bold">{{ include.post.author }}</span>
15
+ {% endif %}
16
+ released this
17
+ {%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%}
18
+ {% assign pdate = include.post.published_at | date_to_xmlschema %}
19
+ <time datetime="{{ pdate }}">
20
+ {{ pdate | date: date_format }}
21
+ </time>
22
+ </div>
23
+ </div>
24
+ </header>
25
+
26
+ <div class="gh-markdown-content mb-8">
27
+ {{ include.content }}
28
+ </div>
29
+ </article>
@@ -0,0 +1,20 @@
1
+ <!DOCTYPE html>
2
+ <html lang="{{ page.lang | default: site.lang | default: "en" }}">
3
+
4
+ {%- include head.html -%}
5
+
6
+ <body>
7
+
8
+ {%- include header.html -%}
9
+
10
+ <main class="py-8" aria-label="Content">
11
+ <div class="wrapper">
12
+ {{ content }}
13
+ </div>
14
+ </main>
15
+
16
+ {%- include footer.html -%}
17
+
18
+ </body>
19
+
20
+ </html>
@@ -0,0 +1,14 @@
1
+ ---
2
+ layout: default
3
+ ---
4
+ <article>
5
+
6
+ <header class="mb-8">
7
+ <h1 class="tracking-[-1px] leading-none">{{ page.title | escape }}</h1>
8
+ </header>
9
+
10
+ <div class="mb-8">
11
+ {{ content }}
12
+ </div>
13
+
14
+ </article>
@@ -0,0 +1,17 @@
1
+ ---
2
+ layout: page
3
+ ---
4
+
5
+ <!-- use the custom key_list filter to get the run ids for the branch and sort them by newest to oldest -->
6
+ {% assign run_ids = site.data.playwright-reports.branches[page.branch] | key_list | reverse %}
7
+ {% for run_id in run_ids %}
8
+ <!-- loop through the run ids -->
9
+ {% assign data = site.data.playwright-reports.branches[page.branch][run_id] %}
10
+ <!-- capture creates a link using the page.branch variable and the run id -->
11
+ {% capture report_link %}/playwright-reports/branches/{{page.branch}}/{{run_id}}.html{% endcapture %}
12
+ <!--
13
+ Include the html snippet in `_includes/playwright-summary.html` with the parameters the `page.branch` variable as `branch`,
14
+ the `run_id` variable as `run_id`, the `data` variable as `data`, and the `report_link` variable as `url`.
15
+ -->
16
+ {% include playwright-summary.html branch=page.branch run_id=run_id data=data url=report_link %}
17
+ {% endfor %}
@@ -0,0 +1,25 @@
1
+ ---
2
+ layout: default
3
+ ---
4
+ <article>
5
+
6
+ <header class="mb-8">
7
+ <h1 class="tracking-[-1px] leading-none">{{ page.title | escape }}</h1>
8
+
9
+ <p class="text-sm text-tertiary">
10
+ <time datetime="{{ page.date | date_to_xmlschema }}">
11
+ {%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%}
12
+ {{ page.date | date: date_format }}
13
+ </time>
14
+ {%- if page.author -%}
15
+ • <span>{{ page.author }}</span>
16
+ {%- endif -%}
17
+ </p>
18
+ </header>
19
+
20
+ <div class="mb-8">
21
+ {{ content }}
22
+ </div>
23
+
24
+ <a class="u-url" href="{{ page.url | relative_url }}" hidden></a>
25
+ </article>
@@ -0,0 +1,7 @@
1
+ ---
2
+ layout: page
3
+ ---
4
+
5
+ {% include release-note.html post=page content=content %}
6
+
7
+ <a class="u-url" href="{{ page.url | relative_url }}" hidden></a>
@@ -0,0 +1,15 @@
1
+ module Jekyll
2
+ module CoverageResultFilter
3
+ def coverage_status(input, name)
4
+ if input >= @context.registers[:site].data["coverage"]["thresholds"]["pass"][name]
5
+ "pass"
6
+ elsif input >= @context.registers[:site].data["coverage"]["thresholds"]["fail"][name]
7
+ "warn"
8
+ else
9
+ "fail"
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ Liquid::Template.register_filter(Jekyll::CoverageResultFilter)
@@ -0,0 +1,22 @@
1
+ module Jekyll
2
+ module IconFilter
3
+ def status_icon(input)
4
+ case input
5
+ when "pass"
6
+ "<svg aria-hidden='true' fill='currentColor' height='100%' width='100%' viewBox='0 0 16 16' version='1.1'>
7
+ <path fillRule='evenodd' d='M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z'></path>
8
+ </svg>"
9
+ when "fail"
10
+ "<svg aria-hidden='true' fill='currentColor' height='100%' width='100%' viewBox='0 0 16 16' version='1.1'>
11
+ <path fillRule='evenodd' d='M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z'></path>
12
+ </svg>"
13
+ when "warn"
14
+ "<svg aria-hidden='true' fill='currentColor' height='100%' width='100%' viewBox='0 0 16 16' version='1.1'>
15
+ <path fillRule='evenodd' d='M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z'></path>
16
+ </svg>"
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ Liquid::Template.register_filter(Jekyll::IconFilter)
@@ -0,0 +1,14 @@
1
+ module Jekyll
2
+ module KeyFilter
3
+ def key_list(input)
4
+ return if input.nil?
5
+ keys = []
6
+ input.each_key do |key|
7
+ keys.push(key)
8
+ end
9
+ keys
10
+ end
11
+ end
12
+ end
13
+
14
+ Liquid::Template.register_filter(Jekyll::KeyFilter)
@@ -0,0 +1,28 @@
1
+ module Jekyll
2
+ class BranchIndex < Page
3
+ def initialize(site, base, dir, branch)
4
+ @site = site
5
+ @base = base
6
+ @dir = dir
7
+ @name = 'index.html'
8
+
9
+ self.process(@name)
10
+ self.read_yaml(File.join(base, '_layouts'), 'playwright-branch.html')
11
+ self.data['branch'] = branch
12
+ end
13
+ end
14
+
15
+ class BranchIndexGenerator < Generator
16
+ safe true
17
+
18
+ def generate(site)
19
+ if site.layouts.key? 'playwright-branch'
20
+ dir = "/playwright-reports/branches"
21
+ site.data["playwright-reports"]["branches"].each_key do |branch|
22
+ Jekyll.logger.info "Branch Index: Generating index for #{branch}"
23
+ site.pages << BranchIndex.new(site, site.source, File.join(dir, branch), branch)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,36 @@
1
+ module Jekyll
2
+ module PlaywrightResultFilter
3
+ def normalize_playwright(input)
4
+ status = playwright_status(input)
5
+ total = playwright_total(input)
6
+ stats = input["stats"]
7
+ stats["errors"] = input["errors"]
8
+ stats["total"] = total
9
+ stats["status"] = status
10
+ stats
11
+ end
12
+
13
+ def playwright_total(input)
14
+ if input["errors"].size > 0
15
+ 0
16
+ else
17
+ input["stats"]["expected"] + input["stats"]["unexpected"] + input["stats"]["skipped"] + input["stats"]["flaky"]
18
+ end
19
+ end
20
+
21
+ def playwright_status(input)
22
+ if input["stats"]["unexpected"] > 0
23
+ # if the unexpected results is greater than one, return fail
24
+ "fail"
25
+ elsif input["errors"].size == 0
26
+ # if there are no unexpected results and no errors, return pass
27
+ "pass"
28
+ else
29
+ # otherwise if there are errors, return error
30
+ "warn"
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ Liquid::Template.register_filter(Jekyll::PlaywrightResultFilter)
@@ -0,0 +1,292 @@
1
+ ---
2
+ # This yaml frontmatter is required for jekyll to process the file
3
+ ---
4
+
5
+ @import "tailwindcss";
6
+
7
+ @layer utilities {
8
+ }
9
+
10
+ @theme {
11
+ --color-primary: var(--color-gray-900);
12
+ --color-secondary: var(--color-gray-700);
13
+ --color-tertiary: var(--color-gray-500);
14
+
15
+ --color-light-primary: #fdfdfd;
16
+ --color-highlight: var(--color-gray-100);
17
+ --color-outline: var(--color-gray-300);
18
+
19
+ --breakpoint-sm: 40rem; /* 640px */
20
+ --breakpoint-md: 48rem; /* 768px */
21
+ --breakpoint-lg: 64rem; /* 1024px */
22
+ --breakpoint-xl: 80rem; /* 1280px */
23
+ --breakpoint-2xl: 96rem; /* 1536px */
24
+
25
+ --font-body:
26
+ ui-sans-serif, system-ui, sans-serif, Helvetica, Roboto,
27
+ "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
28
+ }
29
+
30
+ @layer components {
31
+ body {
32
+ color: var(--color-primary);
33
+ background-color: var(--color-light-primary);
34
+ min-height: 100vh;
35
+ display: flex;
36
+ flex-direction: column;
37
+ }
38
+
39
+ h1,
40
+ h2,
41
+ h3,
42
+ h4,
43
+ h5,
44
+ h6,
45
+ p,
46
+ blockquote,
47
+ pre,
48
+ ul,
49
+ ol,
50
+ dl,
51
+ figure {
52
+ margin-bottom: 15px;
53
+ }
54
+
55
+ main {
56
+ display: block;
57
+ }
58
+
59
+ img {
60
+ max-width: 100%;
61
+ vertical-align: middle;
62
+ }
63
+
64
+ a {
65
+ color: var(--color-sky-700);
66
+ text-decoration: none;
67
+ }
68
+
69
+ a:visited {
70
+ color: var(--color-sky-900);
71
+ text-decoration: none;
72
+ }
73
+
74
+ a:hover {
75
+ text-decoration: underline;
76
+ }
77
+
78
+ h1 {
79
+ font-size: 36px;
80
+ }
81
+
82
+ h2 {
83
+ font-size: 28px;
84
+ }
85
+
86
+ h3 {
87
+ font-size: 22px;
88
+ }
89
+
90
+ h4 {
91
+ font-size: 18px;
92
+ }
93
+
94
+ @media (width >= 40rem) {
95
+ h1 {
96
+ font-size: 42px;
97
+ }
98
+
99
+ h2 {
100
+ font-size: 32px;
101
+ }
102
+
103
+ h3 {
104
+ font-size: 26px;
105
+ }
106
+
107
+ h4 {
108
+ font-size: 20px;
109
+ }
110
+ }
111
+
112
+ table {
113
+ margin-bottom: 30px;
114
+ width: 100%;
115
+ text-align: left;
116
+ color: var(--color-primary);
117
+ border-collapse: collapse;
118
+ border: 1px solid var(--color-outline);
119
+ }
120
+ table tr:nth-child(even) {
121
+ background-color: var(--color-highlight);
122
+ }
123
+ table th,
124
+ table td {
125
+ padding: 9.999999999px 15px;
126
+ }
127
+ table th {
128
+ background-color: var(--color-highlight);
129
+ border: 1px solid var(--color-outline);
130
+ border-bottom-color: var(--color-outline);
131
+ }
132
+ table td {
133
+ border: 1px solid var(--color-outline);
134
+ }
135
+
136
+ ul {
137
+ list-style-type: disc;
138
+ margin-left: 30px;
139
+ }
140
+
141
+ li {
142
+ display: list-item;
143
+ }
144
+
145
+ blockquote {
146
+ font-size: 1em;
147
+ font-weight: normal;
148
+ font-style: normal;
149
+ border-left-color: var(--color-outline);
150
+ border-left-style: solid;
151
+ border-left-width: 4px;
152
+ box-sizing: border-box;
153
+ color: var(--color-secondary);
154
+ display: block;
155
+ margin-bottom: 1em;
156
+ overflow-wrap: break-word;
157
+ padding: 0 1em;
158
+ }
159
+
160
+ p > code {
161
+ padding: 0.2em 0.4em;
162
+ margin: 0;
163
+ font-size: 0.85em;
164
+ white-space: break-spaces;
165
+ background-color: var(--color-highlight);
166
+ border: 1px solid var(--color-highlight);
167
+ border-radius: 6px;
168
+ }
169
+
170
+ pre {
171
+ padding: 1em;
172
+ overflow: auto;
173
+ font-size: 0.85em;
174
+ line-height: 1.45em;
175
+ background-color: var(--color-highlight);
176
+ border: 1px solid var(--color-highlight);
177
+ border-radius: 6px;
178
+ word-wrap: normal;
179
+ margin-top: 0;
180
+ margin-bottom: 1rem;
181
+ box-sizing: border-box;
182
+
183
+ > code {
184
+ display: inline;
185
+ padding: 0;
186
+ margin: 0;
187
+ overflow: visible;
188
+ line-height: inherit;
189
+ word-wrap: normal;
190
+ word-break: normal;
191
+ white-space: pre;
192
+ border: 0;
193
+ background-color: transparent;
194
+ }
195
+ }
196
+
197
+ .wrapper {
198
+ max-width: 30rem;
199
+ margin: 0 auto;
200
+ padding: 0 1rem;
201
+
202
+ @media (width >= 26rem) {
203
+ max-width: 24rem; /* 384px, container @sm */
204
+ }
205
+ @media (width >= 40rem) {
206
+ max-width: 36rem; /* 576px, container @xl */
207
+ }
208
+ @media (width >= 48rem) {
209
+ max-width: 42rem; /* 672px, container @2xl */
210
+ }
211
+ @media (width >= 64rem) {
212
+ max-width: 56rem; /* 896px, container @4xl */
213
+ padding: 0 2rem;
214
+ }
215
+ }
216
+
217
+ .pass {
218
+ color: var(--color-green-700);
219
+ }
220
+
221
+ .fail {
222
+ color: var(--color-red-600);
223
+ }
224
+
225
+ .warn {
226
+ color: var(--color-amber-400);
227
+ }
228
+
229
+ .gh-markdown-content {
230
+ width: 100%;
231
+ overflow-x: auto;
232
+
233
+ p,
234
+ li {
235
+ word-wrap: break-word;
236
+ word-break: break-word;
237
+ overflow-wrap: break-word;
238
+ }
239
+
240
+ table {
241
+ overflow: auto;
242
+ }
243
+
244
+ h1,
245
+ h2,
246
+ h3,
247
+ h4,
248
+ h5,
249
+ h6 {
250
+ margin-top: 1.5rem;
251
+ margin-bottom: 1rem;
252
+ font-weight: 600;
253
+ }
254
+
255
+ h1 {
256
+ font-size: 2rem;
257
+ line-height: 2.5rem;
258
+ padding-bottom: 0.6rem;
259
+ border-bottom: 1px solid var(--color-outline);
260
+ }
261
+
262
+ h2 {
263
+ font-size: 1.5rem;
264
+ line-height: 1.25rem;
265
+ padding-bottom: 0.45rem;
266
+ border-bottom: 1px solid var(--color-outline);
267
+ }
268
+
269
+ h3 {
270
+ font-size: 1.25rem;
271
+ line-height: 1.25rem;
272
+ }
273
+
274
+ h4 {
275
+ font-size: 1rem;
276
+ line-height: 1.25rem;
277
+ }
278
+
279
+ h5 {
280
+ font-size: 0.875rem;
281
+ line-height: 1.25rem;
282
+ }
283
+
284
+ h6 {
285
+ font-size: 0.85rem;
286
+ line-height: 1.25rem;
287
+ color: var(--color-secondary);
288
+ }
289
+ }
290
+ }
291
+
292
+ @plugin "@tailwindcss/typography";
data/coverage.markdown ADDED
@@ -0,0 +1,14 @@
1
+ ---
2
+ layout: page
3
+ # the header for the page
4
+ title: "Code Coverage Report"
5
+ # the link to page https://jekyllrb.com/docs/permalinks/
6
+ permalink: coverage-report/
7
+ ---
8
+
9
+ <div>
10
+ <!-- Get the data from the `total` field in `_data/coverage/coverage-summary.json` and assign it to a variable called `total`. -->
11
+ {% assign total = site.data.coverage.coverage-summary.total %}
12
+ <!-- Include the html snippet in `_includes/coverage-summary.html` with the parameters "main" as `branch` and the totals from the data as `total`. -->
13
+ {% include coverage-summary.html branch="main" total=total %}
14
+ </div>
data/index.markdown ADDED
@@ -0,0 +1,48 @@
1
+ ---
2
+ layout: default
3
+ ---
4
+
5
+ <div class="md:grid md:grid-cols-3 md:gap-8 md:items-start md:justify-center">
6
+ <div class="md:col-start-1 md:col-span-2">
7
+ <div class="">
8
+ <h2 class="md:mt-0">Main</h2>
9
+
10
+ <h3>Code Coverage</h3>
11
+ <!--
12
+ Jekyll provides access to YAML, JSON, CSV, and TSV in the `_data` directory using `site.data`. It supports retrieving data nested in directories, files, and objects. https://jekyllrb.com/docs/datafiles/
13
+
14
+ Get the data from the `total` field in `_data/coverage/coverage-summary.json` and assign it to a variable called `total`.
15
+ -->
16
+ {% assign total = site.data.coverage.coverage-summary.total %}
17
+ <!--
18
+ Jekyll uses includes to create reusable snippets of html code. Data can be passed through to the snippet using parameters. https://jekyllrb.com/docs/includes/
19
+
20
+ Include the html snippet in `_includes/coverage-summary.html` with the parameters "main" as `branch` and the totals from the data as `total`.
21
+ -->
22
+ {% include coverage-summary.html branch="main" total=total %}
23
+
24
+ <!-- Playwright dashboard added earlier -->
25
+ <h3>Playwright</h3>
26
+ <!-- Get the data from `_data/playwright-reports/main.json` and assign it to a variable called `data`. -->
27
+ {% assign data = site.data.playwright-reports.main %}
28
+ <!-- Jekyll uses Liquid filters to provide helper functions. https://jekyllrb.com/docs/liquid/filters/ -->
29
+ <!--
30
+ Include the html snippet in `_includes/playwright-summary.html` with the parameters "main" as `branch`,
31
+ the data variable as `data`, and "/playwright-reports/main.html" as `url`.
32
+ -->
33
+ {% include playwright-summary.html branch="main" data=data url="/playwright-reports/main.html" %}
34
+ </div>
35
+
36
+ <div class="">
37
+ <h2>Latest Reports from Branches</h2>
38
+ <!-- Include the html snippet from `_includes/playwright-branch-list.html` -->
39
+ {% include playwright-branch-list.html %}
40
+ </div>
41
+ </div>
42
+
43
+ <div class="md:mt-[-2rem] md:col-start-3">
44
+ {% for post in site.categories["release"] limit: 3 %}
45
+ {% include release-note.html post=post content=post.content %}
46
+ {% endfor %}
47
+ </div>
48
+ </div>
@@ -0,0 +1,11 @@
1
+ ---
2
+ # the header for the page
3
+ title: "Playwright Reports for Branches"
4
+ # the link to page https://jekyllrb.com/docs/permalinks/
5
+ permalink: playwright-reports/branches/
6
+ ---
7
+
8
+ <div>
9
+ <!-- Include the html snippet in `_includes/playwright-branch-list.html` -->
10
+ {% include playwright-branch-list.html %}
11
+ </div>
@@ -0,0 +1,26 @@
1
+ ---
2
+ layout: page
3
+ # the header for the page
4
+ title: "Playwright Reports"
5
+ # the link to page https://jekyllrb.com/docs/permalinks/
6
+ permalink: playwright-reports/
7
+ ---
8
+
9
+ <div>
10
+ <h2>Main
11
+ </h2>
12
+ <!-- Get the data from `_data/playwright-reports/main.json` and assign it to a variable called `data`. -->
13
+ {% assign data = site.data.playwright-reports.main %}
14
+ <!--
15
+ Include the html snippet in `_includes/playwright-summary.html` with the parameters "main" as `branch`,
16
+ the data variable as `data`, and "/playwright-reports/main.html" as `url`.
17
+ -->
18
+ {% include playwright-summary.html branch="main" data=data url="/playwright-reports/main.html" %}
19
+
20
+ <div class="mt-8">
21
+ <h2>Latest Reports from Branches
22
+ </h2>
23
+ <!-- Include the html snippet in `_includes/playwright-branch-list.html` -->
24
+ {% include playwright-branch-list.html %}
25
+ </div>
26
+ </div>
data/releases.markdown ADDED
@@ -0,0 +1,9 @@
1
+ ---
2
+ layout: page
3
+ title: Release Notes
4
+ permalink: releases/
5
+ ---
6
+
7
+ {% for post in site.categories["release"] %}
8
+ {% include release-note.html post=post content=post.content %}
9
+ {% endfor %}
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jekyll-report-dashboard
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Tiffany Forkner
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 2025-03-26 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: bundler
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :development
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ email:
27
+ - tforkner@fearless.com
28
+ executables: []
29
+ extensions: []
30
+ extra_rdoc_files: []
31
+ files:
32
+ - 404.html
33
+ - _data/coverage/thresholds.yml
34
+ - _includes/coverage-summary.html
35
+ - _includes/footer.html
36
+ - _includes/head.html
37
+ - _includes/header.html
38
+ - _includes/playwright-branch-list.html
39
+ - _includes/playwright-stat.html
40
+ - _includes/playwright-summary.html
41
+ - _includes/release-note.html
42
+ - _layouts/default.html
43
+ - _layouts/page.html
44
+ - _layouts/playwright-branch.html
45
+ - _layouts/post.html
46
+ - _layouts/release-note.html
47
+ - _plugins/coverage-results-filter.rb
48
+ - _plugins/icon-filter.rb
49
+ - _plugins/key-list-filter.rb
50
+ - _plugins/playwright-branch-index-generator.rb
51
+ - _plugins/playwright-results-filter.rb
52
+ - assets/css/styles.css
53
+ - coverage.markdown
54
+ - index.markdown
55
+ - playwright-branches.markdown
56
+ - playwright-reports.markdown
57
+ - releases.markdown
58
+ homepage: https://github.com/FearlessSolutions/jekyll-report-dashboard
59
+ licenses:
60
+ - MIT
61
+ metadata:
62
+ plugin_type: theme
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: 3.4.2
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubygems_version: 3.6.3
78
+ specification_version: 4
79
+ summary: Jekyll theme for displaying software project reports (e.g. Playwright reports,
80
+ code coverage reports, GitHub release notes)
81
+ test_files: []