@decidables/decidables-elements 0.0.2 → 0.0.3

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 (31) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +186 -4
  3. package/package.json +9 -3
  4. package/gulpfile.js +0 -25
  5. package/test/button.test.js +0 -29
  6. package/test/converter-array.test.js +0 -14
  7. package/test/converter-set.test.js +0 -15
  8. package/test/coverage/lcov-report/base.css +0 -224
  9. package/test/coverage/lcov-report/block-navigation.js +0 -87
  10. package/test/coverage/lcov-report/button.js.html +0 -364
  11. package/test/coverage/lcov-report/converter-array.js.html +0 -130
  12. package/test/coverage/lcov-report/converter-set.js.html +0 -130
  13. package/test/coverage/lcov-report/decidables-element.js.html +0 -877
  14. package/test/coverage/lcov-report/favicon.png +0 -0
  15. package/test/coverage/lcov-report/index.html +0 -236
  16. package/test/coverage/lcov-report/prettify.css +0 -1
  17. package/test/coverage/lcov-report/prettify.js +0 -2
  18. package/test/coverage/lcov-report/slider.js.html +0 -1084
  19. package/test/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  20. package/test/coverage/lcov-report/sorter.js +0 -196
  21. package/test/coverage/lcov-report/spinner.js.html +0 -532
  22. package/test/coverage/lcov-report/switch.js.html +0 -622
  23. package/test/coverage/lcov-report/toggle-option.js.html +0 -574
  24. package/test/coverage/lcov-report/toggle.js.html +0 -259
  25. package/test/coverage/lcov.info +0 -1480
  26. package/test/decidables-element.test.js +0 -10
  27. package/test/slider.test.js +0 -64
  28. package/test/spinner.test.js +0 -55
  29. package/test/switch.test.js +0 -71
  30. package/test/toggle-option.test.js +0 -62
  31. package/test/toggle.test.js +0 -98
package/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ### [0.0.3](https://github.com/decidables/decidables/compare/@decidables/decidables-elements@0.0.2...@decidables/decidables-elements@0.0.3) (2022-03-07)
7
+
8
+ **Note:** Version bump only for package @decidables/decidables-elements
9
+
10
+
11
+
12
+
13
+
6
14
  ### [0.0.2](https://github.com/decidables/decidables/compare/@decidables/decidables-elements@0.0.1...@decidables/decidables-elements@0.0.2) (2022-03-03)
7
15
 
8
16
  **Note:** Version bump only for package @decidables/decidables-elements
package/README.md CHANGED
@@ -2,20 +2,199 @@
2
2
 
3
3
  # decidables-elements: Basic UI Web Components for [**decidables**](https://github.com/decidables/decidables)
4
4
 
5
+ ## Usage
6
+
7
+ - Install:
8
+ ```shell
9
+ yarn add @decidables/decidables-elements
10
+ ```
11
+ - Use:
12
+ ```javascript
13
+ import '@decidables/decidables-elements';
14
+ ```
15
+ A bare import is used to register the elements in the custom registry, so they are then available
16
+ for use in HTML.
17
+
5
18
  ## Contents
6
19
 
7
- - Base class
8
- - `DecidablesElement`: Base class for all *decidables* web components
9
- - Elements
20
+ - Components
10
21
  - `DecidablesButton`: Button for taking actions
22
+ - `<decidables-button></decidables-button>`
23
+ - Slot: *unnamed*
24
+ - Inline content as label
25
+ - Attribute: `disabled`
26
+ - Boolean (default: `false`)
27
+ - In disabled state user can't interact
28
+ - Example:
29
+ ```html
30
+ <decidables-button disabled>
31
+ Click me
32
+ </decidables-button>
33
+ ```
11
34
  - `DecidablesSlider`: Slider w/spinner for selecting a numeric value from a range
