@pictogrammers/components 0.4.8 → 0.5.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.
Files changed (191) hide show
  1. package/package.json +1 -1
  2. package/pg/annoy/annoy.css +1 -1
  3. package/pg/button/button.css +5 -4
  4. package/pg/buttonLink/buttonLink.css +1 -1
  5. package/pg/buttonMenu/__examples__/basic/basic.ts +2 -2
  6. package/pg/buttonMenu/buttonMenu.ts +4 -1
  7. package/pg/cardUser/cardUser.css +1 -1
  8. package/pg/database/__examples__/basic/basic.ts +0 -1
  9. package/pg/grid/__examples__/basic/basic.ts +1 -4
  10. package/pg/grid/grid.css +1 -1
  11. package/pg/header/header.css +1 -1
  12. package/pg/icon/__examples__/basic/basic.ts +1 -1
  13. package/pg/inputCheck/__examples__/basic/basic.ts +1 -1
  14. package/pg/inputCheck/inputCheck.css +5 -0
  15. package/pg/inputCheck/inputCheck.ts +4 -0
  16. package/pg/inputCheckList/__examples__/basic/basic.ts +1 -1
  17. package/pg/inputFileLocal/inputFileLocal.css +1 -1
  18. package/pg/inputNumber/README.md +27 -0
  19. package/pg/inputNumber/__examples__/basic/basic.html +9 -0
  20. package/pg/inputNumber/__examples__/basic/basic.ts +30 -0
  21. package/pg/inputNumber/inputNumber.css +34 -0
  22. package/pg/inputNumber/inputNumber.html +1 -0
  23. package/pg/inputNumber/inputNumber.spec.ts +59 -0
  24. package/pg/inputNumber/inputNumber.ts +63 -0
  25. package/pg/inputPixelEditor/README.md +211 -29
  26. package/pg/inputPixelEditor/__examples__/basic/basic.css +8 -0
  27. package/pg/inputPixelEditor/__examples__/basic/basic.html +29 -7
  28. package/pg/inputPixelEditor/__examples__/basic/basic.ts +274 -13
  29. package/pg/inputPixelEditor/__examples__/basic/constants.ts +62 -0
  30. package/pg/inputPixelEditor/inputPixelEditor.css +37 -2
  31. package/pg/inputPixelEditor/inputPixelEditor.html +22 -0
  32. package/pg/inputPixelEditor/inputPixelEditor.ts +822 -82
  33. package/pg/inputPixelEditor/utils/bitmapToMask.ts +22 -8
  34. package/pg/inputPixelEditor/utils/blobToImage.ts +11 -0
  35. package/pg/inputPixelEditor/utils/canvasToPngBuffer.ts +12 -0
  36. package/pg/inputPixelEditor/utils/constants.ts +55 -1
  37. package/pg/inputPixelEditor/utils/crc32.ts +116 -0
  38. package/pg/inputPixelEditor/utils/diffMap.ts +32 -0
  39. package/pg/inputPixelEditor/utils/generateGradient.ts +112 -0
  40. package/pg/inputPixelEditor/utils/getEllipsePixels.ts +131 -19
  41. package/pg/inputPixelEditor/utils/getFloodFill.ts +83 -0
  42. package/pg/inputPixelEditor/utils/getGridColorIndexes.ts +13 -0
  43. package/pg/inputPixelEditor/utils/getOutline.ts +92 -0
  44. package/pg/inputPixelEditor/utils/inputMode.ts +7 -1
  45. package/pg/inputPixelEditor/utils/pixelSizes.ts +47 -0
  46. package/pg/inputPixelEditor/utils/pngMetadata.ts +487 -0
  47. package/pg/inputSelect/inputSelect.css +4 -4
  48. package/pg/inputText/inputText.css +14 -7
  49. package/pg/inputText/inputText.ts +5 -1
  50. package/pg/json/README.md +59 -0
  51. package/pg/json/__examples__/basic/basic.html +4 -0
  52. package/pg/json/__examples__/basic/basic.ts +31 -0
  53. package/pg/json/json.css +9 -0
  54. package/pg/json/json.html +1 -0
  55. package/pg/json/json.ts +124 -0
  56. package/pg/jsonArray/README.md +3 -0
  57. package/pg/jsonArray/jsonArray.css +15 -0
  58. package/pg/jsonArray/jsonArray.html +7 -0
  59. package/pg/jsonArray/jsonArray.ts +55 -0
  60. package/pg/jsonBoolean/README.md +3 -0
  61. package/pg/jsonBoolean/jsonBoolean.css +27 -0
  62. package/pg/jsonBoolean/jsonBoolean.html +5 -0
  63. package/pg/jsonBoolean/jsonBoolean.ts +69 -0
  64. package/pg/jsonNumber/README.md +3 -0
  65. package/pg/jsonNumber/jsonNumber.css +21 -0
  66. package/pg/jsonNumber/jsonNumber.html +5 -0
  67. package/pg/jsonNumber/jsonNumber.ts +42 -0
  68. package/pg/jsonObject/README.md +3 -0
  69. package/pg/jsonObject/jsonObject.css +11 -0
  70. package/pg/jsonObject/jsonObject.html +5 -0
  71. package/pg/jsonObject/jsonObject.ts +55 -0
  72. package/pg/jsonString/README.md +3 -0
  73. package/pg/jsonString/jsonString.css +21 -0
  74. package/pg/jsonString/jsonString.html +5 -0
  75. package/pg/jsonString/jsonString.ts +42 -0
  76. package/pg/menu/menu.ts +6 -5
  77. package/pg/menuItem/README.md +13 -2
  78. package/pg/menuItem/menuItem.css +17 -22
  79. package/pg/menuItem/menuItem.ts +8 -3
  80. package/pg/menuItemIcon/__examples__/basic/basic.html +1 -1
  81. package/pg/menuItemIcon/__examples__/basic/basic.ts +7 -0
  82. package/pg/menuItemIcon/menuItemIcon.css +18 -15
  83. package/pg/menuItemIcon/menuItemIcon.ts +8 -4
  84. package/pg/modal/README.md +29 -0
  85. package/pg/modal/__examples__/basic/basic.html +4 -0
  86. package/pg/modal/__examples__/basic/basic.ts +42 -0
  87. package/pg/modal/index.ts +3 -0
  88. package/pg/modal/modal.css +40 -0
  89. package/pg/modal/modal.html +9 -0
  90. package/pg/modal/modal.ts +14 -0
  91. package/pg/modification/__examples__/basic/basic.ts +1 -1
  92. package/pg/overlayMenu/overlayMenu.ts +6 -2
  93. package/pg/overlaySelectMenu/overlaySelectMenu.ts +6 -0
  94. package/pg/overlaySubMenu/overlaySubMenu.ts +6 -2
  95. package/pg/scroll/__examples__/basic/basic.ts +1 -1
  96. package/pg/search/search.css +1 -1
  97. package/pg/table/README.md +108 -0
  98. package/pg/table/__examples__/basic/basic.css +0 -0
  99. package/pg/table/__examples__/basic/basic.html +10 -0
  100. package/pg/table/__examples__/basic/basic.ts +111 -0
  101. package/pg/table/table.css +20 -0
  102. package/pg/table/table.html +6 -0
  103. package/pg/table/table.ts +86 -0
  104. package/pg/tableCellButtonIcon/README.md +3 -0
  105. package/pg/tableCellButtonIcon/tableCellButtonIcon.css +16 -0
  106. package/pg/tableCellButtonIcon/tableCellButtonIcon.html +5 -0
  107. package/pg/tableCellButtonIcon/tableCellButtonIcon.ts +34 -0
  108. package/pg/tableCellCheck/README.md +3 -0
  109. package/pg/tableCellCheck/tableCellCheck.css +15 -0
  110. package/pg/tableCellCheck/tableCellCheck.html +3 -0
  111. package/pg/tableCellCheck/tableCellCheck.ts +43 -0
  112. package/pg/tableCellNumber/README.md +3 -0
  113. package/pg/tableCellNumber/tableCellNumber.css +11 -0
  114. package/pg/tableCellNumber/tableCellNumber.html +3 -0
  115. package/pg/tableCellNumber/tableCellNumber.ts +40 -0
  116. package/pg/tableCellText/README.md +3 -0
  117. package/pg/tableCellText/tableCellText.css +11 -0
  118. package/pg/tableCellText/tableCellText.html +3 -0
  119. package/pg/tableCellText/tableCellText.ts +62 -0
  120. package/pg/tableColumn/README.md +3 -0
  121. package/pg/tableColumn/tableColumn.css +12 -0
  122. package/pg/tableColumn/tableColumn.html +1 -0
  123. package/pg/tableColumn/tableColumn.ts +29 -0
  124. package/pg/tableRow/README.md +3 -0
  125. package/pg/tableRow/tableRow.css +11 -0
  126. package/pg/tableRow/tableRow.html +1 -0
  127. package/pg/tableRow/tableRow.ts +77 -0
  128. package/pg/tabs/tabs.css +1 -1
  129. package/pg/tree/README.md +10 -4
  130. package/pg/tree/__examples__/basic/basic.html +1 -0
  131. package/pg/tree/__examples__/basic/basic.ts +6 -1
  132. package/pg/tree/tree.css +1 -0
  133. package/pg/treeItem/treeItem.css +3 -3
  134. package/favicon.svg +0 -20
  135. package/index.html +0 -321
  136. package/main.js +0 -2
  137. package/main.js.LICENSE.txt +0 -10
  138. package/pgAnnoy.js +0 -1
  139. package/pgApp.js +0 -1
  140. package/pgAvatar.js +0 -1
  141. package/pgButton.js +0 -1
  142. package/pgButtonGroup.js +0 -1
  143. package/pgButtonLink.js +0 -1
  144. package/pgButtonMenu.js +0 -1
  145. package/pgButtonToggle.js +0 -1
  146. package/pgCard.js +0 -1
  147. package/pgCardUser.js +0 -1
  148. package/pgColor.js +0 -1
  149. package/pgDatabase.js +0 -1
  150. package/pgDropdown.js +0 -1
  151. package/pgGrid.js +0 -1
  152. package/pgHeader.js +0 -1
  153. package/pgIcon.js +0 -1
  154. package/pgInputCheck.js +0 -1
  155. package/pgInputCheckList.js +0 -1
  156. package/pgInputFileLocal.js +0 -1
  157. package/pgInputHexRgb.js +0 -1
  158. package/pgInputPixelEditor.js +0 -1
  159. package/pgInputRange.js +0 -1
  160. package/pgInputSelect.js +0 -1
  161. package/pgInputText.js +0 -1
  162. package/pgInputTextIcon.js +0 -1
  163. package/pgInputUserSelect.js +0 -1
  164. package/pgListTag.js +0 -1
  165. package/pgMarkdown.js +0 -2
  166. package/pgMarkdown.js.LICENSE.txt +0 -10
  167. package/pgMenu.js +0 -1
  168. package/pgMenuDivider.js +0 -1
  169. package/pgMenuIcon.js +0 -1
  170. package/pgMenuItem.js +0 -1
  171. package/pgMenuItemIcon.js +0 -1
  172. package/pgModalAlert.js +0 -1
  173. package/pgModification.js +0 -1
  174. package/pgNav.js +0 -1
  175. package/pgOverlay.js +0 -1
  176. package/pgOverlayContextMenu.js +0 -1
  177. package/pgOverlayMenu.js +0 -1
  178. package/pgOverlaySelectMenu.js +0 -1
  179. package/pgOverlaySubMenu.js +0 -1
  180. package/pgPicker.js +0 -1
  181. package/pgPreview.js +0 -1
  182. package/pgScroll.js +0 -1
  183. package/pgSearch.js +0 -1
  184. package/pgTab.js +0 -1
  185. package/pgTabs.js +0 -1
  186. package/pgToast.js +0 -1
  187. package/pgToasts.js +0 -1
  188. package/pgTooltip.js +0 -1
  189. package/pgTree.js +0 -1
  190. package/pgTreeButtonIcon.js +0 -1
  191. package/pgTreeItem.js +0 -1
