@pictogrammers/components 0.3.2 → 0.4.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 (294) hide show
  1. package/README.md +11 -12
  2. package/favicon.svg +20 -0
  3. package/index.html +67 -49
  4. package/main.js +2 -0
  5. package/main.js.LICENSE.txt +10 -0
  6. package/package.json +6 -6
  7. package/pg/annoy/README.md +0 -5
  8. package/pg/annoy/__examples__/basic/basic.css +3 -0
  9. package/pg/annoy/__examples__/basic/basic.html +4 -7
  10. package/pg/annoy/__examples__/basic/basic.ts +3 -1
  11. package/pg/annoy/annoy.css +29 -198
  12. package/pg/annoy/annoy.html +5 -56
  13. package/pg/annoy/annoy.ts +4 -25
  14. package/pg/app/README.md +11 -0
  15. package/pg/app/__examples__/basic/basic.css +8 -0
  16. package/pg/app/__examples__/basic/basic.html +15 -0
  17. package/pg/app/__examples__/basic/basic.ts +13 -0
  18. package/pg/app/app.css +108 -0
  19. package/pg/app/app.html +16 -0
  20. package/pg/app/app.ts +45 -0
  21. package/pg/app/index.ts +3 -0
  22. package/pg/avatar/__examples__/basic/basic.ts +5 -3
  23. package/pg/button/README.md +3 -0
  24. package/pg/button/button.css +13 -12
  25. package/pg/button/button.spec.ts +35 -0
  26. package/pg/button/button.ts +17 -12
  27. package/pg/buttonLink/buttonLink.css +3 -2
  28. package/pg/buttonMenu/README.md +54 -0
  29. package/pg/buttonMenu/__examples__/basic/basic.html +6 -0
  30. package/pg/buttonMenu/__examples__/basic/basic.ts +43 -0
  31. package/pg/buttonMenu/buttonMenu.css +12 -0
  32. package/pg/buttonMenu/buttonMenu.html +4 -0
  33. package/pg/buttonMenu/buttonMenu.ts +63 -0
  34. package/pg/buttonMenu/index.ts +3 -0
  35. package/pg/buttonToggle/__examples__/basic/basic.ts +2 -2
  36. package/pg/buttonToggle/__examples__/persist/persist.html +10 -0
  37. package/pg/buttonToggle/__examples__/persist/persist.ts +35 -0
  38. package/pg/cardUser/__examples__/basic/basic.ts +0 -1
  39. package/pg/cardUser/cardUser.css +2 -10
  40. package/pg/cardUser/cardUser.html +0 -5
  41. package/pg/cardUser/cardUser.ts +0 -6
  42. package/pg/database/README.md +1 -1
  43. package/pg/database/__examples__/basic/basic.html +2 -1
  44. package/pg/database/__examples__/basic/basic.ts +3 -3
  45. package/pg/dropdown/dropdown.ts +0 -19
  46. package/pg/grid/__examples__/basic/basic.html +2 -2
  47. package/pg/grid/__examples__/basic/basic.ts +3 -2
  48. package/pg/grid/grid.ts +0 -1
  49. package/pg/icon/README.md +6 -5
  50. package/pg/icon/__examples__/basic/basic.html +2 -2
  51. package/pg/icon/__examples__/basic/basic.ts +1 -1
  52. package/pg/icon/icon.ts +6 -0
  53. package/pg/inputCheckList/__examples__/basic/basic.ts +5 -5
  54. package/pg/inputCheckList/inputCheckList.ts +2 -0
  55. package/pg/inputFileLocal/inputFileLocal.css +3 -2
  56. package/pg/inputPixelEditor/README.md +132 -0
  57. package/pg/inputPixelEditor/__examples__/basic/basic.css +29 -0
  58. package/pg/inputPixelEditor/__examples__/basic/basic.html +63 -0
  59. package/pg/inputPixelEditor/__examples__/basic/basic.ts +200 -0
  60. package/pg/inputPixelEditor/__examples__/basic/openUtils.ts +41 -0
  61. package/pg/inputPixelEditor/__examples__/basic/saveUtil.ts +35 -0
  62. package/pg/inputPixelEditor/index.ts +3 -0
  63. package/pg/inputPixelEditor/inputPixelEditor.css +27 -0
  64. package/pg/inputPixelEditor/inputPixelEditor.html +3 -0
  65. package/pg/inputPixelEditor/inputPixelEditor.ts +839 -0
  66. package/pg/inputPixelEditor/utils/bitmapToMask.ts +202 -0
  67. package/pg/inputPixelEditor/utils/cloneGrid.ts +17 -0
  68. package/pg/inputPixelEditor/utils/constants.ts +1 -0
  69. package/pg/inputPixelEditor/utils/createLayer.ts +8 -0
  70. package/pg/inputPixelEditor/utils/debounce.ts +5 -0
  71. package/pg/inputPixelEditor/utils/diffGrid.ts +26 -0
  72. package/pg/inputPixelEditor/utils/fillGrid.ts +11 -0
  73. package/pg/inputPixelEditor/utils/getEllipseOutlinePixels.ts +105 -0
  74. package/pg/inputPixelEditor/utils/getEllipsePixels.ts +28 -0
  75. package/pg/inputPixelEditor/utils/getGuides.ts +232 -0
  76. package/pg/inputPixelEditor/utils/getLinePixels.ts +18 -0
  77. package/pg/inputPixelEditor/utils/getRectangleOutlinePixels.ts +20 -0
  78. package/pg/inputPixelEditor/utils/getRectanglePixels.ts +15 -0
  79. package/pg/inputPixelEditor/utils/inputMode.ts +8 -0
  80. package/pg/inputPixelEditor/utils/interateGrid.ts +7 -0
  81. package/pg/inputPixelEditor/utils/isEmptyGrid.ts +3 -0
  82. package/pg/inputPixelEditor/utils/maskToBitmap.ts +66 -0
  83. package/pg/inputRange/__examples__/basic/basic.ts +4 -4
  84. package/pg/inputRange/inputRange.ts +6 -4
  85. package/pg/inputSelect/README.md +1 -1
  86. package/pg/inputSelect/__examples__/basic/basic.ts +7 -5
  87. package/pg/inputSelect/inputSelect.css +15 -12
  88. package/pg/inputSelect/inputSelect.html +3 -3
  89. package/pg/inputSelect/inputSelect.ts +33 -30
  90. package/pg/inputText/__examples__/basic/basic.ts +6 -6
  91. package/pg/inputText/inputText.css +1 -0
  92. package/pg/inputUserSelect/README.md +1 -1
  93. package/pg/inputUserSelect/inputUserSelect.ts +1 -1
  94. package/pg/listTag/__examples__/basic/basic.ts +4 -5
  95. package/pg/markdown/README.md +17 -3
  96. package/pg/markdown/__examples__/basic/basic.ts +2 -2
  97. package/pg/markdown/__examples__/basic/constants.ts +1 -1
  98. package/pg/markdown/markdown.css +11 -0
  99. package/pg/menu/README.md +46 -0
  100. package/pg/menu/__examples__/basic/basic.html +6 -0
  101. package/pg/menu/__examples__/basic/basic.ts +46 -0
  102. package/pg/menu/index.ts +3 -0
  103. package/pg/menu/menu.css +19 -0
  104. package/pg/menu/menu.html +1 -0
  105. package/pg/menu/menu.ts +119 -0
  106. package/pg/menuDivider/README.md +7 -0
  107. package/pg/menuDivider/__examples__/basic/basic.html +3 -0
  108. package/pg/menuDivider/__examples__/basic/basic.ts +28 -0
  109. package/pg/menuDivider/index.ts +3 -0
  110. package/pg/menuDivider/menuDivider.css +9 -0
  111. package/pg/menuDivider/menuDivider.html +1 -0
  112. package/pg/menuDivider/menuDivider.ts +22 -0
  113. package/pg/menuIcon/menuIcon.ts +43 -36
  114. package/pg/menuItem/README.md +32 -0
  115. package/pg/menuItem/__examples__/basic/basic.html +26 -0
  116. package/pg/menuItem/__examples__/basic/basic.ts +41 -0
  117. package/pg/menuItem/index.ts +3 -0
  118. package/pg/menuItem/menuItem.css +97 -0
  119. package/pg/menuItem/menuItem.html +1 -0
  120. package/pg/menuItem/menuItem.ts +77 -0
  121. package/pg/menuItemIcon/README.md +32 -0
  122. package/pg/menuItemIcon/__examples__/basic/basic.html +34 -0
  123. package/pg/menuItemIcon/__examples__/basic/basic.ts +55 -0
  124. package/pg/menuItemIcon/index.ts +3 -0
  125. package/pg/menuItemIcon/menuItemIcon.css +106 -0
  126. package/pg/menuItemIcon/menuItemIcon.html +4 -0
  127. package/pg/menuItemIcon/menuItemIcon.ts +156 -0
  128. package/pg/modalAlert/__examples__/basic/basic.ts +1 -1
  129. package/pg/modalAlert/modalAlert.css +1 -4
  130. package/pg/modalAlert/modalAlert.ts +18 -4
  131. package/pg/modification/__examples__/basic/basic.ts +1 -2
  132. package/pg/modification/__examples__/basic/constants.ts +25 -50
  133. package/pg/modification/modification.ts +1 -1
  134. package/pg/overlay/overlay.ts +13 -12
  135. package/pg/overlayContextMenu/README.md +35 -0
  136. package/pg/overlayContextMenu/__examples__/basic/basic.css +23 -0
  137. package/pg/overlayContextMenu/__examples__/basic/basic.html +7 -0
  138. package/pg/overlayContextMenu/__examples__/basic/basic.ts +87 -0
  139. package/pg/overlayContextMenu/index.ts +3 -0
  140. package/pg/overlayContextMenu/overlayContextMenu.css +16 -0
  141. package/pg/overlayContextMenu/overlayContextMenu.html +3 -0
  142. package/pg/overlayContextMenu/overlayContextMenu.ts +98 -0
  143. package/pg/overlayMenu/README.md +33 -0
  144. package/pg/overlayMenu/__examples__/basic/basic.css +3 -0
  145. package/pg/overlayMenu/__examples__/basic/basic.html +5 -0
  146. package/pg/overlayMenu/__examples__/basic/basic.ts +62 -0
  147. package/pg/overlayMenu/index.ts +3 -0
  148. package/pg/overlayMenu/overlayMenu.css +16 -0
  149. package/pg/overlayMenu/overlayMenu.html +3 -0
  150. package/pg/overlayMenu/overlayMenu.ts +67 -0
  151. package/pg/overlaySelectMenu/README.md +33 -0
  152. package/pg/overlaySelectMenu/__examples__/basic/basic.css +3 -0
  153. package/pg/overlaySelectMenu/__examples__/basic/basic.html +5 -0
  154. package/pg/overlaySelectMenu/__examples__/basic/basic.ts +62 -0
  155. package/pg/overlaySelectMenu/index.ts +3 -0
  156. package/pg/overlaySelectMenu/overlaySelectMenu.css +17 -0
  157. package/pg/overlaySelectMenu/overlaySelectMenu.html +3 -0
  158. package/pg/overlaySelectMenu/overlaySelectMenu.ts +96 -0
  159. package/pg/overlaySubMenu/README.md +35 -0
  160. package/pg/overlaySubMenu/index.ts +3 -0
  161. package/pg/overlaySubMenu/overlaySubMenu.css +27 -0
  162. package/pg/overlaySubMenu/overlaySubMenu.html +3 -0
  163. package/pg/overlaySubMenu/overlaySubMenu.ts +103 -0
  164. package/pg/picker/picker.ts +1 -19
  165. package/pg/scroll/__examples__/basic/basic.ts +1 -1
  166. package/pg/search/__examples__/basic/basic.ts +10 -7
  167. package/pg/search/search.css +2 -2
  168. package/pg/shared/models/user.ts +0 -2
  169. package/pg/tab/tab.ts +0 -10
  170. package/pg/tabs/partials/tab.css +42 -0
  171. package/pg/tabs/partials/tab.ts +70 -0
  172. package/pg/tabs/tabs.css +0 -53
  173. package/pg/tabs/tabs.ts +54 -70
  174. package/pg/toast/README.md +35 -6
  175. package/pg/toast/__examples__/basic/basic.html +7 -0
  176. package/pg/toast/__examples__/basic/basic.ts +76 -0
  177. package/pg/toast/toast.css +3 -0
  178. package/pg/toast/toast.ts +20 -4
  179. package/pg/tooltip/addTooltip.ts +3 -1
  180. package/pg/tooltip/tooltip.ts +1 -1
  181. package/pg/tree/README.md +67 -0
  182. package/pg/tree/__examples__/basic/basic.html +10 -0
  183. package/pg/tree/__examples__/basic/basic.ts +162 -0
  184. package/pg/tree/index.ts +3 -0
  185. package/pg/tree/tree.css +28 -0
  186. package/pg/tree/tree.html +1 -0
  187. package/pg/tree/tree.ts +217 -0
  188. package/pg/treeButtonIcon/README.md +39 -0
  189. package/pg/treeButtonIcon/index.ts +3 -0
  190. package/pg/treeButtonIcon/treeButtonIcon.css +18 -0
  191. package/pg/treeButtonIcon/treeButtonIcon.html +3 -0
  192. package/pg/treeButtonIcon/treeButtonIcon.ts +42 -0
  193. package/pg/treeItem/README.md +3 -0
  194. package/pg/treeItem/index.ts +3 -0
  195. package/pg/treeItem/treeItem.css +263 -0
  196. package/pg/treeItem/treeItem.html +16 -0
  197. package/pg/treeItem/treeItem.ts +558 -0
  198. package/pgAnnoy.js +1 -0
  199. package/pgApp.js +1 -0
  200. package/pgAvatar.js +1 -0
  201. package/pgButton.js +1 -0
  202. package/pgButtonGroup.js +1 -0
  203. package/pgButtonLink.js +1 -0
  204. package/pgButtonMenu.js +1 -0
  205. package/pgButtonToggle.js +1 -0
  206. package/pgCard.js +1 -0
  207. package/pgCardUser.js +1 -0
  208. package/pgColor.js +1 -0
  209. package/pgDatabase.js +1 -0
  210. package/pgDropdown.js +1 -0
  211. package/pgGrid.js +1 -0
  212. package/pgHeader.js +1 -0
  213. package/pgIcon.js +1 -0
  214. package/pgInputCheck.js +1 -0
  215. package/pgInputCheckList.js +1 -0
  216. package/pgInputFileLocal.js +1 -0
  217. package/pgInputHexRgb.js +1 -0
  218. package/pgInputPixelEditor.js +1 -0
  219. package/pgInputRange.js +1 -0
  220. package/pgInputSelect.js +1 -0
  221. package/pgInputText.js +1 -0
  222. package/pgInputTextIcon.js +1 -0
  223. package/pgInputUserSelect.js +1 -0
  224. package/pgListTag.js +1 -0
  225. package/pgMarkdown.js +2 -0
  226. package/pgMarkdown.js.LICENSE.txt +10 -0
  227. package/pgMenu.js +1 -0
  228. package/pgMenuDivider.js +1 -0
  229. package/pgMenuIcon.js +1 -0
  230. package/pgMenuItem.js +1 -0
  231. package/pgMenuItemIcon.js +1 -0
  232. package/pgModalAlert.js +1 -0
  233. package/pgModification.js +1 -0
  234. package/pgNav.js +1 -0
  235. package/pgOverlay.js +1 -0
  236. package/pgOverlayContextMenu.js +1 -0
  237. package/pgOverlayMenu.js +1 -0
  238. package/pgOverlaySelectMenu.js +1 -0
  239. package/pgOverlaySubMenu.js +1 -0
  240. package/pgPicker.js +1 -0
  241. package/pgPreview.js +1 -0
  242. package/pgScroll.js +1 -0
  243. package/pgSearch.js +1 -0
  244. package/pgTab.js +1 -0
  245. package/pgTabs.js +1 -0
  246. package/pgToast.js +1 -0
  247. package/pgToasts.js +1 -0
  248. package/pgTooltip.js +1 -0
  249. package/pgTree.js +1 -0
  250. package/pgTreeButtonIcon.js +1 -0
  251. package/pgTreeItem.js +1 -0
  252. package/theme-ui3.css +31 -0
  253. package/@types/css.d.ts +0 -4
  254. package/@types/html.d.ts +0 -4
  255. package/dist/main.js +0 -3819
  256. package/dist/pgAnnoy.js +0 -116
  257. package/dist/pgAvatar.js +0 -136
  258. package/dist/pgButton.js +0 -116
  259. package/dist/pgButtonGroup.js +0 -116
  260. package/dist/pgButtonLink.js +0 -116
  261. package/dist/pgButtonToggle.js +0 -146
  262. package/dist/pgCard.js +0 -116
  263. package/dist/pgCardUser.js +0 -196
  264. package/dist/pgColor.js +0 -136
  265. package/dist/pgDatabase.js +0 -236
  266. package/dist/pgDropdown.js +0 -686
  267. package/dist/pgGrid.js +0 -126
  268. package/dist/pgHeader.js +0 -116
  269. package/dist/pgIcon.js +0 -116
  270. package/dist/pgInputCheck.js +0 -116
  271. package/dist/pgInputCheckList.js +0 -126
  272. package/dist/pgInputFileLocal.js +0 -116
  273. package/dist/pgInputHexRgb.js +0 -126
  274. package/dist/pgInputRange.js +0 -116
  275. package/dist/pgInputSelect.js +0 -116
  276. package/dist/pgInputText.js +0 -116
  277. package/dist/pgInputTextIcon.js +0 -176
  278. package/dist/pgInputUserSelect.js +0 -116
  279. package/dist/pgListTag.js +0 -136
  280. package/dist/pgMarkdown.js +0 -346
  281. package/dist/pgMenuIcon.js +0 -206
  282. package/dist/pgModalAlert.js +0 -126
  283. package/dist/pgModification.js +0 -396
  284. package/dist/pgNav.js +0 -116
  285. package/dist/pgOverlay.js +0 -96
  286. package/dist/pgPicker.js +0 -116
  287. package/dist/pgPreview.js +0 -116
  288. package/dist/pgScroll.js +0 -266
  289. package/dist/pgSearch.js +0 -146
  290. package/dist/pgTab.js +0 -116
  291. package/dist/pgTabs.js +0 -136
  292. package/dist/pgToast.js +0 -136
  293. package/dist/pgToasts.js +0 -136
  294. package/dist/pgTooltip.js +0 -126