35
+ - `<decidables-slider></decidables-slider>`
36
+ - Slot: *unnamed*
37
+ - Inline content as label
38
+ - Attribute: `disabled`
39
+ - Boolean (default: `false`)
40
+ - In disabled state user can't interact
41
+ - Attribute: `max`
42
+ - Number (default: `undefined`)
43
+ - Maximum value the slider can take
44
+ - Attribute: `min`
45
+ - Number (default: `undefined`)
46
+ - Minimum value the slider can take
47
+ - Attribute: `step`
48
+ - Number (default: `undefined`)
49
+ - Amount that value increments with smallest movement of the slider
50
+ - Attribute: `value`
51
+ - Number (default: `undefined`)
52
+ - Initial value of the slider
53
+ - Example:
54
+ ```html
55
+ <decidables-slider disabled max="0" min="100" step="2" value="50">
56
+ Move me
57
+ </decidables-slider>
58
+ ```
12
59
  - `DecidablesSpinner`: Text field w/spinner arrows for selecting a continuous numeric value
60
+ - `<decidables-spinner></decidables-spinner>`
61
+ - Slot: *unnamed*
62
+ - Inline content as label
63
+ - Attribute: `disabled`
64
+ - Boolean (default: `false`)
65
+ - In disabled state user can't interact
66
+ - Attribute: `max`
67
+ - Number (default: `undefined`)
68
+ - Maximum value the slider can take
69
+ - Attribute: `min`
70
+ - Number (default: `undefined`)
71
+ - Minimum value the slider can take
72
+ - Attribute: `step`
73
+ - Number (default: `undefined`)
74
+ - Amount that value increments with smallest movement of the slider
75
+ - Attribute: `value`
76
+ - Number (default: `undefined`)
77
+ - Initial value of the slider
78
+ - Example:
79
+ ```html
80
+ <decidables-spinner disabled max="0" min="100" step="2" value="50">
81
+ Change me
82
+ </decidables-spinner>
83
+ ```
13
84
  - `DecidablesSwitch`: Switch for turning an option on or off