@@ -0,0 +1,42 @@
1
+ import { Component, Prop, Part } from '@pictogrammers/element';
2
+
3
+ import PgInputText from '../inputText/inputText';
4
+
5
+ import template from './jsonString.html';
6
+ import style from './jsonString.css';
7
+
8
+ @Component({
9
+ selector: 'pg-json-string',
10
+ style,
11
+ template,
12
+ })
13
+ export default class PgJsonString extends HTMLElement {
14
+ @Prop() key: string = '';
15
+ @Prop() value: string = '';
16
+
17
+ @Part() $key: HTMLDivElement;
18
+ @Part() $value: PgInputText;
19
+
20
+ connectedCallback() {
21
+ this.$value.addEventListener('input', (e: any) => {
22
+ this.dispatchEvent(
23
+ new CustomEvent('update', {
24
+ detail: {
25
+ path: [this.key],
26
+ key: this.key,
27
+ value: e.detail.value,
28
+ }
29
+ })
30
+ );
31
+ });
32
+ }
33
+
34
+ render(changes) {
35
+ if (changes.key) {
36
+ this.$key.textContent = this.key;
37
+ }
38
+ if (changes.value) {
39
+ this.$value.value = this.value;
40
+ }
41
+ }
42
+ }
package/pg/menu/menu.ts CHANGED
@@ -26,7 +26,7 @@ export default class PgMenu extends HTMLElement {
26
26
  },
