@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,16 @@
1
+ :host {
2
+ display: contents;
3
+ }
4
+
5
+ [part="overlay"] {
6
+ margin: 0;
7
+ padding: 0;
8
+ border: 0;
9
+ background: transparent;
10
+ --pg-menu-box-shadow: 0 0.125rem 0.5rem rgba(0, 0, 0, 0.25);
11
+ top: calc(anchor(bottom) - 0.25rem);
12
+ left: anchor(left);
13
+ min-width: calc(anchor-size(width) + calc(2 * var(--pg-menu-padding, 0.25rem)));
14
+ translate: var(--pg-overlay-menu-_x, 0) var(--pg-overlay-menu-_y, 0);
15
+ overflow: visible;
16
+ }
@@ -0,0 +1,3 @@
1
+ <div part="overlay">
2
+ <pg-menu part="menu"></pg-menu>
3
+ </div>
@@ -0,0 +1,67 @@
1
+ import { Component, Part, Prop } from '@pictogrammers/element';
2
+
3
+ import PgMenu from '../menu/menu';
4
+ import PgOverlay from '../overlay/overlay';
5
+
6
+ import template from './overlayMenu.html';
7
+ import style from './overlayMenu.css';
8
+
9
+ @Component({
10
+ selector: 'pg-overlay-menu',
11
+ template,
12
+ style
13
+ })
14
+ export default class PgOverlayMenu extends PgOverlay {
15
+ @Part() $overlay: HTMLDivElement;
16
+ @Part() $menu: PgMenu;
17
+
18
+ @Prop() source: HTMLElement | null = null;
19
+ @Prop() default: any = null;
20
+ @Prop() items: any[] = [];
21
+ @Prop() value: any = null;
22
+
23
+ render(changes) {
24
+
25
+ }
26
+
27
+ connectedCallback() {
28
+ this.$menu.items = this.items;
29
+ this.$menu.addEventListener('select', this.#handleSelect.bind(this));
30
+ this.$overlay.popover = 'auto';
31
+ if (this.source !== null) {
32
+ // @ts-ignore
33
+ this.$overlay.showPopover({
34
+ source: this.source
35
+ });
36
+ }
37
+ this.$overlay.addEventListener('toggle', this.#toggle.bind(this));
38
+ // Position
39
+ const rect = this.source?.getBoundingClientRect();
40
+ let x = 0, y = 0;
41
+ const value = this.value === null || typeof this.value !== 'object'
42
+ ? this.value
43
+ : this.value.value;
44
+ // value is an item in the items list
45
+ const index = this.value === null
46
+ ? 0
47
+ : this.items.findIndex(x => x.value === value);
48
+ // Focus
49
+ this.$menu.focus(index);
50
+ }
51
+
52
+ #toggle(e: ToggleEvent) {
53
+ if (e.newState === 'closed') {
54
+ this.close();
55
+ this.source?.focus();
56
+ }
57
+ }
58
+
59
+ disconnectedCallback() {
60
+ }
61
+
62
+ #handleSelect(e: any) {
63
+ e.detail.item.index = e.detail.index;
64
+ this.close(e.detail.item);
65
+ this.source?.focus();
66
+ }
67
+ }
@@ -0,0 +1,33 @@
1
+ # Overlay Menu
2
+
3
+ The `PgOverlaySelectMenu` creates an overlay menu above a source element. For standard menu lists use the `PgMenuItem` for the check.
4
+
5
+ Components that use `PgOverlaySelectMenu` include:
6
+
7
+ - `pg-input-select`
8
+
9
+ ## Usage
10
+
11
+ ```typescript
12
+ import PgMenuItem from '@pictogrammers/components/pg/menuItem';
13
+
14
+ #isOpen: false;
15
+ handleSourceClick() {
16
+ if (this.#isOpen) { return; }
17
+ this.#isOpen = true;
18
+ const result = await PgOverlayMenu.open({
19
+ source: this.$element,
20
+ items: [{
21
+ label: 'Item 1',
22
+ value: 'item1',
23
+ type: PgMenuItem
24
+ }, {
25
+ label: 'Item 2',
26
+ value: 'item2',
27
+ type: PgMenuItem
28
+ }]
29
+ });
30
+ this.#isOpen = false;
31
+ console.log(result);
32
+ }
33
+ ```
@@ -0,0 +1,3 @@
1
+ p {
2
+ margin: 0.5rem 0;
3
+ }
@@ -0,0 +1,5 @@
1
+ <div class="example">
2
+ <button part="button">Create Menu Overlay</button>
3
+ <p>Result: <code part="result"></code></p></p>
4
+ <p>input: <code part="input"></code></p></p>
5
+ </div>
@@ -0,0 +1,62 @@
1
+ import { Component, Part, Prop } from '@pictogrammers/element';
2
+
3
+ import PgMenuItem from '../../../menuItem/menuItem';
4
+ import PgMenuDivider from '../../../menuDivider/menuDivider';
5
+ import PgOverlaySelectMenu from '../../overlaySelectMenu';
6
+
7
+ import template from './basic.html';
8
+ import style from './basic.css';
9
+
10
+ @Component({
11
+ selector: 'x-pg-overlay-select-menu-basic',
12
+ template,
13
+ style
14
+ })
15
+ export default class XPgOverlaySelectMenuBasic extends HTMLElement {
16
+ @Part() $button: HTMLButtonElement;
17
+ @Part() $result: HTMLSpanElement;
18
+ @Part() $input: HTMLSpanElement;
19
+
20
+ connectedCallback() {
21
+ this.$button.addEventListener('click', this.#handleClick.bind(this));
22
+ }
23
+
24
+ #value = null;
25
+
26
+ #menuOpen = false;
27
+ async #handleClick() {
28
+ if (this.#menuOpen) { return; }
29
+ const items = [{
30
+ label: 'Item 1',
31
+ value: 'item1',
32
+ type: PgMenuItem
33
+ },
34
+ {
35
+ label: 'Item 2',
36
+ value: 'item2',
37
+ type: PgMenuItem
38
+ },
39
+ {
40
+ type: PgMenuDivider
41
+ },
42
+ {
43
+ label: 'Item 3',
44
+ value: 'item3',
45
+ type: PgMenuItem
46
+ }];
47
+ this.#menuOpen = true;
48
+ const result = await PgOverlaySelectMenu.open({
49
+ source: this.$button,
50
+ value: this.#value,
51
+ items,
52
+ oninput: (value) => {
53
+ this.$input.textContent = value;
54
+ }
55
+ });
56
+ if (result !== undefined) {
57
+ this.#value = result;
58
+ }
59
+ this.$result.textContent = result;
60
+ this.#menuOpen = false;
61
+ }
62
+ }
@@ -0,0 +1,3 @@
1
+ import PgOverlaySelectMenu from './overlaySelectMenu';
2
+
3
+ export default PgOverlaySelectMenu;
@@ -0,0 +1,17 @@
1
+ :host {
2
+ display: contents;
3
+ }
4
+
5
+ [part="overlay"] {
6
+ margin: 0;
7
+ padding: 0;
8
+ border: 0;
9
+ background: transparent;
10
+ overflow: visible;
11
+ --pg-menu-box-shadow: 0 0.125rem 0.5rem rgba(0, 0, 0, 0.25);
12
+ top: anchor(top);
13
+ left: anchor(left);
14
+ min-width: calc(anchor-size(width) + calc(2 * var(--pg-menu-padding, 0.25rem)));
15
+ margin: var(--pg-overlay-menu-_y, 0) 0 0 var(--pg-overlay-menu-_x, 0);
16
+ overflow: visible;
17
+ }
@@ -0,0 +1,3 @@
1
+ <div part="overlay">
2
+ <pg-menu part="menu"></pg-menu>
3
+ </div>
@@ -0,0 +1,96 @@
1
+ import { Component, Part, Prop } from '@pictogrammers/element';
2
+
3
+ import PgMenu from '../menu/menu';
4
+ import PgOverlay from '../overlay/overlay';
5
+
6
+ import template from './overlaySelectMenu.html';
7
+ import style from './overlaySelectMenu.css';
8
+
9
+ @Component({
10
+ selector: 'pg-overlay-select-menu',
11
+ template,
12
+ style
13
+ })
14
+ export default class PgOverlaySelectMenu extends PgOverlay {
15
+ @Part() $overlay: HTMLDivElement;
16
+ @Part() $menu: PgMenu;
17
+
18
+ @Prop() source: HTMLElement | null = null;
19
+ @Prop() default: any = null;
20
+ @Prop() items: any[] = [];
21
+ @Prop() value: any = null;
22
+
23
+ render(changes) {
24
+ if (changes.items) {
25
+ if (this.value !== null) {
26
+ this.items.forEach(item => item.checked = false);
27
+ this.items.find(item => item.value === this.value.value).checked = true;
28
+ }
29
+ }
30
+ }
31
+
32
+ connectedCallback() {
33
+ // Pass throughs are binded once, do not do this in render
34
+ this.$menu.items = this.items;
35
+ this.$menu.addEventListener('select', this.#handleSelect.bind(this));
36
+ this.$overlay.popover = 'auto';
37
+ if (this.source !== null) {
38
+ // @ts-ignore
39
+ this.$overlay.showPopover({
40
+ source: this.source
41
+ });
42
+ }
43
+ this.$overlay.addEventListener('toggle', this.#toggle.bind(this));
44
+ // Position
45
+ const rect = this.source?.getBoundingClientRect();
46
+ let x = 0, y = 0;
47
+ const value = this.value === null || typeof this.value !== 'object'
48
+ ? this.value
49
+ : this.value.value;
50
+ // value is an item in the items list
51
+ const index = this.value === null
52
+ ? -1
53
+ : this.items.findIndex(x => x.value === value);
54
+ if (index !== -1) {
55
+ const height = this.$menu.getItemHeight(index);
56
+ // Overlap item
57
+ y -= this.$menu.getItemOffset(0, index);
58
+ if (rect?.height !== height && rect?.height) {
59
+ y += (rect.height - height) / 2;
60
+ }
61
+ } else if (this.items.length > 0) {
62
+ // insert default if defined
63
+ if (this.default) {
64
+ this.default.checked = true;
65
+ this.$menu.items.unshift(this.default);
66
+ }
67
+ // focus first item
68
+ const height = this.$menu.getItemHeight(0);
69
+ y -= this.$menu.getItemOffset(0, 0);
70
+ if (rect?.height !== height && rect?.height) {
71
+ y += (rect.height - height) / 2;
72
+ }
73
+ }
74
+ // ToDo: update to CSS Variables
75
+ this.$overlay.style.setProperty('--pg-overlay-menu-_x', `${x}px`);
76
+ this.$overlay.style.setProperty('--pg-overlay-menu-_y', `${y}px`);
77
+ // Focus
78
+ this.$menu.focus(index);
79
+ }
80
+
81
+ #toggle(e: ToggleEvent) {
82
+ if (e.newState === 'closed') {
83
+ this.close();
84
+ this.source?.focus();
85
+ }
86
+ }
87
+
88
+ disconnectedCallback() {
89
+ }
90
+
91
+ #handleSelect(e: any) {
92
+ e.detail.item.index = e.detail.index;
93
+ this.close(e.detail.item);
94
+ this.source?.focus();
95
+ }
96
+ }
@@ -0,0 +1,35 @@
1
+ # Overlay Menu
2
+
3
+ The `PgOverlaySubMenu` creates an overlay menu above a source element. For standard menu lists use the `PgMenuItem` for the check.
4
+
5
+ Components that use `PgOverlaySubMenu` include:
6
+
7
+ - `pg-input-select`
8
+
9
+ ## Usage
10
+
11
+ ```typescript
12
+ import PgMenuItem from '@pictogrammers/components/pg/overlaySubMenu';
13
+
14
+ #isOpen: false;
15
+ handleSourceClick(e: MouseEvent) {
16
+ if (this.#isOpen) { return; }
17
+ this.#isOpen = true;
18
+ const result = await PgOverlaySubMenu.open({
19
+ source: this.$element,
20
+ x: e.clientX,
21
+ y: e.clientY,
22
+ items: [{
23
+ label: 'Item 1',
24
+ value: 'item1',
25
+ type: PgMenuItem
26
+ }, {
27
+ label: 'Item 2',
28
+ value: 'item2',
29
+ type: PgMenuItem
30
+ }]
31
+ });
32
+ this.#isOpen = false;
33
+ console.log(result);
34
+ }
35
+ ```
@@ -0,0 +1,3 @@
1
+ import PgOverlaySubMenu from './overlaySubMenu';
2
+
3
+ export default PgOverlaySubMenu;
@@ -0,0 +1,27 @@
1
+ :host {
2
+ display: contents;
3
+ }
4
+
5
+ [part="overlay"] {
6
+ margin: 0;
7
+ padding: 0;
8
+ border: 0;
9
+ background: transparent;
10
+ overflow: visible;
11
+ --pg-menu-box-shadow: 0 0.125rem 0.5rem rgba(0, 0, 0, 0.25);
12
+ top: calc(anchor(top) - 0.25rem);
13
+ left: calc(anchor(right) - 0.25rem);
14
+ min-width: 10rem;
15
+ translate: var(--pg-overlay-menu-_x, 0) var(--pg-overlay-menu-_y, 0);
16
+ position-try-fallbacks: --custom-right, --custom-left;
17
+ }
18
+
19
+ @position-try --custom-right {
20
+ top: calc(anchor(top) - 0.25rem);
21
+ left: calc(anchor(right) - 0.25rem);
22
+ }
23
+
24
+ @position-try --custom-left {
25
+ top: calc(anchor(top) - 0.25rem);
26
+ left: calc(anchor(left) - anchor-size(width) + 0.25rem);
27
+ }
@@ -0,0 +1,3 @@
1
+ <div part="overlay">
2
+ <pg-menu part="menu"></pg-menu>
3
+ </div>
@@ -0,0 +1,103 @@
1
+ import { Component, Part, Prop } from '@pictogrammers/element';
2
+
3
+ import PgMenu from '../menu/menu';
4
+ import PgOverlay from '../overlay/overlay';
5
+
6
+ import template from './overlaySubMenu.html';
7
+ import style from './overlaySubMenu.css';
8
+
9
+ // Only allow a single open context menu
10
+ const stack: PgOverlaySubMenu[] = [];
11
+ const stack2: PgOverlaySubMenu[] = [];
12
+
13
+ @Component({
14
+ selector: 'pg-overlay-sub-menu',
15
+ template,
16
+ style
17
+ })
18
+ export default class PgOverlaySubMenu extends PgOverlay {
19
+ @Part() $overlay: HTMLDivElement;
20
+ @Part() $menu: PgMenu;
21
+
22
+ @Prop() source: HTMLElement | null = null;
23
+ @Prop() x: number = 0;
24
+ @Prop() y: number = 0;
25
+ @Prop() default: any = null;
26
+ @Prop() items: any[] = [];
27
+ @Prop() value: any = null;
28
+
29
+ render(changes) {
30
+ if (changes.items) {
31
+ //if (this.value !== null) {
32
+ // this.items.forEach(item => item.checked = false);
33
+ // this.items.find(item => item.value === this.value.value).checked = true;
34
+ //}
35
+ this.$menu.items = this.items;
36
+ }
37
+ }
38
+
39
+ connectedCallback() {
40
+ stack.pop()?.close();
41
+ stack.push(this);
42
+ stack2.push(this);
43
+ this.$menu.addEventListener('select', this.#handleSelect.bind(this));
44
+ this.$menu.addEventListener('close', this.#handleClose.bind(this));
45
+ this.$overlay.popover = 'auto';
46
+ if (this.source !== null) {
47
+ // @ts-ignore
48
+ this.$overlay.showPopover({
49
+ source: this.source
50
+ });
51
+ }
52
+ this.$overlay.addEventListener('toggle', this.#toggle.bind(this));
53
+ // Position
54
+ const rect = this.source?.getBoundingClientRect();
55
+ const x = 0, y = 0; // this.x - (rect?.left || 0),
56
+ // y = this.y - (rect?.top || 0);
57
+ // ToDo: update to CSS Variables
58
+ this.$overlay.style.setProperty('--pg-overlay-menu-_x', `${x}px`);
59
+ this.$overlay.style.setProperty('--pg-overlay-menu-_y', `${y}px`);
60
+ // Focus
61
+ this.$menu.focus(0);
62
+ // Should return focus
63
+ this.#handleDown = this.#down.bind(this);
64
+ document.addEventListener('pointerdown', this.#handleDown);
65
+ }
66
+
67
+ #ignore = false;
68
+ #handleDown;
69
+ #down(e: MouseEvent) {
70
+ this.#ignore = e.composedPath().includes(this.source as any);
71
+ }
72
+
73
+ #toggle(e: ToggleEvent) {
74
+ if (e.newState === 'closed') {
75
+ //this.close();
76
+ if (stack2.length === 0 && this.#ignore) {
77
+ console.log(e);
78
+ this.source?.focus();
79
+ }
80
+ }
81
+ }
82
+
83
+ disconnectedCallback() {
84
+ stack2.pop();
85
+ document.removeEventListener('pointerdown', this.#handleDown);
86
+ }
87
+
88
+ #handleClose(e: any) {
89
+ const { depth } = e.detail;
90
+ console.log('close', depth);
91
+ if (depth === 1) {
92
+ this.close(null);
93
+ } else {
94
+ this.close();
95
+ }
96
+ }
97
+
98
+ #handleSelect(e: any) {
99
+ e.detail.item.index = e.detail.index;
100
+ this.close(e.detail.item);
101
+ this.source?.focus();
102
+ }
103
+ }
@@ -1,7 +1,6 @@
1
1
  import { Component, Prop, Part } from '@pictogrammers/element';
2
2
  import PgButton from '../button/button';
3
3
  import PgGrid from '../grid/grid';
4
- import { createPopper } from '@popperjs/core';
5
4
 
6
5
  import template from './picker.html';
7
6
  import style from './picker.css';
@@ -24,24 +23,7 @@ export default class PgPicker extends HTMLElement { // extends PgButton = bug in
24
23
 
25
24
  isVisible = false;
26
25
  connectedCallback() {
27
- /*createPopper(this.$button, this.$popover, {
28
- placement: 'bottom-start',
29
- modifiers: [
30
- {
31
- name: 'offset',
32
- options: {
33
- offset: [-4, 8],
34
- },
35
- },
36
- {
37
- name: 'arrow',
38
- options: {
39
- element: this.$arrow,
40
- padding: 0,
41
- },
42
- },
43
- ]
44
- });
26
+ /*
45
27
  this.$popover.style.visibility = 'hidden';
46
28
  this.$button.addEventListener('click', () => {
47
29
  this.$popover.style.visibility = this.isVisible ? 'hidden' : 'visible';
@@ -70,7 +70,7 @@ export default class XPgScrollBasic extends HTMLElement {
70
70
  }
71
71
  this.$scrollList.style.transform = `translateY(${-1 * offsetY % 44}px)`;
72
72
  });
73
- function overflow(overflowText) {
73
+ const overflow = (overflowText) => {
74
74
  if (overflowText === 'auto') {
75
75
  this.$overflowContainer.style.overflow = 'auto';
76
76
  this.$overflowContainer.style.height = '300px';
@@ -3,6 +3,8 @@ import PgSearch from '../../search';
3
3
  import { mdiAccount, mdiAccountBox, mdiAccountCircle } from './constants';
4
4
 
5
5
  import template from './basic.html';
6
+ import { Alias } from '../../../shared/models/alias';
7
+ import { Icon } from '../../../shared/models/icon';
6
8
 
7
9
  @Component({
8
10
  selector: 'x-pg-search-basic',
@@ -12,18 +14,19 @@ export default class XPgSearchBasic extends HTMLElement {
12
14
  @Part() $search: PgSearch;
13
15
 
14
16
  connectedCallback() {
15
- this.$search.items = [
17
+ this.$search.items.push(
16
18
  { type: 'Documentation', name: 'Android', url: '/getting-started/android' },
17
19
  { type: 'Documentation', name: 'Angular', url: '/getting-started/angular' },
18
20
  { type: 'Documentation', name: 'AngularJS', url: '/getting-started/angularjs' },
19
21
  { type: 'Documentation', name: 'Bootstrap', url: '/getting-started/bootstrap' },
20
22
  { type: 'Documentation', name: 'How to Play Football', url: '/getting-started/football' },
21
23
  { type: 'Documentation', name: 'Foo Angular Foo Angular', url: '/getting-started/bootstraps' }
22
- ];
23
- this.$search.icons = [
24
- { name: 'account', data: mdiAccount, aliases: [{ name: 'user' }] },
25
- { name: 'account-box', data: mdiAccountBox, aliases: [{ name: 'user-box' }] },
26
- { name: 'account-circle', data: mdiAccountCircle, aliases: [{ name: 'user-circle' }] }
27
- ] as any;
24
+ );
25
+ // fix types later
26
+ this.$search.icons.push(
27
+ //(new Icon()).from({ name: 'account', data: mdiAccount, aliases: [(new Alias()).from({ name: 'user' })] }),
28
+ //{ name: 'account-box', data: mdiAccountBox, aliases: [(new Alias()).from({ name: 'user-box' })] },
29
+ //{ name: 'account-circle', data: mdiAccountCircle, aliases: [(new Alias()).from({ name: 'user-circle' })] }
30
+ );
28
31
  }
29
32
  }
@@ -21,10 +21,10 @@ input {
21
21
  border: .0625rem solid var(--pg-search-border-color);
22
22
  }
23
23
  input:active {
24
- box-shadow: 0 0 0 3px var(--pg-search-active-glow, rgb(79, 143, 249, 0.6));
24
+ box-shadow: 0 0 0 3px var(--pg-search-active-glow, rgba(79, 143, 249, 0.6));
25
25
  }
26
26
  input:focus {
27
- box-shadow: 0 0 0 3px var(--pg-search-focus-glow, rgb(79, 143, 249, 0.5));
27
+ box-shadow: 0 0 0 3px var(--pg-focus-color, rgba(79, 143, 249, 0.5));
28
28
  }
29
29
  .active input + svg path {
30
30
  fill: #453C4F;
@@ -2,7 +2,6 @@ export class User {
2
2
 
3
3
  public id: string | null = null;
4
4
  public github: string | null = null;
5
- public twitter: string | null = null;
6
5
  public name: string | null = null;
7
6
  public base64: string | null = null;
8
7
  public iconCount: number | null = null;
@@ -15,7 +14,6 @@ export class User {
15
14
  from(user: User): User {
16
15
  this.id = user.id;
17
16
  this.github = user.github;
18
- this.twitter = user.twitter;
19
17
  this.name = user.name;
20
18
  if (typeof user.base64 === 'string') {
21
19
  if (user.base64.match(/^data/)) {
package/pg/tab/tab.ts CHANGED
@@ -3,13 +3,6 @@ import { Component, Prop, Part } from '@pictogrammers/element';
3
3
  import template from './tab.html';
4
4
  import style from './tab.css';
5
5
 
6
- function uuid() {
7
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
8
- var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
9
- return v.toString(16);
10
- });
11
- }
12
-
13
6
  @Component({
14
7
  selector: 'pg-tab',
15
8
  style,
@@ -21,8 +14,6 @@ export default class PgTab extends HTMLElement {
21
14
 
22
15
  @Part() $tab: HTMLDivElement;
23
16
 
24
- uuid = uuid();
25
-
26
17
  connectedCallback() {
27
18
 
28
19
  }
@@ -40,7 +31,6 @@ export default class PgTab extends HTMLElement {
40
31
  this.dispatchEvent(
41
32
  new CustomEvent('tab', {
42
33
  detail: {
43
- id: this.uuid,
44
34
  label: this.label
45
35
  },
46
36
  bubbles: true
@@ -0,0 +1,42 @@
1
+
2
+ [part="button"] {
3
+ position: relative;
4
+ display: flex;
5
+ line-height: calc(2.5rem - 0.5px);
6
+ border-top: 1px solid transparent;
7
+ border-right: 1px solid transparent;
8
+ border-bottom: 0;
9
+ border-left: 1px solid transparent;
10
+ border-radius: 0.25rem 0.25rem 0 0;
11
+ padding: 0 0.75rem;
12
+ text-decoration: none;
13
+ color: var(--pg-tab-border, #453C4F);
14
+ align-items: center;
15
+ align-content: center;
16
+ box-sizing: border-box;
17
+ outline: none;
18
+ background: transparent;
19
+ }
20
+
21
+ [part="button"].selected {
22
+ border-color: var(--pg-tab-border, #453C4F);
23
+ font-weight: bold;
24
+ background: #fff;
25
+ cursor: default;
26
+ height: calc(2.5rem + 0.5px);
27
+ }
28
+
29
+ [part="button"]:not(.selected):hover {
30
+ border-color: var(--pg-tab-border, #453C4F);
31
+ }
32
+
33
+ [part="button"].selected:focus-visible {
34
+ color: #197BE0;
35
+ border-color: rgb(79, 143, 249);
36
+ }
37
+
38
+ [part="button"]:not(.selected):focus-visible {
39
+ background: var(--pg-focus-color, rgb(79, 143, 249, 0.15));
40
+ border-color: rgb(79, 143, 249);
41
+ color: #197BE0;
42
+ }