14
- - `DecidablesToggle`: Toggle for selecting one option from a set
85
+ - `<decidables-switch></decidables-switch>`
86
+ - Slot: *unnamed*
87
+ - Inline content as label for **on** state
88
+ - Slot: `off-label`
89
+ - Inline content as label for **off** state
90
+ - Attribute: `disabled`
91
+ - Boolean (default: `false`)
92
+ - In disabled state user can't interact
93
+ - Attribute: `checked`
94
+ - Number (default: `false`)
95
+ - Whether the switch is **on** (`true`) or **off** ('false`)
96
+ - Example:
97
+ ```html
98
+ <decidables-switch disabled checked>
99
+ <span>On</span>
100
+ <span slot="off-label">Off</span>
101
+ </decidables-switch>
102
+ ```
15
103
  - `DecidablesToggleOption`: One option in a toggle set
104
+ - `<decidables-toggle-option></decidables-toggle-option>`
105
+ - Slot: *unnamed*
106
+ - Inline content as label for option
107
+ - Attribute: `disabled`
108
+ - Boolean (default: `false`)
109
+ - In disabled state user can't interact
110
+ - Attribute: `checked`
111
+ - Number (default: `false`)
112
+ - Whether the option is selected (`true`) or not ('false`)
113
+ - Attribute: `name`
114
+ - String (default: `undefined`)
115
+ - An identifier to be shared by all options in a mutually exclusive group
116
+ - Attribute: `value`
117
+ - String (default: `undefined`)
118
+ - An identifier specific to this option to uniquely identify it in the group
119
+ - Example:
120
+ ```html
121
+ <decidables-toggle-option disabled name="flavors" value="chocolate" checked>
122
+ Chocolate
123
+ </decidables-toggle-option>
124
+ ```
125
+ - `DecidablesToggle`: Toggle for selecting one option from a set
126
+ - `<decidables-toggle></decidables-toggle>`
127
+ - Slot: *unnamed*
128
+ - Inline content as label for set
129
+ - Slot: `label`
130
+ - Inline content as legend for options
131
+ - Attribute: `disabled`
132
+ - Boolean (default: `false`)
133
+ - In disabled state user can't interact
134
+ - Example:
135
+ ```html
136
+ <decidables-toggle disabled>
137
+ <span>Pick one</span>
138
+ <span slot="label">Flavors</span>
139
+ <decidables-toggle-option disabled name="flavors" value="chocolate">
140
+ Chocolate
141
+ </decidables-toggle-option>
142
+ <decidables-toggle-option disabled name="flavors" value="strawberry">
143
+ Strawberry
144
+ </decidables-toggle-option>
145
+ <decidables-toggle-option disabled name="flavors" value="vanilla" checked>
146
+ Vanilla
147
+ </decidables-toggle-option>
148
+ </decidables-toggle>
149
+ ```
150
+ - Base class
151
+ - `DecidablesElement`: Base class for all *decidables* web components
152
+ - To define a new element:
153
+ ```javascript
154
+ export default class DecidablesSomething extends DecidablesElement {
155
+ ...
156
+ }
157
+ ```
158
+ - This library is built on `Lit`, so the resulting `DecidableElement` is also a `LitElement`
16
159
  - Utilities
17
160
  - `DecidablesConverterArray`: Utility for attributes that can take an array of values
161
+ - If you are defining a `DecidablesElement` with an attribute that can take an array of numbers,
162
+ then you can use this to automatically convert between a space-separated list as the attribute
163
+ and an `Array` of numbers as the property:
164
+ ```javascript
165
+ static get properties() {
166
+ return {
167
+ stuff: {
168
+ attribute: 'values',
169
+ converter: DecidablesConverterArray,
170
+ reflect: true,
171
+ },
172
+ };
173
+ };
174
+ ```
175
+ ```html
176
+ <decidables-something values="1.23 3.56 -2.97"></decidables-something>
177
+ ```
178
+ And `this.values` will be the `Array`: `[1.23 3.56 -2.97]`
18
179
  - `DecidablesConverterSet`: Utility for attributes that can take a set of values
180
+ - If you are defining a `DecidablesElement` with an attribute that can take a set of string
181
+ values, then you can use this to automatically convert between a space-separated list as the
182
+ attribute and a `Set` of strings as the property:
183
+ ```javascript
184
+ static get properties() {
185
+ return {
186
+ stuff: {
187
+ attribute: 'stuff',
188
+ converter: DecidablesConverterSet,
189
+ reflect: true,
190
+ },
191
+ };
192
+ };
193
+ ```
194
+ ```html
195
+ <decidables-something stuff="this that other"></decidables-something>
196
+ ```
197
+ And `this.stuff` will be a `Set` with members: `'this'`, `'that'`, and `'other'`
19
198
 
20
199
  ---
21
200
 
@@ -37,6 +216,8 @@
37
216
  - Lints markdown, scripts and styles
38
217
  - `yarn test`
39
218
  - Runs all tests and reports coverage in `test/coverage/`
219
+ - `yarn test:watch`
220
+ - Runs all tests in watch mode and reports coverage in `test/coverage/`
40
221
  - `yarn test:file <filename>`
41
222
  - Runs tests for a single file and reports coverage in `test/coverage/`
42
223
  - `yarn build`
@@ -51,6 +232,7 @@
51
232
  - `src/` (Source files)
52
233
  - `test/` (Testing files)
53
234
  - `coverage/` (Code coverage results) **\[autogenerated\]**
235
+ - `CHANGELOG.md` (Based on conventional commits) **\[autogenerated\]**
54
236
  - `gulpfile.js` (Config for *gulp*)
55
237
  - `package.json` (Config for *yarn* and *npm*)
56
238
  - `README.md` (This file)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decidables/decidables-elements",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "decidables-elements: Basic UI Web Components for the decidables project",
5
5
  "type": "module",
6
6
  "main": "./lib/decidablesElements.umd.min.js",
@@ -23,9 +23,16 @@
23
23
  "publishConfig": {
24
24
  "access": "public"
25
25
  },
26
+ "files": [
27
+ "package.json",
28
+ "*.md",
29
+ "src",
30
+ "lib"
31
+ ],
26
32
  "scripts": {
27
33
  "lint": "gulp lint",
28
34
  "test": "web-test-runner test/**/*.test.js --config ../../.webtestrunnerrc.js",
35
+ "test:watch": "web-test-runner test/**/*.test.js --config ../../.webtestrunnerrc.js --watch",
29
36
  "test:file": "web-test-runner $@ --config ../../.webtestrunnerrc.js",
30
37
  "build": "gulp build"
31
38
  },
@@ -34,7 +41,6 @@
34
41
  "not dead"
35
42
  ],
36
43
  "devDependencies": {
37
- "@open-wc/testing": "^3.1.1",
38
44
  "@web/test-runner": "^0.13.27",
39
45
  "gulp": "^4.0.2"
40
46
  },
@@ -42,5 +48,5 @@
42
48
  "d3": "^7.3.0",
43
49
  "lit": "^2.1.2"
44
50
  },
