nanosplash 2.5.3 → 3.0.1

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.
Files changed (102) hide show
  1. package/.github/workflows/ci.yml +48 -0
  2. package/.prettierrc +10 -9
  3. package/LICENSE +1 -1
  4. package/README.md +139 -72
  5. package/coverage/base.css +224 -0
  6. package/coverage/block-navigation.js +87 -0
  7. package/coverage/clover.xml +555 -0
  8. package/coverage/core/Dom.ts.html +565 -0
  9. package/coverage/core/Service.ts.html +790 -0
  10. package/coverage/core/Splash.ts.html +457 -0
  11. package/coverage/core/index.html +146 -0
  12. package/coverage/coverage-final.json +9043 -0
  13. package/coverage/favicon.png +0 -0
  14. package/coverage/index.html +131 -0
  15. package/coverage/prettify.css +1 -0
  16. package/coverage/prettify.js +2 -0
  17. package/coverage/sort-arrow-sprite.png +0 -0
  18. package/coverage/sorter.js +196 -0
  19. package/coverage/types/Types.ts.html +121 -0
  20. package/coverage/types/index.html +116 -0
  21. package/dist/latest/cjs/ns.cjs +1 -0
  22. package/dist/latest/cjs/style.css +1 -0
  23. package/dist/latest/es/ns.js +306 -0
  24. package/dist/latest/es/style.css +1 -0
  25. package/dist/latest/iife/ns.iife.js +4 -0
  26. package/dist/versioned/3.0.1/cjs/ns.cjs +1 -0
  27. package/dist/versioned/3.0.1/cjs/style.css +1 -0
  28. package/dist/versioned/3.0.1/es/ns.js +306 -0
  29. package/dist/versioned/3.0.1/es/style.css +1 -0
  30. package/dist/versioned/3.0.1/iife/ns.iife.js +2 -0
  31. package/docs/index.6d66a821.js +1 -0
  32. package/docs/index.74dbd99e.css +1 -0
  33. package/docs/index.f34144dc.js +1 -0
  34. package/docs/index.html +90 -114
  35. package/index.html +87 -115
  36. package/package.json +50 -36
  37. package/src/sass/ns.sass +95 -0
  38. package/src/ts/core/Dom.ts +160 -0
  39. package/src/ts/core/Service.ts +235 -0
  40. package/src/ts/core/ServiceInterface.ts +60 -0
  41. package/src/ts/core/Splash.ts +124 -0
  42. package/src/ts/core/SplashInterface.ts +54 -0
  43. package/src/ts/main.ts +9 -0
  44. package/src/ts/types/Types.ts +12 -0
  45. package/src/ts/types/global.d.ts +14 -0
  46. package/tests/Dom.spec.ts +127 -0
  47. package/tests/Guid.spec.ts +21 -0
  48. package/tests/Service.spec.ts +119 -0
  49. package/tests/Splash.spec.ts +64 -0
  50. package/tsconfig.json +20 -16
  51. package/vite.config.ts +27 -13
  52. package/vite.demo.config.ts +16 -0
  53. package/.github/workflows/production.yml +0 -60
  54. package/.github/workflows/release.yml +0 -61
  55. package/_config.yml +0 -1
  56. package/dist/iife/manifest.json +0 -7
  57. package/dist/iife/nanosplash.iife.js +0 -1
  58. package/dist/module/manifest.json +0 -7
  59. package/dist/module/nanosplash.cjs.js +0 -1
  60. package/dist/module/nanosplash.es.js +0 -371
  61. package/dist/module/style.css +0 -1
  62. package/docs/nanosplash.iife.js +0 -6
  63. package/docs/style.css +0 -1
  64. package/docs/typedoc/.nojekyll +0 -1
  65. package/docs/typedoc/assets/highlight.css +0 -22
  66. package/docs/typedoc/assets/icons.css +0 -1043
  67. package/docs/typedoc/assets/icons.png +0 -0
  68. package/docs/typedoc/assets/icons@2x.png +0 -0
  69. package/docs/typedoc/assets/main.js +0 -52
  70. package/docs/typedoc/assets/search.js +0 -1
  71. package/docs/typedoc/assets/style.css +0 -1414
  72. package/docs/typedoc/assets/widgets.png +0 -0
  73. package/docs/typedoc/assets/widgets@2x.png +0 -0
  74. package/docs/typedoc/classes/Core_Nanosplash.default.html +0 -133
  75. package/docs/typedoc/index.html +0 -1
  76. package/docs/typedoc/modules/Core_Nanosplash.html +0 -1
  77. package/docs/typedoc/modules/types.html +0 -1
  78. package/favicon.svg +0 -15
  79. package/postcss.config.js +0 -8
  80. package/src/Core/Nanosplash.ts +0 -257
  81. package/src/Core/SplashInstance.ts +0 -298
  82. package/src/Exceptions/DestinationException.ts +0 -13
  83. package/src/Exceptions/Exception.ts +0 -9
  84. package/src/Exceptions/IllegalArgumentException.ts +0 -11
  85. package/src/Factory/NanosplashFactory.ts +0 -93
  86. package/src/Interfaces/ContextualAPIInterface.ts +0 -8
  87. package/src/Interfaces/IdentityInterface.ts +0 -3
  88. package/src/Interfaces/InsideInterface.ts +0 -5
  89. package/src/Interfaces/NanosplashInterface.ts +0 -8
  90. package/src/Interfaces/ProgressInterface.ts +0 -5
  91. package/src/Interfaces/ShowInterface.ts +0 -5
  92. package/src/Interfaces/WhileInterface.ts +0 -5
  93. package/src/Repositories/NanosplashRepository.ts +0 -82
  94. package/src/Tests/dom.spec.ts +0 -72
  95. package/src/Utilities/dom.ts +0 -49
  96. package/src/main.ts +0 -5
  97. package/src/style.sass +0 -88
  98. package/src/types.d.ts +0 -59
  99. package/update-all.sh +0 -3
  100. package/vite.iife.config.js +0 -72
  101. package/vite.mod.config.js +0 -71
  102. package/vite.site.config.js +0 -22