27
27
  create: ($item: any, item) => {
28
28
  $item.addEventListener('close', (e: any) => {
29
- const { depth } = e.detail;
29
+ const depth = e.detail ? e.detail.depth : 1;
30
30
  this.dispatchEvent(new CustomEvent('close', {
31
31
  detail: {
32
32
  depth
@@ -34,11 +34,12 @@ export default class PgMenu extends HTMLElement {
34
34
  }));
35
35
  });
36
36
  $item.addEventListener('select', (e: any) => {
37
- const { index } = e.detail;
37
+ const { indexes, item } = e.detail;
38
+ const lastIndex = indexes[indexes.length - 1];
38
39
  this.dispatchEvent(new CustomEvent('select', {
39
40
  detail: {
40
- indexes: [index],
41
- item
41
+ indexes,
42
+ item: item ? item : this.items[lastIndex],
42
43
  }
43
44
  }));
44
45
  });
@@ -116,4 +117,4 @@ export default class PgMenu extends HTMLElement {
116
117
  return ele.getHeight();
117
118
  }
118
119
 
119
- }
120
+ }
@@ -13,7 +13,11 @@ import '@pictogrammers/components/pgMenuItem.js';
13
13
  ```typescript
14
14
  this.$items = [{
15
15
  type: PgMenuItem,
16
- label: 'Item 1'
16
+ label: 'Item 1',
17
+ items: [{
18
+ type: PgMenuItem,
19
+ label: 'Sub Item 1',
20
+ }]
17
21
  }];
18
22
  ```
19
23
 
@@ -23,10 +27,17 @@ this.$items = [{
23
27
  | `checked` | | Item checked. |
24
28
  | `disabled` | | Item disabled. |
25
29
 
30
+ | CSS Variable | Default | Description |
31
+ | ------------------- | --------- | ----------- |
32
+ | `--pg-menu-item-border-radius` | `0.25rem` | Radius |
33
+
26
34
  ## Events
27
35
 
28
36
  ```typescript
29
37
  this.$item.addEventListener('select', (e: any) => {
30
- const { index } = e.detail;
38
+ // user clicks 'Sub Item 1'
39
+ const { indexes, item } = e.detail;
40
+ // indexes = [0, 0]
41
+ console.log(item.label);
31
42
  });
32
43
  ```
@@ -6,28 +6,25 @@
6
6
  outline: none;
7
7
  display: flex;
8
8
  align-items: center;
9
- font-family: var(--pg-font-family);
9
+ font-family: var(--pg-font-family, system-ui);
10
10
  text-align: var(--pg-menu-item-text-align, left);
11
- background: var(--pg-menu-item-background, transparent);
11
+ background-color: var(--pg-menu-item-background, transparent);
12
12
  padding: var(--pg-menu-item-padding, 0.25rem 0.5rem 0.25rem 0.5rem);
13
13
  border-color: transparent;
14
14
  border-width: 0;
15
15
  border-style: solid;
16
- border-top-left-radius: var(--pg-menu-item-border-radius-top, 0.25rem);
17
- border-top-right-radius: var(--pg-menu-item-border-radius-top, 0.25rem);
18
- border-bottom-left-radius: var(--pg-menu-item-border-radius-bottom, 0.25rem);
19
- border-bottom-right-radius: var(--pg-menu-item-border-radius-bottom, 0.25rem);
16
+ border-radius: var(--pg-menu-item-border-radius, 0.25rem);
20
17
  color: var(--pg-menu-item-color, #453C4F);
21
18
  }
22
19
 
23
20
  [part=label]:not(:disabled):active,
24
21
  [part=label]:not(:disabled):hover {
25
- background: var(--pg-menu-item-selected-background, #453C4F);
22
+ background-color: var(--pg-menu-item-selected-background, #453C4F);
26
23
  color: #FFFFFF;
27
24
  }
28
25
 
29
26
  [part=label]:not(:disabled):active {
30
- background: var(--pg-menu-item-active-background, #5f516e);
27
+ background-color: var(--pg-menu-item-active-background, #5f516e);
31
28
  }
32
29
 
33
30
  [part=label]:disabled {
@@ -69,32 +66,30 @@
69
66
  right: -1px;
70
67
  bottom: -1px;
71
68
  left: -1px;
72
- border-radius: 0.25rem;
69
+ border-radius: var(--pg-menu-item-border-radius, 0.25rem);;
73
70
  box-shadow: 0 0 0 3px var(--pg-focus-color, rgb(79, 143, 249, 0.5));
74
71
  }
75
72
 
76
73
  [part=label]:focus-visible:not(:hover)::after {
77
- background: var(--pg-focus-background-color, rgb(79, 143, 249, 0.1));
74
+ background-color: var(--pg-focus-background-color, rgb(79, 143, 249, 0.1));
78
75
  }
79
76
 
80
77
  [part=label].more {
81
78
  padding-right: 1.5rem;
82
79
  }
83
80
 
84
- [part=label].more::after {
85
- position: absolute;
86
- translate: -0.25rem 0;
87
- right: 0;
88
- content: var(--pg-menu-item-check, url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z' fill='rgb(69, 60, 79)' /></svg>"));
89
- width: 1.5rem;
90
- height: 1.5rem;
81
+ [part=label].more {
82
+ background-image: var(--pg-menu-item-more, url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z' fill='rgb(69, 60, 79)' /></svg>"));
83
+ background-size: 1.5rem 1.5rem;
84
+ background-position: 100% 50%;
85
+ background-repeat: no-repeat;
91
86
  }
92
87
 
93
- [part=label].more:active::after,
94
- [part=label].more:hover::after {
95
- content: var(--pg-menu-item-hover-check, url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z' fill='white' /></svg>"));
88
+ [part=label].more:active,
89
+ [part=label].more:hover {
90
+ background-image: var(--pg-menu-item-hover-more, url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z' fill='white' /></svg>"));
96
91
  }
97
92
 
98
- [part=label].more:disabled::after {
99
- content: var(--pg-menu-item-disabled-check, url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z' fill='rgb(69, 60, 79, 0.5)' /></svg>"));
93
+ [part=label].more:disabled {
94
+ background-image: var(--pg-menu-item-disabled-more, url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z' fill='rgb(69, 60, 79, 0.5)' /></svg>"));
100
95
  }
@@ -56,21 +56,26 @@ export default class PgMenuItem extends HTMLElement {
56
56
  if (result === null) {
57
57
  this.focus();
58
58
  } else if (result) {
59
+ const { indexes, item } = result;
59
60
  this.dispatchEvent(new CustomEvent('select', {
60
61
  detail: {
61
- item: result
62
+ item,
63
+ indexes: [...indexes, this.index],
62
64
  }
63
65
  }));
64
66
  } else {
65
67
  this.dispatchEvent(new CustomEvent('close', {
66
68
  detail: {
67
- depth: -1
69
+ depth: -1,
68
70
  }
69
71
  }));
70
72
  }
71
73
  } else {
72
74
  this.dispatchEvent(new CustomEvent('select', {
73
- detail: { index: this.index }
75
+ detail: {
76
+ indexes: [this.index],
77
+ item: undefined, // determined by parent
78
+ }
74
79
  }));
75
80
  }
76
81
  });
@@ -1,4 +1,4 @@
1
- <div class="example">
1
+ <div class="example" part="example">
2
2
  <pg-menu-item-icon part="item"></pg-menu-item-icon>
3
3
  </div>
4
4
  <div>
@@ -19,6 +19,7 @@ export default class XPgMenuItemIconBasic extends HTMLElement {
19
19
  @Part() $iconFolder: HTMLButtonElement;
20
20
  @Part() $checkedValue: HTMLDivElement;
21
21
  @Part() $disabledValue: HTMLDivElement;
22
+ @Part() $example: HTMLDivElement;
22
23
 
23
24
  connectedCallback() {
24
25
  this.$item.icon = IconFile;
@@ -45,6 +46,12 @@ export default class XPgMenuItemIconBasic extends HTMLElement {
45
46
  this.$checkedToggle.addEventListener('change', (e: any) => {
46
47
  this.$item.checked = e.target.checked;
47
48
  this.$checkedValue.textContent = `${this.$item.checked}`;
49
+ // simulate check column
50
+ if (e.target.checked) {
51
+ this.$example.style.setProperty('--pg-menu-_has-check', 'true');
52
+ } else {
53
+ this.$example.style.removeProperty('--pg-menu-_has-check');
54
+ }
48
55
  });
49
56
 
50
57
  this.$disabledToggle.addEventListener('change', (e: any) => {
@@ -6,9 +6,9 @@
6
6
  outline: none;
7
7
  display: flex;
8
8
  align-items: center;
9
- font-family: var(--pg-font-family);
9
+ font-family: var(--pg-font-family, system-ui);
10
10
  text-align: var(--pg-menu-item-text-align, left);
11
- background: var(--pg-menu-item-background, transparent);
11
+ background-color: var(--pg-menu-item-background, transparent);
12
12
  padding: var(--pg-menu-item-padding, 0.25rem 0.5rem 0.25rem 0.5rem);
13
13
  border-color: transparent;
14
14
  border-width: 0;
@@ -22,13 +22,13 @@
22
22
 
23
23
  [part=button]:not(:disabled):active,
24
24
  [part=button]:not(:disabled):hover {
25
- background: var(--pg-menu-item-selected-background, #453C4F);
25
+ background-color: var(--pg-menu-item-selected-background, #453C4F);
26
26
  color: #FFFFFF;
27
27
  --pg-icon-color: #FFFFFF;
28
28
  }
29
29
 
30
30
  [part=button]:not(:disabled):active {
31
- background: var(--pg-menu-item-active-background, #5f516e);
31
+ background-color: var(--pg-menu-item-active-background, #5f516e);
32
32
  }
33
33
 
34
34
  [part=button]:disabled {
@@ -83,21 +83,24 @@
83
83
  margin-inline-end: 0.5rem;
84
84
  }
85
85
 
86
- [part=button].more [part=label]::after {
87
- content: var(--pg-menu-item-check, url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z' fill='rgb(69, 60, 79)' /></svg>"));
88
- width: 1.5rem;
89
- height: 1.5rem;
90
- vertical-align: middle;
91
- translate: 0.25rem 0;
86
+ [part=button].more {
87
+ padding-right: 1.5rem;
92
88
  }
93
89
 
94
- [part=button].more:active [part=label]::after,
95
- [part=button].more:hover [part=label]::after {
96
- content: var(--pg-menu-item-hover-check, url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z' fill='white' /></svg>"));
90
+ [part=button].more {
91
+ background-image: var(--pg-menu-item-more, url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z' fill='rgb(69, 60, 79)' /></svg>"));
92
+ background-size: 1.5rem 1.5rem;
93
+ background-position: 100% 50%;
94
+ background-repeat: no-repeat;
97
95
  }
98
96
 
99
- [part=button].more:disabled [part=label]::after {
100
- content: var(--pg-menu-item-disabled-check, url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z' fill='rgb(69, 60, 79, 0.5)' /></svg>"));
97
+ [part=button].more:active,
98
+ [part=button].more:hover {
99
+ background-image: var(--pg-menu-item-hover-more, url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z' fill='white' /></svg>"));
100
+ }
101
+
102
+ [part=button].more:disabled {
103
+ background-image: var(--pg-menu-item-disabled-more, url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z' fill='rgb(69, 60, 79, 0.5)' /></svg>"));
101
104
  }
102
105
 
103
106
  [part=label] {
@@ -63,9 +63,11 @@ export default class PgMenuItemIcon extends HTMLElement {
63
63
  if (result === null) {
64
64
  this.focus();
65
65
  } else if (result) {
66
+ const { indexes, item } = result;
66
67
  this.dispatchEvent(new CustomEvent('select', {
67
68
  detail: {
68
- item: result
69
+ indexes: [...indexes, this.index],
70
+ item,
69
71
  }
70
72
  }));
71
73
  } else {
@@ -78,8 +80,8 @@ export default class PgMenuItemIcon extends HTMLElement {
78
80
  } else {
79
81
  this.dispatchEvent(new CustomEvent('select', {
80
82
  detail: {
81
- index: this.index,
82
- item: this.items[this.index]
83
+ indexes: [this.index],
84
+ item: undefined, // determined by parent
83
85
  }
84
86
  }));
85
87
  }
@@ -118,9 +120,11 @@ export default class PgMenuItemIcon extends HTMLElement {
118
120
  if (result === null) {
119
121
  this.focus();
120
122
  } else if (result) {
123
+ const { indexes, item } = result;
121
124
  this.dispatchEvent(new CustomEvent('select', {
122
125
  detail: {
123
- item: result
126
+ indexes: [...indexes, this.index],
127
+ item,
124
128
  }
125
129
  }));
126
130
  } else {
@@ -0,0 +1,29 @@
1
+ # `PgModalAlert`
2
+
3
+ The `PgModal` is a base class for creating modals.
4
+
5
+ ```typescript
6
+ import '@pictogrammers/components/pgModal';
7
+ import PgModal from '@pictogrammers/components/pgModal';
8
+ ```
9
+
10
+ ```typescript
11
+ import { Component, Prop, Part } from '@pictogrammers/element';
12
+
13
+ import template from './modal.html';
14
+ import style from './modal.css';
15
+
16
+ @Component({
17
+ selector: 'my-modal',
18
+ template,
19
+ style
20
+ })
21
+ export default class MyModal extends PgModal {
22
+ @Part() $close: HTMLButtonElement;
23
+ connectedCallback() {
24
+ this.$close.addEventListener('click', () => {
25
+ this.close();
26
+ });
27
+ }
28
+ }
29
+ ```
@@ -0,0 +1,4 @@
1
+ <div class="example">
2
+ <button part="button">Launch MyModal</button>
3
+ <div><code>Result: </code><code part="result"></code></div>
4
+ </div>
@@ -0,0 +1,42 @@
1
+ import { Component, Part, Prop } from '@pictogrammers/element';
2
+ import PgModal from '../../modal';
3
+
4
+ import template from './basic.html';
5
+
6
+ @Component({
7
+ selector: 'x-my-modal',
8
+ template: `<main>Hello! <button part="close">Close</button></main>`
9
+ })
10
+ export class XMyModal extends PgModal {
11
+
12
+ @Part() $close: HTMLButtonElement;
13
+
14
+ connectedCallback() {
15
+ this.$close.addEventListener('click', () => {
16
+ this.close();
17
+ });
18
+ }
19
+ }
20
+
21
+ @Component({
22
+ selector: 'x-pg-modal-basic',
23
+ template
24
+ })
25
+ export default class XPgModalBasic extends HTMLElement {
26
+
27
+ @Part() $button: HTMLButtonElement;
28
+ @Part() $result: HTMLSpanElement;
29
+
30
+ connectedCallback() {
31
+ this.$button.addEventListener('click', this.handleClick.bind(this));
32
+ }
33
+
34
+ async handleClick() {
35
+ const result = await XMyModal.open({
36
+ header: 'Delete Item',
37
+ message: 'Are you sure you want to delete the item?'
38
+ });
39
+ this.$result.textContent = `${result}`;
40
+ }
41
+
42
+ }
@@ -0,0 +1,3 @@
1
+ import PgModal from './modal';
2
+
3
+ export default PgModal;
@@ -0,0 +1,40 @@
1
+ .backdrop {
2
+ display: flex;
3
+ position: fixed;
4
+ top: 0;
5
+ left: 0;
6
+ right: 0;
7
+ bottom: 0;
8
+ background: rgba(0, 0, 0, 0.6);
9
+ justify-content: center;
10
+ align-items: center;
11
+ }
12
+ .dialog {
13
+ background: #fff;
14
+ border-radius: 0.5rem;
15
+ box-shadow: 0 1px 1rem rgba(0, 0, 0, 0.5);
16
+ overflow: hidden;
17
+ min-width: 15rem;
18
+ }
19
+ header {
20
+ border-bottom: 1px solid #ccc;
21
+ background: #f1f1f1;
22
+ padding: 0.75rem 1rem;
23
+ }
24
+ header h2 {
25
+ font-size: 1.25rem;
26
+ margin: 0;
27
+ font-weight: normal;
28
+ }
29
+ main {
30
+ padding: 0.5rem 1rem;
31
+ }
32
+ footer {
33
+ display: flex;
34
+ flex-direction: row;
35
+ padding: 0.75rem 1rem;
36
+ border-top: 1px solid #ccc;
37
+ background: #f1f1f1;
38
+ justify-content: flex-end;
39
+ gap: 0.5rem;
40
+ }
@@ -0,0 +1,9 @@
1
+ <div class="backdrop">
2
+ <div class="dialog"
3
+ role="dialog"
4
+ id="dialog1"
5
+ aria-labelledby="dialog1_label"
6
+ aria-modal="true">
7
+ <child/>
8
+ </div>
9
+ </div>
@@ -0,0 +1,14 @@
1
+ import { Component } from '@pictogrammers/element';
2
+
3
+ import template from './modal.html';
4
+ import style from './modal.css';
5
+
6
+ import PgOverlay from '../overlay/overlay';
7
+
8
+ @Component({
9
+ template,
10
+ style
11
+ })
12
+ export default class PgModal extends PgOverlay {
13
+
14
+ }
@@ -1,5 +1,5 @@
1
1
  import { Component, Part, Prop } from '@pictogrammers/element';
2
- import { Modification } from 'pg/shared/models/modification';
2
+ import { Modification } from '../../../shared/models/modification';
3
3
  import PgModification from '../../modification';
4
4
 
5
5
  import template from './basic.html';
@@ -60,8 +60,12 @@ export default class PgOverlayMenu extends PgOverlay {
60
60
  }
61
61
 
62
62
  #handleSelect(e: any) {
63
- e.detail.item.index = e.detail.index;
64
- this.close(e.detail.item);
63
+ // e.detail.item.index = e.detail.index;
64
+ const { indexes, item } = e.detail;
65
+ this.close({
66
+ indexes,
67
+ item
68
+ });
65
69
  this.source?.focus();
66
70
  }
67
71
  }
@@ -33,6 +33,7 @@ export default class PgOverlaySelectMenu extends PgOverlay {
33
33
  // Pass throughs are binded once, do not do this in render
34
34
  this.$menu.items = this.items;
35
35
  this.$menu.addEventListener('select', this.#handleSelect.bind(this));
36
+ this.$menu.addEventListener('close', this.#handleClose.bind(this));
36
37
  this.$overlay.popover = 'auto';
37
38
  if (this.source !== null) {
38
39
  // @ts-ignore
@@ -93,4 +94,9 @@ export default class PgOverlaySelectMenu extends PgOverlay {
93
94
  this.close(e.detail.item);
94
95
  this.source?.focus();
95
96
  }
97
+
98
+ #handleClose() {
99
+ this.close({ value: null });
100
+ this.source?.focus();
101
+ }
96
102
  }
@@ -96,8 +96,12 @@ export default class PgOverlaySubMenu extends PgOverlay {
96
96
  }
97
97
 
98
98
  #handleSelect(e: any) {
99
- e.detail.item.index = e.detail.index;
100
- this.close(e.detail.item);
99
+ const { item, indexes } = e.detail;
100
+ //e.detail.item.index = e.detail.indexes;
101
+ this.close({
102
+ indexes,
103
+ item,
104
+ });
101
105
  this.source?.focus();
102
106
  }
103
107
  }
@@ -1,5 +1,5 @@
1
1
  import { Component, Part, Prop } from '@pictogrammers/element';
2
- import PgScroll from 'pg/scroll/scroll';
2
+ import PgScroll from '../../scroll';
3
3
 
4
4
  import template from './basic.html';
5
5
  import style from './basic.css';
@@ -1,7 +1,7 @@
1
1
  :host {
2
2
  display: block;
3
3
  align-self: center;
4
- font-family: var(--pg-font-family);
4
+ font-family: var(--pg-font-family, system-ui);
5
5
  }
6
6
 
7
7
  div {