45
- "gitHead": "e6bd81a6113c3d4e6a89d9b16f835ec00021034e"
51
+ "gitHead": "316addbec77ac7c9b445b313ac4694e65164f104"
46
52
  }
package/gulpfile.js DELETED
@@ -1,25 +0,0 @@
1
-
2
- // devDependencies
3
- import gulp from 'gulp';
4
-
5
- // Local dependencies
6
- import * as cleans from '../../scripts/clean.js';
7
- import * as lints from '../../scripts/lint.js';
8
- import * as builds from '../../scripts/build.js';
9
-
10
- // Re-export
11
- export * from '../../scripts/clean.js';
12
- export * from '../../scripts/lint.js';
13
- export * from '../../scripts/build.js';
14
-
15
- // Tasks
16
- export const lint = gulp.parallel(
17
- lints.lintMarkdown,
18
- lints.lintScripts,
19
- lints.lintStyles,
20
- );
21
-
22
- export const build = gulp.series(
23
- cleans.cleanLib,
24
- builds.buildLibrary,
25
- );
@@ -1,29 +0,0 @@
1
- import {expect, fixture, html} from '@open-wc/testing';
2
-
3
- import '../src/button';
4
-
5
- describe('decidables-button', () => {
6
- it('has a shadowDom', async () => {
7
- const el = await fixture(html` <decidables-button>Push</decidables-button> `);
8
-
9
- expect(el).shadowDom.to.equal(`
10
- <button>
11
- <slot></slot>
12
- </button>
13
- `);
14
- });
15
-
16
- it('has a lightDom', async () => {
17
- const el = await fixture(html` <decidables-button>Push</decidables-button> `);
18
-
19
- expect(el).lightDom.to.equal(`
20
- Push
21
- `);
22
- });
23
-
24
- it('can be disabled', async () => {
25
- const el = await fixture(html` <decidables-button disabled>Push</decidables-button> `);
26
-
27
- expect(el.shadowRoot).to.have.descendant('button').that.has.attribute('disabled');
28
- });
29
- });
@@ -1,14 +0,0 @@
1
- import {expect} from '@open-wc/testing';
2
-
3
- import DecidablesConvertArray from '../src/converter-array';
4
-
5
- describe('decidables-converter-array', () => {
6
- it('converts from attribute to property', () => {
7
- expect(DecidablesConvertArray.fromAttribute('1 2 3 4 5')).to.deep.equal([1, 2, 3, 4, 5]);
8
- });
9
-
10
- it('converts from property to attribute', () => {
11
- expect(DecidablesConvertArray.toAttribute([1, 2, 3, 4, 5]))
12
- .to.equal('1.000 2.000 3.000 4.000 5.000');
13
- });
14
- });
@@ -1,15 +0,0 @@
1
- import {expect} from '@open-wc/testing';
2
-
3
- import DecidablesConvertSet from '../src/converter-set';
4
-
5
- describe('decidables-converter-set', () => {
6
- it('converts from attribute to property', () => {
7
- expect(DecidablesConvertSet.fromAttribute('alpha beta gamma'))
8
- .to.deep.equal(new Set(['alpha', 'beta', 'gamma']));
9
- });
10
-
11
- it('converts from property to attribute', () => {
12
- expect(DecidablesConvertSet.toAttribute(new Set(['alpha', 'beta', 'gamma'])))
13
- .to.equal('alpha beta gamma');
14
- });
15
- });
@@ -1,224 +0,0 @@
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
- }
@@ -1,87 +0,0 @@
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);