@@ -0,0 +1,48 @@
1
+ name: Build and Test
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - production
7
+ pull_request:
8
+ branches:
9
+ - production
10
+
11
+ jobs:
12
+ build-and-test:
13
+ runs-on: ubuntu-latest
14
+
15
+ steps:
16
+ - name: Checkout code
17
+ uses: actions/checkout@v2
18
+
19
+ - name: Setup Node.js
20
+ uses: actions/setup-node@v2
21
+ with:
22
+ node-version: '20'
23
+
24
+ - name: Set up Git and update production branch
25
+ run: |
26
+ git config --global user.name "GitHub Actions"
27
+ git config --global user.email "actions@github.com"
28
+ git checkout production
29
+ git fetch
30
+ git pull --no-rebase
31
+
32
+ - name: Install dependencies
33
+ run: yarn install --frozen-lockfile
34
+
35
+ - name: Build (Vite)
36
+ run: yarn build
37
+
38
+ - name: Test (Vitest)
39
+ run: yarn test
40
+
41
+ - name: Generate Code Coverage (Vitest)
42
+ run: yarn coverage
43
+
44
+ - name: Commit and push changes
45
+ run: |
46
+ git add .
47
+ git commit --allow-empty -m "Build, test, and coverage report"
48
+ git push
package/.prettierrc CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
- "tabWidth": 2,
3
- "useTabs": true,
4
- "singleQuote": true,
5
- "bracketSpacing": true,
6
- "jsxSingleQuote": true,
7
- "endOfLine": "lf",
8
- "trailingComma": "es5",
9
- "arrowParens": "avoid",
10
- "semi": false
2
+ "tabWidth": 2,
3
+ "useTabs": true,
4
+ "singleQuote": true,
5
+ "bracketSpacing": true,
6
+ "jsxSingleQuote": true,
7
+ "endOfLine": "lf",
8
+ "trailingComma": "es5",
9
+ "arrowParens": "avoid",
10
+ "semi": false,
11
+ "printWidth": 80
11
12
  }
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2021 Isak Hauge
3
+ Copyright (c) 2023 Isak Hauge
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,124 +1,191 @@
1
- # nanosplash 🍩
1
+ # Nanosplash
2
2
 
