@pictogrammers/components 0.4.9 → 0.5.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 (182) 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 +212 -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 +826 -80
  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/getFloodFill.ts +83 -0
  41. package/pg/inputPixelEditor/utils/getGridColorIndexes.ts +13 -0
  42. package/pg/inputPixelEditor/utils/getOutline.ts +92 -0
  43. package/pg/inputPixelEditor/utils/inputMode.ts +7 -1
  44. package/pg/inputPixelEditor/utils/pixelSizes.ts +47 -0
  45. package/pg/inputPixelEditor/utils/pngMetadata.ts +487 -0
  46. package/pg/inputSelect/inputSelect.css +4 -4
  47. package/pg/inputText/inputText.css +14 -7
  48. package/pg/inputText/inputText.ts +5 -1
  49. package/pg/json/README.md +59 -0
  50. package/pg/json/__examples__/basic/basic.html +4 -0
  51. package/pg/json/__examples__/basic/basic.ts +31 -0
  52. package/pg/json/json.css +9 -0
  53. package/pg/json/json.html +1 -0
  54. package/pg/json/json.ts +124 -0
  55. package/pg/jsonArray/README.md +3 -0
  56. package/pg/jsonArray/jsonArray.css +15 -0
  57. package/pg/jsonArray/jsonArray.html +7 -0
  58. package/pg/jsonArray/jsonArray.ts +55 -0
  59. package/pg/jsonBoolean/README.md +3 -0
  60. package/pg/jsonBoolean/jsonBoolean.css +27 -0
  61. package/pg/jsonBoolean/jsonBoolean.html +5 -0
  62. package/pg/jsonBoolean/jsonBoolean.ts +69 -0
  63. package/pg/jsonNumber/README.md +3 -0
  64. package/pg/jsonNumber/jsonNumber.css +21 -0
  65. package/pg/jsonNumber/jsonNumber.html +5 -0
  66. package/pg/jsonNumber/jsonNumber.ts +42 -0
  67. package/pg/jsonObject/README.md +3 -0
  68. package/pg/jsonObject/jsonObject.css +11 -0
  69. package/pg/jsonObject/jsonObject.html +5 -0
  70. package/pg/jsonObject/jsonObject.ts +55 -0
  71. package/pg/jsonString/README.md +3 -0
  72. package/pg/jsonString/jsonString.css +21 -0
  73. package/pg/jsonString/jsonString.html +5 -0
  74. package/pg/jsonString/jsonString.ts +42 -0
  75. package/pg/menu/menu.ts +6 -5
  76. package/pg/menuItem/README.md +13 -2
  77. package/pg/menuItem/menuItem.css +17 -22
  78. package/pg/menuItem/menuItem.ts +8 -3
  79. package/pg/menuItemIcon/__examples__/basic/basic.html +1 -1
  80. package/pg/menuItemIcon/__examples__/basic/basic.ts +7 -0
  81. package/pg/menuItemIcon/menuItemIcon.css +18 -15
  82. package/pg/menuItemIcon/menuItemIcon.ts +8 -4
  83. package/pg/modification/__examples__/basic/basic.ts +1 -1
  84. package/pg/overlayMenu/overlayMenu.ts +6 -2
  85. package/pg/overlaySelectMenu/overlaySelectMenu.ts +6 -0
  86. package/pg/overlaySubMenu/overlaySubMenu.ts +6 -2
  87. package/pg/scroll/__examples__/basic/basic.ts +1 -1
  88. package/pg/search/search.css +1 -1
  89. package/pg/table/README.md +108 -0
  90. package/pg/table/__examples__/basic/basic.css +0 -0
  91. package/pg/table/__examples__/basic/basic.html +10 -0
  92. package/pg/table/__examples__/basic/basic.ts +111 -0
  93. package/pg/table/table.css +20 -0
  94. package/pg/table/table.html +6 -0
  95. package/pg/table/table.ts +86 -0
  96. package/pg/tableCellButtonIcon/README.md +3 -0
  97. package/pg/tableCellButtonIcon/tableCellButtonIcon.css +16 -0
  98. package/pg/tableCellButtonIcon/tableCellButtonIcon.html +5 -0
  99. package/pg/tableCellButtonIcon/tableCellButtonIcon.ts +34 -0
  100. package/pg/tableCellCheck/README.md +3 -0
  101. package/pg/tableCellCheck/tableCellCheck.css +15 -0
  102. package/pg/tableCellCheck/tableCellCheck.html +3 -0
  103. package/pg/tableCellCheck/tableCellCheck.ts +43 -0
  104. package/pg/tableCellNumber/README.md +3 -0
  105. package/pg/tableCellNumber/tableCellNumber.css +11 -0
  106. package/pg/tableCellNumber/tableCellNumber.html +3 -0
  107. package/pg/tableCellNumber/tableCellNumber.ts +40 -0
  108. package/pg/tableCellText/README.md +3 -0
  109. package/pg/tableCellText/tableCellText.css +11 -0
  110. package/pg/tableCellText/tableCellText.html +3 -0
  111. package/pg/tableCellText/tableCellText.ts +62 -0
  112. package/pg/tableColumn/README.md +3 -0
  113. package/pg/tableColumn/tableColumn.css +12 -0
  114. package/pg/tableColumn/tableColumn.html +1 -0
  115. package/pg/tableColumn/tableColumn.ts +29 -0
  116. package/pg/tableRow/README.md +3 -0
  117. package/pg/tableRow/tableRow.css +11 -0
  118. package/pg/tableRow/tableRow.html +1 -0
  119. package/pg/tableRow/tableRow.ts +77 -0
  120. package/pg/tabs/tabs.css +1 -1
  121. package/pg/tree/README.md +0 -3
  122. package/pg/tree/__examples__/basic/basic.ts +0 -1
  123. package/pg/treeItem/treeItem.css +3 -3
  124. package/favicon.svg +0 -20
  125. package/index.html +0 -321
  126. package/main.js +0 -2
  127. package/main.js.LICENSE.txt +0 -10
  128. package/pgAnnoy.js +0 -1
  129. package/pgApp.js +0 -1
  130. package/pgAvatar.js +0 -1
  131. package/pgButton.js +0 -1
  132. package/pgButtonGroup.js +0 -1
  133. package/pgButtonLink.js +0 -1
  134. package/pgButtonMenu.js +0 -1
  135. package/pgButtonToggle.js +0 -1
  136. package/pgCard.js +0 -1
  137. package/pgCardUser.js +0 -1
  138. package/pgColor.js +0 -1
  139. package/pgDatabase.js +0 -1
  140. package/pgDropdown.js +0 -1
  141. package/pgGrid.js +0 -1
  142. package/pgHeader.js +0 -1
  143. package/pgIcon.js +0 -1
  144. package/pgInputCheck.js +0 -1
  145. package/pgInputCheckList.js +0 -1
  146. package/pgInputFileLocal.js +0 -1
  147. package/pgInputHexRgb.js +0 -1
  148. package/pgInputPixelEditor.js +0 -1
  149. package/pgInputRange.js +0 -1
  150. package/pgInputSelect.js +0 -1
  151. package/pgInputText.js +0 -1
  152. package/pgInputTextIcon.js +0 -1
  153. package/pgInputUserSelect.js +0 -1
  154. package/pgListTag.js +0 -1
  155. package/pgMarkdown.js +0 -2
  156. package/pgMarkdown.js.LICENSE.txt +0 -10
  157. package/pgMenu.js +0 -1
  158. package/pgMenuDivider.js +0 -1
  159. package/pgMenuIcon.js +0 -1
  160. package/pgMenuItem.js +0 -1
  161. package/pgMenuItemIcon.js +0 -1
  162. package/pgModal.js +0 -1
  163. package/pgModalAlert.js +0 -1
  164. package/pgModification.js +0 -1
  165. package/pgNav.js +0 -1
  166. package/pgOverlay.js +0 -1
  167. package/pgOverlayContextMenu.js +0 -1
  168. package/pgOverlayMenu.js +0 -1
  169. package/pgOverlaySelectMenu.js +0 -1
  170. package/pgOverlaySubMenu.js +0 -1
  171. package/pgPicker.js +0 -1
  172. package/pgPreview.js +0 -1
  173. package/pgScroll.js +0 -1
  174. package/pgSearch.js +0 -1
  175. package/pgTab.js +0 -1
  176. package/pgTabs.js +0 -1
  177. package/pgToast.js +0 -1
  178. package/pgToasts.js +0 -1
  179. package/pgTooltip.js +0 -1
  180. package/pgTree.js +0 -1
  181. package/pgTreeButtonIcon.js +0 -1
  182. package/pgTreeItem.js +0 -1