@@ -0,0 +1,32 @@
1
+ # `<pg-menu>`
2
+
3
+ The `PgMenuItemIcon` is the `PgMenuItem` with icon support. The `pg-menu` can use both in the same list, but this component has the overhead of includig `PgIcon`.
4
+
5
+ ## Usage
6
+
7
+ ```typescript
8
+ import '@pictogrammers/components/pgMenuItemIcon.js';
9
+ ```
10
+
11
+ ```typescript
12
+ this.$items = [{
13
+ type: PgMenuItemIcon,
14
+ icon: '',
15
+ label: 'Item 1'
16
+ }];
17
+ ```
18
+
19
+ | Attributes | Tested | Description |
20
+ | ---------- | -------- | ----------- |
21
+ | `label` | | Item label. |
22
+ | `icon` | | Item icon. |
23
+ | `checked` | | Item checked. |
24
+ | `disabled` | | Item disabled. |
25
+
26
+ ## Events
27
+
28
+ ```typescript
29
+ this.$item.addEventListener('select', (e: any) => {
30
+ const { index } = e.detail;
31
+ });
32
+ ```
@@ -0,0 +1,34 @@
1
+ <div class="example">
2
+ <pg-menu-item-icon part="item"></pg-menu-item-icon>
3
+ </div>
4
+ <div>
5
+ <table style="border: 1px solid #ddd;margin-block-start: 0.5rem;">
6
+ <thead>
7
+ <tr>
8
+ <th>Property</th>
9
+ <th>Value</th>
10
+ <th>&nbsp;</th>
11
+ </tr>
12
+ </thead>
13
+ <tbody>
14
+ <tr>
15
+ <td><code>icon</code></td>
16
+ <td part="iconValue"></td>
17
+ <td>
18
+ <button part="iconFile">File</button>
19
+ <button part="iconFolder">Folder</button>
20
+ </td>
21
+ </tr>
22
+ <tr>
23
+ <td><code>checked</code></td>
24
+ <td part="checkedValue"></td>
25
+ <td><input part="checkedToggle" type="checkbox"/></td>
26
+ </tr>
27
+ <tr>
28
+ <td><code>disabled</code></td>
29
+ <td part="disabledValue"></td>
30
+ <td><input part="disabledToggle" type="checkbox"/></td>
31
+ </tr>
32
+ </tbody>
33
+ </table>
34
+ </div>
@@ -0,0 +1,55 @@
1
+ import { Component, Part } from '@pictogrammers/element';
2
+
3
+ import PgMenuItem from '../../menuItemIcon';
4
+
5
+ import template from './basic.html';
6
+
7
+ const IconFile = 'M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z';
8
+ const IconFolder = 'M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z';
9
+
10
+ @Component({
11
+ selector: 'x-pg-menu-item-icon-basic',
12
+ template
13
+ })
14
+ export default class XPgMenuItemIconBasic extends HTMLElement {
15
+ @Part() $item: PgMenuItem;
16
+ @Part() $checkedToggle: HTMLInputElement;
17
+ @Part() $disabledToggle: HTMLInputElement;
18
+ @Part() $iconFile: HTMLButtonElement;
19
+ @Part() $iconFolder: HTMLButtonElement;
20
+ @Part() $checkedValue: HTMLDivElement;
21
+ @Part() $disabledValue: HTMLDivElement;
22
+
23
+ connectedCallback() {
24
+ this.$item.icon = IconFile;
25
+ this.$item.label = 'Item 1';
26
+ this.$item.checked = false;
27
+ this.$item.disabled = false;
28
+
29
+ this.$checkedValue.textContent = `${this.$item.checked}`;
30
+ this.$disabledValue.textContent = `${this.$item.disabled}`;
31
+
32
+ this.$item.addEventListener('select', (e: any) => {
33
+ this.$checkedToggle.checked = e.target.checked;
34
+ this.$checkedValue.textContent = `${this.$item.checked}`;
35
+ });
36
+
37
+ this.$iconFile.addEventListener('click', () => {
38
+ this.$item.icon = IconFile;
39
+ });
40
+
41
+ this.$iconFolder.addEventListener('click', () => {
42
+ this.$item.icon = IconFolder;
43
+ });
44
+
45
+ this.$checkedToggle.addEventListener('change', (e: any) => {
46
+ this.$item.checked = e.target.checked;
47
+ this.$checkedValue.textContent = `${this.$item.checked}`;
48
+ });
49
+
50
+ this.$disabledToggle.addEventListener('change', (e: any) => {
51
+ this.$item.disabled = e.target.checked;
52
+ this.$disabledValue.textContent = `${this.$item.disabled}`;
53
+ });
54
+ }
55
+ }
@@ -0,0 +1,3 @@
1
+ import PgMenuItemIcon from './menuItemIcon';
2
+
3
+ export default PgMenuItemIcon;
@@ -0,0 +1,106 @@
1
+ :host {
2
+ display: contents;
3
+ }
4
+
5
+ [part=button] {
6
+ outline: none;
7
+ display: flex;
8
+ align-items: center;
9
+ font-family: var(--pg-font-family);
10
+ text-align: var(--pg-menu-item-text-align, left);
11
+ background: var(--pg-menu-item-background, transparent);
12
+ padding: var(--pg-menu-item-padding, 0.25rem 0.5rem 0.25rem 0.5rem);
13
+ border-color: transparent;
14
+ border-width: 0;
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);
20
+ color: var(--pg-menu-item-color, #453C4F);
21
+ }
22
+
23
+ [part=button]:not(:disabled):active,
24
+ [part=button]:not(:disabled):hover {
25
+ background: var(--pg-menu-item-selected-background, #453C4F);
26
+ color: #FFFFFF;
27
+ --pg-icon-color: #FFFFFF;
28
+ }
29
+
30
+ [part=button]:not(:disabled):active {
31
+ background: var(--pg-menu-item-active-background, #5f516e);
32
+ }
33
+
34
+ [part=button]:disabled {
35
+ color: var(--pg-menu-item-disabled-color, rgb(69, 60, 79, 0.75));
36
+ --pg-icon-color: var(--pg-menu-item-disabled-color, rgb(69, 60, 79, 0.75));
37
+ }
38
+
39
+ @container style(--pg-menu-_has-check: true) {
40
+ [part=button] {
41
+ padding-inline-start: 1.5rem;
42
+ }
43
+
44
+ [part=button].checked::before {
45
+ position: absolute;
46
+ translate: -1.5rem 0;
47
+ 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='M 17.5,10.2501L 10.5,17.25L 6.5,13.25L 7.9,11.8L 10.5,14.4L 16.0857,8.8L 17.5,10.25Z' fill='rgb(69, 60, 79)' /></svg>"));
48
+ width: 1.5rem;
49
+ height: 1.5rem;
50
+ }
51
+
52
+ [part=button].checked:active::before,
53
+ [part=button].checked:hover::before {
54
+ 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='M 17.5,10.2501L 10.5,17.25L 6.5,13.25L 7.9,11.8L 10.5,14.4L 16.0857,8.8L 17.5,10.25Z' fill='white' /></svg>"));
55
+ }
56
+
57
+ [part=button].checked:disabled::before {
58
+ 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='M 17.5,10.2501L 10.5,17.25L 6.5,13.25L 7.9,11.8L 10.5,14.4L 16.0857,8.8L 17.5,10.25Z' fill='rgb(69, 60, 79, 0.5)' /></svg>"));
59
+ }
60
+ }
61
+
62
+ [part=button]:focus-visible {
63
+ position: relative;
64
+ }
65
+
66
+ [part=button]:focus-visible::after {
67
+ pointer-events: none;
68
+ content: '';
69
+ position: absolute;
70
+ top: -1px;
71
+ right: -1px;
72
+ bottom: -1px;
73
+ left: -1px;
74
+ border-radius: 0.25rem;
75
+ box-shadow: 0 0 0 3px var(--pg-focus-color, rgb(79, 143, 249, 0.5));
76
+ }
77
+
78
+ [part=button]:focus-visible:not(:hover)::after {
79
+ background: var(--pg-focus-background-color, rgb(79, 143, 249, 0.1));
80
+ }
81
+
82
+ [part=icon] {
83
+ margin-inline-end: 0.5rem;
84
+ }
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;
92
+ }
93
+
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>"));
97
+ }
98
+
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>"));
101
+ }
102
+
103
+ [part=label] {
104
+ display: flex;
105
+ align-items: center;
106
+ }
@@ -0,0 +1,4 @@
1
+ <button part="button">
2
+ <pg-icon part="icon"></pg-icon>
3
+ <span part="label"></span>
4
+ </button>
@@ -0,0 +1,156 @@
1
+ import { Component, Prop, Part } from '@pictogrammers/element';
2
+
3
+ import PgOverlaySubMenu from '../overlaySubMenu/overlaySubMenu'
4
+ import PgIcon from '../icon/icon';
5
+
6
+ import template from './menuItemIcon.html';
7
+ import style from './menuItemIcon.css';
8
+
9
+ const noIcon = 'M0 0h24v24H0V0zm2 2v20h20V2H2z';
10
+
11
+ @Component({
12
+ selector: 'pg-menu-item-icon',
13
+ style,
14
+ template
15
+ })
16
+ export default class PgMenuItemIcon extends HTMLElement {
17
+ static delegatesFocus = true;
18
+
19
+ @Prop() index: number;
20
+ @Prop() icon: string = 'M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z';
21
+ @Prop() label: string = '';
22
+ @Prop() checked: boolean = false;
23
+ @Prop() disabled: boolean = false;
24
+ @Prop() items: any[] = [];
25
+
26
+ @Part() $icon: PgIcon;
27
+ @Part() $button: HTMLButtonElement;
28
+ @Part() $label: HTMLSpanElement;
29
+
30
+ render(changes) {
31
+ if (changes.icon) {
32
+ this.$icon.path = this.icon;
33
+ }
34
+ if (changes.label) {
35
+ this.$label.textContent = this.label;
36
+ }
37
+ if (changes.disabled) {
38
+ this.$button.disabled = this.disabled;
39
+ }
40
+ if (changes.checked) {
41
+ this.$button.classList.toggle('checked', this.checked);
42
+ }
43
+ if (changes.items) {
44
+ this.$button.classList.toggle('more', this.items.length > 0);
45
+ }
46
+ if (changes.checked) {
47
+ if (this.checked === true) {
48
+ this.dispatchEvent(new CustomEvent('hasCheck', { bubbles: true }));
49
+ }
50
+ }
51
+ }
52
+
53
+ connectedCallback() {
54
+ this.$button.addEventListener('click', async () => {
55
+ if (this.items.length > 0) {
56
+ const result = await PgOverlaySubMenu.open({
57
+ source: this.$button,
58
+ x: 0,
59
+ y: 0,
60
+ value: this.items[0],
61
+ items: this.items
62
+ });
63
+ if (result === null) {
64
+ this.focus();
65
+ } else if (result) {
66
+ this.dispatchEvent(new CustomEvent('select', {
67
+ detail: {
68
+ item: result
69
+ }
70
+ }));
71
+ } else {
72
+ this.dispatchEvent(new CustomEvent('close', {
73
+ detail: {
74
+ depth: -1
75
+ }
76
+ }));
77
+ }
78
+ } else {
79
+ this.dispatchEvent(new CustomEvent('select', {
80
+ detail: {
81
+ index: this.index,
82
+ item: this.items[this.index]
83
+ }
84
+ }));
85
+ }
86
+ });
87
+ this.$button.addEventListener('keydown', async (e: KeyboardEvent) => {
88
+ switch (e.key) {
89
+ case 'ArrowDown':
90
+ this.dispatchEvent(new CustomEvent('down', {
91
+ detail: { index: this.index }
92
+ }));
93
+ e.preventDefault();
94
+ break;
95
+ case 'ArrowUp':
96
+ this.dispatchEvent(new CustomEvent('up', {
97
+ detail: { index: this.index }
98
+ }));
99
+ e.preventDefault();
100
+ break;
101
+ case 'ArrowLeft':
102
+ this.dispatchEvent(new CustomEvent('close', {
103
+ detail: {
104
+ depth: 1
105
+ }
106
+ }));
107
+ e.preventDefault();
108
+ break;
109
+ case 'ArrowRight':
110
+ if (this.items.length > 0) {
111
+ const result = await PgOverlaySubMenu.open({
112
+ source: this.$button,
113
+ x: 0,
114
+ y: 0,
115
+ value: this.items[0],
116
+ items: this.items
117
+ });
118
+ if (result === null) {
119
+ this.focus();
120
+ } else if (result) {
121
+ this.dispatchEvent(new CustomEvent('select', {
122
+ detail: {
123
+ item: result
124
+ }
125
+ }));
126
+ } else {
127
+ this.dispatchEvent(new CustomEvent('close', {
128
+ detail: {
129
+ depth: -1
130
+ }
131
+ }));
132
+ }
133
+ }
134
+ e.preventDefault();
135
+ break;
136
+ case 'Escape':
137
+ this.dispatchEvent(new CustomEvent('close', {
138
+ detail: {
139
+ depth: -1
140
+ }
141
+ }));
142
+ e.preventDefault();
143
+ break;
144
+ }
145
+ });
146
+ }
147
+
148
+ focus() {
149
+ this.$button.focus();
150
+ }
151
+
152
+ getHeight(): number {
153
+ return this.$label.getBoundingClientRect().height;
154
+ }
155
+
156
+ }
@@ -21,7 +21,7 @@ export default class XPgModalAlertBasic extends HTMLElement {
21
21
  header: 'Delete Item',
22
22
  message: 'Are you sure you want to delete the item?'
23
23
  });