3
- ![npm](https://img.shields.io/npm/v/nanosplash)
4
- ![Minified+gzip size](https://badgen.net/bundlephobia/minzip/nanosplash)
5
- ![Minified size](https://badgen.net/bundlephobia/dependency-count/nanosplash)
6
- ![Tree shaking](https://badgen.net/bundlephobia/tree-shaking/nanosplash)
3
+ ### The tiny loading screen for web artisans
7
4
 
8
- ![npm maintenance score](https://img.shields.io/npms-io/maintenance-score/nanosplash)
9
- ![npm quality score](https://img.shields.io/npms-io/quality-score/nanosplash)
10
- ![npm final score](https://img.shields.io/npms-io/final-score/nanosplash)
11
- ![npm popularity score](https://img.shields.io/npms-io/popularity-score/nanosplash)
5
+ <br>
12
6
 
13
- <strong>The simple, tiny loading screen</strong>
7
+ [![Build](https://github.com/isakhauge/nanosplash/actions/workflows/ci.yml/badge.svg?branch=production)](https://github.com/isakhauge/nanosplash/actions/workflows/ci.yml) ![npm bundle size](https://img.shields.io/bundlephobia/minzip/nanosplash) [![Coverage](https://img.shields.io/badge/Coverage-99%25-brightgreen)](./coverage/index.html) [![TypeScript](https://badges.frapsoft.com/typescript/version/typescript-next.svg?v=101)](https://github.com/ellerbrock/typescript-badges/) [![Last Commit](https://img.shields.io/github/last-commit/isakhauge/nanosplash)](https://github.com/isakhauge/nanosplash/commits/production)
14
8
 
15
- # Getting started
9
+ <br>
16
10
 
17
- ## Import via CDN (recommended)
11
+ ## Get started
12
+
13
+ ### Install via CDN
14
+
15
+ When installing via CDN, you will always get the latest version, and CSS is included inside the bundle.
18
16
 
19
17
  ```html
20
- <script src="https://unpkg.com/nanosplash/dist/iife/nanosplash.iife.js"></script>
21
- ```
22
- ```js
23
- // Install Nanosplash in the browser
24
- window.installNanosplash()
25
- // Display your first Nanosplash
26
- window.ns.show('Hello world')
18
+ <script src="https://unpkg.com/nanosplash/dist/latest/iife/ns.iife.js">
27
19
  ```
28
20
 
29
- ## Install (advanced)
21
+ Pros:
22
+
23
+ - Easy to get started.
24
+ - Always get the latest version.
25
+ - CSS is included inside the bundle.
26
+
27
+ Cons:
28
+
29
+ - Always get the latest version.
30
+
31
+ ### Install via NPM
32
+
30
33
  ```bash
31
34
  yarn add nanosplash
32
35
  ```
33
36
 
34
- ### Modules
37
+ ```js
38
+ import { Service } from 'nanosplash'
39
+ Service.start()
40
+ ```
35
41
 
36
- When including either ES or CJS modules, you need the CSS in the dist folder, whereas in the IIFE variant, everything is included. If you are using a modern bundler e.g Vite, NextJS, NuxtJS, you can import the CSS directly into your code.
42
+ The CSS file is located in the following path:
37
43
 
38
- ```js
39
- import 'nanosplash/dist/module/style.css'
44
+ ```text
45
+ node_modules/nanosplash/dist/latest/es/style.css
40
46
  ```
41
47
 
42
- > ### Location of the stylesheet
43
- >
44
- > Full: `node_modules/nanosplash/dist/module/style.css`<br>
45
- > Relative: `nanosplash/dist/module/style.css`
48
+ ### Example usage
46
49
 
47
- #### ESM (ES modules)
50
+ It's so simple to use.
48
51
 
49
52
  ```js
50
- import { Nanosplash } from 'nanosplash'
53
+ // Display a fullscreen loading screen
54
+ ns.show('Loading')
55
+
56
+ axios.get('/api/users')
57
+ .then((response) => /* Do something */ )
58
+ .finally(() => {
59
+ // Hide it when you're done
60
+ ns.hide()
61
+ })
51
62
  ```
52
63
 
53
- #### CJS (CommonJS)
64
+ ### TLDR
54
65
 
55
66
  ```js
56
- const Nanosplash = require('nanosplash')
67
+ // Fullscreen spinning wheel
68
+ ns.show()
69
+
70
+ // Fullscreen spinning wheel with text
71
+ ns.show('Loading')
72
+
73
+ // Display inside an element
74
+ ns.showInside('#my-table', 'Fetching data')
75
+
76
+ // Hide the last created loading screen (LIFO)
77
+ ns.hide()
78
+
79
+ // Hide loading screen inside an element
80
+ ns.hideInside('#my-table')
81
+
82
+ // Hide specific loading screen
83
+ const id = ns.show('Loading')
84
+ ns.hideId(id)
85
+
86
+ // Hide all loading screens
87
+ ns.hideAll()
57
88
  ```
58
89
 
59
- ### Inject Nanosplash into global scope
60
- #### Using CDN
61
- ```js
62
- const nsOptions = {
63
- spinner: true,
64
- fontSize: '18px',
65
- }
66
- window.installNanosplash(nsOptions)
90
+ ## API Documentation
91
+
92
+ ### Show
93
+
94
+ This method displays a fullscreen loading screen and returns a GUID string.
95
+
96
+ ```ts
97
+ ns.show(text?: string): GUIDString
67
98
  ```
68
- #### Using modules
99
+
100
+ If you enter no text, it will display the spinning wheel only.
101
+
69
102
  ```js
70
- const nsOptions = {
71
- spinner: true,
72
- fontSize: '18px',
73
- }
74
- window.ns = new Nanosplash(nsOptions)
103
+ ns.show() // Spinner only
104
+ ns.show('Loading') // Spinner with text
75
105
  ```
76
106
 
77
- ## Basic usage
107
+ ### Show inside
78
108
 
79
- ### Display the loading screen
109
+ This method displays a fullscreen loading screen inside an element and returns a GUID string.
80
110
 
81
- ```js
82
- ns.show('Loading the good stuff')
111
+ ```ts
112
+ ns.showInside(ref: Reference, text?: string): GUIDString | null
83
113
  ```
84
114
 
85
- ### Hide the loading screen
115
+ The `Reference` type is a union type of `string | Element`. The `string` type is a CSS selector string. The `Element` type is a DOM element.
86
116
 
87
117
  ```js
88
- // Hide one at a time
89
- ns.hide()
118
+ // Both works
119
+ const selector = '#my-table'
120
+ const element = document.getElementById('my-table')
121
+ ns.showInside(selector, 'Loading')
122
+ ns.showInside(element, 'Loading')
123
+ ```
90
124
 
91
- // Hide all
92
- ns.hideAll()
125
+ ### Hide
126
+
127
+ Hides the last created loading screen (LIFO).
128
+
129
+ ```ts
130
+ ns.hide(): GUIDString | null
131
+ ```
132
+
133
+ The reason why the hide function works in a LIFO (last in first out) manner is because you should always see the loading screen that you want to hide, which will always be the last one you created.
134
+
135
+ ```js
136
+ ns.show('a')
137
+ ns.show('b')
138
+ ns.show('c')
139
+ ns.hide() // Hides 'c'
140
+ ns.hide() // Hides 'b'
141
+ ns.hide() // Hides 'a'
93
142
  ```
94
143
 
95
- ## Advanced usage
144
+ > 💡 **PRO Tip:** If you have multiple loading screens open at the same time, I would recommend that you hide specific elements based on their GUID or host element. See `hideId` and `hideInside` for more information.
96
145
 
97
- ### Display the loading screen inside an element
146
+ ### Hide by ID
147
+
148
+ Hides the Nanosplash loading screen with the given GUID string.
149
+
150
+ ```ts
151
+ ns.hideId(guid: GUIDString): GUIDString | null
152
+ ```
153
+
154
+ The show methods always retrun a GUID. This identifier can be used to hide specific loading screens.
98
155
 
99
156
  ```js
100
- // Use CSS selector string
101
- ns.show('Loading component').inside('#my-element')
157
+ const id = ns.show('Loading')
158
+ ns.hideId(id)
159
+ ```
160
+
161
+ ### Hide inside
102
162
 
103
- // Use HTMLElement objects directly
104
- ns.show('Loading component').inside(document.getElementById('my-element'))
163
+ Hides the Nanosplash loading screen inside another element — if any — that corresponds with the given element reference. Returns the GUID string of the loading screen that was hidden, or null if no loading screen was found inside.
164
+
165
+ ```ts
166
+ ns.hideInside(ref: Reference): GUIDString | null
105
167
  ```
106
168
 
107
- ### Combine Nanosplash with async tasks
169
+ This method works almost the same way as `hideId`, but instead of using the GUID string as the identifier, it uses the host element as the identifier.
108
170
 
109
171
  ```js
110
- const task1 = new Promise(r => setTimeout(r, 3000))
111
- const task2 = async () => await getDataFromApi()
172
+ const selector = '#my-table'
173
+ ns.showInside(selector, 'Loading')
174
+ ns.hideInside(selector)
175
+ ```
112
176
 
113
- ns.while(task1).show('Loading resources')
114
- ns.while(task2).show('Fetching table data').inside('#my-table')
177
+ You can also use the `Element` type as the reference.
115
178
 
116
- ns.progress(
117
- [task1, 'Loading data from API'],
118
- [task2, 'Processing data']
119
- ).inside('#my-table')
179
+ ```js
180
+ const element = document.getElementById('my-table')
181
+ ns.showInside(element, 'Loading')
182
+ ns.hideInside(element)
120
183
  ```
121
184
 
122
- <hr>
185
+ ### Hide all
123
186
 
124
- ## If you like it, give it a star! ⭐️
187
+ Hide all Nanosplash loading screens.
188
+
189
+ ```ts
190
+ ns.hideAll(): void
191
+ ```
@@ -0,0 +1,224 @@
1
+ body, html {
2
+ margin:0; padding: 0;
3
+ height: 100%;
4
+ }
5
+ body {
6
+ font-family: Helvetica Neue, Helvetica, Arial;
7
+ font-size: 14px;
8
+ color:#333;
9
+ }
10
+ .small { font-size: 12px; }
11
+ *, *:after, *:before {
12
+ -webkit-box-sizing:border-box;
13
+ -moz-box-sizing:border-box;
14
+ box-sizing:border-box;
15
+ }
16
+ h1 { font-size: 20px; margin: 0;}
17
+ h2 { font-size: 14px; }
18
+ pre {
19
+ font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
20
+ margin: 0;
21
+ padding: 0;
22
+ -moz-tab-size: 2;
23
+ -o-tab-size: 2;
24
+ tab-size: 2;
25
+ }
26
+ a { color:#0074D9; text-decoration:none; }
27
+ a:hover { text-decoration:underline; }
28
+ .strong { font-weight: bold; }
29
+ .space-top1 { padding: 10px 0 0 0; }
30
+ .pad2y { padding: 20px 0; }
31
+ .pad1y { padding: 10px 0; }
32
+ .pad2x { padding: 0 20px; }
33
+ .pad2 { padding: 20px; }
34
+ .pad1 { padding: 10px; }
35
+ .space-left2 { padding-left:55px; }
36
+ .space-right2 { padding-right:20px; }
37
+ .center { text-align:center; }
38
+ .clearfix { display:block; }
39
+ .clearfix:after {
40
+ content:'';
41
+ display:block;
42
+ height:0;
43
+ clear:both;
44
+ visibility:hidden;
45
+ }
46
+ .fl { float: left; }
47
+ @media only screen and (max-width:640px) {
48
+ .col3 { width:100%; max-width:100%; }
49
+ .hide-mobile { display:none!important; }
50
+ }
51
+
52
+ .quiet {
53
+ color: #7f7f7f;
54
+ color: rgba(0,0,0,0.5);
55
+ }
56
+ .quiet a { opacity: 0.7; }
57
+
58
+ .fraction {
59
+ font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
60
+ font-size: 10px;
61
+ color: #555;
62
+ background: #E8E8E8;
63
+ padding: 4px 5px;
64
+ border-radius: 3px;
65
+ vertical-align: middle;
66
+ }
67
+
68
+ div.path a:link, div.path a:visited { color: #333; }
69
+ table.coverage {
70
+ border-collapse: collapse;
71
+ margin: 10px 0 0 0;
72
+ padding: 0;
73
+ }
74
+
75
+ table.coverage td {
76
+ margin: 0;
77
+ padding: 0;
78
+ vertical-align: top;
79
+ }
80
+ table.coverage td.line-count {
81
+ text-align: right;
82
+ padding: 0 5px 0 20px;
83
+ }
84
+ table.coverage td.line-coverage {
85
+ text-align: right;
86
+ padding-right: 10px;
87
+ min-width:20px;
88
+ }
89
+
90
+ table.coverage td span.cline-any {
91
+ display: inline-block;
92
+ padding: 0 5px;
93
+ width: 100%;
94
+ }
95
+ .missing-if-branch {
96
+ display: inline-block;
97
+ margin-right: 5px;
98
+ border-radius: 3px;
99
+ position: relative;
100
+ padding: 0 4px;
101
+ background: #333;
102
+ color: yellow;
103
+ }
104
+
105
+ .skip-if-branch {
106
+ display: none;
107
+ margin-right: 10px;
108
+ position: relative;
109
+ padding: 0 4px;
110
+ background: #ccc;
111
+ color: white;
112
+ }
113
+ .missing-if-branch .typ, .skip-if-branch .typ {
114
+ color: inherit !important;
115
+ }
116
+ .coverage-summary {
117
+ border-collapse: collapse;
118
+ width: 100%;
119
+ }
120
+ .coverage-summary tr { border-bottom: 1px solid #bbb; }
121
+ .keyline-all { border: 1px solid #ddd; }
122
+ .coverage-summary td, .coverage-summary th { padding: 10px; }
123
+ .coverage-summary tbody { border: 1px solid #bbb; }
124
+ .coverage-summary td { border-right: 1px solid #bbb; }
125
+ .coverage-summary td:last-child { border-right: none; }
126
+ .coverage-summary th {
127
+ text-align: left;
128
+ font-weight: normal;
129
+ white-space: nowrap;
130
+ }
131
+ .coverage-summary th.file { border-right: none !important; }
132
+ .coverage-summary th.pct { }
133
+ .coverage-summary th.pic,
134
+ .coverage-summary th.abs,
135
+ .coverage-summary td.pct,
136
+ .coverage-summary td.abs { text-align: right; }
137
+ .coverage-summary td.file { white-space: nowrap; }
138
+ .coverage-summary td.pic { min-width: 120px !important; }
139
+ .coverage-summary tfoot td { }
140
+
141
+ .coverage-summary .sorter {
142
+ height: 10px;
143
+ width: 7px;
144
+ display: inline-block;
145
+ margin-left: 0.5em;
146
+ background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
147
+ }
148
+ .coverage-summary .sorted .sorter {
149
+ background-position: 0 -20px;
150
+ }
151
+ .coverage-summary .sorted-desc .sorter {
152
+ background-position: 0 -10px;
153
+ }
154
+ .status-line { height: 10px; }
155
+ /* yellow */
156
+ .cbranch-no { background: yellow !important; color: #111; }
157
+ /* dark red */
158
+ .red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
159
+ .low .chart { border:1px solid #C21F39 }
160
+ .highlighted,
161
+ .highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
162
+ background: #C21F39 !important;
163
+ }
164
+ /* medium red */
165
+ .cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
166
+ /* light red */
167
+ .low, .cline-no { background:#FCE1E5 }
168
+ /* light green */
169
+ .high, .cline-yes { background:rgb(230,245,208) }
170
+ /* medium green */
171
+ .cstat-yes { background:rgb(161,215,106) }
172
+ /* dark green */
173
+ .status-line.high, .high .cover-fill { background:rgb(77,146,33) }
174
+ .high .chart { border:1px solid rgb(77,146,33) }
175
+ /* dark yellow (gold) */
176
+ .status-line.medium, .medium .cover-fill { background: #f9cd0b; }
177
+ .medium .chart { border:1px solid #f9cd0b; }
178
+ /* light yellow */
179
+ .medium { background: #fff4c2; }
180
+
181
+ .cstat-skip { background: #ddd; color: #111; }
182
+ .fstat-skip { background: #ddd; color: #111 !important; }
183
+ .cbranch-skip { background: #ddd !important; color: #111; }
184
+
185
+ span.cline-neutral { background: #eaeaea; }
186
+
187
+ .coverage-summary td.empty {
188
+ opacity: .5;
189
+ padding-top: 4px;
190
+ padding-bottom: 4px;
191
+ line-height: 1;
192
+ color: #888;
193
+ }
194
+
195
+ .cover-fill, .cover-empty {
196
+ display:inline-block;
197
+ height: 12px;
198
+ }
199
+ .chart {
200
+ line-height: 0;
201
+ }
202
+ .cover-empty {
203
+ background: white;
204
+ }
205
+ .cover-full {
206
+ border-right: none !important;
207
+ }
208
+ pre.prettyprint {
209
+ border: none !important;
210
+ padding: 0 !important;
211
+ margin: 0 !important;
212
+ }
213
+ .com { color: #999 !important; }
214
+ .ignore-none { color: #999; font-weight: normal; }
215
+
216
+ .wrapper {
217
+ min-height: 100%;
218
+ height: auto !important;
219
+ height: 100%;
220
+ margin: 0 auto -48px;
221
+ }
222
+ .footer, .push {
223
+ height: 48px;
224
+ }
@@ -0,0 +1,87 @@
1
+ /* eslint-disable */
2
+ var jumpToCode = (function init() {
3
+ // Classes of code we would like to highlight in the file view
4
+ var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];
5
+
6
+ // Elements to highlight in the file listing view
7
+ var fileListingElements = ['td.pct.low'];
8
+
9
+ // We don't want to select elements that are direct descendants of another match
10
+ var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `
11
+
12
+ // Selecter that finds elements on the page to which we can jump
13
+ var selector =
14
+ fileListingElements.join(', ') +
15
+ ', ' +
16
+ notSelector +
17
+ missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`
18
+
19
+ // The NodeList of matching elements
20
+ var missingCoverageElements = document.querySelectorAll(selector);
21
+
22
+ var currentIndex;
23
+
24
+ function toggleClass(index) {
25
+ missingCoverageElements
26
+ .item(currentIndex)
27
+ .classList.remove('highlighted');
28
+ missingCoverageElements.item(index).classList.add('highlighted');
29
+ }
30
+
31
+ function makeCurrent(index) {
32
+ toggleClass(index);
33
+ currentIndex = index;
34
+ missingCoverageElements.item(index).scrollIntoView({
35
+ behavior: 'smooth',
36
+ block: 'center',
37
+ inline: 'center'
38
+ });
39
+ }
40
+
41
+ function goToPrevious() {
42
+ var nextIndex = 0;
43
+ if (typeof currentIndex !== 'number' || currentIndex === 0) {
44
+ nextIndex = missingCoverageElements.length - 1;
45
+ } else if (missingCoverageElements.length > 1) {
46
+ nextIndex = currentIndex - 1;
47
+ }
48
+
49
+ makeCurrent(nextIndex);
50
+ }
51
+
52
+ function goToNext() {
53
+ var nextIndex = 0;
54
+
55
+ if (
56
+ typeof currentIndex === 'number' &&
57
+ currentIndex < missingCoverageElements.length - 1
58
+ ) {
59
+ nextIndex = currentIndex + 1;
60
+ }
61
+
62
+ makeCurrent(nextIndex);
63
+ }
64
+
65
+ return function jump(event) {
66
+ if (
67
+ document.getElementById('fileSearch') === document.activeElement &&
68
+ document.activeElement != null
69
+ ) {
70
+ // if we're currently focused on the search input, we don't want to navigate
71
+ return;
72
+ }
73
+
74
+ switch (event.which) {
75
+ case 78: // n
76
+ case 74: // j
77
+ goToNext();
78
+ break;
79
+ case 66: // b
80
+ case 75: // k
81
+ case 80: // p
82
+ goToPrevious();
83
+ break;
84
+ }
85
+ };
86
+ })();
87
+ window.addEventListener('keydown', jumpToCode);