@@ -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 {
@@ -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 {
@@ -0,0 +1,108 @@
1
+ # `<pg-preview>`
2
+
3
+ The `pg-table` component allows a standard way to create static tables. While it has features like the datatable it is much more lightweight lacking features like column resize and edit.
4
+
5
+ - `PgTableHeaderText`
6
+ - `PgTableCellText` - default `string` cell type
7
+ - `PgTableCellNumber` - default `number` cell type
8
+ - `PgTableCellCheck` - default `boolean` cell type
9
+ - `PgTableCellButton`
10
+ - `PgTableCellButtonIcon`
11
+
12
+ ```typescript
13
+ import '@pictogrammers/components/pg/table';
14
+ import PgTable, { createTableItem } from '@pictogrammers/components/pg/table';
15
+ ```
16
+
17
+ ```html
18
+ <pg-table part="table"></pg-table>
19
+ ```
20
+
21
+ | Attributes | Tested | Default | Description |
22
+ | ---------- | -------- | ------- | ----------- |
23
+ | columns | | [] | Column definition. |
24
+ | data | | [] | Data |
25
+
26
+ | CSS Variable | Default | Description |
27
+ | ------------------- | --------- | ----------- |
28
+ | `--pg-table-font-size` | `inherit` | Font size |
29
+ | `--pg-table-row-background-color` | `#f1f1f1` | Row background |
30
+
31
+ ## Columns
32
+
33
+ ```typescript
34
+ // type: TableHeaderText
35
+ this.$table.columns = [{
36
+ label: 'Check All',
37
+ key: 'check',
38
+ hideLabel: true,
39
+ type: TableHeaderCheck,
40
+ editable: true
41
+ }, {
42
+ label: 'Name',
43
+ key: 'name'
44
+ }, {
45
+ label: 'Age',
46
+ key: 'age'
47
+ }, {
48
+ label: 'Favorite',
49
+ key: 'favorite',
50
+ hideLabel: true,
51
+ }];
52
+ ```
53
+
54
+ Adding `editable: true` to any data types will enable editing and trigger the `action` event (see Events below).
55
+
56
+ ## Data
57
+
58
+ The `createTableItem` unrolls the `{ key: value }` shorthand to `items: [{ key, value}]` object to support the mutable data.
59
+
60
+ ```typescript
61
+ const IconStar = 'M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z';
62
+ const IconStarOutline = 'M12,15.39L8.24,17.66L9.23,13.38L5.91,10.5L10.29,10.13L12,6.09L13.71,10.13L18.09,10.5L14.77,13.38L15.76,17.66M22,9.24L14.81,8.63L12,2L9.19,8.63L2,9.24L7.45,13.97L5.82,21L12,17.27L18.18,21L16.54,13.97L22,9.24Z';
63
+ this.$table.data = [
64
+ createTableItem({
65
+ name: 'Dipper Pines',
66
+ age: 12,
67
+ favorite: {
68
+ type: TableCellButtonIcon,
69
+ icon: IconStar,
70
+ }
71
+ }),
72
+ createTableItem({
73
+ name: 'Mabel Pines',
74
+ age: 12,
75
+ favorite: {
76
+ type: TableCellButtonIcon,
77
+ icon: IconStar,
78
+ }
79
+ })
80
+ ];
81
+ ```
82
+
83
+ ## Events
84
+
85
+ All events dispatched will be the same `action` name. This allows the insert of `index` as it bubbles to the parent `this.$table` element.
86
+
87
+ ```typescript
88
+ this.$table.addEventListener('action', (e: any) => {
89
+ const { getColumn, value, key } = e.detail;
90
+ switch(key) {
91
+ case 'selected':
92
+ getColumn(key).value = value;
93
+ break;
94
+ default:
95
+ throw `unhandled action event for key ${key}`;
96
+ }
97
+ });
98
+ ```
99
+
100
+ From a custom cell component...
101
+
102
+ ```typescript
103
+ this.dispatchEvent(new CustomEvent('action', {
104
+ detail {
105
+ other: 'other data',
106
+ },
107
+ }))
108
+ ```
File without changes
@@ -0,0 +1,10 @@
1
+ <div class="example">
2
+ <pg-table part="table"></pg-table>
3
+ <div>
4
+ <button part="pushData">Push Data</button>
5
+ <button part="deleteLast">Delete Last</button>
6
+ </div>
7
+ <div>
8
+ <code>.getCSV()</code>: <pre part="output"></pre>
9
+ </div>
10
+ </div>
@@ -0,0 +1,111 @@
1
+ import { Component, Part, Prop } from '@pictogrammers/element';
2
+
3
+ import PgTable, { createTableItem } from '../../table';
4
+ import PgTableCellButtonIcon from '../../../tableCellButtonIcon/tableCellButtonIcon';
5
+
6
+ import style from './basic.css';
7
+ import template from './basic.html';
8
+
9
+ const IconStar = 'M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z';
10
+ const IconStarOutline = 'M12,15.39L8.24,17.66L9.23,13.38L5.91,10.5L10.29,10.13L12,6.09L13.71,10.13L18.09,10.5L14.77,13.38L15.76,17.66M22,9.24L14.81,8.63L12,2L9.19,8.63L2,9.24L7.45,13.97L5.82,21L12,17.27L18.18,21L16.54,13.97L22,9.24Z';
11
+
12
+ @Component({
13
+ selector: 'x-pg-table-basic',
14
+ style,
15
+ template
16
+ })
17
+ export default class XPgTableBasic extends HTMLElement {
18
+
19
+ @Part() $table: PgTable;
20
+ @Part() $pushData: HTMLButtonElement;
21
+ @Part() $deleteLast: HTMLButtonElement;
22
+ @Part() $output: HTMLPreElement;
23
+
24
+ connectedCallback() {
25
+ // this.$table.addEventListener('click', this.handleClick.bind(this));
26
+ this.$table.columns = [{
27
+ label: 'Select',
28
+ key: 'selected',
29
+ hideLabel: true,
30
+ editable: true,
31
+ }, {
32
+ label: 'Name',
33
+ key: 'name',
34
+ editable: true,
35
+ maxWidth: '12rem',
36
+ }, {
37
+ label: 'Age',
38
+ key: 'age'
39
+ }, {
40
+ label: 'Favorite',
41
+ key: 'favorite',
42
+ hideLabel: true,
43
+ }];
44
+ this.$table.data = [
45
+ createTableItem({
46
+ selected: true,
47
+ name: 'Dipper Pines',
48
+ age: 12,
49
+ favorite: {
50
+ type: PgTableCellButtonIcon,
51
+ icon: IconStarOutline,
52
+ value: false,
53
+ }
54
+ }),
55
+ createTableItem({
56
+ selected: false,
57
+ name: 'Mabel Pines',
58
+ age: 12,
59
+ favorite: {
60
+ type: PgTableCellButtonIcon,
61
+ icon: IconStarOutline,
62
+ value: false,
63
+ }
64
+ })
65
+ ];
66
+ this.$pushData.addEventListener('click', this.handlePushData.bind(this));
67
+ this.$deleteLast.addEventListener('click', this.handleDeleteLast.bind(this));
68
+ this.$table.addEventListener('action', (e: any) => {
69
+ const { getColumn, key } = e.detail;
70
+ switch(key) {
71
+ case 'name':
72
+ getColumn(key).value = e.detail.value;
73
+ break;
74
+ case 'favorite':
75
+ getColumn(key).value = !getColumn(key).value;
76
+ if (getColumn(key).value) {
77
+ getColumn(key).icon = IconStar;
78
+ } else {
79
+ getColumn(key).icon = IconStarOutline;
80
+ }
81
+ break;
82
+ case 'selected':
83
+ getColumn(key).value = e.detail.value;
84
+ break;
85
+ }
86
+ // CSV
87
+ this.$output.textContent = this.$table.getCSV();
88
+ });
89
+ }
90
+
91
+ newCount = 0;
92
+ handlePushData() {
93
+ this.$table.data.push(createTableItem({
94
+ name: `new ${this.newCount++}`,
95
+ age: this.newCount,
96
+ favorite: {
97
+ type: PgTableCellButtonIcon,
98
+ icon: IconStarOutline,
99
+ },
100
+ }));
101
+ // CSV
102
+ this.$output.textContent = this.$table.getCSV();
103
+ }
104
+
105
+ handleDeleteLast() {
106
+ this.$table.data.pop();
107
+ // CSV
108
+ this.$output.textContent = this.$table.getCSV();
109
+ }
110
+
111
+ }
@@ -0,0 +1,20 @@
1
+ :host {
2
+ display: inline-flex;
3
+ }
4
+
5
+ [part=table] {
6
+ display: table;
7
+ border-spacing: 2px;
8
+ }
9
+
10
+ [part=header] {
11
+ display: table-header-group;
12
+ }
13
+
14
+ [part=columns] {
15
+ display: table-row;
16
+ }
17
+
18
+ [part=rows] {
19
+ display: table-row-group;
20
+ }
@@ -0,0 +1,6 @@
1
+ <div part="table">
2
+ <div part="header">
3
+ <div part="columns"></div>
4
+ </div>
5
+ <div part="rows"></div>
6
+ </div>
@@ -0,0 +1,86 @@
1
+ import { Component, Prop, Part, forEach } from '@pictogrammers/element';
2
+
3
+ import PgTableColumn from '../tableColumn/tableColumn';
4
+ import PgTableRow from '../tableRow/tableRow';
5
+
6
+ import template from './table.html';
7
+ import style from './table.css';
8
+
9
+ /**
10
+ * Create a table data item that can react to data changes. While cumbersome
11
+ * this greatly increases performance and uses less memory.
12
+ *
13
+ * @param obj ex: { field1: 'value', field2: 42 }
14
+ * @returns formatted object
15
+ */
16
+ export function createTableItem(obj: object) {
17
+ const keys = Object.keys(obj);
18
+ const items: any[] = [];
19
+ keys.forEach((key) => {
20
+ if (typeof obj[key] === 'object' && obj[key] !== null) {
21
+ items.push({
22
+ key,
23
+ ...obj[key],
24
+ });
25
+ } else {
26
+ items.push({
27
+ key,
28
+ value: obj[key],
29
+ });
30
+ }
31
+ });
32
+ return { items };
33
+ }
34
+
35
+ @Component({
36
+ selector: 'pg-table',
37
+ style,
38
+ template
39
+ })
40
+ export default class PgTable extends HTMLElement {
41
+ @Prop() columns: any[] = [];
42
+ @Prop() data: any[] = [];
43
+
44
+ @Part() $columns: HTMLDivElement;
45
+ @Part() $rows: HTMLDivElement;
46
+
47
+ trackedData = [];
48
+
49
+ connectedCallback() {
50
+ forEach({
51
+ container: this.$columns,
52
+ items: this.columns,
53
+ type: () => PgTableColumn,
54
+ });
55
+ forEach({
56
+ container: this.$rows,
57
+ items: this.data,
58
+ type: () => PgTableRow,
59
+ create: ($item: PgTableRow, item) => {
60
+ if (this.columns.length === 0) {
61
+ throw 'columns must be set before data';
62
+ }
63
+ $item.columns = this.columns;
64
+ $item.addEventListener('action', (e: any) => {
65
+ e.stopPropagation();
66
+ this.dispatchEvent(new CustomEvent('action', {
67
+ detail: e.detail,
68
+ }));
69
+ })
70
+ }
71
+ });
72
+ }
73
+
74
+ getCSV() {
75
+ let text = this.columns.map((column) => {
76
+ return column.label;
77
+ }).join(',');
78
+ text += '\n';
79
+ text += this.data.map(({ items }) => {
80
+ return items.map((item) => {
81
+ return item.value;
82
+ }).join(',')
83
+ }).join('\n');
84
+ return text;
85
+ }
86
+ }
@@ -0,0 +1,3 @@
1
+ # `PgTableCellButtonIcon`
2
+
3
+ See `PgTable`.