@pictogrammers/components 0.5.13 → 0.5.15

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 (33) hide show
  1. package/package.json +1 -1
  2. package/pg/button/button.css +1 -1
  3. package/pg/buttonIncrement/buttonIncrement.ts +11 -3
  4. package/pg/inputNumber/__examples__/basic/basic.ts +1 -0
  5. package/pg/inputNumber/index.ts +3 -0
  6. package/pg/inputNumber/inputNumber.css +51 -4
  7. package/pg/inputNumber/inputNumber.html +9 -1
  8. package/pg/inputNumber/inputNumber.ts +61 -12
  9. package/pg/inputRadio/README.md +3 -0
  10. package/pg/inputRadio/__examples__/basic/basic.html +6 -0
  11. package/pg/inputRadio/__examples__/basic/basic.ts +31 -0
  12. package/pg/inputRadio/basic/basic.html +8 -0
  13. package/pg/inputRadio/basic/basic.ts +23 -0
  14. package/pg/inputRadio/index.ts +3 -0
  15. package/pg/inputRadio/inputRadio.css +5 -0
  16. package/pg/inputRadio/inputRadio.html +1 -0
  17. package/pg/inputRadio/inputRadio.ts +60 -0
  18. package/pg/inputRadio copy/README.md +3 -0
  19. package/pg/inputRadio copy/inputRadio.css +0 -0
  20. package/pg/inputRadio copy/inputRadio.html +1 -0
  21. package/pg/inputRadio copy/inputRadio.ts +19 -0
  22. package/pg/inputRadioItem/README.md +3 -0
  23. package/pg/inputRadioItem/inputRadioItem.css +27 -0
  24. package/pg/inputRadioItem/inputRadioItem.html +8 -0
  25. package/pg/inputRadioItem/inputRadioItem.ts +36 -0
  26. package/pg/inputRange/inputRange.css +7 -0
  27. package/pg/inputSelect/__examples__/basic/basic.ts +2 -2
  28. package/pg/inputSelect/inputSelect.css +1 -1
  29. package/pg/inputSelect/inputSelect.ts +57 -4
  30. package/pg/inputText/inputText.css +16 -6
  31. package/pg/jsonNumber/jsonNumber.css +12 -2
  32. package/pg/jsonNumber/jsonNumber.ts +2 -1
  33. package/pg/jsonString/jsonString.css +2 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pictogrammers/components",
3
3
  "type": "module",
4
- "version": "0.5.13",
4
+ "version": "0.5.15",
5
5
  "license": "MIT",
6
6
  "author": "Austin Andrews",
7
7
  "scripts": {
@@ -80,7 +80,7 @@
80
80
 
81
81
  [part=button].active {
82
82
  box-shadow: 0 1px 0.25rem rgba(0, 0, 0, 0.5) inset;
83
- background-color: rgba(69, 60, 79, 0.1);
83
+ background-color: rgb(236, 235, 237);
84
84
  color: var(--pg-button-color, #453C4F);
85
85
  }
86
86
  [part=button].active:hover {
@@ -1,4 +1,4 @@
1
- import { Component, normalizeInt, Part, Prop } from '@pictogrammers/element';
1
+ import { Component, normalizeInt, Prop } from '@pictogrammers/element';
2
2
 
3
3
  import template from './buttonIncrement.html';
4
4
  import style from './buttonIncrement.css';
@@ -32,8 +32,16 @@ export default class PgButtonIncrement extends PgButton {
32
32
  this.dispatchEvent(new CustomEvent('increment'));
33
33
  }, this.incrementStepDelay);
34
34
  }, this.incrementDelay);
35
+ const pointerLeave = () => {
36
+ this.dispatchEvent(new CustomEvent('finish'));
37
+ clearTimers();
38
+ this.$button.removeEventListener('pointerleave', pointerLeave);
39
+ };
40
+ this.$button.addEventListener('pointerleave', pointerLeave);
41
+ });
42
+ this.$button.addEventListener('pointerup', () => {
43
+ this.dispatchEvent(new CustomEvent('finish'));
44
+ clearTimers();
35
45
  });