24
- this.$result.innerText = `${result}`;
24
+ this.$result.textContent = `${result}`;
25
25
  }
26
26
 
27
27
  }
@@ -36,8 +36,5 @@ footer {
36
36
  border-top: 1px solid #ccc;
37
37
  background: #f1f1f1;
38
38
  justify-content: flex-end;
39
- }
40
-
41
- [part="no"] {
42
- margin-right: 0.5rem;
39
+ gap: 0.5rem;
43
40
  }
@@ -21,16 +21,30 @@ export default class PgModalAlert extends PgOverlay {
21
21
  @Part() $yes: PgButton;
22
22
  @Part() $no: PgButton;
23
23
 
24
+ #cacheKeydownHandler: any;
25
+
24
26
  connectedCallback() {
25
- this.$yes.addEventListener('click', this.handleYes.bind(this));
26
- this.$no.addEventListener('click', this.handleNo.bind(this));
27
+ this.$yes.addEventListener('click', this.#handleYes.bind(this));
28
+ this.$no.addEventListener('click', this.#handleNo.bind(this));
29
+ this.#cacheKeydownHandler ??= this.#handleKeyDown.bind(this);
30
+ document.addEventListener('keydown', this.#cacheKeydownHandler);
31
+ }
32
+
33
+ disconnectedCallback() {
34
+ document.removeEventListener('keydown', this.#cacheKeydownHandler);
35
+ }
36
+
37
+ #handleKeyDown(e: KeyboardEvent) {
38
+ if (e.key === 'Escape') {
39
+ this.close(null);
40
+ }
27
41
  }
28
42
 
29
- handleYes() {
43
+ #handleYes() {
30
44
  this.close(true);
31
45
  }
32
46
 
33
- handleNo() {
47
+ #handleNo() {
34
48
  this.close(false);
35
49
  }
36
50
 
@@ -47,8 +47,7 @@ export default class XPgModificationBasic extends HTMLElement {
47
47
  "user": {
48
48
  "id": "c4ea5584-07e3-11e4-bf19-842b2b6cfe1b",
49
49
  "name": "Austin Andrews",
50
- "github": "templarian",
51
- "twitter": "Templarian"
50
+ "github": "templarian"
52
51
  },
53
52
  "icon": null,
54
53
  "version": {