36
- this.$button.addEventListener('pointerup', clearTimers);
37
- this.$button.addEventListener('pointerleave', clearTimers);
38
46
  }
39
47
  }
@@ -26,5 +26,6 @@ export default class XPgInputNumberBasic extends HTMLElement {
26
26
  #handleInput(e: CustomEvent) {
27
27
  const { value } = e.detail;
28
28
  this.$value2.textContent = value;
29
+ this.$input.value = value;
29
30
  }
30
31
  }
@@ -0,0 +1,3 @@
1
+ import PgInputNumber from './inputNumber';
2
+
3
+ export default PgInputNumber;
@@ -4,15 +4,28 @@
4
4
  }
5
5
 
6
6
  [part=input] {
7
- border: 1px solid var(--pg-input-text-border-color, #453C4F);
7
+ border: 1px solid var(--pg-input-number-border-color, #453C4F);
8
8
  border-radius: 0.125rem;
9
- padding: var(--pg-input-text-padding, calc(0.5rem - 1px) 0.75rem);
9
+ padding-inline-start: var(--pg-input-number-padding-inline-start, var(--pg-input-number-padding-inline, 0.5rem));
10
+ padding-inline-end: var(--pg-input-number-padding-inline-end, var(--pg-input-number-padding-inline, 0.5rem));
11
+ padding-block-start: var(--pg-input-number-padding-block-start, var(--pg-input-number-padding-block, 0.25rem));
12
+ padding-block-end: var(--pg-input-number-padding-block-start, var(--pg-input-number-padding-block, 0.25rem));
10
13
  font-family: var(--pg-input-number-font-family, var(--pg-font-family));
11
14
  font-size: 1rem;
12
15
  outline: none;
13
16
  field-sizing: content;
14
- min-width: calc(100% - 0.5rem - 2px);
15
- max-width: calc(var(--pg-input-text-max-width, 100%) - 0.5rem - 2px);
17
+ min-width: calc(
18
+ 100%
19
+ - var(--pg-input-number-padding-inline-start, var(--pg-input-number-padding-inline, 0.5rem))
20
+ - var(--pg-input-number-padding-inline-end, var(--pg-input-number-padding-inline, 0.5rem))
21
+ - 2px
22
+ );
23
+ max-width: calc(
24
+ var(--pg-input-number-max-width, 100%)
25
+ - var(--pg-input-number-padding-inline-start, var(--pg-input-number-padding-inline, 0.5rem))
26
+ - var(--pg-input-number-padding-inline-end, var(--pg-input-number-padding-inline, 0.5rem))
27
+ - 2px
28
+ );
16
29
  background-color: transparent;
17
30
  appearance: textfield;
18
31
  }
@@ -29,6 +42,40 @@
29
42
  [part=input]:active {
30
43
  box-shadow: 0 0 0 3px var(--pg-input-text-active-glow, rgb(79, 143, 249, 0.6));
31
44
  }
45
+
32
46
  [part=input]:focus {
33
47
  box-shadow: 0 0 0 3px var(--pg-input-text-focus-glow, rgb(79, 143, 249, 0.5));
48
+ z-index: 1;
49
+ }
50
+
51
+ [part=layout] {
52
+ display: grid;
53
+ grid-template-columns: 1fr auto auto;
54
+ gap: var(--pg-input-number-gap, 0);
55
+ }
56
+
57
+ [part=input]:has(+ [part=buttonMinus]) {
58
+ border-right: 0;
59
+ border-top-right-radius: var(--pg-input-number-minus-border-radius, var(--pg-input-number-minus-border-top-right-radius, 0));
60
+ border-bottom-right-radius: var(--pg-input-number-minus-border-radius, var(--pg-input-number-minus-border-top-right-radius, 0));;
61
+ }
62
+
63
+ [part=buttonMinus] {
64
+ --pg-button-border-radius: var(--pg-input-number-minus-border-radius, var(--pg-input-number-minus-border-top-right-radius, 0));;
65
+ margin-left: -1px;
66
+ --pg-button-padding-inline: var(--pg-input-number-minus-padding-inline, unset);
67
+ --pg-button-padding-block: var(--pg-input-number-minus-padding-block, unset);
34
68
  }
69
+
70
+ [part=buttonPlus] {
71
+ --pg-button-border-radius: var(
72
+ --pg-input-number-plus-border-radius,
73
+ var(--pg-input-number-plus-border-top-right-radius, 0)
74
+ var(--pg-input-number-plus-border-bottom-right-radius, 0.25rem)
75
+ var(--pg-input-number-plus-border-bottom-left-radius, 0.25rem)
76
+ var(--pg-input-number-plus-border-top-left-radius, 0)
77
+ );
78
+ margin-left: -1px;
79
+ --pg-button-padding-inline: var(--pg-input-number-plus-padding-inline, unset);
80
+ --pg-button-padding-block: var(--pg-input-number-plus-padding-block, unset);
81
+ }
@@ -1 +1,9 @@
1
- <input part="input" type="number" />
1
+ <div part="layout">
2
+ <input part="input" type="number" />
3
+ <pg-button-increment part="buttonMinus">
4
+ <pg-icon path="M19,13H5V11H19V13Z"></pg-icon>
5
+ </pg-button-increment>
6
+ <pg-button-increment part="buttonPlus">
7
+ <pg-icon path="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z"></pg-icon>
8
+ </pg-button-increment>
9
+ </div>
@@ -1,7 +1,8 @@
1
- import { Component, Prop, Part } from '@pictogrammers/element';
1
+ import { Component, Prop, Part, normalizeFloat } from '@pictogrammers/element';
2
2
 
3
3
  import template from './inputNumber.html';
4
4
  import style from './inputNumber.css';
5
+ import PgButtonIncrement from '../buttonIncrement/buttonIncrement';
5
6
 
6
7
  @Component({
7
8
  selector: 'pg-input-number',
@@ -10,22 +11,56 @@ import style from './inputNumber.css';
10
11
  })
11
12
  export default class PgInputNumber extends HTMLElement {
12
13
  @Prop() name: string = '';
13
- @Prop() value: string = '';
14
+ @Prop(normalizeFloat) value: number = 0;
15
+ @Prop(normalizeFloat) min: number = 0;
16
+ @Prop(normalizeFloat) max: number = 100;
17
+ @Prop(normalizeFloat) step: number = 1;
14
18
  @Prop() placeholder: string = '';
15
19
  @Prop() readOnly: boolean = false;
20
+ @Prop() disableButtons: boolean = false;
16
21
 
17
22
  @Part() $input: HTMLInputElement;
23
+ @Part() $buttonMinus: PgButtonIncrement;
24
+ @Part() $buttonPlus: PgButtonIncrement;
18
25
 
19
26
  connectedCallback() {
20
27
  this.$input.addEventListener('input', this.handleInput.bind(this));
21
28
  this.$input.addEventListener('change', this.handleChange.bind(this));
29
+ this.$input.addEventListener('beforeinput', (e: KeyboardEvent) => {
30
+ switch (e.key) {
31
+ case 'ArrowUp':
32
+ this.#triggerInput(this.value + this.step);
33
+ break;
34
+ case 'ArrowDown':
35
+ this.#triggerInput(this.value - this.step);
36
+ break;
37
+ }
38
+ });
39
+ this.$buttonMinus.addEventListener('increment', (e: any) => {
40
+ this.#triggerInput(this.value - this.step);
41
+ });
42
+ this.$buttonPlus.addEventListener('increment', (e: any) => {
43
+ this.#triggerInput(this.value + this.step);
44
+ });
45
+ this.$buttonMinus.addEventListener('finish', (e: any) => {
46
+ this.#triggerChange(this.value);
47
+ });
48
+ this.$buttonPlus.addEventListener('finish', (e: any) => {
49
+ this.#triggerChange(this.value);
50
+ });
22
51
  }
23
52
 
24
53
  skipValue = false;
25
54
 
26
55
  render(changes) {
27
56
  if (changes.value && !this.skipValue) {
28
- this.$input.value = this.value;
57
+ this.$input.value = `${this.value}`;
58
+ }
59
+ if (changes.min) {
60
+ this.$input.min = `${this.min}`;
61
+ }
62
+ if (changes.max) {
63
+ this.$input.max = `${this.max}`;
29
64
  }
30
65
  if (changes.placeholder) {
31
66
  this.$input.placeholder = this.placeholder;
@@ -36,28 +71,42 @@ export default class PgInputNumber extends HTMLElement {
36
71
  this.skipValue = false;
37
72
  }
38
73
 
39
- handleInput(e) {
40
- e.stopPropagation();
41
- this.skipValue = true;
42
- this.value = e.target.value;
74
+ #triggerInput(value) {
75
+ if (value < this.min || value > this.max) {
76
+ return;
77
+ }
43
78
  this.dispatchEvent(
44
79
  new CustomEvent('input', {
45
80
  detail: {
46
- value: e.target.value,
47
- name: e.name
81
+ value: value,
82
+ name: this.name,
48
83
  }
49
84
  })
50
85
  );
51
86
  }
52
87
 
53
- handleChange(e) {
88
+ handleInput(e) {
89
+ e.stopPropagation();
90
+ this.skipValue = true;
91
+ const value = parseInt(e.target.value ?? '0', 10);
92
+ this.#triggerInput(value);
93
+ }
94
+
95
+ #triggerChange(value) {
96
+ if (value < this.min || value > this.max) {
97
+ return;
98
+ }
54
99
  this.dispatchEvent(
55
100
  new CustomEvent('change', {
56
101
  detail: {
57
- value: e.target.value,
58
- name: e.name
102
+ value: value,
103
+ name: this.name,
59
104
  }
60
105
  })
61
106
  );
62
107
  }
108
+
109
+ handleChange(e) {
110
+ this.#triggerChange(e.target.value);
111
+ }
63
112
  }
@@ -0,0 +1,3 @@
1
+ # `<pg-input-radio>`
2
+
3
+ The `pg-input-radio` creates a radio list of options a user can pick from.
@@ -0,0 +1,6 @@
1
+ <div class="example">
2
+ <pg-input-radio part="input" value="item1"></pg-input-radio>
3
+ <div>
4
+ <code>onchange: <span part="value"></span></code>
5
+ </div>
6
+ </div>
@@ -0,0 +1,31 @@
1
+ import { Component, Part, Prop } from '@pictogrammers/element';
2
+ import PgInputRadio from '../../inputRadio';
3
+
4
+ import template from './basic.html';
5
+
6
+ @Component({
7
+ selector: 'x-pg-input-radio-basic',
8
+ template,
9
+ })
10
+ export default class XPgInputRadioBasic extends HTMLElement {
11
+
12
+ @Part() $input: PgInputRadio;
13
+ @Part() $value: HTMLSpanElement;
14
+
15
+ connectedCallback() {
16
+ this.$input.items.push({
17
+ label: 'Item 1',
18
+ value: 'item1',
19
+ }, {
20
+ label: 'Item 2',
21
+ value: 'item2',
22
+ });
23
+ this.$input.addEventListener('change', this.handleChange.bind(this));
24
+ }
25
+
26
+ handleChange(e: any) {
27
+ const { value } = e.detail;
28
+ this.$input.value = value;
29
+ this.$value.textContent = value;
30
+ }
31
+ }
@@ -0,0 +1,8 @@
1
+ <div class="example">
2
+ <pg-input-radio part="input" value="item1"></pg-input-check>
3
+ <pg-input-radio disabled></pg-input-check>
4
+ <pg-input-radio value="item2" disabled></pg-input-check>
5
+ <div>
6
+ <code>onchange: <span part="value"></span></code>
7
+ </div>
8
+ </div>
@@ -0,0 +1,23 @@
1
+ import { Component, Part, Prop } from '@pictogrammers/element';
2
+ import PgInputRadio from '../inputRadio';
3
+
4
+ import template from './basic.html';
5
+
6
+ @Component({
7
+ selector: 'x-pg-input-radio-basic',
8
+ template,
9
+ })
10
+ export default class XPgInputRadioBasic extends HTMLElement {
11
+
12
+ @Part() $input: PgInputRadio;
13
+ @Part() $value: HTMLSpanElement;
14
+
15
+ connectedCallback() {
16
+ this.$input.addEventListener('change', this.handleChange.bind(this));
17
+ }
18
+
19
+ handleChange(e) {
20
+ var value = e.target.value;
21
+ this.$value.innerText = value;
22
+ }
23
+ }
@@ -0,0 +1,3 @@
1
+ import PgInputRadio from './inputRadio';
2
+
3
+ export default PgInputRadio;
@@ -0,0 +1,5 @@
1
+ [part=items] {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 0.25rem;
5
+ }
@@ -0,0 +1 @@
1
+ <div part="items"></div>
@@ -0,0 +1,60 @@
1
+ import { Component, Prop, Part, normalizeBoolean, forEach } from '@pictogrammers/element';
2
+
3
+ import template from './inputRadio.html';
4
+ import style from './inputRadio.css';
5
+ import PgInputRadioItem from '../inputRadioItem/inputRadioItem';
6
+
7
+ @Component({
8
+ selector: 'pg-input-radio',
9
+ style,
10
+ template,
11
+ })
12
+ export default class PgInputRadio extends HTMLElement {
13
+ @Prop() name: string = '';
14
+ @Prop() value: string = '';
15
+ @Prop(normalizeBoolean) readOnly: boolean = false;
16
+ @Prop(normalizeBoolean) disabled: boolean = false;
17
+ @Prop() items: any[] = [];
18
+
19
+ @Part() $items: HTMLInputElement;
20
+
21
+ connectedCallback() {
22
+ forEach({
23
+ container: this.$items,
24
+ items: this.items,
25
+ type: () => PgInputRadioItem,
26
+ create: ($item: PgInputRadioItem, item) => {
27
+ $item.addEventListener('change', () => {
28
+ Array.from(this.$items.children).forEach(($ele: PgInputRadioItem) => {
29
+ if ($ele === $item) {
30
+ $ele.checked = true;
31
+ } else {
32
+ $ele.checked = false;
33
+ }
34
+ });
35
+ this.dispatchEvent(new CustomEvent('change', {
36
+ detail: {
37
+ value: item.value,
38
+ }
39
+ }))
40
+ });
41
+ // set initial checked
42
+ if (item.value === this.value) {
43
+ $item.checked = true;
44
+ }
45
+ }
46
+ });
47
+ }
48
+
49
+ render(changes) {
50
+ if (changes.value && this.items.length) {
51
+ Array.from(this.$items.children).forEach(($ele: PgInputRadioItem) => {
52
+ if ($ele.value === this.value) {
53
+ $ele.checked = true;
54
+ } else {
55
+ $ele.checked = false;
56
+ }
57
+ });
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,3 @@
1
+ # `<pg-input-radio>`
2
+
3
+ The `pg-input-radio` creates a radio list of options a user can pick from.
File without changes
@@ -0,0 +1 @@
1
+ <div part="list"></div>
@@ -0,0 +1,19 @@
1
+ import { Component, Prop, Part, normalizeBoolean } from '@pictogrammers/element';
2
+
3
+ import template from './inputRadio.html';
4
+ import style from './inputRadio.css';
5
+
6
+ @Component({
7
+ selector: 'pg-input-radio',
8
+ style,
9
+ template,
10
+ })
11
+ export default class PgInputRadio extends HTMLElement {
12
+ @Prop() name: string = '';
13
+ @Prop() value: string = '';
14
+ @Prop(normalizeBoolean) readOnly: boolean = false;
15
+ @Prop(normalizeBoolean) disabled: boolean = false;
16
+ @Prop() items: any[] = [];
17
+
18
+ @Part() $input: HTMLInputElement;
19
+ }
@@ -0,0 +1,3 @@
1
+ # `PgInputRadioItem`
2
+
3
+ The `PgInputRadioItem` is used internally as options are added to the `pg-input-radio`.
@@ -0,0 +1,27 @@
1
+ svg:hover [part="path"] {
2
+ fill: #4f8ff9;
3
+ }
4
+
5
+ label {
6
+ display: flex;
7
+ flex-direction: row;
8
+ gap: 0.5rem;
9
+ align-items: center;
10
+ }
11
+
12
+ [part="input"] {
13
+ visibility: hidden;
14
+ width: 0;
15
+ height: 0;
16
+ margin: 0;
17
+ }
18
+
19
+ [part="input"]:not(:checked) + svg [part="check"] {
20
+ display: none;
21
+ }
22
+
23
+ svg {
24
+ width: 1.5rem;
25
+ height: 1.5rem;
26
+ margin-left: -0.5rem;
27
+ }
@@ -0,0 +1,8 @@
1
+ <label>
2
+ <input part="input" type="radio" />
3
+ <svg viewBox="0 0 24 24">
4
+ <path part="path" d="M12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z"></path>
5
+ <path part="check" d="M12,7A5,5 0 0,0 7,12A5,5 0 0,0 12,17A5,5 0 0,0 17,12A5,5 0 0,0 12,7Z"></path>
6
+ </svg>
7
+ <span part="label"></span>
8
+ </label>
@@ -0,0 +1,36 @@
1
+ import { Component, Prop, Part, normalizeBoolean } from '@pictogrammers/element';
2
+
3
+ import template from './inputRadioItem.html';
4
+ import style from './inputRadioItem.css';
5
+
6
+ @Component({
7
+ selector: 'pg-input-radio-item',
8
+ style,
9
+ template,
10
+ })
11
+ export default class PgInputRadioItem extends HTMLElement {
12
+ @Prop() label: string = '';
13
+ @Prop() value: string = '';
14
+ @Prop() checked: boolean = false;
15
+
16
+ @Part() $input: HTMLInputElement;
17
+ @Part() $label: HTMLSpanElement;
18
+
19
+ connectedCallback() {
20
+ this.$input.addEventListener('change', () => {
21
+ this.dispatchEvent(new CustomEvent('change'));
22
+ });
23
+ }
24
+
25
+ render(changes) {
26
+ if (changes.label) {
27
+ this.$label.textContent = this.label;
28
+ }
29
+ if (changes.value) {
30
+ this.$input.textContent = this.label;
31
+ }
32
+ if (changes.checked) {
33
+ this.$input.checked = this.checked;
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,7 @@
1
+ :host {
2
+ display: block;
3
+ }
4
+
5
+ input {
6
+ width: 100%;
7
+ }
@@ -24,9 +24,9 @@ export default class XPgInputSelectBasic extends HTMLElement {
24
24
  this.$input.addEventListener('change', this.#handleChange.bind(this));
25
25
  }
26
26
 
27
- #handleChange(e) {
27
+ #handleChange(e: any) {
28
28
  const { value } = e.detail;
29
29
  this.$input.value = value;
30
- this.$value.innerText = `${value}`;
30
+ this.$value.textContent = `${value}`;
31
31
  }
32
32
  }
@@ -24,7 +24,7 @@
24
24
  [part=label] {
25
25
  grid-row: 1;
26
26
  grid-column: 1;
27
- padding: var(--pg-input-select-padding, 0.5rem 0.75rem);
27
+ padding: var(--pg-input-select-padding, 0.25rem 0.75rem);
28
28
  font-size: var(--pg-input-select-font-size, 1rem);
29
29
  }
30
30
 
@@ -25,12 +25,13 @@ export default class PgInputSelect extends HTMLElement {
25
25
 
26
26
  connectedCallback() {
27
27
  this.$button.addEventListener('click', this.#handleClick.bind(this));
28
+ this.$button.addEventListener('keydown', this.#handleKeyPress.bind(this));
28
29
  }
29
30
 
30
31
  render(changes) {
31
32
  if (changes.value || changes.default) {
32
33
  this.$label.textContent = this.value
33
- ? this.value
34
+ ? (this.options.find(x => x.value === this.value) ?? { label: this.value }).label
34
35
  : this.default
35
36
  ? this.default.label
36
37
  : '\u00A0'; // nbsp
@@ -45,16 +46,68 @@ export default class PgInputSelect extends HTMLElement {
45
46
  source: this.$button,
46
47
  default: this.default,
47
48
  value: this.options.find(x => x.value === this.value) ?? null,
48
- items: this.options
49
+ items: this.options,
49
50
  });
50
51
  if (result !== undefined) {
51
52
  this.dispatchEvent(new CustomEvent('change', {
52
53
  detail: {
53
- value: result.value
54
- }
54
+ value: result.value,
55
+ },
55
56
  }));
56
57
  this.$label.textContent = result.label;
57
58
  }
58
59
  this.#menuOpen = false;
59
60
  }
61
+
62
+ #handleKeyPress(e: KeyboardEvent) {
63
+ switch (e.key) {
64
+ case 'ArrowDown':
65
+ e.preventDefault();
66
+ if (this.options.length <= 1) {
67
+ return;
68
+ }
69
+ this.#handleKeyDownArrowDown();
70
+ break;
71
+ case 'ArrowUp':
72
+ e.preventDefault();
73
+ if (this.options.length <= 1) {
74
+ return;
75
+ }
76
+ this.#handleKeyDownArrowUp();
77
+ break;
78
+ }
79
+ }
80
+
81
+ #handleKeyDownArrowDown() {
82
+ const index = this.options.findIndex(x => x.value === this.value);
83
+ let newValue = '';
84
+ if (index === -1 || index === this.options.length - 1) {
85
+ // select first or loop to top
86
+ newValue = this.options[0].value;
87
+ } else {
88
+ newValue = this.options[index + 1].value;
89
+ }
90
+ this.dispatchEvent(new CustomEvent('change', {
91
+ detail: {
92
+ value: newValue,
93
+ },
94
+ }));
95
+ }
96
+
97
+ #handleKeyDownArrowUp() {
98
+ const index = this.options.findIndex(x => x.value === this.value);
99
+ const normalizeIndex = index === -1 ? 0 : index;
100
+ let newValue = '';
101
+ if (normalizeIndex === 0) {
102
+ // loop to bottom
103
+ newValue = this.options[this.options.length - 1].value;
104
+ } else {
105
+ newValue = this.options[normalizeIndex - 1].value;
106
+ }
107
+ this.dispatchEvent(new CustomEvent('change', {
108
+ detail: {
109
+ value: newValue,
110
+ },
111
+ }));
112
+ }
60
113
  }
@@ -6,16 +6,26 @@
6
6
  [part=input] {
7
7
  border: 1px solid var(--pg-input-text-border-color, #453C4F);
8
8
  border-radius: 0.125rem;
9
- padding-inline-start: var(--pg-input-text-padding-inline, var(--pg-input-text-padding-inline-start, 0.5rem));
10
- padding-inline-end: var(--pg-input-text-padding-inline, var(--pg-input-text-padding-inline-end, 0.5rem));
11
- padding-block-start: var(--pg-input-text-padding-block, var(--pg-input-text-padding-block-start, 0.25rem));
12
- padding-block-end: var(--pg-input-text-padding-block, var(--pg-input-text-padding-block-start, 0.25rem));
9
+ padding-inline-start: var(--pg-input-text-padding-inline-start, var(--pg-input-text-padding-inline, 0.5rem));
10
+ padding-inline-end: var(--pg-input-text-padding-inline-end, var(--pg-input-text-padding-inline, 0.5rem));
11
+ padding-block-start: var(--pg-input-text-padding-block-start, var(--pg-input-text-padding-block, 0.25rem));
12
+ padding-block-end: var(--pg-input-text-padding-block-start, var(--pg-input-text-padding-block, 0.25rem));
13
13
  font-family: var(--pg-input-text-font-family, var(--pg-font-family));
14
14
  font-size: 1rem;
15
15
  outline: none;
16
16
  field-sizing: content;
17
- min-width: calc(100% - 1rem - 2px);
18
- max-width: calc(var(--pg-input-text-max-width, 100%) - 1.5rem - 2px);
17
+ min-width: calc(
18
+ 100%
19
+ - var(--pg-input-text-padding-inline-start, var(--pg-input-text-padding-inline, 0.5rem))
20
+ - var(--pg-input-text-padding-inline-end, var(--pg-input-text-padding-inline, 0.5rem))
21
+ - 2px
22
+ );
23
+ max-width: calc(
24
+ var(--pg-input-text-max-width, 100%)
25
+ - var(--pg-input-text-padding-inline-start, var(--pg-input-text-padding-inline, 0.5rem))
26
+ - var(--pg-input-text-padding-inline-end, var(--pg-input-text-padding-inline, 0.5rem))
27
+ - 2px
28
+ );
19
29
  background-color: transparent;
20
30
  }
21
31
 
@@ -10,9 +10,19 @@
10
10
 
11
11
  [part=value] {
12
12
  user-select: text;
13
- --pg-input-text-padding-inline: 0.25rem;
14
- --pg-input-text-border-color: transparent;
13
+ --pg-input-number-border-color: transparent;
15
14
  --pg-input-number-font-family: var(--pg-json-font-family);
15
+ --pg-input-number-padding-block: 0;
16
+ --pg-input-number-padding-inline: 0.25rem;
17
+ --pg-input-number-gap: 0.5rem;
18
+ --pg-input-number-minus-padding-inline: 0;
19
+ --pg-input-number-minus-padding-block: 0;
20
+ --pg-input-number-plus-padding-inline: 0;
21
+ --pg-input-number-plus-padding-block: 0;
22
+ --pg-icon-width: 1rem;
23
+ --pg-icon-height: 1rem;
24
+ --pg-input-number-plus-border-radius: 0.25rem;
25
+ --pg-input-number-minus-border-radius: 0.25rem;
16
26
  display: inline-flex;
17
27
  vertical-align: middle;
18
28
  margin: 0 -0.25rem;
@@ -19,6 +19,7 @@ export default class PgJsonNumber extends HTMLElement {
19
19
 
20
20
  connectedCallback() {
21
21
  this.$value.addEventListener('input', (e: any) => {
22
+ this.$value.value = e.detail.value;
22
23
  this.dispatchEvent(
23
24
  new CustomEvent('update', {
24
25
  detail: {
@@ -36,7 +37,7 @@ export default class PgJsonNumber extends HTMLElement {
36
37
  this.$key.textContent = this.key;
37
38
  }
38
39
  if (changes.value) {
39
- this.$value.value = `${this.value}`;
40
+ this.$value.value = this.value;
40
41
  }
41
42
  }
42
43
  }
@@ -10,9 +10,10 @@
10
10
 
11
11
  [part=value] {
12
12
  user-select: text;
13
- --pg-input-text-padding-inline: 0.25rem;
14
13
  --pg-input-text-border-color: transparent;
15
14
  --pg-input-text-font-family: var(--pg-json-font-family);
15
+ --pg-input-text-padding-block: 0;
16
+ --pg-input-text-padding-inline: 0.25rem;
16
17
  display: inline-flex;
17
18
  vertical-align: middle;
18
19
  margin: 0 -0.25rem;